75 lines
1.4 KiB
Python
Executable file
75 lines
1.4 KiB
Python
Executable file
#!/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()
|