#!/bin/bash #set -x # Author: Daniel Kahn Gillmor # Date: 2009-10-08 # License: GPL v3+ CMD="$1" shift NAME="$1" VG="$2" SIZE="${3:-3G}" RAM="${4:-512}" [ "$CMD" == "create" ] && [ ! -d /etc/sv/kvm ] && mkdir /etc/sv/kvm ls /etc/sv/kvm/* &> /dev/null if [ "$?" -eq 0 ]; then TAP="${5:-tap$(( $( cat /etc/sv/kvm/*/env/TAP | sed 's/^tap//' | sort -n | tail -n 1 ) + 1 ))}" MAC="${6:-$(cat /etc/sv/kvm/*/env/MAC | head -n1 | cut -f 1-5 -d: ):$(( $( cat /etc/sv/kvm/*/env/MAC | cut -f 6 -d: | sort -n | tail -n 1 ) + 1 ))}" else TAP=tap0 MAC=00:00:00:00:00:00 fi die() { echo "$1" exit_code=1 [ -n "$2" ] && exit_code="$2" exit $exit_code } destroy() { update-service --remove "/etc/sv/kvm/$NAME" rm -rf "/etc/sv/kvm/$NAME" deluser "$NAME" lvremove "$VG/$NAME" rm -rf "/home/$NAME" } validate() { # Make sure none of the pieces already exist. [ -z "$NAME" ] && die "Please pass the name of the virtual server to create" [ -z "$VG" ] && die "Please pass the name of the volume group to use" getent passwd "$NAME" > /dev/null [ "$?" -eq "0" ] && die "The username '$NAME' already exists." getent group "$NAME" > /dev/null [ "$?" -eq 0 ] && die "The group '$NAME' already exists." [ -d /home/"$NAME" ] && die "The directory '/home/$NAME' already exists." [ -d /etc/sv/kvm/"$NAME" ] && die "The directory '/etc/sv/kvm/$NAME' already exists." [ -d /dev/mapper/${VG}-${NAME} ] && die "The logical volume $NAME already exists." } create() { set -e validate adduser "$NAME" --disabled-password --gecos "$NAME KVM user,,," addgroup "$NAME" kvm for dir in .ssh vms "vms/$NAME"; do [ ! -d "/home/$NAME/$dir" ] && mkdir "/home/$NAME/$dir" done touch "/home/$NAME/vms/$NAME/netboot" chown "$NAME:$NAME" "/home/$NAME/"{.ssh,vms,"vms/$NAME","vms/$NAME/netboot"} cp /root/.ssh/authorized_keys "/home/$NAME/.ssh/" lvcreate --name "$NAME" --size "$SIZE" $VG mkdir "/etc/sv/kvm/$NAME"{,/log,/env} cat > "/etc/sv/kvm/$NAME/log/run" <&1 exec chpst -e ../env /usr/local/sbin/kvm-manager log EOF cat > "/etc/sv/kvm/$NAME/run" <&1 exec chpst -e ./env /usr/local/sbin/kvm-manager up EOF cat > "/etc/sv/kvm/$NAME/finish" <&1 exec chpst -e ./env /usr/local/sbin/kvm-manager down EOF chmod a+x "/etc/sv/kvm/$NAME/"{run,finish,log/run} echo "$NAME" > "/etc/sv/kvm/$NAME/env/OWNER" echo "$NAME" > "/etc/sv/kvm/$NAME/env/VMNAME" echo "$TAP" > "/etc/sv/kvm/$NAME/env/TAP" echo "$RAM" > "/etc/sv/kvm/$NAME/env/RAM" echo "$MAC" > "/etc/sv/kvm/$NAME/env/MAC" } demo() { validate for foo in NAME VG TAP RAM MAC SIZE ; do echo "$foo : ${!foo}" done } "$CMD"