ほんじゃらねっと

ダイエット中プログラマのブログ

一日使い続けるだけで通信速度が低下する古いルーターを毎日再起動させるNode.jsスクリプト

先日iPad miniとiPhone 6sを導入してから、

うちの古いルーターが2日間隔くらいで再起動しないと

通信が遅くなってネットに繋がらなくなるようになった。

どうやら新しいiPadとiPhoneはWi-fi環境だとガシガシ通信するようで、

ルーターのキャパをすぐに超えてしまうみたいだ。

ルーターを新しくすればすぐに解決しそうな話だが、

とりあえず1日1回再起動すれば快適に使えるようなので、

ルーターを再起動するスクリプトを書いてみた。

幸いうちのルーターはWebブラウザで操作できる管理画面を持っており、

BASIC認証でログインして特定のURLを叩くと再起動できるので、

httpアクセスするスクリプトを書いて毎晩実行されるように

定期処理の設定をしておけば自動化できそうだ。

ついでに、ちゃんと定期処理が実行されてるか確認できるように

再起動前に「これから再起動しますよ」という通知を

チャットワークに送るようにしてみる。

Gruntの「grunt-http」パッケージでBASIC認証する

調べてみると「grunt-http」パッケージを使えば

BASIC認証経由でURLを叩けそうなので、

Gruntスクリプトを作ってみた。

「router_rebooter」という名前のフォルダを作成して、

下記のファイルを保存する。

package.json

{
  "name": "router_rebooter",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "grunt": "^0.4.5",
    "grunt-http": "^2.0.1"
  }
}

Gruntfile.js

module.exports = function(grunt) {
    grunt.initConfig({
        http: {
            reboot: {
                options: {
                    url: "<ルーターの再起動用URL>",
                    qs: {
                        "action": "Reboot" //うちのルーターで再起動する際に必要なパラメータ
                    },
                    auth: {
                        username: "<BASIC認証ユーザー名>",
                        password: "<BASIC認証パスワード>",
                        sendImmediately: false
                    }
                }
            },
            notify: {
                options: {
                    url: "https://api.chatwork.com/v1/rooms/<チャットワークのルームID>/messages",
                    method: "POST",
                    headers: {
                         "X-ChatWorkToken": "<チャットワークAPIキー>"
                    },
                    form: {
                        body: "ルーターを再起動します"
                    }
                }
            }
        }
    });
    
    grunt.loadNpmTasks("grunt-http");
    grunt.registerTask("default", "http");
    grunt.registerTask("reboot", ["http:notify","http:reboot"]);
};

ファイルを作成したら、

npm install

で必要なパッケージをダウンロードする。

これで、下記のコマンドを実行すればチャットワーク通知してから

ルーター再起動を実行してくれる:

grunt reboot

Macのcrondで定期処理設定

今回は自宅のMacに設定したので、Macでの設定方法となる。

(Windowsでの定期処理設定はまた他の記事で試したい)

Macはcronが使えるので、上記の「grunt reboot」を

呼び出す処理をcrontabで設定する。

色々試して、下記の設定でどうにか動くようになった。

nodeコマンドとgruntコマンドが「/usr/local/bin」にあって、

今回作成した「router_rebooter」が「/Users/pirosuke/workspace」にある想定。

毎晩「0:00」に起動する。

0   0   *   *   *   export PATH=$PATH:/usr/local/bin; cd /Users/pirosuke/workspace/router_rebooter; /usr/local/bin/grunt reboot;

cronはデフォルトで「/usr/bin」の中しか探してくれないようで、

gruntコマンドだけを記述すると「nodeコマンドが見つかりません」という

エラーが表示される。

実行前にPATH設定を追加することで、

「/usr/local/bin」内のnodeコマンドを

実行してくれるようにした。

おわり

BASIC認証は他でも使う機会があるだろうから、覚えておこう。

cronの設定もこの書き方を覚えておけば、

今後Gruntで作成したスクリプトを定期実行したい時は使いまわせそうだ。