Ejemplo n.º 1
0
    def run_cmd_on_guest(self, cmd, args="", timeout=30):
        self.wait_for_tools_in_guest(timeout)

        pl_handle = vixlib.VixHandle()

        err = vixlib.VixPropertyList_AllocPropertyList(
            self._vm_handle, ctypes.byref(pl_handle), vixlib.VIX_PROPERTY_NONE)
        _check_job_err_code(err)

        job_handle = vixlib.VixVM_RunProgramInGuest(self._vm_handle, cmd, args,
                                                    0, pl_handle, None, None)

        pid = ctypes.c_uint32()
        exit_code = ctypes.c_uint32()

        err = vixlib.VixJob_Wait(
            job_handle, vixlib.VIX_PROPERTY_JOB_RESULT_PROCESS_ID,
            ctypes.byref(pid),
            vixlib.VIX_PROPERTY_JOB_RESULT_GUEST_PROGRAM_EXIT_CODE,
            ctypes.byref(exit_code), vixlib.VIX_PROPERTY_NONE)
        vixlib.Vix_ReleaseHandle(job_handle)
        vixlib.Vix_ReleaseHandle(pl_handle)
        _check_job_err_code(err)

        return pid.value, exit_code.value
Ejemplo n.º 2
0
 def unpause(self):
     job_handle = vixlib.VixVM_Unpause(self._vm_handle, 0,
                                       vixlib.VIX_INVALID_HANDLE, None,
                                       None)
     err = vixlib.VixJob_Wait(job_handle, vixlib.VIX_PROPERTY_NONE)
     vixlib.Vix_ReleaseHandle(job_handle)
     _check_job_err_code(err)
Ejemplo n.º 3
0
    def connect(self,
                host=None,
                host_port=0,
                username=None,
                password=None,
                host_type=None):
        assert not self.connected, "VixConnection already connected"
        if (host_type is None) or (host is None):
            host_type = get_vix_host_type()

        job_handle = vixlib.VixHost_Connect(
            vixlib.VIX_API_VERSION,  # API version
            host_type,  # host connection type
            host,  # host address/URL
            host_port,  # host port
            username,  # username
            password,  # password
            0,  # options
            vixlib.VIX_INVALID_HANDLE,  # properties list
            None,  # callback
            None)  # user data

        host_handle = vixlib.VixHandle()
        err = vixlib.VixJob_Wait(job_handle,
                                 vixlib.VIX_PROPERTY_JOB_RESULT_HANDLE,
                                 ctypes.byref(host_handle),
                                 vixlib.VIX_PROPERTY_NONE)
        vixlib.Vix_ReleaseHandle(job_handle)
        _check_job_err_code(err)

        self._host = host
        self._host_handle = host_handle
Ejemplo n.º 4
0
    def open_vm(self, vmx_path, timeout=4):
        assert self.connected, "VixConnection not connected"

        start_time = time.time()
        job_handle = vixlib.VixVM_Open(self._host_handle, vmx_path, None, None)
        vm_handle = vixlib.VixHandle()

        job_completed = ctypes.c_byte(0)
        while not job_completed.value:
            err = vixlib.VixJob_CheckCompletion(job_handle,
                                                ctypes.byref(job_completed))
            _check_job_err_code(err)

            if timeout and timeout < (time.time() - start_time):
                raise VixException(
                    "Timeout (%d seconds) waiting to open VM by VMX '%s'", 0,
                    timeout, vmx_path)

        err = vixlib.Vix_GetProperties(job_handle,
                                       vixlib.VIX_PROPERTY_JOB_RESULT_HANDLE,
                                       ctypes.byref(vm_handle),
                                       vixlib.VIX_PROPERTY_NONE)
        vixlib.Vix_ReleaseHandle(job_handle)
        _check_job_err_code(err)

        return VixVM(vm_handle)
Ejemplo n.º 5
0
    def capture_guest_screenshot(self, screenshot_path):
        data_blob = ctypes.c_void_p()
        data_size = ctypes.c_size_t()

        job_handle = vixlib.VixVM_CaptureScreenImage(
            self._vm_handle,
            vixlib.VIX_CAPTURESCREENFORMAT_PNG,
            vixlib.VIX_INVALID_HANDLE,
            None,  # callback
            None)  # client data
        err = vixlib.VixJob_Wait(
            job_handle, vixlib.VIX_PROPERTY_JOB_RESULT_SCREEN_IMAGE_DATA,
            ctypes.byref(data_size), ctypes.byref(data_blob),
            vixlib.VIX_PROPERTY_NONE)
        vixlib.Vix_ReleaseHandle(job_handle)
        _check_job_err_code(err)

        try:
            buff = (ctypes.c_char * data_size.value).from_address(
                data_blob.value)
            with open(screenshot_path, "wb") as fp:
                fp.write(buff)
        finally:
            vixlib.Vix_FreeBuffer(data_blob)

        return screenshot_path, data_size
