From 562e763fbd9c9fedf7af9954eba90f035aee2da0 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Sun, 14 Jan 2024 20:03:16 +0100 Subject: [PATCH] tools: add server query client example --- tools/query.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 tools/query.py diff --git a/tools/query.py b/tools/query.py new file mode 100644 index 000000000..7f976a038 --- /dev/null +++ b/tools/query.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 + +# simple client for server status queries + +import sys, os, socket, struct, time + +DEFAULT_PORT = 27100 +QUERY_MAGIC = b"PDQM\x01" +MAX_WAIT = 5.0 + +def checksum(data): + chk = 1 + for b in data[:-2]: + chk = (chk + b) % 65521 + return chk + +def eat_string(data): + strlen = struct.unpack_from("[:]") + sys.exit(1) + +addrstr = sys.argv[1].strip() +host = addrstr +port = None + +if addrstr.startswith('[') and ("]:" in addrstr): + # [ipv6]:port + host, sep, port = addrstr.rpartition(':') +elif addrstr.count(':') == 1: + # possibly ipv4:port or hostname:port + host, sep, port = addrstr.rpartition(':') + +host = host.strip('[]') + +if port != None: + port = int(port) +else: + port = DEFAULT_PORT + +sockfam = socket.AF_INET +if ':' in host: + sockfam = socket.AF_INET6 + +sock = socket.socket(sockfam, socket.SOCK_DGRAM) +sock.settimeout(MAX_WAIT) + +# send query magic to server +sock.sendto(QUERY_MAGIC, (host, port)) + +# wait for response +data = sock.recv(256) + +# check magic +if data[:5] != QUERY_MAGIC: + print("invalid magic: expected", QUERY_MAGIC, "got", data[:5]) + sys.exit(1) + +# check checksum +chkremote = struct.unpack(" len(data): + print("invalid size: expected", len(data), "got", datalen) + sys.exit(1) + +data = data[7:datalen - 2] + +# unpack fixed size part of the response +msgdata = struct.unpack_from("