YAMAHA RTX830のLuaスクリプト機能

年の瀬に上げるような内容の記事ではないですけど、ネットワーク設定が一通り終わって安定運用に入ると、ルーターに触る機会も減ってしまうので定期的に勉強しておこうかなと。

前回の記事はヤマハ製ルーターRTX830におけるIPv6環境のネットワーク設定についての内容でした。

ヤマハルーターのLuaスクリプト機能について

RTX830など多くのヤマハ製ルーターにはLuaスクリプトの実行環境が備わっています。導入方法については公式サイトの通りに進めていけば問題ないかと思います。

環境

機器: YAMAHA RTX830 (Rev.15.02.10)
Luaライブラリバージョン: Lua 5.1.5
Luaスクリプト機能バージョン: 1.08

* Lua有効化
デフォルトでは有効化されていますが念の為に設定コマンドを載せておきます。

# lua use ?
    入力形式: lua use スイッチ
               スイッチ = 'on' or 'off'
      説明: Luaスクリプト機能を使用するか否かを設定します
デフォルト値: on
# lua -v
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio

# show status lua
Luaライブラリバージョン:        Lua 5.1.5
Luaスクリプト機能バージョン:    1.08
... 省略

Luaのバージョンはファームウェア配信でアップデートされているようです。2019/12現在は5.1.5なのでけっこう古め。また、Luaスクリプト機能バージョンというのは、ファームウェアによって独自に追加された機能等を管理するリビジョン番号のようなものです。

また、ヤマハルーターにはRTFSというルーターの内蔵フラッシュROMに構築されるファイルシステムがあり、Luaスクリプトなどのファイル類はここに置くことができます。ここではルート以下にluaディレクトリを作り、その下にLuaスクリプトファイルを置いています。

# show file list /
2019/07/26 17:21:38            dashboard
2019/08/10 14:34:41            lanmap
2019/09/01 23:14:16            lua

Luaのサンプルスクリプトは公式サイトや個人ブログ上にていろいろ公開されてます。ルーターコマンドやログの内容を監視して、何らかのイベントを補足したらメール等の方法で通知するというようなユースケースが多いようです。また、開発環境としてはVisual Studio Codeを使いました。適当なLua lint系のextension入れておくと使いやすくなります。ヤマハルーター専用APIだけチェックできませんが、必要なら拡張してやれば良いかなと思います。

ヤマハルーター専用 API

ヤマハルーターのLua処理系で利用できる専用の機能(rtモジュール)があります。

rt.command/rt.mail/rt.syslog あたりはサンプルスクリプトでも良く利用されているのを見かけます。特に rt.command は任意のルーターコマンドを実行する汎用関数なので活用の機会は自然と多くなりそうですが、セキュリティ的に外部からコマンドを受け取れるような作りにはしない等のコマンドインジェクション対策を忘れずにしておくと良いかと思います。今回はせっかくなので専用APIを使ってサンプルを作ってみます。

サンプル: CPU利用率が閾値以上だったら、syslogにログ出力してブザー鳴らしてステータスLEDを10秒間点灯させる

-- test.lua
local function alert_cpu_usage(threshold)
    local cpu, cpuerr = rt.hw.open('cpu1')
    if cpu then
        local load = cpu:read()
        cpu:close()
        local msg = 'warning cpu usage: ' .. load.load_1m
        if load.load_1m > threshold then
            print(msg)
            rt.syslog('info', msg)
            local led, lederr = rt.hw.open('status-led1')
            if led then
                local bz, bzerr = rt.hw.open('buzzer1')
                if bz then
                    bz:tone('B2')
                    rt.sleep(1)
                    bz:tone('E3')
                    rt.sleep(1)
                    bz:tone('B3')
                    rt.sleep(1)
                    bz:tone('B4')
                    rt.sleep(1)
                    bz:off()
                    bz:close()
                else
                    print(bzerr)
                end
                led:on()
                rt.sleep(10)
                led:off()
                led:close()
            else
                print(lederr)
            end
        end
    else
        print(cpuerr)
    end
end

-- main
alert_cpu_usage(50)

とても汚い書き殴りをしてみましたが、ハードウェア系APIをいろいろ使ってます。

* 動作確認
クライアント側でLuaスクリプトファイルをルーターに転送

$ tftp 192.168.100.1
tftp> put test.lua /lua/test.lua/{ログインパスワード}
転送を正常に完了しました: 1 秒間に 1262 バイト、1262 バイト/秒

