#!/usr/bin/env -S uv run --script # /// script # dependencies = [ # "playwright>=1.45.0", # ] # /// from __future__ import annotations import argparse import sys import time from playwright.sync_api import Playwright, TimeoutError as PlaywrightTimeoutError, sync_playwright ROUTER_URL = "http://192.168.1.1" ROUTER_USERNAME = "abdus" ROUTER_PASSWORD = "xAsametk50" def reboot_router(playwright: Playwright, headed: bool, timeout_ms: int) -> None: browser = playwright.chromium.launch(headless=not headed) context = browser.new_context(ignore_https_errors=True) page = context.new_page() page.set_default_timeout(timeout_ms) try: page.goto(f"{ROUTER_URL}/login", wait_until="domcontentloaded") username_box = page.get_by_role("textbox", name="User Name") password_box = page.get_by_role("textbox", name="Password") username_box.click() username_box.press("ControlOrMeta+a") username_box.press("Backspace") username_box.type(ROUTER_USERNAME, delay=80) password_box.click() password_box.press("ControlOrMeta+a") password_box.press("Backspace") password_box.type(ROUTER_PASSWORD, delay=140) page.get_by_role("textbox", name="Password").press("Enter") page.wait_for_load_state("domcontentloaded") try: page.get_by_text("The username or password is not correct", exact=False).wait_for( state="visible", timeout=1500 ) raise RuntimeError("Router rejected configured credentials") except PlaywrightTimeoutError: pass menu_trigger = page.locator("#h_menu_list").first if menu_trigger.count() and menu_trigger.is_visible(): menu_trigger.click() restart_icon = page.locator("#navbar_reboot .icon-menu-restart, #navbar_reboot").first restart_icon.wait_for(state="visible") with page.expect_response(lambda r: "/cgi-bin/Reboot" in r.url, timeout=timeout_ms): restart_icon.click() page.get_by_role("button", name="OK").click() time.sleep(5) print("Router reboot request sent.") finally: context.close() browser.close() def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Log in and reboot router") parser.add_argument("--headed", action="store_true", help="Run with visible browser") parser.add_argument( "--timeout", type=int, default=60000, help="Timeout in milliseconds (default: 60000)", ) return parser.parse_args() def main() -> int: args = parse_args() try: with sync_playwright() as playwright: reboot_router(playwright, headed=args.headed, timeout_ms=args.timeout) return 0 except Exception as exc: print(f"Error: {exc}", file=sys.stderr) return 1 if __name__ == "__main__": raise SystemExit(main())