先日、Raspberry PiにRocket.Chatサーバをインストールしました。
さらにhubotを自動起動するように設定し、botを動かせる環境を作成しました。
たとえばスマートフォンからRaspberry PiのRocket.Chatサーバへ接続し、botへ命令を出して、Raspberry Piを再起動するにはどうすれば良いでしょうか?
設定手順を記録しておこうと思います。
目次
Raspberry Piの再起動bot作成手順
1. Rocket.Chatのインストール
こちらの記事にて、Rocket.Chatサーバをインストールしました
2. Hubotのインストール
Rocket.ChatでHubotが動くように設定しました。
3. 再起動スクリプトの作成
再起動用のスクリプトを作成します。
cd hubot-rocketchat-boilerplate
vi scripts/reboot.js
次のような内容です。
// Description:
// reboot machine script.
//
// Commands:
// bot reboot machine - Begin rebooting
// bot restart machine - Begin rebooting
//
module.exports = (robot) => {
robot.respond(/(reboot machine|restart machine)/gi, (res) => {
require('child_process').exec('sudo /sbin/shutdown -r now',
function (msg) {
res.reply(msg);
});
})
}
child_processモジュールを使用して、shutdownコマンドを実行するかたちです。
スクリプトを作成する際、DescriptionとCommandsのコメントを書いておくと、hubot helpで使用方法を表示できるようです。後で作ったスクリプトがわからなくならないように、ちゃんと書いておいたほうが良さそうですね。
4. 使用するモジュールのインストール
child_processモジュールをインストールしておきます。
npm install child_process --save
5. Hubotの再起動
これで準備が整いました。あとはHubotを再起動すれば。
sudo systemctl restart rocketchat_hubot.service
作成したスクリプトが動作するようになります。
bot helpと入力すると、先程作成した再起動用のスクリプトが表示されるようになりました。
bot reboot machineまたはbot restart machineと入力すると、Raspberry Piが再起動しました。
再起動ではなくシャットダウンしたい場合、よろしければ記事の末尾のスクリプトをご利用下さい。
他にもサービスの再起動やログの閲覧など、よく利用するコマンドをbot化しておくと便利かと思います。
botスクリプトの覚書
Raspberry PiのCPU温度表示
// Description:
// Display a cpu temperature.
//
// Commands:
// bot cputemp - display cpu temperature
//
module.exports = (robot) => {
robot.respond(/(cputemp)/gi, (res) => {
require('child_process').exec('echo "scale=3;`cat /sys/class/thermal/thermal_zone0/temp` / 1000" | bc -l',
function (err, stdout, stderr) {
res.reply(stdout);
});
})
}
シャットダウン
// Description:
// shutdown machine script.
//
// Commands:
// bot shutdown machine - Begin shutdown
// bot halt machine - Begin shutdown
//
module.exports = (robot) => {
robot.respond(/(shutdown machine|halt machine)/gi, (res) => {
require('child_process').exec('sudo /sbin/shutdown -h now',
function (msg) {
res.reply(msg);
});
})
}