diff options
| author | Joseph Henry <[email protected]> | 2021-05-02 21:30:21 -0700 |
|---|---|---|
| committer | Joseph Henry <[email protected]> | 2021-05-02 21:30:21 -0700 |
| commit | 6a77f0092fdc692a0680fb5d1b1f40ccc57a129f (patch) | |
| tree | d60491537d44ce764d0b51e598839471a9d0ec4a /test | |
| parent | 6f42338f6e56a8d9410eb5ac95097828dedb9a1a (diff) | |
Update Python bindings to 1.4.0 API (WIP)
Diffstat (limited to 'test')
| -rw-r--r-- | test/selftest.py | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/test/selftest.py b/test/selftest.py new file mode 100644 index 0000000..8236363 --- /dev/null +++ b/test/selftest.py @@ -0,0 +1,133 @@ +'''Example low-level socket usage''' + +import time +import sys + +import libzt + +def print_usage(): + '''print help''' + print( + "\nUsage: <server|client> <storage_path> <net_id> <remote_ip> <remote_port>\n" + ) + print("Ex: python3 example.py server . 0123456789abcdef 8080") + print("Ex: python3 example.py client . 0123456789abcdef 192.168.22.1 8080\n") + if len(sys.argv) < 5: + print("Too few arguments") + if len(sys.argv) > 6: + print("Too many arguments") + sys.exit(0) + +# +# (Optional) Event handler +# +def on_zerotier_event(event_code, id): + if event_code == libzt.ZTS_EVENT_NODE_ONLINE: + print("ZTS_EVENT_NODE_ONLINE (" + str(event_code) + ") : " + hex(id)) + if event_code == libzt.ZTS_EVENT_NODE_OFFLINE: + print("ZTS_EVENT_NODE_OFFLINE (" + str(event_code) + ") : " + hex(id)) + if event_code == libzt.ZTS_EVENT_NETWORK_READY_IP4: + print("ZTS_EVENT_NETWORK_READY_IP4 (" + str(event_code) + ") : " + hex(id)) + if event_code == libzt.ZTS_EVENT_NETWORK_READY_IP6: + print("ZTS_EVENT_NETWORK_READY_IP6 (" + str(event_code) + ") : " + hex(id)) + if event_code == libzt.ZTS_EVENT_PEER_DIRECT: + print("ZTS_EVENT_PEER_DIRECT (" + str(event_code) + ") : " + hex(id)) + if event_code == libzt.ZTS_EVENT_PEER_RELAY: + print("ZTS_EVENT_PEER_RELAY (" + str(event_code) + ") : " + hex(id)) + +# +# Main +# +def main(): + mode = None # client|server + storage_path = "." # Where identity files are stored + net_id = 0 # Network to join + remote_ip = None # ZeroTier IP of remote node + remote_port = 8080 # ZeroTier port your app logic may use + + if len(sys.argv) < 5 or len(sys.argv) > 6: + print_usage() + if sys.argv[1] == "server" and len(sys.argv) == 5: + mode = sys.argv[1] + storage_path = sys.argv[2] + net_id = int(sys.argv[3], 16) + remote_port = int(sys.argv[4]) + if sys.argv[1] == "client" and len(sys.argv) == 6: + mode = sys.argv[1] + storage_path = sys.argv[2] + net_id = int(sys.argv[3], 16) + remote_ip = sys.argv[4] + remote_port = int(sys.argv[5]) + if mode is None: + print_usage() + print("mode = ", mode) + print("storage_path = ", storage_path) + print("net_id = ", net_id) + print("remote_ip = ", remote_ip) + print("remote_port = ", remote_port) + + # + # Node initialization and start + # + print("Starting ZeroTier...") + + n = libzt.ZeroTierNode() + n.init_set_event_handler(on_zerotier_event) # Optional + n.init_from_storage(storage_path) # Optional + n.init_set_port(9994) # Optional + n.node_start() + + print("Waiting for node to come online...") + while not n.node_is_online(): + time.sleep(1) + print("Joining network:", hex(net_id)) + n.net_join(net_id) + while not n.net_transport_is_ready(net_id): + time.sleep(1) + print("Joined network") + + # + # Example server + # + if mode == "server": + print("Starting server...") + serv = libzt.socket(libzt.ZTS_AF_INET, libzt.ZTS_SOCK_STREAM, 0) + try: + # serv.setblocking(True) + serv.bind(("0.0.0.0", remote_port)) + serv.listen(5) + conn, addr = serv.accept() + print("Accepted connection from: ", addr) + data = conn.recv(4096) + if data: + print("recv: ", data) + print("send: ", data) + sent_bytes = conn.send(data) # echo back to the server + print("sent: " + str(sent_bytes) + " byte(s)") + conn.close() + print("client disconnected") + except Exception as ex: + print(ex) + print("errno=", libzt.errno()) # See include/ZeroTierSockets.h for codes + + # + # Example client + # + if mode == "client": + print("Starting client...") + client = libzt.socket(libzt.ZTS_AF_INET, libzt.ZTS_SOCK_STREAM, 0) + try: + print("connecting...") + client.connect((remote_ip, remote_port)) + data = "Hello, world!" + print("send: ", data) + sent_bytes = client.send(data.encode('utf-8')) + print("sent: " + str(sent_bytes) + " byte(s)") + data = client.recv(1024) + print("recv: ", repr(data)) + except Exception as ex: + print(ex) + print("errno=", libzt.errno()) + +if __name__ == "__main__": + main() |
