diff options
author | iphydf <iphydf@users.noreply.github.com> | 2020-05-05 23:45:16 +0000 |
---|---|---|
committer | iphydf <iphydf@users.noreply.github.com> | 2020-05-06 10:59:47 +0100 |
commit | 8f4400b9b4a63dd5674ea6e7cf15486e90a01174 (patch) | |
tree | 9e7bb0982d306639d50bf7bf6a206022b109e955 /other/fun/bootstrap_node_info.py | |
parent | 3851cfb652f1b2237738a49c106e703f0270ceee (diff) |
cleanup: Make pylint and mypy happy with bootstrap_node_info.py.
Diffstat (limited to 'other/fun/bootstrap_node_info.py')
-rwxr-xr-x | other/fun/bootstrap_node_info.py | 119 |
1 files changed, 71 insertions, 48 deletions
diff --git a/other/fun/bootstrap_node_info.py b/other/fun/bootstrap_node_info.py index f4f5f73d..5cf09166 100755 --- a/other/fun/bootstrap_node_info.py +++ b/other/fun/bootstrap_node_info.py | |||
@@ -20,15 +20,16 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
21 | THE SOFTWARE. | 21 | THE SOFTWARE. |
22 | """ | 22 | """ |
23 | 23 | import socket | |
24 | from socket import * | ||
25 | import sys | 24 | import sys |
26 | 25 | ||
27 | if sys.version_info[0] == 2: | 26 | if sys.version_info[0] == 2: |
28 | print("This script requires Python 3+ in order to run.") | 27 | print("This script requires Python 3+ in order to run.") |
29 | sys.exit(1) | 28 | sys.exit(1) |
30 | 29 | ||
31 | def printHelp(): | 30 | |
31 | def print_help() -> None: | ||
32 | """Print program usage to stdout.""" | ||
32 | print("Usage: " + sys.argv[0] + " <ipv4|ipv6> <ip/hostname> <port>") | 33 | print("Usage: " + sys.argv[0] + " <ipv4|ipv6> <ip/hostname> <port>") |
33 | print(" Example: " + sys.argv[0] + " ipv4 192.210.149.121 33445") | 34 | print(" Example: " + sys.argv[0] + " ipv4 192.210.149.121 33445") |
34 | print(" Example: " + sys.argv[0] + " ipv4 23.226.230.47 33445") | 35 | print(" Example: " + sys.argv[0] + " ipv4 23.226.230.47 33445") |
@@ -42,57 +43,79 @@ def printHelp(): | |||
42 | print(" 2 - didn't receive any reply from a node") | 43 | print(" 2 - didn't receive any reply from a node") |
43 | print(" 3 - received a malformed/unexpected reply") | 44 | print(" 3 - received a malformed/unexpected reply") |
44 | 45 | ||
45 | if len(sys.argv) != 4: | ||
46 | printHelp() | ||
47 | sys.exit(1) | ||
48 | 46 | ||
49 | protocol = sys.argv[1] | 47 | # https://github.com/irungentoo/toxcore/blob/4940c4c62b6014d1f0586aa6aca7bf6e4ecfcf29/toxcore/network.h#L128 |
50 | ip = sys.argv[2] | 48 | INFO_PACKET_ID = b"\xF0" |
51 | port = int(sys.argv[3]) | 49 | # https://github.com/irungentoo/toxcore/blob/881b2d900d1998981fb6b9938ec66012d049635f/other/bootstrap_node_packets.c#L28 |
52 | 50 | INFO_REQUEST_PACKET_LENGTH = 78 | |
53 | INFO_PACKET_ID = b"\xF0" # https://github.com/irungentoo/toxcore/blob/4940c4c62b6014d1f0586aa6aca7bf6e4ecfcf29/toxcore/network.h#L128 | 51 | # first byte is INFO_REQUEST_ID, other bytes don't matter as long as reqest's |
54 | INFO_REQUEST_PACKET_LENGTH = 78 # https://github.com/irungentoo/toxcore/blob/881b2d900d1998981fb6b9938ec66012d049635f/other/bootstrap_node_packets.c#L28 | 52 | # length matches INFO_REQUEST_LENGTH |
55 | # first byte is INFO_REQUEST_ID, other bytes don't matter as long as reqest's length matches INFO_REQUEST_LENGTH | 53 | INFO_REQUEST_PACKET = INFO_PACKET_ID + ( |
56 | INFO_REQUEST_PACKET = INFO_PACKET_ID + ( b"0" * (INFO_REQUEST_PACKET_LENGTH - len(INFO_PACKET_ID)) ) | 54 | b"0" * (INFO_REQUEST_PACKET_LENGTH - len(INFO_PACKET_ID))) |
57 | 55 | ||
58 | PACKET_ID_LENGTH = len(INFO_PACKET_ID) | 56 | PACKET_ID_LENGTH = len(INFO_PACKET_ID) |
59 | VERSION_LENGTH = 4 # https://github.com/irungentoo/toxcore/blob/881b2d900d1998981fb6b9938ec66012d049635f/other/bootstrap_node_packets.c#L44 | 57 | # https://github.com/irungentoo/toxcore/blob/881b2d900d1998981fb6b9938ec66012d049635f/other/bootstrap_node_packets.c#L44 |
60 | MAX_MOTD_LENGTH = 256 # https://github.com/irungentoo/toxcore/blob/881b2d900d1998981fb6b9938ec66012d049635f/other/bootstrap_node_packets.c#L26 | 58 | VERSION_LENGTH = 4 |
59 | # https://github.com/irungentoo/toxcore/blob/881b2d900d1998981fb6b9938ec66012d049635f/other/bootstrap_node_packets.c#L26 | ||
60 | MAX_MOTD_LENGTH = 256 | ||
61 | 61 | ||
62 | MAX_INFO_RESPONSE_PACKET_LENGTH = PACKET_ID_LENGTH + VERSION_LENGTH + MAX_MOTD_LENGTH | 62 | MAX_INFO_RESPONSE_PACKET_LENGTH = PACKET_ID_LENGTH + VERSION_LENGTH + MAX_MOTD_LENGTH |
63 | 63 | ||
64 | SOCK_TIMEOUT_SECONDS = 1.0 | 64 | SOCK_TIMEOUT_SECONDS = 1.0 |
65 | 65 | ||
66 | sock = None | ||
67 | |||
68 | if protocol == "ipv4": | ||
69 | sock = socket(AF_INET, SOCK_DGRAM) | ||
70 | elif protocol == "ipv6": | ||
71 | sock = socket(AF_INET6, SOCK_DGRAM) | ||
72 | else: | ||
73 | print("Invalid first argument") | ||
74 | printHelp() | ||
75 | sys.exit(1) | ||
76 | |||
77 | sock.sendto(INFO_REQUEST_PACKET, (ip, port)) | ||
78 | |||
79 | sock.settimeout(SOCK_TIMEOUT_SECONDS) | ||
80 | |||
81 | try: | ||
82 | data, addr = sock.recvfrom(MAX_INFO_RESPONSE_PACKET_LENGTH) | ||
83 | except timeout: | ||
84 | print("The DHT bootstrap node didn't reply in " + str(SOCK_TIMEOUT_SECONDS) + " sec.") | ||
85 | print("The likely reason for that is that the DHT bootstrap node is either offline or has no info set.") | ||
86 | sys.exit(2) | ||
87 | |||
88 | packetId = data[:PACKET_ID_LENGTH] | ||
89 | if packetId != INFO_PACKET_ID: | ||
90 | print("Bad response, first byte should be", INFO_PACKET_ID, "but got", packetId, "(", data, ")") | ||
91 | print("Are you sure that you are pointing the script at a Tox DHT bootstrap node and that the script is up to date?") | ||
92 | sys.exit(3) | ||
93 | 66 | ||
94 | version = int.from_bytes(data[PACKET_ID_LENGTH:PACKET_ID_LENGTH + VERSION_LENGTH], byteorder='big') | 67 | def main(protocol: str, host: str, port: int) -> None: |
95 | motd = data[PACKET_ID_LENGTH + VERSION_LENGTH:].decode("utf-8") | 68 | """Call the bootstrap node info RPC and output the response.""" |
96 | print("Version: " + str(version)) | 69 | if protocol == "ipv4": |
97 | print("MOTD: " + motd) | 70 | sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) |
98 | sys.exit(0) | 71 | elif protocol == "ipv6": |
72 | sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) | ||
73 | else: | ||
74 | print("Invalid first argument") | ||
75 | print_help() | ||
76 | sys.exit(1) | ||
77 | |||
78 | sock.sendto(INFO_REQUEST_PACKET, (host, port)) | ||
79 | |||
80 | sock.settimeout(SOCK_TIMEOUT_SECONDS) | ||
81 | |||
82 | try: | ||
83 | data, _ = sock.recvfrom(MAX_INFO_RESPONSE_PACKET_LENGTH) | ||
84 | except socket.timeout: | ||
85 | print("The DHT bootstrap node didn't reply in " + | ||
86 | str(SOCK_TIMEOUT_SECONDS) + " sec.") | ||
87 | print("The likely reason for that is that the DHT bootstrap node " | ||
88 | "is either offline or has no info set.") | ||
89 | sys.exit(2) | ||
90 | |||
91 | packet_id = data[:PACKET_ID_LENGTH] | ||
92 | if packet_id != INFO_PACKET_ID: | ||
93 | print("Bad response, first byte should be {info_packet_id!r}" | ||
94 | " but got {packet_id!r}({data!r})".format( | ||
95 | info_packet_id=INFO_PACKET_ID, | ||
96 | packet_id=packet_id, | ||
97 | data=data, | ||
98 | )) | ||
99 | print("Are you sure that you are pointing the script at a Tox " | ||
100 | "DHT bootstrap node and that the script is up to date?") | ||
101 | sys.exit(3) | ||
102 | |||
103 | version = int.from_bytes(data[PACKET_ID_LENGTH:PACKET_ID_LENGTH + | ||
104 | VERSION_LENGTH], | ||
105 | byteorder="big") | ||
106 | motd = data[PACKET_ID_LENGTH + VERSION_LENGTH:].decode("utf-8") | ||
107 | print("Version: " + str(version)) | ||
108 | print("MOTD: " + motd) | ||
109 | sys.exit(0) | ||
110 | |||
111 | |||
112 | if __name__ == "__main__": | ||
113 | if len(sys.argv) != 4: | ||
114 | print_help() | ||
115 | sys.exit(1) | ||
116 | |||
117 | main( | ||
118 | protocol=sys.argv[1], | ||
119 | host=sys.argv[2], | ||
120 | port=int(sys.argv[3]), | ||
121 | ) | ||