github.com/StackPointCloud/packer@v0.10.2-0.20180716202532-b28098e0f79b/builder/parallels/common/prltype.go (about)

     1  package common
     2  
     3  // Prltype is a Python scrypt allowin to send scancodes to the VM. It requires
     4  // the module "prlsdkapi", which is bundled to Parallels Virtualization SDK.
     5  const Prltype string = `
     6  import sys
     7  import prlsdkapi
     8  
     9  ##
    10  def main():
    11      if len(sys.argv) < 3:
    12         print "Usage: prltype VM_NAME SCANCODE..."
    13         sys.exit(1)
    14  
    15      vm_name = sys.argv[1]
    16      scancodes = sys.argv[2:]
    17  
    18      server = login()
    19      vm, vm_io = connect(server, vm_name)
    20  
    21      send(scancodes, vm, vm_io)
    22  
    23      disconnect(server, vm, vm_io)
    24  
    25  ##
    26  def login():
    27      prlsdkapi.prlsdk.InitializeSDK(prlsdkapi.prlsdk.consts.PAM_DESKTOP_MAC)
    28      server = prlsdkapi.Server()
    29      login_job=server.login_local()
    30      login_job.wait()
    31  
    32      return server
    33  
    34  ##
    35  def connect(server, vm_name):
    36      vm_list_job = server.get_vm_list()
    37      result = vm_list_job.wait()
    38  
    39      vm_list = [result.get_param_by_index(i) for i in range(result.get_params_count())]
    40      vm = [vm for vm in vm_list if vm.get_name() == vm_name]
    41  
    42      if not vm:
    43         vm_names = [vm.get_name() for vm in vm_list]
    44         raise Exception("%s: No such VM. Available VM's are:\n%s" % (vm_name, "\n".join(vm_names)))
    45  
    46      vm = vm[0]
    47  
    48      vm_io = prlsdkapi.VmIO()
    49      vm_io.connect_to_vm(vm).wait()
    50  
    51      return (vm, vm_io)
    52  
    53  ##
    54  def disconnect(server, vm, vm_io):
    55      if vm and vm_io:
    56          vm_io.disconnect_from_vm(vm)
    57  
    58      if server:
    59          server.logoff()
    60  
    61      prlsdkapi.deinit_sdk
    62  
    63  ##
    64  def send(scancodes, vm, vm_io):
    65      timeout = 10
    66      consts = prlsdkapi.prlsdk.consts
    67  
    68      for scancode in scancodes:
    69          c = int(scancode, 16)
    70          if (c < 128):
    71              vm_io.send_key_event(vm, (c,), consts.PKE_PRESS, timeout)
    72          else:
    73              vm_io.send_key_event(vm, (c - 128,) , consts.PKE_RELEASE, timeout)
    74  
    75  ##
    76  if __name__ == "__main__":
    77      main()
    78  `