summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriphydf <iphydf@users.noreply.github.com>2020-05-05 23:45:16 +0000
committeriphydf <iphydf@users.noreply.github.com>2020-05-06 10:59:47 +0100
commit8f4400b9b4a63dd5674ea6e7cf15486e90a01174 (patch)
tree9e7bb0982d306639d50bf7bf6a206022b109e955
parent3851cfb652f1b2237738a49c106e703f0270ceee (diff)
cleanup: Make pylint and mypy happy with bootstrap_node_info.py.
-rwxr-xr-xother/fun/bootstrap_node_info.py119
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,
20OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21THE SOFTWARE. 21THE SOFTWARE.
22""" 22"""
23 23import socket
24from socket import *
25import sys 24import sys
26 25
27if sys.version_info[0] == 2: 26if 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
31def printHelp(): 30
31def 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
45if len(sys.argv) != 4:
46 printHelp()
47 sys.exit(1)
48 46
49protocol = sys.argv[1] 47# https://github.com/irungentoo/toxcore/blob/4940c4c62b6014d1f0586aa6aca7bf6e4ecfcf29/toxcore/network.h#L128
50ip = sys.argv[2] 48INFO_PACKET_ID = b"\xF0"
51port = int(sys.argv[3]) 49# https://github.com/irungentoo/toxcore/blob/881b2d900d1998981fb6b9938ec66012d049635f/other/bootstrap_node_packets.c#L28
52 50INFO_REQUEST_PACKET_LENGTH = 78
53INFO_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
54INFO_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 53INFO_REQUEST_PACKET = INFO_PACKET_ID + (
56INFO_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
58PACKET_ID_LENGTH = len(INFO_PACKET_ID) 56PACKET_ID_LENGTH = len(INFO_PACKET_ID)
59VERSION_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
60MAX_MOTD_LENGTH = 256 # https://github.com/irungentoo/toxcore/blob/881b2d900d1998981fb6b9938ec66012d049635f/other/bootstrap_node_packets.c#L26 58VERSION_LENGTH = 4
59# https://github.com/irungentoo/toxcore/blob/881b2d900d1998981fb6b9938ec66012d049635f/other/bootstrap_node_packets.c#L26
60MAX_MOTD_LENGTH = 256
61 61
62MAX_INFO_RESPONSE_PACKET_LENGTH = PACKET_ID_LENGTH + VERSION_LENGTH + MAX_MOTD_LENGTH 62MAX_INFO_RESPONSE_PACKET_LENGTH = PACKET_ID_LENGTH + VERSION_LENGTH + MAX_MOTD_LENGTH
63 63
64SOCK_TIMEOUT_SECONDS = 1.0 64SOCK_TIMEOUT_SECONDS = 1.0
65 65
66sock = None
67
68if protocol == "ipv4":
69 sock = socket(AF_INET, SOCK_DGRAM)
70elif protocol == "ipv6":
71 sock = socket(AF_INET6, SOCK_DGRAM)
72else:
73 print("Invalid first argument")
74 printHelp()
75 sys.exit(1)
76
77sock.sendto(INFO_REQUEST_PACKET, (ip, port))
78
79sock.settimeout(SOCK_TIMEOUT_SECONDS)
80
81try:
82 data, addr = sock.recvfrom(MAX_INFO_RESPONSE_PACKET_LENGTH)
83except 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
88packetId = data[:PACKET_ID_LENGTH]
89if 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
94version = int.from_bytes(data[PACKET_ID_LENGTH:PACKET_ID_LENGTH + VERSION_LENGTH], byteorder='big') 67def main(protocol: str, host: str, port: int) -> None:
95motd = data[PACKET_ID_LENGTH + VERSION_LENGTH:].decode("utf-8") 68 """Call the bootstrap node info RPC and output the response."""
96print("Version: " + str(version)) 69 if protocol == "ipv4":
97print("MOTD: " + motd) 70 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
98sys.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
112if __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 )