# HG changeset patch # User heiko # Date 1224860459 0 # Node ID 30ac294f8cedaf64989dad4da6678eb862117f09 # Parent e7bd8393f87b23f100f46ef15b0c76e1ffb99afc * unusable!!! diff -r e7bd8393f87b -r 30ac294f8ced kvmctl --- a/kvmctl Fri Oct 24 06:06:18 2008 +0000 +++ b/kvmctl Fri Oct 24 15:00:59 2008 +0000 @@ -4,16 +4,37 @@ # $URL$ # Heiko Schlittermann -action="${1?}"; shift -vm="$1"; shift +# Structure of virtual machine directories +# $DIR/ (see below, hard coded into this script) +# +# $DIR//conv/cmdline # KVM options (ro) +# # example: +# # -hda rootfs.img +# # Note: paths are relative to $DIR/ +# id # KVM id (ro) +# # Note: has to be unique among all VMs +# $DIR//var/pid +# frozen +# .cmdline +# $DIR// +# +# $DIR//... +# ... ... +# +# /... DIR=/kvm + +action="${1?}"; shift +vm="$1"; shift + # no user service able parts below unset ${!LC_*} LANG unset CDPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -set +m # switch off job control + +#set +m # switch off job control ME=$(basename $0) KVM=$(command -v kvm) @@ -27,56 +48,66 @@ ### MAIN # sanity -test "$NC" || die "need nc (netcat)" -test "$KVM" || die "need kvm" +test "$NC" || die "need nc (netcat)" +test "$KVM" || die "need kvm" +test "$FUSER" || die "need fuser" -dups=$(cat $DIR/*/kvm/id | sort -n | uniq -c \ +dups=$(cat $DIR/*/conf/id | sort -n | uniq -c \ | egrep -v '^[[:space:]]+1 ' | tr -s ' ' | cut -f2 -d:) test "$dups" && die "duplicate ids (id: $dups)" for vm in ${vm:-$(echo $DIR/*)}; do vm=$(basename $vm) - kvm=$DIR/$vm/kvm + conf=$DIR/$vm/conf + var=$DIR/$vm/var + + # silent conversion + test -d $DIR/$vm/kvm && ! test -d $DIR/$vm/conf \ + && mv $DIR/$vm/kvm $DIR/$vm/conf - test -d $kvm || continue - test -f $kvm/id || { warn "need id file (vm: $vm)" && continue; } - test -f $kvm/cmdline || { warn "need cmdline file (vm: $vm)" && continue; } + test -d $vm || { warn "no such file or directory: $vm"; continue; } + test -d $conf || continue + test -f $conf/id || { warn "need id file (vm: $vm)" && continue; } + test -f $conf/cmdline || { warn "need cmdline file (vm: $vm)" && continue; } + test -d $var || mkdir $var || exit 2 - id=$(cat $kvm/id) + id=$(cat $conf/id) monitor=$((4000 + id)) - pid=$(cat $kvm/pid 2>/dev/null) + pid=$(cat $var/pid 2>/dev/null) case "$action" in + start) echo "starting $vm" - cmdline="$(cat $kvm/cmdline) \ - -pidfile kvm/pid \ + cmdline="$(grep -v '^#' $conf/cmdline) \ + -pidfile var/pid \ -name "$vm" \ -vnc :$id \ -usb -usbdevice tablet \ -monitor tcp:localhost:$monitor,server,nowait \ -daemonize \ $@" - echo "$cmdline" > $kvm/.cmdline - test -f $kvm/frozen && cmdline="$cmdline $(cat $kvm/frozen)" + echo "$cmdline" > $var/.cmdline + test -f $var/frozen && cmdline="$cmdline $(cat $var/frozen)" - ( - cd $DIR/$vm && $KVM $cmdline \ - && echo "started, display :$id, monitor tcp:127.0.0.1:$monitor" - ) + ( cd $DIR/$vm && $KVM $cmdline ) + pid=$(cat $var/pid) + echo "started, pid: $pid, display :$id, monitor tcp:127.0.0.1:$monitor" test "$DISPLAY" && test "$VNCVIEWER" && test -t \ && ( $VNCVIEWER :$id &>/dev/null /dev/null ) & pid1=$! + #{ + { echo system_powerdown | $NC localhost $monitor; } & pid0=$! + #( sleep 30; kill $pid0 &>/dev/null ) & pid1=$! +echo $pid0 wait $pid0 - kill $pid1 2>/dev/null - kill -0 $pid 2>/dev/null && $0 kill $vm - } & +echo $? + #kill $pid1 2>/dev/null + #kill -0 $pid 2>/dev/null && $0 kill $vm + #} & ;; quit) echo "quit $vm" $FUSER -k $monitor/tcp @@ -89,8 +120,9 @@ freeze) echo "freezing $vm" fuser -k $monitor/tcp echo -e "savevm HIBERNATE\nquit" | $NC localhost $monitor & - echo "-loadvm HIBERNATE" >$kvm/frozen + echo "-loadvm HIBERNATE" >$var/frozen ;; + #status) echo "status $vm: " qemu) echo "DO *NOT* USE \"quit\", use ^C for exiting!" $NC localhost $monitor @@ -100,3 +132,5 @@ done wait + +# vim:ts=4 sw=4 et: