#!/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()