ルーター側でLuaスクリプト実行 (administrator権限が必要)

# lua /lua/test.lua
warning cpu usage: 61

ステータスLEDが点灯するとダッシュボードに警告として通知されました。これは地味に嬉しいですね。ちなみにステータスLEDはオレンジ色でした。

RTX830だとハードウェア制御系APIがあまり使えないのが寂しい感じではあります。RTX1200とかだと温度計とか各種LEDとか制御できるようです。

Luaスクリプトのコンパイル

Luaスクリプトはluacコマンドでバイトコードにコンパイルできるので、大きめのスクリプトはコンパイルしてから実行するのが良さそうです。

# luac -o /lua/test.out /lua/test.lua
luacコマンドの実行が終了しました
# lua /lua/test.out

その他の実行方法

ルーターにログインしてluaコマンドを都度叩いて実行するのは非現実的です。ヤマハルーターにはcronのようなスケジューリング機能やDOWNLOADボタンでLuaスクリプトを実行する機能があります。

* DOWNLOADボタンで起動するLuaスクリプトを登録

# operation button function download execute lua /lua/test.lua

上記コマンドで登録したら、筐体前面のDOWNLOADボタンを3秒以上押すことで登録したLuaスクリプトが実行されます。RTX830だと実行開始と実行終了時にアラームが鳴りました。他のモデルでも多分だいたい同じだと思います。

* スケジュール機能で実行
schedule コマンドの使い方は40.1 スケジュールの設定を参考にしてください。以下は例です。

# schedule at 1 1/1 0:0 * lua /lua/test.lua

補足として、Luaスクリプトの強制終了方法も載せておきます。不用意に負荷の高いスクリプトを流してしまってリソースが逼迫することを回避できます。show status lua コマンドでタスク番号を確認して、terminate コマンドで強制終了します。

# show status lua
... 省略

[running]
LuaタスクID (状態):  1  (RUN)
走行トリガー:        'lua' コマンド
コマンドライン:      lua sd1:/test.lua
スクリプトファイル:  sd1:/test.lua
開始日時:            2019/11/30 12:45:08
経過時間:            6秒

# terminate lua 1
Luaスクリプトを停止しました

注意点など

Luaのバージョンと機能

2019/12現在、Luaのバージョンは5.1系となっていて古めです。モジュールシステムが5.2以降から変わっているので、モジュールを作る/使う時は5.1での書き方を確認しておきましょう。

また、Lua言語のライブラリ関数にヤマハルーターのLuaスクリプトで利用できるライブラリ関数が掲載されています。ルーターに実装されている処理系だと一部機能制限されており、Lua標準関数であっても利用できないものがあるので注意が必要です。例えば、標準入出力(stdin/stdout)が使えなかったり、require()関数でCのモジュールをロードすることはできなかったり等のいろいろな制限があります。Luaのバージョンだけでなく、Luaスクリプト機能バージョンのchangelogも気にしつつ開発/運用するのが良いかと思います。

他の制限としてはLuaタスクの同時実行数は上限があり、luaコマンド用に8個、DOWNLOADボタンからの実行用に1個、Luaコンパイラ用に1個の計10個が用意されています。

# lua sd1:/test.lua
# lua sd1:/test.lua
# lua sd1:/test.lua
# lua sd1:/test.lua
# lua sd1:/test.lua
# lua sd1:/test.lua
# lua sd1:/test.lua
# lua sd1:/test.lua
# lua sd1:/test.lua
エラー: Luaスクリプトを実行するための空きタスクがありません

RTFSの注意点

RTFS(公式サイト)にRTFSについての説明と利用の際の注意点が載っています。要約すると、RTFSは頻繁に読み書きする使い方は避けてくださいということのようです。今回は紹介も兼ねてRTFSを使いましたが、LuaスクリプトファイルはRTFSよりも外部microSDカードに置いた方が良いかもしれません。

終わりに

今回はヤマハルーターRTX830でのLuaスクリプト環境を試してみました。組み込み系ということもあってWeb系実行環境と比べると機能制限は厳しめで、Luaバージョンも2019/12現在は5.1系と古めなのですが、C言語ではなくLuaスクリプトで開発できるのは手軽で嬉しいですね。これまでLuaはTorchの勉強の際に少し書いてた程度、実践で使ったことはほとんど無いので引き続き勉強していきます。

また、GitHubにはサンプルスクリプトを、wikiの方にヤマハルーター関連のメモを書いてますので参考までに。

あわせて読む:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です