私の録画環境は録画サーバーとNASの2台で構成されています。かつては、双方とも不安定だったために、両方に生きているかの確認をするために自作のプログラムを録画時間の前に実行していたのですが、録画途中でどちらかが停止したりするので、あまりこのプログラムが意味をなさない状態でした。
最近になって録画環境を変更して録画サーバの方(EPGStaionを稼働している)は安定環境になりつつあります。しかし、NASの方がメーカー製のは大きいし高いということで、導入していません。自作PCを使うにしても大きいですしね。
これの環境でたまに引き起こされるのがNASのエラーによる停止。これがあると録画ができません。録画サーバの方が生きているのに録画ができないという残念な状態になります。つい昨日その状態になり、一部録画ができておらず大変悲しい思いをしたのですが、以前から気になっており、有用に使えると思っていたコマンドを使用してみることにしました。
それが、録画準備失敗時と録画途中で失敗した際に各々コマンドを実行することができる機能です。これはEPGStaionに実装されている機能で、config.ymlに記述することで実行できます。具体的なオプションとしては以下の2種類です。
recordingPrepRecFailedCommand //録画準備失敗
recordingFailedCommand //録画中のエラー時
これは公式のリファレンスにも記述があります。
GitHub
https://github.com/l3tnun/EPGStation/blob/master/doc/conf-manual.md
このオプションを利用して少しでも障害発生に早く気付けるようにしていきます。
目次
LINE Notifyを利用
LINEに通知を送るにあたり、専用の場所で1対1でメッセージを受け取ります。グループに送るなんてこともできますが、録画失敗のお知らせならば基本的には専用の場所で受け取りたいところ。
そんな時に利用できるサービスがLINE Notifyです。WEBサービスと連携することで通知をLINE Notifyで受け取ることが可能です。メッセージの確認に、何か特別な画面を開く必要があるのかというとそういうわけでもなく、普通のトーク画面から確認できます。
このように簡単に通知で確認できるという点から、LINEに通知を送って障害にいち早く気付こうというわけですね。
ちなみに、類似する機能のあるものだとSlackに送るものがあるみたいです。というか私が去年ぐらいに調べたときはLINEでやっている人がいなかったから記事にしようと思ったわけですが、今改めて検索したらLINE用のも作っている方がいましたね。
https://github.com/PiedHarrier/EPGS-to-LINE
まあ私なりの適当な実装ということで紹介していきます。コードを見た感じやっていることは同じ操作ですが、私はチャンネルとか番組情報はどうでも良く、失敗したという事実だけが欲しいので、その機能だけをシンプルに実装していきます。この方が作っているものの方が凝っていると思うので、凝ったものがいい人は上記の物の方がいいかも?
利用のための準備
LINE Notifyのサイトに行ってトークンを発行します。
LINE Notify
https://notify-bot.line.me/ja/
こちらの右上からログインして、ログイン後の右上にはあなたの名前が表示されていると思うので、それを押してマイページに移動します。
あとは下の方にあるトークン発行を押すと送りたいトーク等が表示されると思います。トークン名には通知時の先頭の[トークン名]のように表示されるので好みで設定してください。
通知を送るのは「1:1でLINE Notifyから通知を受け取る」というのを選択すればOKです。表示されたトークンは二度と再表示できないので、コピーを取ってメモ帳にでも張り付けて残しておきます。このトークンが通知システムには必要なので、無くさないようにしましょう。もしわからなくなった場合は、別のサービスとしてトークンを再発行する必要があります。
簡単なコマンドでメッセージの送受信を確認
LINE Notifyにメッセージを送るのはコマンドラインから可能です。Callback URLで簡単に送れるのでかなり便利です。色んな開発で使えます。
こちらも最近環境が充実したのかLINEの公式フォーム見たいなところに掲載されていました。以前は別のサイトを見てこんな方法もあるのかと思ったような気もしますが、以下のページに使用方法の記載があります。
このページによると以下のコマンドで送れるそうです。
curl -X POST -H 'Authorization: Bearer [access_token]' -F 'message=foobar' https://notify-api.line.me/api/notify
トークンやメッセージは適切に読み替えてもらうとして、実際にこれで実行してみるとLINE Notifyにメッセージが届きます。
もし届かない場合はどこかで間違えているのでミスを探してください。
シェルスクリプトを作成する
EPGStationで実行しようと思うとシェルスクリプトの形でないと動かせないみたいです。直打ちで入れてみましたが動かなかったので、そういう仕様なのでしょう。
なので、動かすためにシェルスクリプトを作成します。と言っても、最も簡単な形式で問題ありません。
#!/bin/bash
curl -X POST -H 'Authorization: Bearer [your token]' -F 'message=test' https://notify-api.line.me/api/notify
exit 0
これも適切にトークンなどは読み替えて作成してください。作成したら実行権限を与えます。
chmod +x test.sh
あとは確認のために一度実行してみましょう。
./test.sh
これでLINE Notifyに通知がいけば問題ありません。
次はEPGStationへの登録の作業なので、好きなようにメッセージの内容を変更しておいてください。また、私のように二つのオプションを利用する場合は、それに合わせて二つシェルスクリプトを作成してください。
一応書いておくと、凝ったメッセージを出力したい場合は環境変数がEPGStationの設定ページに掲載されていますので、そちらを三洋しつつ変更しましょう。
EPGStationに登録する
この作業は非常に簡単なのでサクッと終わらせます。
先ほど作成したシェルスクリプトを任意の場所に移動させておいてください。
EPGStationのconfig.ymlに以下の文を追記します。場所は最後でも最初でも良いはずです。私は真ん中らへんに追記しておきました。
recordingPrepRecFailedCommand: '/bin/bash /hoge/hoge/EPGStation/test1.sh'
recordingFailedCommand: '/bin/bash /hoge/huga/EPGStation/test2.sh'
これを追記してEPGStationを再起動します。
pm2 restart epgstation
後は、意図的に障害を起こしてみて正しく通知がくれば大丈夫です。
これで障害発生時に録画ミスを最小限に抑えられます。
まとめ
LINE Notifyを使って障害によって録画が失敗したときに通知を送るようにすることができました。メッセージはシンプルでも、設定次第では凝ったもの送ることもできます。これによって録画ミスを最小限にできます。
また、LINE Notifyの使い方は非常に簡単でコマンドラインからも実行できることから様々な活用方法を検討でき、今後の開発にも活かしやすいことを確認しました。
長らくいつかは書こうと思っていたら同じようなことをやっている人がいて少しがっかりしましたが、ざっくりと周辺のことも説明しているので、何か得てもらえる記事にはなったと思っています。
以上です、お読みいただきありがとうございました。
EPGstationでは、録画失敗した時には、確認しづらいので、通知があったらいいと思っていました。とても参考になったのですが、コマンドから実行すると思った通りLINEに通知されるのですが、EPGstationから自動実行させると、error127が出ます。この記事のEPG-to-LINEでも、同じエラーが出ます。たぶん私がわかってないんだと思いますが、なにか予想される間違いはありますでしょうか?
dockerで運用しています。
[ERROR] system - /bin/bash %ROOT%/EPGtoLINE3.sh process is error. exit: 127
コメントありがとうございます。
すみません、私はDockerを使っていないので詳しいことは答えらません。
考えられることだと、書いている通りですが、実行権限が与えられているか、
%ROOT%の環境変数がどう設定されているか、
あとはDNSを解決できているかあたりでしょうか。
お役に立てず申し訳ないですが、一歩ずつ確認していくしかないように思います。