From 7b512267968e065157e78fe85169cf6e81f7c47e Mon Sep 17 00:00:00 2001 From: cecilkorik Date: Sat, 5 Mar 2011 08:34:41 +0000 Subject: [PATCH] initial import --HG-- branch : vmtools --- autostartvm | 20 ++++++++++++++ autostopvm | 14 ++++++++++ killvm | 54 ++++++++++++++++++++++++++++++++++++++ makevm | 49 ++++++++++++++++++++++++++++++++++ nextvnc.py | 30 +++++++++++++++++++++ rebootvm | 2 ++ startvm | 64 +++++++++++++++++++++++++++++++++++++++++++++ stopvm | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++ vmlist | 39 ++++++++++++++++++++++++++++ 9 files changed, 347 insertions(+) create mode 100755 autostartvm create mode 100755 autostopvm create mode 100755 killvm create mode 100755 makevm create mode 100755 nextvnc.py create mode 100755 rebootvm create mode 100755 startvm create mode 100755 stopvm create mode 100755 vmlist 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() +