ASUS LYRA VOICEでnode_exporterを動かしたい

目的

ASUSから出ている「LYRA VOICE」でnode_exporterを動かしたい

結果

動かすだけなら可能。ただし単体での常時稼働はできずいろんな理由で面倒である

経緯

RT-AC85Uを使っていたのですが、LAN内での大容量データ転送が多くなったためトライバンドルータを探していました。しかしながら、コロナの影響で多くのルータが品切れ状態となり、買おうと思っていたRT-AX92Uも値上がりしてしまいました。
そんな中LYRA VOICEというルータが(性能の割には)安く売られているということを知りました。一応トライバンドで、なぜかAmazonEchoと同等の機能を内蔵しています。今どきの802.11axなどもないですし、最大速度は866Mbpsであることから投げ売りなのでしょうか。1万円を切る価格で購入することができました。
そんなLYRA VOICEでも、node_exporterを動かしてみたいと思い試行錯誤しました。

必要なもの

  • Prometheusが動作しているサーバ
  • node_exporter (Architecture:armv7)
  • LYRA VOICEへのssh接続が可能であること

作業詳細

バイナリのダウンロード

まずnode_exporterは「armv7アーキテクチャ対応」のバイナリをダウンロードします。
LYRA VOICEでunameを打つとわかります。

admin@LYRA_VOICE:/tmp/home/root# uname -a
Linux LYRA_VOICE 3.14.77 #1 SMP PREEMPT Tue Sep 17 15:19:22 CST 2019 armv7l GNU/Linux

PrometheusのダウンロードページからOperating system : linux 、Architecture : armv7を選択し、node_exporterをダウンロード・展開します。/jffsの配下であればどこでもいいとは思いますが、今回は「/jffs/scripts」というフォルダを作成し、そこに展開しています。

スクリプトの作成

動作させるためにはnode_exporter以外にスクリプトを用意する必要があります。なくてもできるかもしれませんが、うまくいかなかったので作っています。これらのスクリプトも「/jffs/scripts」配下に保管しています。

check.sh

#!/bin/sh

CRU=`/usr/sbin/cru l  | /bin/grep init.sh | /bin/grep -v grep | wc -l`
# cronの登録数を確認し、変数に代入

if [ $CRU = 0 ]  ; then
 /usr/sbin/cru a check_node "*/5 * * * * /bin/sh /jffs/scripts/init.sh"
fi
# cron行が1行もない場合に追加をする
# このcheck.shは外部サーバから定期的に実行する(別にスクリプトあり)

init.sh

#!/bin/sh

NODE=`/bin/ps | /bin/grep node_exporter| /bin/grep -v grep | wc -l`
# node_exporterプロセスの動作を確認する

if [ $NODE = 0 ]  ; then
 chmod a+x /jffs/scripts/node_exporter
 /jffs/scripts/node_exporter &
fi
# node_exporterプロセスがない場合にnode_exporterを起動する。
# 起動前に(念のため)node_exporterに実行権限を付与する

結果的に以下のようになると思います。

admin@LYRA_VOICE:/jffs/scripts# pwd
/jffs/scripts
admin@LYRA_VOICE:/jffs/scripts# ls -l
-rw-rw-rw-    1 admin    root           306 May 14 13:43 check.sh
-rw-rw-rw-    1 admin    root           253 May  7 13:45 init.sh
-rwxrwxrwx    1 admin    root      14896306 Jun  4  2019 node_exporter

このままでは当然動かないです。しかもリブートするたびにパーミッションが変わり実行権限が消されます(!)。スクリプト内にchmodコマンドがあるのはそのためです。そしてcheck.shを外部サーバから定期的に実行することでnode_exporterを動作させます
以下のスクリプトは外部サーバに保管し、cron等で定期実行します。1分おきはやりすぎだと思うので、10分おきとか30分おきが良いかと思います。それにより突然の再起動や、電源OFF/ONの際も(しばらくすれば)node_exporterが動作します。

gw_check.sh

#!/bin/sh

PW="PASSWORD" # LYRA VOICEに設定したパスワードを入れる

expect -c "
set timeout 5
spawn env LANG=C /usr/bin/ssh admin@192.168.0.1 \"/bin/sh /jffs/scripts/check.sh\"
# IPアドレスはルータのIPアドレスです
expect \"password:\"
send \"${PW}\n\"
expect \"$\"
exit 0
"

※expectは事前にインストールしておきます

まとめ

最善の手段かどうかはわかりませんが、とりあえずLYRA VOICEでnode_exporterを動かすことができました。RT-AC85Uの時はUSBメモリを挿入し、nvramの「usb挿入タイミングでスクリプトを実行する」パラメータをいじるだけで済みましたが、LYRA VOICEにはUSBポートがないことから同じ手段は使えず、遠回りをしてしまいました。また、今回は細かいパラメータをいじらずにdefaultで動かしています。時間ができたらチューニングしようと思います。

参考URL

Alldocube iPlay 50 mini

表題の通り Alldocube iPlay 50 mini をAliexpressで購入しました。5chを見ると9,000円を切る価格で買える場合もあったようですが、自分の場合は10,814円でした。最安ではないけどまあいいのかと思います。 届くまでおよそ1週間でした。結構早い印...