Skip to content

Instantly share code, notes, and snippets.

@barakplasma
Last active December 19, 2024 11:49
Show Gist options
  • Save barakplasma/d874b7f04d5018782ab1efb740d8f819 to your computer and use it in GitHub Desktop.
Save barakplasma/d874b7f04d5018782ab1efb740d8f819 to your computer and use it in GitHub Desktop.
# backup at Z5nYiUJM https://rentry.co/7d98g63q
from playwright.sync_api import sync_playwright
import requests
import schedule
from time import sleep
from datetime import datetime, UTC
from loguru import logger
logger.add(
"reset-pluga-wifi.log", rotation="50 MB"
) # Automatically rotate too big file
@logger.catch
def is_internet_available():
try:
logger.debug("pinging healthcheck.io")
res = requests.get("https://hc-ping.com/40d11324-f128-4684-8514-3a9399f3cc5c")
res.raise_for_status()
return True
except requests.RequestException:
logger.warning("the internet is down")
return False
@logger.catch
def reboot_wifi():
with sync_playwright() as p:
try:
browser = p.chromium.launch(headless=True, slow_mo=50)
page = browser.new_page()
logger.debug("started playwright")
page.goto("http://192.168.1.1")
logger.debug("logging into router page")
except Exception as e:
if "net::ERR_INTERNET_DISCONNECTED" in str(e):
logger.info("ignore net::ERR_INTERNET_DISCONNECTED")
else:
logger.exception(e)
username = page.locator("#A1")
username.fill("home")
password = page.locator("#A2")
password.fill("12345678")
page.get_by_role("button", name="Enter").click()
logger.debug("logged in successfully")
page.get_by_role("link", name="System").click()
page.get_by_role("link", name="Configuration").click()
page.locator(".cover").get_by_text("Save", exact=True).click()
page.on("dialog", lambda dia: dia.accept())
page.locator(".cover").get_by_text("Reboot", exact=True).click()
browser.close()
logger.info("sent reboot command to router")
sleep(30)
try:
logger.debug("logging reboot event to healthcheck.io")
timestamp = datetime.now(UTC)
data = f"Router rebooted at {timestamp}"
res = requests.post(
"https://hc-ping.com/40d11324-f128-4684-8514-3a9399f3cc5c/log",
data=data,
timeout=300,
)
res.raise_for_status()
except requests.RequestException:
logger.warning("failed to log reboot event to healthcheck.io")
def reboot_all():
try:
for i in range(3):
reboot_wifi()
except Exception as e:
logger.error('failed to reboot wifi')
logger.exception(e)
sleep(60)
def run():
if is_internet_available() is False:
reboot_all()
else:
logger.info("internet connected")
schedule.every(5).minutes.do(run)
schedule.every(2).hours.do(reboot_all)
schedule.run_all()
while True:
schedule.run_pending()
sleep(1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment