def connect(self): my_hostname = socket.gethostname() my_ip = socket.gethostbyname(my_hostname) self.socket = None vista_info = socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM) af, socktype, proto, canonname, sa = vista_info[0] try: self.socket = socket.socket(af, socktype, proto) self.socket.connect(sa) except socket.error as message: if self.socket: self.socket.close() self.socket = None raise VistaException('Unable to connect: ' + message) params = [ RpcParameter(RpcParameter.LITERAL, my_ip), RpcParameter(RpcParameter.LITERAL, my_hostname) ] rpc = VistaRpc.prepare('HELLO', params) try: response = self.execute(rpc) except: raise VistaException('No VistA listener at ' + self.host + ', port ' + self.port) if response != 'accept': self.disconnect() raise VistaException('Connection not accepted: ' + response) self.is_connected = True
def test_connect_rpc(self): expected = "[XWB]10304\x0ATCPConnect50013192.168.1.107f00010f0022LAPTOP2.v11.med.va.govf\x04" params = [ RpcParameter(RpcParameter.LITERAL, '192.168.1.107'), RpcParameter(RpcParameter.LITERAL, 'LAPTOP2.v11.med.va.gov') ] actual = VistaRpc.prepare('HELLO', params) self.assertEqual(expected, actual)
def test_cipher_pad(self): param = RpcParameter(RpcParameter.LITERAL, "SomeParam") self.assertEqual(20, len(param._RpcParameter__cipher_pad())) rownum = 0 for row in param._RpcParameter__cipher_pad(): self.assertEqual(94, len(row)) colnum = 0 for col in row: self.assertEqual(self.ASCII_PAD[rownum][colnum], ord(col)) colnum += 1 rownum += 1
def test_init(self): param = RpcParameter(RpcParameter.LITERAL, 'SomeParam') self.assertEqual(RpcParameter.LITERAL, param.type) self.assertEqual('SomeParam', param.value) param = RpcParameter(RpcParameter.ENCRYPTED, 'lgs413') self.assertEqual(RpcParameter.LITERAL, param.type) self.assertTrue(re.match(r"[\x20-\x7E]{8}", param.value) is not None) param = RpcParameter(RpcParameter.ENCRYPTED, 'lgs413', [0, 1]) self.assertEqual(RpcParameter.LITERAL, param.type) self.assertEqual(' CTgF#b!', param.value)
def test_decrypt(self): expected = "lgs413" actual = RpcParameter.decrypt(" CTgF#b!") self.assertEqual(expected, actual) expected = "lgs413" actual = RpcParameter.decrypt("!S;|\\M&3") self.assertEqual(expected, actual) expected = "lgs413" actual = RpcParameter.decrypt(",P2GzBT1") self.assertEqual(expected, actual)
def test_encrypt(self): param = RpcParameter(RpcParameter.ENCRYPTED, 'SomeParam') expected = " CTgF#b!" actual = param.encrypt('lgs413', [0, 1]) self.assertEqual(expected, actual) expected = "!S;|\\M&3" actual = param.encrypt('lgs413', [1, 19]) self.assertEqual(expected, actual) expected = ",P2GzBT1" actual = param.encrypt('lgs413', [12, 17]) self.assertEqual(expected, actual)
def test_encrypt(self): param = RpcParameter(RpcParameter.ENCRYPTED, 'SomeParam') expected = " CTgF#b!" actual = param.encrypt('lgs413', [0,1]) self.assertEqual(expected, actual) expected = "!S;|\\M&3" actual = param.encrypt('lgs413', [1,19]) self.assertEqual(expected, actual) expected = ",P2GzBT1" actual = param.encrypt('lgs413', [12,17]) self.assertEqual(expected, actual)
def test_list_to_string(self): lst = [('"FILE"', '200'), ('"FIELDS"', '@;.01;2;4;5;.141;8;9;11;29'), ('"FLAGS"', 'IP'), ('"MAX"', '1'), ('"FROM"', '545'), ('"XREF"', '#')] expected = "006\"FILE\"003200t008\"FIELDS\"026@;.01;2;4;5;.141;8;9;11;29t007\"FLAGS\"002IPt005\"MAX\"0011t006\"FROM\"003545t006\"XREF\"001#f" actual = RpcParameter.list_to_string(lst) self.assertEqual(expected, actual)
def set_context(self, cxn, context): param = [RpcParameter(RpcParameter.ENCRYPTED, context)] rpc = VistaRpc.prepare('XWB CREATE CONTEXT', param) response = cxn.execute(rpc) if response != '1': raise VistaException(response) self.context = context
def test_list_to_string(self): lst = [ ('"FILE"', '200'), ('"FIELDS"', '@;.01;2;4;5;.141;8;9;11;29'), ('"FLAGS"', 'IP'), ('"MAX"', '1'), ('"FROM"', '545'), ('"XREF"', '#') ] expected = "006\"FILE\"003200t008\"FIELDS\"026@;.01;2;4;5;.141;8;9;11;29t007\"FLAGS\"002IPt005\"MAX\"0011t006\"FROM\"003545t006\"XREF\"001#f" actual = RpcParameter.list_to_string(lst) self.assertEqual(expected, actual)
def prepare_param_str(params): param_str = '5' if params: for param in params: if param.type == RpcParameter.LITERAL: param_str += '0' + VistaUtils.str_pack(param.value, VistaRpc.COUNT_WIDTH) + 'f' elif param.type == RpcParameter.REFERENCE: param_str += '1' + VistaUtils.str_pack(param.value, VistaRpc.COUNT_WIDTH) + 'f' elif param.type == RpcParameter.LIST: param_str += '2' + RpcParameter.list_to_string(param.value) else: raise VistaException('Invalid param type') if param_str == '5' : param_str += '4f' return param_str
def prepare_param_str(params): param_str = '5' if params: for param in params: if param.type == RpcParameter.LITERAL: param_str += '0' + VistaUtils.str_pack( param.value, VistaRpc.COUNT_WIDTH) + 'f' elif param.type == RpcParameter.REFERENCE: param_str += '1' + VistaUtils.str_pack( param.value, VistaRpc.COUNT_WIDTH) + 'f' elif param.type == RpcParameter.LIST: param_str += '2' + RpcParameter.list_to_string(param.value) else: raise VistaException('Invalid param type') if param_str == '5': param_str += '4f' return param_str
def login(self, cxn, access_code, verify_code, context=None): rpc = VistaRpc.prepare('XUS SIGNON SETUP') response = cxn.execute(rpc) if response is None: raise VistaException('Unable to setup login') param = [RpcParameter(RpcParameter.ENCRYPTED, access_code + ';' + verify_code)] rpc = VistaRpc.prepare('XUS AV CODE', param) response = cxn.execute(rpc) if response is None: raise VistaException('No response to login request') greeting = self.load(response) self.access_code = access_code self.verify_code = verify_code if context is not None: self.set_context(cxn, context) return greeting
def __prepare(self): self.__prepare_param_list() params = RpcParameter(RpcParameter.LIST, self.param_list) self.rpc = VistaRpc.prepare('DDR LISTER', [params])
def test_login_rpc(self): expected = "[XWB]11302\x051.108\x0BXUS AV CODE50017.r v11k3}!r&sAgP$f\x04" param = RpcParameter(RpcParameter.ENCRYPTED, 'ijr773;Akiba12.', [14,4]) actual = VistaRpc.prepare('XUS AV CODE', [param]) self.assertEqual(expected, actual)
def test_set_context_rpc(self): expected = "[XWB]11302\x051.108\x12XWB CREATE CONTEXT50019(&y?#jy<?x:=?#68y].f\x04" param = RpcParameter(RpcParameter.ENCRYPTED, 'OR CPRS GUI CHART', [8,14]) actual = VistaRpc.prepare('XWB CREATE CONTEXT', [param]) self.assertEqual(expected, actual)
def test_get_variable_value_rpc(self): arg = "$P($G(^DIC(3.1,1362,0)),U,1)" expected = "[XWB]11302\x051.108\x16XWB GET VARIABLE VALUE51028$P($G(^DIC(3.1,1362,0)),U,1)f\x04" param = RpcParameter(RpcParameter.REFERENCE, arg) actual = VistaRpc.prepare('XWB GET VARIABLE VALUE', [param]) self.assertEqual(expected, actual)