#!/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}" if [ ls /etc/sv/kvm/* &> /dev/null ]; then TAP="${5:-$(( $( 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=1 MAC=:1 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" } create() { set -e # FIXME: check that this stuff doesn't exist yet: [ -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" adduser "$NAME" --disabled-password --gecos "$NAME KVM user,,," 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() { for foo in NAME VG TAP RAM MAC SIZE ; do echo "$foo : ${!foo}" done } "$CMD"