# /usr/bin/python3
'''
# /usr/bin/python3
'''
#命令管理虚拟机 list, running list, start,stop
https://askubuntu.com/questions/445284/how-to-start-a-virtualbox-machine-via-command-line-without-gui
vboxmanage list vms
vboxmanage startvm "k8s-node1" --type headless
vboxmanage controlvm "k8s-node1" poweroff
'''
import subprocess
import sys
def rep(vm):
return str(vm).strip().split()[0].replace('"','')
def exec(cmd):
return str(subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0], "UTF-8").split("\n")
def exec_single(cmd):
return subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
# get vm list
def get_vm_list():
try:
vm_list = exec(["/usr/bin/vboxmanage", "list", "vms"])
if len(vm_list) == 0:
sys.exit(2)
return vm_list,None
except Exception as e:
return [],e
#get running vm list
def get_running_vms():
vm_list = []
try:
vm_list = exec(["/usr/bin/vboxmanage", "list", "runningvms"])
if len(vm_list) == 0:
sys.exit(2)
return vm_list,None
except Exception as e:
return [],e
def start_vms():
try:
vm_list,err1 = get_vm_list()
if err1 != None:
print(f"get running vm list failed:{err1.__str__()}")
sys.exit(2)
running_vm_list,err2 = get_running_vms()
if err2 != None:
print(f"get running vm list failed:{err2.__str__()}")
sys.exit(2)
for vm in vm_list:
if vm.__contains__("harbor-server") or str(vm).strip() == "":
continue
if vm in running_vm_list:
print(f"【{vm}\tis already started")
continue
name = str(vm).strip().split()[0].replace('"','')
commad = exec_single(["/usr/bin/vboxmanage","startvm", name,"--type","headless"])
print(str(f"{str(commad).strip()}"))
except Exception as e:
print(e.__str__())
def stop_vms():
try:
running_vm_list,err = get_running_vms()
if err != None:
print(f"get running vm list failed:{err.__str__()}")
sys.exit(2)
for vm in running_vm_list:
if str(vm).strip() == "":
continue
print(str(f"Stop【{vm}】"))
name = rep(vm)
command = exec_single(["/usr/bin/vboxmanage","controlvm", name,"poweroff"])
print(str(f"Stop【{vm}】:{str(command).strip()}"))
except Exception as e:
print(e)
def start_vm(vm):
try:
commad = exec_single(["/usr/bin/vboxmanage","startvm", vm,"--type","headless"])
print(str(f"{str(commad).strip()}"))
except Exception as e:
print(e.__str__())
def stop_vm(vm):
try:
print(str(f"Stop【{vm}】"))
command = exec_single(["/usr/bin/vboxmanage","controlvm", vm,"poweroff"])
print(str(f"Stop【{vm}】:{str(command).strip()}"))
except Exception as e:
print(e)
def print_running_vms():
run_list,err = get_running_vms()
if err != None:
print(f"get running vm list failed:{err.__str__()}")
sys.exit(2)
for vm in run_list:
if str(vm).strip() == "":
continue
print(f"{vm}")
def print_vms_list():
run_list,err = get_vm_list()
if err != None:
print(f"get running vm list failed:{err.__str__()}")
sys.exit(2)
for vm in run_list:
if str(vm).strip() == "":
continue
print(f"{vm}")
def restart(vms):
vms = vms.split(";")
for vm in vms:
if vm == "":
continue
if in_vm_list(vm):
if in_running(vm):
stop_vm(vm)
start_vm(vm)
else:
print(f"【{vm}】not in vms list")
def in_running(vm_name):
running_vm_list,err = get_running_vms()
if err != None:
return False
for vm in running_vm_list:
if str(vm).strip() == "":
continue
name = rep(vm)
if vm_name == name:
return True
return False
def in_vm_list(vm_name):
running_vm_list,err = get_vm_list()
if err != None:
return False
for vm in running_vm_list:
if str(vm).strip() == "":
continue
name = rep(vm)
if name == vm_name:
return True
return False
if __name__ == "__main__":
if len(sys.argv) < 2:
print(f"usage: ./{sys.argv[0]} [list|running|start|stop]")
sys.exit(0)
else:
if str(sys.argv[1]) == "":
print(f"usage: ./{sys.argv[0]} [list|running|start|stop]")
sys.exit(0)
else:
flag = str(sys.argv[1]).strip()
if flag == "list":
print_vms_list()
elif flag == "running":
print_running_vms()
elif flag == "start":
start_vms()
elif flag == "stop":
stop_vms()
elif flag == "restart":
restart(sys.argv[2])
else:
print(f"usage: .{sys.argv[0]} [list|running|start|stop|]")
12-30