diff --git a/Bindings/python/.DS_Store b/Bindings/python/.DS_Store index d364a57..14f75da 100644 Binary files a/Bindings/python/.DS_Store and b/Bindings/python/.DS_Store differ diff --git a/Bindings/python/library.py b/Bindings/python/library.py new file mode 100644 index 0000000..02edf3b --- /dev/null +++ b/Bindings/python/library.py @@ -0,0 +1,102 @@ +import ctypes +from ctypes import Structure, c_char_p, c_int, cdll +from dataclasses import dataclass, astuple +import time +import json +from urllib.parse import urlparse +from typing import List +import subprocess +import uuid +import dacite +import os +import sqlalchemy +import dataclasses +from typing import Union +import schedule +import threading +import requests + +p2prc = ctypes.CDLL("SharedObjects/p2prc.so") + +p2prc.Init("") + +# Start running schedule +schedule.run_pending() + +# # Create Sqlite database to track processes +# engine=sqlalchemy.create_engine(f'sqlite:///homeserver.db') + +# Global variable +# A global variable will be populated on runtime. +# It is read from P2PRC directly or from a local +# database. + +# Node information +# Generated using: https://jsonformatter.org/json-to-python +@dataclass +class Node: + Name: str + MachineUsername: str + IPV4: str + IPV6: str + Latency: int + Download: int + Upload: int + ServerPort: str + BareMetalSSHPort: str + NAT: str + EscapeImplementation: str + ProxyServer: str + UnSafeMode: bool + PublicKey: str + CustomInformation: str + +@dataclass +class IPAddress: + ip_address: List[Node] + + +# ---------------------------------------------------------------------------- +# ----------------------------- Helper functions ----------------------------- +# ---------------------------------------------------------------------------- + +def StartServer(): + # Starting P2PRC as a server mode + p2prc.Server() + +# Class to create string to pass as string function +# parameter to shared object file +class go_string(Structure): + _fields_ = [ + ("p", c_char_p), + ("n", c_int)] + +# Ensuring local port can escape NAT and responds +# with the public ip and port no. +# If the domain name is specified then the public IP +# can be used as an A name entry. +def P2PRCMapPort(port="",domainname="",serveraddress=""): + port = go_string(c_char_p(port.encode('utf-8')), len(port)) + domainname = go_string(c_char_p(domainname.encode('utf-8')), len(domainname)) + serveraddress = go_string(c_char_p(serveraddress.encode('utf-8')), len(serveraddress)) + + # Defining the response type of the GoLang function + # function + p2prc.MapPort.restype = c_char_p + # Calling the Go function + address = p2prc.MapPort(port,domainname,serveraddress) + res = str(address).strip("b'") + return res + +# Lists all avaliable nodes in the network +def ListNodes(): + # View IP Table information + p2prc.ViewIPTable.restype = c_char_p + ipTable = p2prc.ViewIPTable() + # View IP Table as + ipTableObject = json.loads((str(ipTable).strip("b'"))) + dat: IPAddress = dacite.from_dict(IPAddress,ipTableObject) + return dat + + + diff --git a/Bindings/python/p2prc.py b/Bindings/python/p2prc.py deleted file mode 100644 index 07376d2..0000000 --- a/Bindings/python/p2prc.py +++ /dev/null @@ -1,11 +0,0 @@ -import ctypes - -p2prc = ctypes.CDLL("SharedOBjects/p2prc.so") - -p2prc.Init("") - -def StartServer(): - # Starting P2PRC as a server mode - p2prc.Server() - for _ in iter(int, 1): - pass \ No newline at end of file diff --git a/Bindings/python/requirements.txt b/Bindings/python/requirements.txt new file mode 100644 index 0000000..c163bff --- /dev/null +++ b/Bindings/python/requirements.txt @@ -0,0 +1,4 @@ +dacite +schedule +sqlalchemy +requests diff --git a/Bindings/python/test.py b/Bindings/python/test.py new file mode 100644 index 0000000..30157a2 --- /dev/null +++ b/Bindings/python/test.py @@ -0,0 +1,7 @@ +from library import * + + +if __name__ == "__main__": + P2PRCNodes = ListNodes() + # Print nodes in the network + print(P2PRCNodes)