pythonとseleniumとchromiumとcronで、ルータの再起動を定期的に行う

はじめに

家庭用ルータを常時使用していると、時々動作が重くなったりします。
いまは、子どもたちはipadを使うし、大人はスマートフォンを使うし、テレビやGoogleHomeなどもwifiに繋がっているので、ネット接続の快適さは、我が家にとって重要なものなので、しっかりメンテナンスしたいと思いました。



環境準備

主に「python」「selenium」「ChromeDriver」の環境があれば良いです。

#ディレクトリ作成と移動
cd /home/username/myShell/
mkdir selenium
cd selenium/

#seleniumを仮想環境で実装
virtualenv selenium
source selenium/bin/activate
pip install selenium

#ChromeDriverインストール
webdriver.Chrome(driver_path)
wget https://chromedriver.storage.googleapis.com/2.29/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/
sudo apt-get install libappindicator1
sudo touch /etc/default/google-chrome

pythonコード作成(PR400-KI)

我が家にはルータが2つあります。
NTTからレンタルしている有線ルータ「PR400-KI」と、wifiするために購入した「Aterm WG1800HP2」です。それぞれ個別にコードを書いていきます。

<pr400ki_reboot.py>

--- coding: utf-8 ---
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.alert import Alert
import time
options = Options()
#ブラウザ非表示 options.add_argument('--headless') options.add_argument('--disable-gpu')
#Chromeを使う driver = webdriver.Chrome()
#画面サイズ options.add_argument('--window-size=1280,1024')
#URL呼び出し driver.get("http://user:{password}@192.168.xx.xx/cgi-bin/paractl.cgi?st_reboot")
#クリック操作 driver.find_element_by_name("oup_reboot").click() time.sleep(3) Alert(driver).accept() time.sleep(3)
#ブラウザを終了する。 driver.quit()

工夫した点は、以下のとおりです。
 ●アクセス時にベーシック認証があるので、ユーザ名とパスワードをURLに含める
 ●メイン画面から順に辿らず、再起動メニューのURLまで一気に飛ぶ
 ●import time して、sleepをちょっと入れる
 ●再起動ボタンを押すと、問合せポップアップが出るので、以下の組合せを入れる
   from selenium.webdriver.common.alert import Alert
   Alert(driver).accept()
 ●クリックする場所の探し方は、以下の通りです。


①押したいボタン(再起動)を右クリックし、「検証」を押す
②もう一度、(再起動)を右クリックし、「検証」押す(表示が展開される)
③検証画面に、name= や ID= がでてくるのでメモする

これで、必要な情報が揃うと思います。



pythonコード作成(Aterm WG1800HP2)

同様に、Aterm WG1800HP2の再起動コードも作成します

<wg1800hp2_reboot.py>

--- coding: utf-8 ---
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.alert import Alert import time options = Options()
#ブラウザ非表示 options.add_argument('--headless') options.add_argument('--disable-gpu')
#Chromeを使う driver = webdriver.Chrome()
#画面サイズ options.add_argument('--window-size=1280,1024')
#URL呼び出し driver.get("http://admin:{password}192.168.xx.xx/index.cgi/reboot_main")
#クリック操作 driver.find_element_by_name("UPDATE_BUTTON").click()
time.sleep(5) Alert(driver).accept() time.sleep(3)
#ブラウザを終了する。 driver.quit()

工夫した点は、表示が遅かったので、speepを多めに入れたところくらいです。




まとめて起動するためのシェルスクリプト作成

定期リブートをまとめて行うために、シェルにまとめます。
また、シェルの中で環境変数も定義する意味もあります。

<router_reboot.sh>

!/bin/bash
export PATH=/home/username/myShell/selenium/selenium
export PATH=$PATH:/home/username/myShell/selenium/selenium/bin
export PATH=$PATH:/home/username/myShell/gCloudSpeech/google-cloud-sdk/bin
export PATH=$PATH:/usr/local/sbin
export PATH=$PATH:/usr/local/bin
export PATH=$PATH:/usr/sbin
export PATH=$PATH:/usr/bin
export PATH=$PATH:/sbin
export PATH=$PATH:/bin
export PATH=$PATH:/usr/games
export PATH=$PATH:/usr/local/games
export PATH=$PATH:/snap/bin
export PATH=$PATH:/home/username/myShell/gCloudSpeech/google-cloud-sdk/bin
#プロジェクトのフォルダへ移動 export DISPLAY=:0
#プロジェクトのフォルダへ移動 cd /home/username/myShell/selenium/
#virtualenvの有効化 . /home/username/myShell/selenium/selenium/bin/activate #メインルータをリブート python /home/username/myShell/selenium/pr400ki_reboot.py
#wifiルータをリブート python /home/username/myShell/selenium/wg1800hp2_reboot.py

export PATH をたくさん使っているのは、このあと行うcronで、パスが無効化されてしまうので、再定義するためです。

source selenium/bin/activate を実施して、
プロンプトが(selenium)になった状態で、envコマンドを実施し、
PATH と VIRTUAL_ENV を入れました。
※どれが正解かわからないのでいろいろ突っ込みました。

また、source selenium/bin/activate でsourceが使えなかったので、
「.」にしたらうまく行きました。

ターミナルからうまく出来るのに、cronでうまく行かなくて、
エラーに

selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally

このエラーは、chromedriver のバージョンが古いときに出るようです。
(selenium)pip install chromedriver でアップデートできます。
アップデート用のコマンド忘れたので、これで適当にやっちゃう。

しかし、それでも直らなかったので、色々調べたところ、
export DISPLAY=:0
を付けたら、うまく行くようになりました。

cron登録

ネタが揃ったので、cron登録します。

ターミナルからの実行では、スムーズに出来たのですが、cronになると環境変数などがそのまま使えないので、再定義するのにとても苦労しました。
ジョブツールとか使ったほうが良いのかなとも思いました。

でも、今回の方法で今後もクリアできそうです。




crontab -e
#毎日3時に定期ルータ再起動
0 3 * * * sh '/home/username/myShell/selenium/router_reboot.sh' > /home/username/myShell/selenium/router_reboot.log 2>&1

該当時間に動いたか把握するためにログは、出しておいたほうが良いです。
/home/username/myShell/selenium/router_reboot.log 2>&1





効果

無事、毎日ルータを再起動出来るようになったおかげで、毎日快適にネットが使えるようになりました。

コメント

%d人のブロガーが「いいね」をつけました。