#!/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}" DISK="/dev/mapper/${VG}-${NAME}" [ "$CMD" == "create" ] && mkdir -p /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 usage() { die "USAGE: kvm-creator create|destroy|demo guestname [volumegroup [disksize [ram [tap [mac] ] ] ] ]" } 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" ] && [ "$CMD" == "create" ] && die "Please pass the name of the volume group to use" || : getent passwd "$NAME" > /dev/null && die "The username '$NAME' already exists." || : getent group "$NAME" > /dev/null && 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." || : [ -e $DISK ] && die "The logical volume $NAME already exists." || : } create() { set -e validate adduser "$NAME" --disabled-password --gecos "$NAME KVM user,,," mkdir -p "/home/$NAME/"{.ssh,vms,"vms/$NAME"} chown "$NAME:$NAME" "/home/$NAME/"{.ssh,vms,"vms/$NAME"} 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" echo "$DISK" > "/etc/sv/kvm/$NAME/env/KVMOPTS" } demo() { validate for foo in NAME VG TAP RAM MAC SIZE DISK ; do echo "$foo : ${!foo}" done } [ "$CMD" != "create" ] && [ "$CMD" != "destroy" ] && [ "$CMD" != "demo" ] && usage "$CMD"