commit 7b512267968e065157e78fe85169cf6e81f7c47e Author: cecilkorik Date: Sat Mar 5 08:34:41 2011 +0000 initial import --HG-- branch : vmtools diff --git a/autostartvm b/autostartvm new file mode 100755 index 0000000..be4a99d --- /dev/null +++ b/autostartvm @@ -0,0 +1,20 @@ +#!/usr/bin/python + +import os, sys, subprocess, time + +os.environ['VBOX_USER_HOME'] = '/srv/vbox' + +devnull = open('/dev/null', 'wb') +vml = open('/srv/vmlist', 'r') + +for vmd in vml: + vmd = vmd.strip() + if not vmd: + continue + name, mac, vnc, autostart = vmd.split(' ') + if autostart == '1': + subprocess.Popen(['/usr/local/sbin/startvm', name], env=os.environ).wait() + time.sleep(2) + +vml.close() + diff --git a/autostopvm b/autostopvm new file mode 100755 index 0000000..a2751d6 --- /dev/null +++ b/autostopvm @@ -0,0 +1,14 @@ +#!/usr/bin/python + +import os, sys, subprocess + +os.environ['VBOX_USER_HOME'] = '/srv/vbox' + +if not os.path.exists('/var/run/vbox'): + sys.exit(0) + +devnull = open('/dev/null', 'wb') + +for name in os.listdir('/var/run/vbox'): + subprocess.Popen(['/usr/local/sbin/stopvm', name], env=os.environ).wait() + diff --git a/killvm b/killvm new file mode 100755 index 0000000..5197405 --- /dev/null +++ b/killvm @@ -0,0 +1,54 @@ +#!/usr/bin/python + +import os, sys, time, traceback + +def vbox_soft_kill(name, pid): + def vbox_running(pid): + try: + fd = open("/proc/%d/cmdline" % (pid,), "r") + except IOError, OSError: + return False + return True + + if not vbox_running(pid): + return + + os.system("vboxmanage controlvm %s poweroff" % (name,)) + for i in xrange(30): + time.sleep(0.333) + if not vbox_running(pid): + return + os.system("kill %s" % (pid,)) + for i in xrange(30): + time.sleep(0.333) + if not vbox_running(pid): + return + os.system("kill -9 %s" % (pid,)) + +def usage(): + sys.stderr.write("""\ +Usage: + killvm + +""") + +def run(): + if len(sys.argv) != 2: + sys.stderr.write("Invalid arguments\n\n") + usage() + return + + name = sys.argv[1] + if not os.path.exists('/var/run/vbox/%s' % (name,)): + sys.stderr.write("Invalid VM name\n\n") + usage() + return + + fd = open('/var/run/vbox/%s' % (name,), 'r') + pid = int(fd.read()) + fd.close() + + vbox_soft_kill(name, pid) + +if __name__ == "__main__": + run() diff --git a/makevm b/makevm new file mode 100755 index 0000000..8df47f7 --- /dev/null +++ b/makevm @@ -0,0 +1,49 @@ +#!/bin/bash + +usage() { + cat << EEOF +Usage: + makevm [clonevm] +EEOF +} + +if [ ! $1 ]; then + usage + exit 1 +fi + +NEWVM=$1 +CLONEVM=$2 +SYSDISK=/dev/vg0/$NEWVM +SYSDISKFILE=$VBOX_USER_HOME/Disks/$NEWVM/$NEWVM.vmdk +CLONEDISK=/dev/vg0/$CLONEVM +CLONEDISKFILE=$VBOX_USER_HOME/Disks/$CLONEVM/$CLONEVM.vmdk +NEWVNC=`python nextvnc.py` +if [ $NEWVNC -lt 5900 ]; then + echo "Python error $NEWVNC" + exit 99 +fi + +NEWMAC_LASTPART=`python -c "print '%.2d' % ($(($NEWVNC - ($NEWVNC / 100 * 100))),)"` +NEWMAC=aa:aa:aa:00:$(($NEWVNC / 100)):$NEWMAC_LASTPART +VBOXMAC=`echo $NEWMAC | sed -e 's/://g'` + +if [ $CLONEVM ]; then + #lvcreate -L 10G -n $NEWVM vg0 + vboxmanage internalcommands createrawvmdk -filename $SYSDISKFILE -rawdisk $SYSDISK || exit 250 + vboxmanage clonehd $CLONEDISKFILE $SYSDISKFILE --existing --remember || exit 250 +else + lvcreate -L 10G -n $NEWVM vg0 || exit 250 + vboxmanage internalcommands createrawvmdk -filename $SYSDISKFILE -rawdisk $SYSDISK || exit 250 + #vboxmanage createhd --filename $SYSDISK --size 10000 --variant Fixed --remember || exit 250 +fi +vboxmanage createvm --name $NEWVM --ostype Ubuntu_64 --register || exit 250 +vboxmanage modifyvm $NEWVM --memory 512 --nic1 bridged --nictype1 Am79C973 --nicspeed1 1000000 --bridgeadapter1 eth0 --macaddress1 $VBOXMAC --boot1 disk --boot2 dvd --boot3 net || exit 250 +vboxmanage storagectl $NEWVM --name sata0 --add sata --sataportcount 30 || exit 250 +vboxmanage storageattach $NEWVM --storagectl sata0 --port 1 --device 0 --type hdd --medium $SYSDISKFILE || exit 250 + +echo $NEWVM $NEWMAC $NEWVNC 0 >> /srv/vmlist + +echo "Done!" +echo "Machine '$NEWVM' with MAC '$NEWMAC' on port '$NEWVNC' created successfully!" + diff --git a/nextvnc.py b/nextvnc.py new file mode 100755 index 0000000..9a03058 --- /dev/null +++ b/nextvnc.py @@ -0,0 +1,30 @@ +#!/usr/bin/python +import os, sys +import traceback + +if not os.path.exists('/srv/vmlist'): + print "5900" + sys.exit(0) + +try: + f = open('/srv/vmlist', 'r') + vnclist = [] + for l in f: + l = l.strip() + if not l: + continue + vm, mac, vnc, autostart = l.split() + vnc = int(vnc) + vnclist.append(vnc) + vnclist.sort() + vncstart = 5900 + for i in xrange(len(vnclist)): + if vncstart + i != vnclist[i]: + print vncstart + i + + print vncstart + len(vnclist) +except: + traceback.print_exc() + sys.exit(1) + + diff --git a/rebootvm b/rebootvm new file mode 100755 index 0000000..341a2bb --- /dev/null +++ b/rebootvm @@ -0,0 +1,2 @@ +#!/bin/bash +vboxmanage controlvm $1 reset diff --git a/startvm b/startvm new file mode 100755 index 0000000..440c307 --- /dev/null +++ b/startvm @@ -0,0 +1,64 @@ +#!/usr/bin/python + +import os, sys, time, traceback +import subprocess + +Popen = subprocess.Popen + +def usage(): + sys.stderr.write("""\ +Usage: + startvm +""") + +def run(): + if len(sys.argv) != 2: + usage() + return + + vmstart = sys.argv[1] + fd = open('/srv/vmlist', 'r') + found = False + for l in fd: + l = l.strip() + if not l: + continue + name, mac, port, autostart = l.split() + if name == vmstart: + found = True + break + + if not found: + sys.stderr.write("No VM with that name\n\n") + usage() + return + + try: + os.mkdir("/var/run/vbox") + except OSError: + pass + + pidfile = "/var/run/vbox/%s" % (name,) + if os.path.exists(pidfile): + fdpid = open(pidfile, "r") + oldpid = int(fdpid.read()) + fdpid.close() + procfile = "/proc/%s/cmdline" % (oldpid,) + if os.path.exists(procfile): + fdcmd = open(procfile, "r") + oldcmd = fdcmd.read().replace('\x00', ' ') + fdcmd.close() + sys.stderr.write("Already running: PID %s, CMD %s\n" % (oldpid, oldcmd)) + return + + fdo = open("/var/log/vbox/%s.log" % (name,), "a") + fdo.write("--- Starting VirtualBox at %s ---\n" % (time.strftime("%Y-%m-%d %H:%M:%S"),)) + fdpid = open(pidfile, "w") + p = Popen(["vboxheadless", "-s", name, "-n", "-m", port], stdout=fdo, stderr=fdo) + fdpid.write(str(p.pid)) + fdpid.close() + + + +if __name__ == "__main__": + run() diff --git a/stopvm b/stopvm new file mode 100755 index 0000000..6aca39f --- /dev/null +++ b/stopvm @@ -0,0 +1,75 @@ +#!/usr/bin/python + +import os, sys, time, traceback + +def vbox_soft_kill(name, pid): + def vbox_running(pid): + try: + fd = open("/proc/%d/cmdline" % (pid,), "r") + except IOError, OSError: + return False + return True + + if not vbox_running(pid): + return + + os.system("vboxmanage controlvm %s acpipowerbutton" % (name,)) + for i in xrange(360): + time.sleep(0.333) + if not vbox_running(pid): + return + os.system("vboxmanage controlvm %s poweroff" % (name,)) + for i in xrange(30): + time.sleep(0.333) + if not vbox_running(pid): + return + os.system("kill %s" % (pid,)) + for i in xrange(30): + time.sleep(0.333) + if not vbox_running(pid): + return + os.system("kill -9 %s" % (pid,)) + +def usage(): + sys.stderr.write("""\ +Usage: + stopvm + +""") + +def run(): + if len(sys.argv) != 2: + sys.stderr.write("Invalid arguments\n\n") + usage() + return + + name = sys.argv[1] + vml = open('/srv/vmlist', 'r') + found = False + for vmn in vml: + vmn = vmn.strip() + if not vmn: + continue + vmn = vmn.split()[0] + if vmn == name: + found = True + break + + if not found: + sys.stderr.write("Invalid VM name\n\n") + usage() + return + + if not os.path.exists('/var/run/vbox/%s' % (name,)): + sys.stderr.write("VM is not running\n\n") + usage() + return + + fd = open('/var/run/vbox/%s' % (name,), 'r') + pid = int(fd.read()) + fd.close() + + vbox_soft_kill(name, pid) + +if __name__ == "__main__": + run() diff --git a/vmlist b/vmlist new file mode 100755 index 0000000..cd5d490 --- /dev/null +++ b/vmlist @@ -0,0 +1,39 @@ +#!/usr/bin/python + +import os, sys +fd = open('/srv/vmlist', 'r') + +auto_only = False +running_only = False +show_pids = False +if len(sys.argv) > 1 and sys.argv[1] == '-a': + auto_only = True +if len(sys.argv) > 1 and sys.argv[1] == '-r': + running_only = True +if len(sys.argv) > 1 and sys.argv[1] == '-p': + show_pids = True + +for line in fd: + line = line.strip() + if not line: + continue + ls = line.split(' ') + if auto_only and ls[3] == '0': + continue + pid = None + if running_only or show_pids: + if not os.path.exists('/var/run/vbox/%s' % (ls[0],)): + continue + pid = open('/var/run/vbox/%s' % (ls[0],), 'r').read() + procfile = "/proc/%s/cmdline" % (pid,) + if not os.path.exists(procfile): + continue + + + if show_pids: + print "%s %s" % (ls[0], pid) + else: + print ls[0] + +fd.close() +