AVCommon/commands/server/START_VM.py
import os
import sys
from AVCommon.logger import logging
from time import sleep
from AVCommon import mq
from AVCommon import helper
from AVCommon import config
def get_status(vm):
from AVMaster import vm_manager
# [19/12/13 11:09:23] Seppia: pid=1432, owner=WIN7-NOAV\avtest, cmd=vmtoolsd.exe
# pid=1776, owner=NT AUTHORITY\SYSTEM, cmd=vmtoolsd.exe
# pid=712, owner=NT AUTHORITY\SYSTEM, cmd=TrustedInstaller.exe
# pid=1376, owner=WIN7-NOAV\avtest, cmd=wuauclt.exe
# pid=1408, owner=WIN7-NOAV\avtest, cmd=wuauclt.exe
# [19/12/13 11:09:53] Seppia: questa e' una vm che sta facendo aggiornamento, con i vmwaretools partiti (user logged on)
user_logged = False
vm_tools = False
install = False
try:
processes = vm_manager.execute(vm, "list_processes");
except:
logging.exception("cannot get processes")
#processes = vm_manager.execute(vm, "listProcesses");
#logging.debug("listProcesses: %s" % processes)
if not processes:
try:
sleep(60)
logging.debug("trying listProcesses")
procs = vm_manager.execute(vm, "listProcesses");
if config.verbose:
logging.debug("listProcesses: %s" % procs)
processes = helper.convert_processes(procs)
except:
logging.exception("listProcesses")
if not processes:
return "NOT-STARTED"
try:
if config.verbose:
logging.debug("%s, list_processes: %s" % (vm, [ (p["name"],p["owner"]) for p in processes] ))
for process in processes:
if process["owner"].endswith("avtest"):
user_logged = True
if process["name"] == "vmtoolsd.exe":
# owner=WIN7-NOAV\avtest, cmd=VMwareTray.exe
vm_tools = True
if process["name"] == "wuauclt.exe" or process["name"] == "TrustedInstaller.exe":
install = True
# explorer, vmware solo se logged in
except:
logging.exception("error")
if vm_tools:
return "LOGGED-IN"
if install:
return "INSTALL"
if not user_logged:
return "LOGGED-OFF"
else:
return "NO-VM-TOOLS"
def execute(vm, protocol, args):
""" server side """
from AVMaster import vm_manager
#logging.debug(" CS Execute")
assert vm, "null vm"
mq = protocol.mq
check_avagent = (args == "AV_AGENT")
mq.reset_connection(vm)
ret = vm_manager.execute(vm, "startup")
started = False
if not ret:
return False, "Not Started VM"
max_install = 10
max_tries = 10
for i in range(3):
sleep(10)
if vm_manager.execute(vm, "is_powered_on"):
for i in range(max_tries):
if mq.check_connection(vm):
logging.debug("got connection from %s" % vm)
return True, "Started VM"
for i in range(max_install):
status = get_status(vm)
logging.debug("%s, got status: %s" % (vm, status))
if status == "INSTALL":
logging.debug("waiting for the install to finish: %s/%s" % (i, max_install))
sleep(60)
else:
break
if status == "LOGGED-IN":
logging.debug("%s, executing ipconfig, time: %s/%s" % (vm, i, max_tries))
started = vm_manager.execute(vm, "executeCmd", "c:\\windows\\system32\\ipconfig.exe") == 0
logging.debug("%s, executed ipconfig, ret: %s" % (vm, started))
if started and not check_avagent:
return True, "Started VM"
else:
sleep(20)
if not started:
logging.debug("%s: reboot requested" % vm)
vm_manager.execute(vm, "reboot")
sleep(60)
continue
return False, "Not started VM"
else:
logging.debug("%s: not yet powered" % vm)
return False, "Error Occurred: Timeout while starting VM"