無線ルータAtermを再起動するPythonスクリプト

無線ルータAtermを再起動するPythonスクリプト

自宅のルータ兼無線アクセスポイントが、勝手に再起動することがこの夏から二度ほど発生しました。当日の室温が高かったせいかもしれないが、たとえば在宅勤務中に不意に再起動したら業務に支障も出るので、予防的に週に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

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')
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は、ウェブ上の知見も多いし、比較的少ないコード量で思った以上のことを実現できるような感覚があり、触ってて楽しいです。