Ejemplo n.º 6
0
    def list_running_vms(self):
        assert self.connected, "VixConnection not connected"
        vmx_paths = []

        def callback(jobHandle, eventType, moreEventInfo, clientData):
            if vixlib.VIX_EVENTTYPE_FIND_ITEM != eventType:
                return

            url = ctypes.c_char_p()
            err = vixlib.Vix_GetProperties(
                moreEventInfo, vixlib.VIX_PROPERTY_FOUND_ITEM_LOCATION,
                ctypes.byref(url), vixlib.VIX_PROPERTY_NONE)

            vmx_paths.append(url.value)

            vixlib.Vix_FreeBuffer(url)
            _check_job_err_code(err)

        cb = vixlib.VixEventProc(callback)
        job_handle = vixlib.VixHost_FindItems(self._host_handle,
                                              vixlib.VIX_FIND_RUNNING_VMS,
                                              vixlib.VIX_INVALID_HANDLE, -1,
                                              cb, None)
        err = vixlib.VixJob_Wait(job_handle, vixlib.VIX_PROPERTY_NONE)
        vixlib.Vix_ReleaseHandle(job_handle)
        _check_job_err_code(err)

        return vmx_paths
Ejemplo n.º 7
0
 def delete_file_in_guest(self, guest_file_path):
     job_handle = vixlib.VixVM_DeleteFileInGuest(
         self._vm_handle,
         guest_file_path,
         None,  # callback
         None)  # client data
     err = vixlib.VixJob_Wait(job_handle, vixlib.VIX_PROPERTY_NONE)
     vixlib.Vix_ReleaseHandle(job_handle)
     _check_job_err_code(err)
Ejemplo n.º 8
0
 def delete_folder_in_guest(self, guest_folder_path):
     job_handle = vixlib.VixVM_DeleteDirectoryInGuest(
         self._vm_handle,
         guest_folder_path,
         0,  # options- must be 0
         None,  # callback
         None)  # client data
     err = vixlib.VixJob_Wait(job_handle, vixlib.VIX_PROPERTY_NONE)
     vixlib.Vix_ReleaseHandle(job_handle)
     _check_job_err_code(err)
Ejemplo n.º 9
0
    def wait_for_tools_in_guest(self, timeout=600):
        if self._vmtools_waited:
            return

        job_handle = vixlib.VixVM_WaitForToolsInGuest(self._vm_handle, timeout,
                                                      None, None)
        err = vixlib.VixJob_Wait(job_handle, vixlib.VIX_PROPERTY_NONE)
        vixlib.Vix_ReleaseHandle(job_handle)
        _check_job_err_code(err)
        self._vmtools_waited = True
Ejemplo n.º 10
0
    def reboot(self, soft=False):
        if soft:
            power_op = vixlib.VIX_VMPOWEROP_FROM_GUEST
        else:
            power_op = vixlib.VIX_VMPOWEROP_NORMAL

        job_handle = vixlib.VixVM_Reset(self._vm_handle, power_op, None, None)
        err = vixlib.VixJob_Wait(job_handle, vixlib.VIX_PROPERTY_NONE)
        vixlib.Vix_ReleaseHandle(job_handle)
        _check_job_err_code(err)
Ejemplo n.º 11
0
 def download_file_from_guest(self, guest_file_path, local_file_path):
     job_handle = vixlib.VixVM_CopyFileFromGuestToHost(
         self._vm_handle,
         guest_file_path,
         local_file_path,
         0,  # options
         vixlib.VIX_INVALID_HANDLE,  # prop list
         None,  # callback
         None)  # client data
     err = vixlib.VixJob_Wait(job_handle, vixlib.VIX_PROPERTY_NONE)
     vixlib.Vix_ReleaseHandle(job_handle)
     _check_job_err_code(err)
Ejemplo n.º 12
0
    def power_on(self, show_gui=True):
        if show_gui:
            options = vixlib.VIX_VMPOWEROP_LAUNCH_GUI
        else:
            options = vixlib.VIX_VMPOWEROP_NORMAL

        job_handle = vixlib.VixVM_PowerOn(self._vm_handle, options,
                                          vixlib.VIX_INVALID_HANDLE, None,
                                          None)
        err = vixlib.VixJob_Wait(job_handle, vixlib.VIX_PROPERTY_NONE)
        vixlib.Vix_ReleaseHandle(job_handle)
        _check_job_err_code(err)
Ejemplo n.º 13
0
    def delete(self, delete_disk_files=True):
        if delete_disk_files:
            delete_options = vixlib.VIX_VMDELETE_DISK_FILES
        else:
            delete_options = 0

        job_handle = vixlib.VixVM_Delete(self._vm_handle, delete_options, None,
                                         None)
        err = vixlib.VixJob_Wait(job_handle, vixlib.VIX_PROPERTY_NONE)
        vixlib.Vix_ReleaseHandle(job_handle)
        _check_job_err_code(err)

        self.close()
Ejemplo n.º 14
0
    def is_folder_exists_in_guest(self, guest_folder_path):
        is_exists = ctypes.c_bool()

        job_handle = vixlib.VixVM_DirectoryExistsInGuest(
            self._vm_handle,
            guest_folder_path,
            None,  # callback
            None)  # client data
        err = vixlib.VixJob_Wait(
            job_handle, vixlib.VIX_PROPERTY_JOB_RESULT_GUEST_OBJECT_EXISTS,
            ctypes.byref(is_exists), vixlib.VIX_PROPERTY_NONE)
        vixlib.Vix_ReleaseHandle(job_handle)
        _check_job_err_code(err)

        return is_exists.value
Ejemplo n.º 15
0
    def list_guest_processes(self):
        job_handle = vixlib.VixVM_ListProcessesInGuest(self._vm_handle, 0,
                                                       None, None)
        err = vixlib.VixJob_Wait(job_handle, vixlib.VIX_PROPERTY_NONE)

        try:
            _check_job_err_code(err)

            process_count = vixlib.VixJob_GetNumProperties(
                job_handle, vixlib.VIX_PROPERTY_JOB_RESULT_ITEM_NAME)
            processes = []
            for i in range(process_count):
                process_name = ctypes.c_char_p()
                owner = ctypes.c_char_p()
                cmdline = ctypes.c_char_p()
                pid = ctypes.c_uint64()
                is_debugged = ctypes.c_bool()
                start_time = ctypes.c_int()

                err = vixlib.VixJob_GetNthProperties(
                    job_handle, i, vixlib.VIX_PROPERTY_JOB_RESULT_ITEM_NAME,
                    ctypes.byref(process_name),
                    vixlib.VIX_PROPERTY_JOB_RESULT_PROCESS_ID,
                    ctypes.byref(pid),
                    vixlib.VIX_PROPERTY_JOB_RESULT_PROCESS_OWNER,
                    ctypes.byref(owner),
                    vixlib.VIX_PROPERTY_JOB_RESULT_PROCESS_COMMAND,
                    ctypes.byref(cmdline),
                    vixlib.VIX_PROPERTY_JOB_RESULT_PROCESS_BEING_DEBUGGED,
                    ctypes.byref(is_debugged),
                    vixlib.VIX_PROPERTY_JOB_RESULT_PROCESS_START_TIME,
                    ctypes.byref(start_time), vixlib.VIX_PROPERTY_NONE)

                processes.append(
                    dict(pid=pid.value,
                         name=process_name.value,
                         owner=owner.value,
                         cmdline=cmdline.value,
                         is_debugged=is_debugged.value,
                         start_time=start_time.value))

                vixlib.Vix_FreeBuffer(process_name)
                vixlib.Vix_FreeBuffer(owner)
                vixlib.Vix_FreeBuffer(cmdline)
        finally:
            vixlib.Vix_ReleaseHandle(job_handle)

        return processes
Ejemplo n.º 16
0
    def read_guest_variable_str(self,
                                variable_name,
                                variable_type=vixlib.VIX_VM_GUEST_VARIABLE,
                                timeout=30):
        if variable_type in (vixlib.VIX_VM_GUEST_VARIABLE,
                             vixlib.VIX_GUEST_ENVIRONMENT_VARIABLE):
            self.wait_for_tools_in_guest(timeout)

        job_handle = vixlib.VixVM_ReadVariable(self._vm_handle, variable_type,
                                               variable_name, 0, None, None)
        read_value = ctypes.c_char_p()
        err = vixlib.VixJob_Wait(
            job_handle, vixlib.VIX_PROPERTY_JOB_RESULT_VM_VARIABLE_STRING,
            ctypes.byref(read_value), vixlib.VIX_PROPERTY_NONE)
        vixlib.Vix_ReleaseHandle(job_handle)
        _check_job_err_code(err)

        value = read_value.value
        vixlib.Vix_FreeBuffer(read_value)

        return value
Ejemplo n.º 17
0
    def create_snapshot(self,
                        include_memory=False,
                        name=None,
                        description=None):
        if include_memory:
            options = vixlib.VIX_SNAPSHOT_INCLUDE_MEMORY
        else:
            options = 0

        job_handle = vixlib.VixVM_CreateSnapshot(self._vm_handle, name,
                                                 description, options,
                                                 vixlib.VIX_INVALID_HANDLE,
                                                 None, None)
        snapshot_handle = vixlib.VixHandle()
        err = vixlib.VixJob_Wait(job_handle,
                                 vixlib.VIX_PROPERTY_JOB_RESULT_HANDLE,
                                 ctypes.byref(snapshot_handle),
                                 vixlib.VIX_PROPERTY_NONE)
        vixlib.Vix_ReleaseHandle(job_handle)
        _check_job_err_code(err)

        return VixSnapshot(snapshot_handle)
Ejemplo n.º 18
0
 def close(self):
     if self._vm_handle:
         vixlib.Vix_ReleaseHandle(self._vm_handle)
         self._vm_handle = None
Ejemplo n.º 19
0
 def suspend(self):
     job_handle = vixlib.VixVM_Suspend(self._vm_handle, 0, None, None)
     err = vixlib.VixJob_Wait(job_handle, vixlib.VIX_PROPERTY_NONE)
     vixlib.Vix_ReleaseHandle(job_handle)
     _check_job_err_code(err)
Ejemplo n.º 20
0
 def close(self):
     if self._snapshot_handle:
         vixlib.Vix_ReleaseHandle(self._snapshot_handle)
         self._snapshot_handle = None