From 669f3c58646721e4cbda2b53412d5b7b27b70705 Mon Sep 17 00:00:00 2001 From: Yannik Enss Date: Fri, 28 May 2021 13:17:53 +0200 Subject: [PATCH] add check_factorio --- check_factorio.py | 89 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100755 check_factorio.py diff --git a/check_factorio.py b/check_factorio.py new file mode 100755 index 0000000..bb7b056 --- /dev/null +++ b/check_factorio.py @@ -0,0 +1,89 @@ +#!/usr/bin/python3 +import socket +import time +import sys +import argparse +from pprint import pprint + +DEBUG = False + +def decode_array(content): + length = decode_int() + l = [] + for _ in range(length): + l.append(content()) + return l + +def decode_str(): + global pointer + l = decode_int() + data = info[pointer:pointer+l].decode("utf8") + pointer += l + if DEBUG: + print(f"read string {data} ({l})") + return data + +def decode_int(): + global pointer + i = int(info[pointer]) + if DEBUG: + print(f"read int {i}") + pointer += 1 + return i + +def decode_version(): + version = (decode_int(), decode_int(), decode_int()) + return version + +def skip(amount): + global pointer + b = info[pointer:pointer+amount] + if DEBUG: + print(f"skipped {amount} bytes: {b} ({b.hex()})") + pointer += amount + +def version_to_string(version): + return f"{version[0]}.{version[1]}.{version[2]}" + +def query_server(host, port=34197): + global info + s = socket.socket(type=socket.SOCK_DGRAM) + s.sendto(bytes.fromhex("30"), (host, port)) + info = s.recvfrom(512)[0] + +def decode_packet(): + global pointer + s = {} + + pointer = 0 + skip(13) + s["server_name"] = decode_str() + s["version"] = decode_version() + skip(2) + s["server_description"] = decode_str() + skip(8) + s["bind_addr"] = decode_str() + skip(3) + s["mods"] = decode_array(lambda: (decode_str(), decode_version())) + skip(4) + s["tags"] = decode_array(decode_str) + s["players"] = decode_array(decode_str) + + return s + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("host") + parser.add_argument("--port", "-p", type=int, default=34197) + args = parser.parse_args() + + try: + query_server(args.host, args.port) + except Exception as e: + print(f"CRITICAL:{e}") + exit(2) + + s = decode_packet() + + print(f"OK: {s['server_name']}: Version {version_to_string(s['version'])}, {len(s['players'])} Players|num_players={len(s['players'])}") +