$Date: 2025/11/20 15:09:00 $
ヤマハルーターで Lua スクリプト ( 参考: lua.org の ホームページ ) が実行できます。Lua スクリプトにヤマハルーター専用 API を埋め込むことで、ルーターの状態に応じて、ルーターの設定変更やアクションをプログラミングすることが可能になります。例えば、次のようなスクリプトを作成できます。
なお、ヤマハルーター専用 API はこちらのページで公開しています。API は随時追加していく予定です。また、ヤマハルーターが実装している Lua のバージョンは 5.1.4 または 5.1.5 です。詳細は Lua スクリプト機能バージョンの変更履歴を参照してください。
ヤマハが実装している Lua 言語の仕様については、Lua 言語の文法とライブラリ関数を参照してください。また、Lua チュートリアルはプログラミング初心者向けのチュートリアルです。
オリジナルの Lua 言語の仕様については、Lua 5.1 Reference Manual を参照してください。
FUNCボタンが搭載された機種を使用する場合は、DOWNLOADボタンをFUNCボタンに読み替えてください。
ヤマハルーターでは以下の機種およびファームウェアで、Lua スクリプト機能をサポートしています。
| 機種 | ファームウェア |
|---|---|
| YSL-V810 | すべてのリビジョン |
| vRXシリーズ | |
| RTX840 | |
| RTX3510 | |
| RTX1300 | |
| RTX1220 | |
| RTX830 | |
| NVR510 | |
| NVR700W | |
| RTX1210 | |
| RTX5000 | |
| RTX3500 | |
| FWX120 | |
| RTX810 | |
| NVR500 | |
| RTX1200 | Rev.10.01.16以降 |
| SRT100 | Rev.10.00.52以降 |
Lua スクリプト機能バージョンの変更履歴と、各機種のファームウェアリビジョンとの対比表です。
| _RT_LUA_VERSION | 変更内容 | 対応ファームウェア | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| YSL-V810 | vRX VMware ESXi版 | vRX Amazon EC2版 | vRX さくらのクラウド版 | RTX840 | RTX3510 | RTX1300 | RTX1220 | RTX830 | NVR510 | NVR700W | RTX1210 | RTX5000 | RTX3500 | FWX120 | RTX810 | NVR500 | RTX1200 | SRT100 | ||
| "1.0" | 初期リリース | Rev.1.03.01 以降 |
Rev.19.01.06 以降 |
Rev.19.00.01 以降 |
Rev.19.02.10 以降 |
Rev.23.02.02 以降 |
Rev.23.01.01 以降 |
Rev.23.00.03 以降 |
Rev.15.04.01 以降 |
Rev.15.02.01 以降 |
Rev.15.01.02 以降 |
Rev.15.00.02 以降 |
Rev.14.01.05 以降 |
Rev.14.00.08 以降 |
Rev.14.00.08 以降 |
Rev.11.03.02 以降 |
Rev.11.01.04 以降 |
Rev.11.00.06 以降 |
Rev.10.01.16 以降 |
Rev.10.00.52 以降 |
| "1.01" |
以下の機能を追加した
|
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | Rev.10.01.22 以降 |
Rev.10.00.56 以降 |
| "1.02" |
以下の機能を追加した
|
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | Rev.10.01.24 以降 |
↓ |
| "1.03" |
以下の機能を追加した
|
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | Rev.11.00.13 以降 |
↓ | Rev.10.00.60 以降 |
| "1.04" |
ハードウェアライブラリで、USBキーボードやUSBバーコードリーダーの出力を読み取れるようにした |
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | Rev.11.00.16 以降 |
Rev.10.01.32 以降 |
↓ |
| "1.05" |
以下の変更をした
|
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | Rev.11.01.06 以降 |
Rev.11.00.20 以降 |
Rev.10.01.42 以降 |
Rev.10.00.61 以降 |
| "1.06" | LuaSocketに対応した | ↓ | ↓ ※LuaSocketには非対応 |
↓ ※LuaSocketには非対応 |
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | Rev.11.01.09 以降 |
↓ | ↓ | ↓ |
| "1.07" | rt.command 関数で、コマンド実行のログを出力するか否かを指定できるようにした | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | Rev.14.01.11 以降 |
Rev.14.00.18 以降 |
Rev.14.00.18 以降 |
Rev.11.03.13 以降 |
Rev.11.01.25 以降 |
Rev.11.00.28 以降 |
Rev.10.01.65 以降 |
- |
| "1.08" |
以下の変更をした
|
- | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | Rev.15.02.03 以降 |
Rev.15.01.09 以降 |
Rev.15.00.10 以降 |
Rev.14.01.26 以降 |
Rev.14.00.26 以降 |
Rev.14.00.26 以降 |
- | - | - | - | - |
Lua スクリプト機能バージョンの新しいファームウェアは、基本的に以前のバージョンでサポートする機能を含みます。詳細は Lua 言語の文法とライブラリ関数を参照してください。
(*1) DOWNLOAD ボタン非搭載機種、および、SRT100では、DOWNLOADボタンからの実行用のタスクを除く、9個のタスクが用意されています。
管理ユーザー権限でルーターにログインして lua コマンドを実行したり、DOWNLOAD ボタンを押すことで指定した Lua スクリプトを開始させることができます。lua コマンド は Lua 標準の lua コマンドオプションのうち、標準入力 ( stdin ) をスクリプトの入力対象とする -i / - オプションや、パラメータなしの実行には対応していません。Lua スクリプトを開始させる手段には次のものがあります。
lua コマンドの実行例を下記に挙げます。
# lua usb1:/sample.lua
# lua -e 'for i = 1, 10 do rt.command("no ip filter " .. i) end'
# lua -e 'rt.command("clear log")' -e 'rt.syslog("info", "スクリプト開始")' usb1:/sample.lua
lua コマンドは、指定した Lua スクリプトを開始させるトリガーに過ぎないため、Lua スクリプトの終了を待たずにコマンドプロンプトが返ります。そのため、同一コンソール上から連続的に同コマンドを実行して複数の Lua スクリプトを立ち上げることが可能です。ただし、同時に走行可能な Lua スクリプトの上限数は 8 です。Lua スクリプト機能では 1 度の lua コマンド実行につき 1 つの Lua タスクが割り当てられるため、同時に走行しているスクリプトの数だけ Lua タスクが使用されることになります。なお、(例 3) のように、1 度の lua コマンドで複数の Lua スクリプトを指定する場合は、複数の Lua スクリプトが 1 つの Lua タスク内で指定した順番に実行されます。Lua スクリプトの走行状態や過去の実行状況などは show status lua コマンドから確認できます。また、走行中の Lua スクリプトを強制終了させたいときは、terminate lua コマンド を使用します。
実行した lua コマンドや Lua スクリプトの中に文法エラーがあった場合は、INFO タイプのエラーメッセージが SYSLOG に出力され、スクリプトの実行が中断されます。
[SYSLOG例] 2009/09/21 12:20:07: lua: mail.lua:26: 'rt.mail': 'text' field value of argument #1 is invalid.
また、スクリプトファイルの重複チェック等は行われないため、同時に同一のスクリプトファイルを指定して lua コマンドを実行した場合は、同一のスクリプトファイルが複数の Lua タスクで走行することになります。操作ミスをした場合は、terminate lua コマンド で不要な Lua タスクを強制終了させてください。
DOWNLOAD ボタンによる実行について ( DOWNLOAD ボタン非搭載機種、および、SRT100 を除く )
DOWNLOAD ボタンからはスクリプトファイルを 1 つだけ実行させることができます。lua コマンドのような複雑な操作は行えません。
DOWNLOAD ボタンを使用して Lua スクリプトを開始させる場合は 1 つの Lua タスクしか割り当てられません。ただし、lua コマンド の実行時に割り当てられる 8 個の Lua タスクとは別に DOWNLOAD ボタン専用の Lua タスクが用意してあるため、lua コマンド 用の Lua タスクに空きが無くても、DOWNLOAD ボタンから Lua スクリプトを開始させることができます。DOWNLOAD ボタンによる実行方法について下記に述べます。(※1)
(※1) DOWNLOAD ランプがない機種では、DOWNLOAD ランプの点灯、点滅はありません。
(※2) FUNCボタンが搭載されている機種では、operation button function funcコマンドを使用してください。
常駐型の Lua スクリプトについて
専用の Lua タスクで実行されるため、プログラムに終了がない常駐型の Lua スクリプトを走行させることが可能です。Lua タスクは CPU リソースの使用に制限を設けていますが、実行するスクリプトの内容によっては CPU 使用率が 100% 近く上がることがあります。したがって、スクリプトプログラムの方でも CPU 使用率が高くならないような配慮が必要です ( 注意事項 参照 )。
スクリプトファイルはルーター内蔵のフラッシュ ROM ( RTFS )、または、外部メモリに保存できます。RTFS とは、ルーター内蔵のフラッシュ ROM 上に構築されているファイルシステムのことです。lua コマンドや operation button function download コマンド(※)でスクリプトファイルを指定する場合は、その格納場所を絶対パス、もしくは、環境変数 PWD からの相対パスで指定します。絶対パス指定では、外部メモリを指すファイルパスには搭載している外部メモリポートに従い "usb1:" 、 "sd1:" というようなプレフィックスを付けます。外部メモリを示すプレフィックスが記述されていない場合は、RTFS を示すファイルパスと判別されます。相対パス指定では、環境変数 PWD により、外部メモリと RTFS のいずれかに判別されます。なお、スクリプトファイルの暗号化には対応していません。
(※) FUNCボタンが搭載されている機種では、operation button function funcコマンドを使用してください。
ファイルシステムの操作方法は技術資料 ( RTFS / 外部メモリの利用 ) を参考にしてください。
# lua /lua/sample.lua
# lua usb1:/lua/sample.lua
# operation button function download execute lua usb1:/lua/sample.lua
# lua sample.lua
(例 4) は、PWD に "/lua" が設定されていれば (例 1) と同じ意味になり、"usb1:/lua" が設定されていれば (例 2) と同じ意味になります。
また、Lua 標準関数にあるファイル操作系関数も同様にルーター内蔵のフラッシュ ROM 、または、外部メモリを対象とすることができ、それぞれのデバイス上でファイルの生成と読み書きが行えます。ファイル操作系関数の引数のファイル名にも絶対パスと相対パスが使用できます。なお、フラッシュ ROM への頻繁な書き込みはデバイスの消耗を早めることになるので、繰り返しフラッシュ ROM への書き込みを行うようなスクリプトの実行には注意してください ( 注意事項 参照 )。
-- スクリプト
fdr, err = io.open("/in_file.txt", "r")
if (not fdr) then
print(err)
os.exit(-1)
end
fdw, err = io.open("usb1:/out_file.txt", "w")
if (not fdw) then
print(err)
fdr:close()
os.exit(-1)
end
str = fdr:read("*a")
fdw:write(str)
fdr:close()
fdw:close()
定義済みファイルディスクリプタの標準入力 ( stdin ) / 標準出力 ( stdout ) / エラー出力 ( stderr ) には対応していないため、それらを指定することはできません。ただし、Lua 標準関数の print( ) 関数は使用可能です。print( ) 関数の出力先は lua コマンドを実行したルーターコンソールになりますが、Lua スクリプトが schedule at コマンド、または、DOWNLOAD ボタンをトリガーにして実行されたときの print( ) 関数では何も出力されません。
ヤマハルーターが実装している Lua のバージョンは 5.1.4 / 5.1.5 です。Lua 5.1.4 / 5.1.5 がサポートしている標準関数のうち、ヤマハルーターでは使用できない関数や使用方法に制限がある関数があります。ここに挙がっていない関数は標準の仕様で使用可能です。
使用できない関数
使用方法に制限がある関数
Lua 標準では "_VERSION" のように予約済みのグローバル変数があり、それらはスクリプト内でその変数名を指定するだけで参照することができます。ここではルーター用に新たに追加している予約済みのグローバル変数について説明します。
_RT_LUA_VERSION
_RT_LUA_VERSION_NUM
ベースとなる Lua のバージョン ( _VERSION ) からさらに、ルーター独自のカスタマイズを加えた当機能のバージョンが設定されています。当機能の初期リリース時は _RT_LUA_VERSION には "1.0" という文字列が設定されており、当機能の仕様拡張やルーター用 API の追加に伴い、バージョン番号が上がっていきます。_RT_LUA_VERSION_NUM はバージョンを数値で表したもので、上一桁でメジャー番号、下二桁でマイナー番号を示す三桁の整数になっています。"1.0" の場合、_RT_LUA_VERSION_NUM == 100 となります。API を新旧のルーターファームウェアで使い分ける必要がある場合などに、当変数で切り分けることができます。
-- スクリプト
if (_RT_LUA_VERSION_NUM >= 200) then
-- 2.0 で対応している API を使う
else
-- 2.0 より前のバージョンで対応している API を使う
end
_RT_FIRM_REVISION
ルーターファームウェアのリビジョンを示す文字列が設定されています。
-- スクリプト
a = _RT_LUA_VERSION
b = _RT_LUA_VERSION_NUM
c = _RT_FIRM_REVISION
d = _VERSION
print("_RT_LUA_VERSION : " .. a)
print("_RT_LUA_VERSION_NUM : " .. b)
print("_RT_FIRM_REVISION : " .. c)
print("_VERSION : " .. d)
[実行結果] _RT_LUA_VERSION : 1.0 _RT_LUA_VERSION_NUM : 100 _RT_FIRM_REVISION : RTX1200 Rev.10.01.12 (Fri Jul 31 17:52:51 2009) _VERSION : Lua 5.1
よく使うアドレスや文字列、もしくは、ルーターごとに異なる設定値などを、set コマンドで環境変数に設定しておくことができます。設定した環境変数は Lua 標準関数の os.getenv( ) で参照します。Lua スクリプトを各ルーターで共通化したい場合などに便利です。
( config ) # set GATEWAY1=172.16.1.100
-- スクリプト
adr = os.getenv("GATEWAY1")
rt.command("ping -c 5 " .. adr)
次に、Lua スクリプト機能の内部で参照される環境変数について説明します。
LUA_INIT(大文字指定)
LUA_INIT には、Lua の開始時に事前に実行させるスクリプトを設定します。LUA_INIT が設定されている場合は、lua コマンド等で指定したスクリプトの開始前に必ずそのスクリプトが実行されるようになります。設定値は、先頭に "@" がある場合はスクリプトファイルを指すパスと認識され、それ以外はスクリプト文字列と認識されます。
# set LUA_INIT=@/lua/init.lua
# set LUA_INIT='rt.command("clear log")'
LUA_INIT のデフォルト値は設定されていません。
LUA_PATH(大文字指定)
LUA_PATH には、Lua 標準関数の require( ) が Lua のモジュールをロードするために使用するパスを設定します。Lua ではモジュール名の置換記号として "?" を使いますが、ルーターコンソールで "?" を入力するとヘルプが表示されてしまうため、"?" を入力する前にエスケープシーケンスの "\" を入力してください。
# set LUA_PATH="usb1:/\?.lua;"
LUA_PATH が設定されていない場合は、" ./?.lua; " がデフォルトのパスとして使用されます。
(注) 当機能では、require( ) で C のモジュールをロードすることはできません。したがって、LUA_CPATH は使用されません。
PWD(大文字指定)
PWD には、スクリプトファイルを指す相対パスの基点となるパスを絶対パスで設定します。lua コマンド等でスクリプトファイルを相対パスで指定する場合、この PWD が基点になります。末尾の " / " はなくても構いません。
PWD が設定されていない場合は、" / " ( RTFS のルート ) がデフォルトのパスとして使用されます。
# set PWD="/lua"
ヤマハルーター専用 API を使用することで、ルーターの操作をプログラミングすることができます。API は随時追加していく予定です。
luac コマンドを実行することで Lua スクリプトをコンパイルしてバイトコード ( 中間言語 ) を生成できます。標準の luac コマンドオプションのうち、標準入力 ( stdin ) を入力対象とする - オプションには対応していません。Lua コンパイラは同時に 1 つだけ起動することができます。lua コマンドとは違い、コンパイルが終了するまでコマンドプロンプトは返らないため、実行中は "CTRL + C" で強制終了することができます。なお、luac コマンドは shcedule at コマンドには指定できません。
# luac -o usb1:/script.out usb1:/script.lua
また、生成されたバイトコードファイルを lua コマンド等の実行対象ファイルに指定して実行することもできます。少しでも Lua スクリプトの実行負荷を下げたい場合や、保存しているスクリプトファイルを一見しただけではその内容がわからないようにしたい場合に有効な方法です。なお、実行対象のルーターまたは同一の機種上で生成したバイトコードだけが実行可能であり、実行対象のルーターとは異なる機種や Lua をインストールした PC 等で生成したバイトコードは実行できません。
# lua usb1:/script.out
ルーター内蔵のフラッシュ ROM ( RTFS ) は実行対象のスクリプトファイルを保存する用途として使用してください。外部メモリやルーター内蔵のフラッシュ ROM への頻繁な書き込みはデバイスの消耗を早めることになるので、それらに繰り返し書き込みを行うようなスクリプトの実行には注意してください。 特にルーター内蔵のフラッシュ ROM については、頻繁にファイル書き込みを行ったことが原因で故障に至った場合、保証期間内であっても無償修理の保証対象外になります。
ヤマハルーターが実装している Lua のバージョンは 5.1.4 / 5.1.5 です。Lua 言語の仕様は Lua 5.1.4 / 5.1.5 の仕様に従います。Lua 標準では一部の SJIS 文字が化ける問題がありますが、その問題は修正しており、文字列やコメントに日本語 (SJIS 文字) が使用できます。なお、関数名や変数名に日本語 (SJIS 文字) を使用することはできません。
Lua スクリプト機能は CPU リソースの使用に制限を設けています。したがって、単純な無限ループをするだけのスクリプトを走行させても CPU 使用率は 100% にはなりません。しかし、負荷の高いコマンドを繰り返し実行するようなスクリプトを同時に多数走行させたりすると CPU 使用率が高くなり、他のルーター機能に影響を及ぼすことがあります。無限ループのように長時間に渡り繰り返し同じ処理を行わせる場合は、適度に rt.sleep( ) を挟むなどして CPU 使用率が高くならないように注意してください。rt.sleep( ) はタスクを休止状態にします。
Lua 言語の数値型定義 lua_Number は、標準の double 型 ( 64bit倍精度浮動小数点数型 ) から long 型 ( 32bit符号付整数型 )に変更しています。float 型 や double 型 で表現される数値は ヤマハルーターの Lua では扱えません。同様に、string.format( ) 関数等の書式フォーマットの型変換指定子に e, E / f, F / g, G を使用することはできません。
定義済みファイルディスクリプタの標準入力 ( stdin ) / 標準出力 ( stdout ) / エラー出力 ( stderr ) を Lua スクリプト内で使用することはできません。
Lua 標準関数の require( ) で C のモジュールをロードすることはできません。したがって、当機能では LUA_CPATH は使用されません。
schedule at 1 startup * lua /lua/restart.lua
ルーターの起動時に Lua スクリプトを実行するスケジュールを設定します。その他、基本的な経路設定などは既に設定されているものとします。
-- ### restart.lua ###
------------------------------------------------------------
-- ルーターコマンドを実行し、出力結果を整形して返す関数 --
------------------------------------------------------------
function exec_command(cmd)
local rtn, str
local text
rtn, str = rt.command(cmd)
if (rtn) and (str) then
text = string.format("\"%s\"の実行結果\r\n\r\n%s\r\n", cmd, str)
else
text = string.format("\"%s\"の実行失敗\r\n\r\n", cmd)
end
return text
end
------------------------------------------------------------
-- メイン部分 --
------------------------------------------------------------
mail_table = {
smtp_address = "smtp.xxxx.co.jp", -- 適宜変更
from = "rt-admin@xxxx.co.jp", -- 適宜変更
to = "rt-admin@xxxx.co.jp", -- 適宜変更
subject = "ルーターが再起動しました"
}
-- 情報収集
mail_table.text = exec_command("show status boot all")
mail_table.text = mail_table.text .. exec_command("show log")
-- メール送信
rt.mail(mail_table)
上記の restart.lua というテキストファイルを作成し、RTFS の /lua 配下に保存しておきます。保存方法はこちらを参照してください。
set GATEWAY=172.16.10.254 set LUA_INIT=@/lua/init.lua set PWD=/lua/tokyo ip route default gateway 172.16.10.254 ip route 192.168.1.0/24 gateway tunnel 1 ip lan1 address 192.168.2.1/24 ip lan2 address 172.16.10.1/24 ip lan2 nat descriptor 1 tunnel select 1 ipsec tunnel 101 ipsec sa policy 101 1 esp aes-cbc sha-hmac anti-replay-check=off ipsec ike always-on 1 on ipsec ike pre-shared-key 1 text PASSWORD ipsec ike remote address 1 172.16.2.1 tunnel enable 1 ipsec auto refresh on nat descriptor type 1 masquerade nat descriptor address outer 1 primary nat descriptor masquerade static 1 1 192.168.2.1 udp 500 nat descriptor masquerade static 1 2 192.168.2.1 esp
set GATEWAY=172.16.10.254 set LUA_INIT=@/lua/init.lua set PWD=/lua/tokyo
スクリプトで使用する環境変数の設定です。
-- ### init.lua ###
rt.command("clear log")
rt.syslog("info", "[スクリプト開始]")
上記の init.lua というテキストファイルを作成し、RTFS の /lua 配下に保存しておきます。保存方法はこちらを参照してください。
-- ### ping.lua ###
adr = os.getenv("GATEWAY")
------------------------------------------------------------
-- n 回 PING を実行し、ロス率を返す関数 --
------------------------------------------------------------
function exec_ping(n)
local ping_cmd
local rtn, str
local loss
ping_cmd = string.format("ping -c %s -w 0.5 %s", n, adr)
rtn, str = rt.command(ping_cmd)
if (not rtn) or (not str) then
-- エラー
return -1
end
loss = string.match(str, "(%d+)%.%d+%%") -- パケットロス率(NNN.N%)の整数部を抽出
if (not loss) then
loss = -1
else
loss = tonumber(loss)
end
return loss
end
------------------------------------------------------------
-- IPsec パケットを優先するための QoS を設定/解除する関数 --
------------------------------------------------------------
function set_qos(set)
local no = ""
if (not set) then
no = "no "
end
rt.command(no .. "queue class filter 1 4 ip * * udp 500")
rt.command(no .. "queue class filter 2 4 ip * * esp")
rt.command(no .. "queue lan2 class filter list 1 2")
rt.command(no .. "speed lan2 80m") -- 上り速度を考慮した値で
rt.command(no .. "queue lan2 type priority")
rt.command("save")
end
------------------------------------------------------------
-- メイン部分 --
------------------------------------------------------------
local rtn, str
cnt = 1
qos = false
show_cmd = "show status qos all"
mail_table = {
smtp_address = "smtp.xxxx.co.jp", -- 適宜変更
from = "admin-tokyo@xxxx.co.jp", -- 適宜変更
to = "admin-tokyo@xxxx.co.jp", -- 適宜変更
subject = "Ping Status",
text = ""
}
while (1) do
set_qos_flag = false
-- 10分間休止
rt.sleep(600)
text = os.date("%Y年%m月%d日 %H時%M分%S秒: PING 実行結果\r\n")
loss = exec_ping(arg[1])
if (loss < 0) then
text = text .. "PING 実行エラー"
else
text = text .. string.format("宛先:%s パケットロス率:%d%%", adr, loss)
if (loss >= 10) then
if (not qos) then
set_qos(true)
set_qos_flag = true
qos = true
text = text .. "\r\nQoS を設定しました"
end
elseif (loss == 0) then
if (qos) then
set_qos(false)
qos = false
text = text .. "\r\nQoS を解除しました"
end
end
end
-- SYSLOG へ記録
rt.syslog("info", text)
text = text .. "\r\n"
-- 6 回分をまとめてメール通知
mail_table.text = mail_table.text .. text .. "\r\n"
if (cnt < 6) then
cnt = cnt + 1
else
-- QoS の設定がある場合だけ"show status qos"の出力結果をメール本文に追加
-- ただし、QoS設定直後は意味がないので除く
if (qos) and (not set_qos_flag) then
rtn, str = rt.command(show_cmd)
if (rtn) and (str) then
text = string.format("# %s\r\n%s", show_cmd, str)
mail_table.text = mail_table.text .. text
end
end
-- メール送信
if (not rt.mail(mail_table)) then
rt.syslog("info", "Failed rt.mail by Lua")
end
-- メール送信が終わったらリセット
cnt = 1
mail_table.text = ""
end
end
上記の ping.lua というテキストファイルを作成し、RTFS の /lua/tokyo 配下に保存しておきます。保存方法はこちらを参照してください。
# lua ping.lua 30
東京支社ルーターにシリアルや TELNET 経由でログインし、仮に PING の送信回数を 30 回とするなら、コマンド入力画面で上記のように入力します。PWD に "/lua/tokyo" が設定されているため、ファイルパスは "/lua/tokyo/ping.lua" と解釈されます。ping.lua は無限ループをするので、途中で終了させたい場合は terminate lua コマンドを使います。
本機能において出力される SYSLOG メッセージを以下に示します。実際に出力されるメッセージには "[LUA]" というプレフィックスが付加されます。ヤマハルーター専用 API で出力される SYSLOG メッセージについては、Lua 向けヤマハルーター専用 APIのページを参照してください。
| レベル | 出力メッセージ | 意味 |
|---|---|---|
| INFO | Lua script function was enabled. | Lua スクリプト機能を有効にした。 |
| Lua script function was disabled. | Lua スクリプト機能を無効した。 | |
| DEBUG | created Lua Task(N) | Lua タスク番号 N の Lua タスクを生成した。 |
| terminated Lua Task(N) | Lua タスク番号 N の Lua タスクを強制終了した。 | |
| closed Lua Task(N): success | Lua タスク番号 N の Lua タスクを終了した。実行したスクリプトは正常に終了した。 | |
| closed Lua Task(N): failure | Lua タスク番号 N の Lua タスクを終了した。実行したスクリプトはエラー終了した。 |