blob: 141bd707f7abf7793006c8e969b3384334aa813e [file] [log] [blame]
Courtney Cavin4ec6c072015-12-01 14:57:49 -08001#!/usr/bin/env python2.7
2
3import ctypes
4import collections
5
6from ctypes import CDLL, CFUNCTYPE, POINTER, cast, py_object
7from ctypes import c_char_p, c_void_p, c_int, pointer
8
9_qrtr = CDLL("./libqrtr.so")
10
11class qrtr:
12 Result = collections.namedtuple('Result', ['service', 'instance', 'addr'])
13 _cbtype = CFUNCTYPE(None, c_void_p, c_int, c_int, c_int, c_int)
14 def __init__(self, port=0):
15 self.sock = _qrtr.qrtr_open(port)
16 if self.sock < 0:
17 raise RuntimeError("unable to open qrtr socket")
18 self.service = None
Bjorn Anderssonff29fb12017-06-06 12:42:04 -070019 self._qrtr = _qrtr
Courtney Cavin4ec6c072015-12-01 14:57:49 -080020
21 def __del__(self):
Bjorn Anderssonff29fb12017-06-06 12:42:04 -070022 self._qrtr.qrtr_close(self.sock)
Courtney Cavin4ec6c072015-12-01 14:57:49 -080023
24 def _lookup_list_add(self, ptr, srv, instance, node, port):
25 res = qrtr.Result(srv, instance, (node, port))
26 cast(ptr, POINTER(py_object)).contents.value.append(res)
Bjorn Anderssonff29fb12017-06-06 12:42:04 -070027
Courtney Cavin4ec6c072015-12-01 14:57:49 -080028 def lookup(self, srv, instance=0, ifilter=0):
29 results = []
30 err = _qrtr.qrtr_lookup(self.sock, srv, instance, ifilter,
31 qrtr._cbtype(self._lookup_list_add), cast(pointer(py_object(results)), c_void_p))
32 if err:
33 raise RuntimeError("query failed")
Bjorn Anderssonff29fb12017-06-06 12:42:04 -070034 return results
Courtney Cavin4ec6c072015-12-01 14:57:49 -080035
Bjorn Anderssonff29fb12017-06-06 12:42:04 -070036 def publish(self, service, version, instance):
37 err = _qrtr.qrtr_publish(self.sock, service, version, instance)
Courtney Cavin4ec6c072015-12-01 14:57:49 -080038 if err:
39 raise RuntimeError("publish failed")
Bjorn Anderssonff29fb12017-06-06 12:42:04 -070040 self.service = (service, version, instance)
41
42 def new_server(self, service, version, instance):
43 err = _qrtr.qrtr_new_server(self.sock, service, version, instance)
44 if err:
45 raise RuntimeError("new_server failed")
46 self.service = (service, version, instance)
47
48 return self.service
49
50 def remove_server(self, service):
51 err = _qrtr.qrtr_remove_server(self.sock, *service)
52 if err:
53 raise RuntimeError("remove_server failed")
54 self.service = None
Courtney Cavin4ec6c072015-12-01 14:57:49 -080055
56 def send(self, addr, data):
57 node, port = addr
58 n = _qrtr.qrtr_sendto(self.sock, node, port, c_char_p(data), len(data))
59 if n:
60 raise RuntimeError("sendto failed")
61
62 def recv(self, sz=65536):
63 buf = ctypes.create_string_buffer(sz)
64 n = _qrtr.qrtr_recv(self.sock, c_char_p(ctypes.addressof(buf)), sz)
65 if n <= 0:
66 raise RuntimeError("recv failed")
67 return buf[0:n]
68
69 def recvfrom(self, sz=65536):
70 node = ctypes.c_int()
71 port = ctypes.c_int()
72 buf = ctypes.create_string_buffer(sz)
73 n = _qrtr.qrtr_recvfrom(self.sock, c_char_p(ctypes.addressof(buf)),
74 ctypes.byref(node), ctypes.byref(port))
75 if n <= 0:
76 raise RuntimeError("recvfrom failed")
77 return (buf[0:n], (node.value, port.value))
78
79 def poll(self, tout=0):
80 return _qrtr.qrtr_poll(self.sock, tout)
81
82if __name__ == "__main__":
83 svcs = qrtr().lookup(15) # 15 is the test service
84 print " service instance addr"
85 for svc in svcs:
86 print "% 8d % 8d %s" % (svc.service, svc.instance, svc.addr)