自宅のルータ兼無線アクセスポイントが、勝手に再起動することがこの夏から二度ほど発生しました。当日の室温が高かったせいかもしれないが、たとえば在宅勤務中に不意に再起動したら業務に支障も出るので、予防的に週に2度、インターネットをほぼ使用していない時間帯に、定期的に再起動をかけることにしました。
我が家で使用している機種は、NEC Aterm WG2600HP3 (PA-WG2600HP3)。このAtermの管理画面には再起動をスケジューリングするような機能は無く、定期的な再起動の仕掛けは自ら用意する必要があります。そこで、管理画面をSeleniumで操作して再起動まで自動で行うPythonスクリプトを用意し、これを、24時間稼働しているサーバにてcron実行するようにしました。
0 7 * * mon,thu timeout 5m /home/USERNAME/script/reboot_aterm.py
ちなみに、cron設定時刻の月曜・木曜の朝 (07:00) というのは家庭ごみを出すタイミングと同じで、これだと、自宅回線のインターネットがいつ途絶えるかを家族も覚えやすいためです。
Atermを再起動するスクリプトreboot_aterm.py
は次のように簡単な内容ですが、もし参考になればと思いご紹介です。
#!/usr/bin/env python3
# reboot_aterm.py (Ver.20220118)
import sys
import time
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert
username = 'admin'
password = 'Atermの管理者パスワード'
url = 'http://'+username+':'+password+'@192.168.10.1/index.cgi/reboot_main.html'
timeout = 10
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=options)
def wait_element(attribute, target):
try:
if attribute == 'ID':
element_present = EC.presence_of_element_located((By.ID, target))
elif attribute == 'CLASS_NAME':
element_present = EC.presence_of_element_located((By.CLASS_NAME, target))
elif attribute == 'XPATH':
element_present = EC.presence_of_element_located((By.XPATH, target))
elif attribute == 'CSS_SELECTOR':
element_present = EC.presence_of_element_located((By.CSS_SELECTOR, target))
WebDriverWait(driver, timeout).until(element_present)
except TimeoutException:
print('ERROR: Timed out waiting for page to load. %s = %s' % (attribute, target), file=sys.stderr)
driver.quit()
sys.exit(1)
else:
return True
driver.get(url)
wait_element('CSS_SELECTOR', '.btn.blue') # 「再起動」ボタン
driver.find_element_by_css_selector('.btn.blue').click()
time.sleep(2)
Alert(driver).accept()
time.sleep(5)
driver.quit()
P.S. 小物スクリプトを私はこれまで手慣れたPerlで書くことが多かったが、最近は勉強のため、とりあえずPythonで書いてみるようにしています。Pythonは、ウェブ上の知見も多いし、比較的少ないコード量で思った以上のことを実現できるような感覚があり、触ってて楽しいです。