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
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)
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
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)
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
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
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)
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)
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
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)
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)
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)
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()
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
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
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
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)
def close(self): if self._vm_handle: vixlib.Vix_ReleaseHandle(self._vm_handle) self._vm_handle = None
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)
def close(self): if self._snapshot_handle: vixlib.Vix_ReleaseHandle(self._snapshot_handle) self._snapshot_handle = None