initial import
--HG-- branch : vmtools
This commit is contained in:
commit
7b51226796
9 changed files with 347 additions and 0 deletions
20
autostartvm
Executable file
20
autostartvm
Executable file
|
@ -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()
|
||||||
|
|
14
autostopvm
Executable file
14
autostopvm
Executable file
|
@ -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()
|
||||||
|
|
54
killvm
Executable file
54
killvm
Executable file
|
@ -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 <vmname>
|
||||||
|
|
||||||
|
""")
|
||||||
|
|
||||||
|
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()
|
49
makevm
Executable file
49
makevm
Executable file
|
@ -0,0 +1,49 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat << EEOF
|
||||||
|
Usage:
|
||||||
|
makevm <newvm> [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!"
|
||||||
|
|
30
nextvnc.py
Executable file
30
nextvnc.py
Executable file
|
@ -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)
|
||||||
|
|
||||||
|
|
2
rebootvm
Executable file
2
rebootvm
Executable file
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
vboxmanage controlvm $1 reset
|
64
startvm
Executable file
64
startvm
Executable file
|
@ -0,0 +1,64 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import os, sys, time, traceback
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
Popen = subprocess.Popen
|
||||||
|
|
||||||
|
def usage():
|
||||||
|
sys.stderr.write("""\
|
||||||
|
Usage:
|
||||||
|
startvm <vmname>
|
||||||
|
""")
|
||||||
|
|
||||||
|
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()
|
75
stopvm
Executable file
75
stopvm
Executable file
|
@ -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 <vmname>
|
||||||
|
|
||||||
|
""")
|
||||||
|
|
||||||
|
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()
|
39
vmlist
Executable file
39
vmlist
Executable file
|
@ -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()
|
||||||
|
|
Loading…
Add table
Reference in a new issue