chore: Update everything
This commit is contained in:
Executable
+97
@@ -0,0 +1,97 @@
|
||||
#!/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())
|
||||
Reference in New Issue
Block a user