hackedteam/test-av2

View on GitHub
AVCommon/commands/server/START_VM.py

Summary

Maintainability
C
1 day
Test Coverage
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"