はじめに
家庭用ルータを常時使用していると、時々動作が重くなったりします。
いまは、子どもたちは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
効果
無事、毎日ルータを再起動出来るようになったおかげで、毎日快適にネットが使えるようになりました。
コメント