Lua脚本功能

概述

雅马哈路由器中,能够执行Lua脚本(参考: lua.org的首页)。通过在Lua脚本中嵌入了雅马哈路由器专用API,可以根据路由器的状态编程处理路由器的设置变更及动作。例如,能够创建如下脚本。

  • config的程序设置
  • 当无法向特定的地址进行通信时,给管理员发送邮件
  • 通道关闭时,变更路由

并且,雅马哈路由器专用API已在 这里的页面(日文)中公开。预计随时追加API。雅马哈路由器实现的Lua的版本为5.1.4。

关于雅马哈实现的Lua语言的规格,请参 Lua语言的语法(日文)库(Library)函数(日文)
Lua 教程(日文)是面向编程初学者的教程。

关于原始的Lua语言的规范,请参照 Lua 5.1 Reference Manual

支持机型和固件版本

雅马哈路由器中,以下的机型以及固件支持Lua脚本功能。

机型 固件
RTX5000 Rev.14.00.15以后
RTX820 Rev.11.03.16以后
RTX1200 Rev.10.01.20以后
RTX800 Rev.10.01.20以后

Lua脚本功能版本更改历史记录

Lua脚本功能版本更改历史记录和各个机型的固件版本比较表。

_RT_LUA_VERSION 变更内容 固件
RTX5000 RTX820 RTX1200 RTX800
"1.0" 初期リリース Rev.14.00.15
以后
Rev.11.03.16
以后
Rev.10.01.20
以后
Rev.10.01.20
以后
"1.01" 以下の機能を追加した
  • BIGNUM を使用できるようにした
  • ビット演算ライブラリを追加した
  • math ライブラリの一部の関数を使用できるようにした
"1.02" 以下の機能を追加した
  • ハードウェアライブラリを追加した
  • HTTPクライアント機能 ( rt.httprequest 関数 ) を追加した
"1.03" 以下の機能を追加した
  • 正規表現オブジェクトを生成する string.regexp 関数を新設した
    また、正規表現糖衣構文により、string.regexp 関数を呼び出せるようにした
  • 以下の各関数で、パターンとして正規表現オブジェクトを利用できるようにした
    • string.find
    • string.match
    • string.gmatch
    • string.gsub
    • string.split
    • rt.syslogwatch
  • 文字列をパターンで分割する string.split 関数を新設した
  • 引数列あるいは配列の要素を巡回する each 関数を新設した
Rev.10.01.25
以后
Rev.10.01.25
以后
"1.04" ハードウェアライブラリで、USBキーボードやUSBバーコードリーダーの出力を読み取れるようにした Rev.10.01.33
以后
Rev.10.01.33
以后
"1.05" 以下の変更をした
  • ベースとなる Lua をバージョン 5.1.5 にした
  • rt.mail 関数で、メール本文の先頭にルーターの情報を挿入するか否かを指定できるようにした
"1.06" LuaSocketに対応した。 Rev.10.01.55
以后
Rev.10.01.55
以后
"1.07" rt.command 関数で、コマンド実行のログを出力するか否かを指定できるようにした Rev.10.01.66
以后
Rev.10.01.66
以后

Lua スクリプト機能バージョンの新しいファームウェアは、基本的に以前のバージョンでサポートする機能を含みます。詳細は Lua 言語の文法ライブラリ関数を参照してください。

术语的定义

Lua任务

由路由器的OS准备的、为执行Lua脚本路由器的专用任务。事先共准备了10个任务,其中8个用于lua命令,一个用于从DOWNLOAD按钮执行,一个用于Lua编译器。每个任务独立,因此能够同时运行最大数量的Lua任务。

详细

Lua脚本的执行方法和执行环境

以管理用户权限登录路由器,能够通过执行lua 命令或者按下DOWNLOAD按钮来开始指定的Lua脚本。lua 命令 在Lua标准的lua 命令选项中,不支持将标准输入(stdin)作为脚本输入对象的-i/-选项以及不带参数的执行。开始Lua脚本有以下的方法。

  • 从串行口控制台以及TELNET/SSH客户端执行lua命令
  • 使用远程启动功能执行lua命令
  • 从GUI的命令执行页面执行lua命令
  • 使用schedule at自动执行lua命令(定时执行及路由器启动时执行等)
  • [装有DOWNLOAD按钮的] 长时间按住DOWNLOAD按钮

lua 命令的执行例列举如下:

(例1) 执行外部存储器的脚本文件。
# lua usb1:/sample.lua
(例2) 执行命令行中记述的脚本。
# lua -e 'for i = 1, 10 do rt.command("no ip filter " .. i) end'
(例3) 连续执行多个脚本。
# lua -e 'rt.command("clear log")' -e 'rt.syslog("info", "脚本开始")' usb1:/sample.lua

lua 命令只不过是使指定的Lua脚本开始的触发器,所以,不等待Lua脚本结束就返回命令提示符。因此,能够从同一个控制台上连续执行该命令,建立多个Lua脚本。不过,能够同时运行的Lua脚本的最大数量为8个。Lua脚本功能中,执行一次lua 命令就会被分配一个Lua任务,因此会使用同时运行的脚本数量的Lua任务。并且,如例3所示,用一次lua 命令指定多个Lua脚本时,多个Lua脚本将在一个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按钮只能执行一个脚本文件。不能进行类似lua 命令的复杂操作。

使用DOWNLOAD按钮开始Lua脚本时,只会分配一个Lua任务。不过,由于准备了DOWNLOAD按钮专用的Lua任务而不同于执行lua 命令时分配的八个Lua任务,所以即使用于lua 命令 的Lua任务用完了,仍然能够通过DOWNLOAD按钮开始Lua脚本。通过DOWNLOAD按钮的执行方法如下所述。

  • 通过operation button function download 命令将Lua脚本的执行分配给DOWNLOAD按钮的功能。
  • 连续按住DOWNLOAD按钮3秒钟以上,Lua脚本即开始。
    这时会发出"哔"的警告,DOWNLOAD指示灯开始闪烁。然后,Lua脚本结束时,发出"哔啵哔啵"的警告,DOWNLOAD指示灯熄灭。
  • 想要中途停止Lua脚本的运行时,连续按住DOWNLOAD按钮1秒钟以上。Lua脚本的运行停止后,DOWNLOAD指示灯熄灭。这时,连续按住DOWNLOAD按钮3秒钟以上后将再次开始Lua脚本,因此,DOWNLOAD指示灯熄灭后请将手从按钮上拿开。
    而且,通过DOWNLOAD按钮开始的脚本也能够通过terminate lua 命令停止。这时,Lua脚本停止时,发出"卟卟卟卟"的警告,DOWNLOAD指示灯熄灭。
  • Lua脚本错误结束时,发出"卟卟卟卟"的警告,DOWNLOAD指示灯亮灯。
    这时,连续按住DOWNLOAD按钮1秒钟以上,错误状态解除,DOWNLOAD指示灯熄灭。
  • 通过DOWNLOAD按钮开始的Lua脚本还在运行过程中执行operation button function download 命令时,无论是否有参数变更,正在运行的Lua脚本将被强行结束。
关于常驻型的Lua脚本

由于用专用的Lua任务执行,所以能够在程序中运行不会结束的常驻型的Lua脚本。Lua任务对CPU资源的使用设有限制,但是可能因执行的脚本的内容而导致CPU使用率升至接近100%。因此,脚本程序中也要考虑到如何使CPU使用率不升高(参照注意事项)。

文件 I/O

脚本文件能够保存在路由器内置的闪存ROM(RTFS)或者外部存储器中。RTFS是指在路由器内置的闪存ROM上构建的文件系统。用lua 命令operation button function download 命令指定脚本文件时,用绝对路径或者通过环境变量PWD的相对路径指定其保存场所。绝对路径指定中,根据指向外部存储器的文件路径中搭载的外部存储器端口,添加"usb1:"、"sd1:"的前缀,未记述表示外部存储器的前缀时,判断为表示RTFS的文件路径。相对路径指定中,根据环境变量PWD判断是外部存储器或RTFS的其中之一。并且,不支持脚本文件的加密。

文件系统的操作方法请参照技术资料(RTFS/ 外部存储器的使用(日文))。

(例1)用绝对路径指定内置闪存ROM的脚本文件。
# lua /lua/sample.lua
(例2)用绝对路径指定外部存储器的脚本文件。
# lua usb1:/lua/sample.lua
(例3) 通过DOWNLOAD按钮执行的脚本中用绝对路径设置外部存储器的脚本文件。
# operation button function download execute lua usb1:/lua/sample.lua
(例4) 用相对路径指定脚本文件。
# lua sample.lua

(例4)如果在PWD中设置了“/lua”则与(例1)的意义相同,如果设置了“usb1:/lua”,则与(例2)的意义相同。

另外,Lua标准函数内的文件操作类函数也同样能够以路由器内置的闪存ROM或者外部存储器为对象,能在各自的设备中进行文件的生成和读写。文件操作类函数参数的文件命中也能够使用绝对路径和相对路径。并且,向闪存ROM的频繁写入会加速设备的消耗,因此,请注意不要进行反复写入闪存ROM这样的脚本执行(参照注意事项)。

(例) 将内置闪存ROM的in_file.txt的内容写入USB存储器的out_file.txt。
-- 脚本
 
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的标准函数

雅马哈路由器实现的Lua的版本为5.1.4。Lua 5.1.4支持的标准函数中,有雅马哈路由器中不能使用或者使用方法有限制的函数。这里没有列举的为标准的规格,可以使用。

不能使用的函数

  • math库的所有函数 (math.XXX)
  • package.loadlib( )
  • io.popen( )
  • io.tmpfile( )
  • file:setvbuf( )
  • file:seek( )
  • os.execute( ) (能够用rt.command( )代替)
  • os.setlocale( )
  • os.tmpname( )
  • debug.debug( )

使用方法有限制的函数

  • dofile( )/loadfile( )
    因为不支持标准输入,所以请务必指定参数的文件名。
  • require( )
    因为不能加载C的模块,因此请在参数中指定Lua中记述的模块的名称。
  • string.format( )
    不能在格式format的类型转换指定符中使用e, E/f, F/g, G。
  • io 库 (io.XXX)
    因为不支持标准输入及标准输出,所以初始状态下未设置默认输入输出文件。进行对默认输入输出文件的操作时,需要用io.input( )以及io.output( )预先设置默认输入输出文件。并且,不能将标准输入(stdin)/标准输出(stdout)/错误输出(stderr)用作为文件句柄。
  • io.open( )
    模式中不能像“r+”/“w+”/“a+”这样加上“+”。另外,RTFS不支持补记模式,因此,如果是开放对象位于内置闪存ROM中的文件,模式中不能指定“a”。
  • io.read( )/file:read( )
    格式format中不能使用“*n”。
  • os.date( )
    因为不支持isdst,所以格式参数中指定了“*t”时,返回的表中isdst字段总是设为false。
  • os.time( )
    因为不支持isdst,所以即使参数的表字段中有isdst也被忽视。

Lua的全局变量

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等情况下,能够通过该变量区分。

(例) 通过_RT_LUA_VERSION_NUM分支处理。
-- 脚本
 
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 (China) Rev.10.01.33 (Thu Jul 28 15:25:19 2011)
_VERSION            : Lua 5.1

路由器的环境变量

能够用set 命令在环境变量中预设常用的地址及字符串、或者各个路由器不同的设置值等。设置的环境变量用Lua标准函数的os.getenv( )进行引用。在各个路由器中通用化Lua脚本等情况时,非常方便。

(例)将WAN端的网关地址预设在环境变量中,向该地址抛出5次PING。
( 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 命令等开始指定的脚本之前必须执行该脚本。如果设置值的开头有“@”,则识别为指向脚本文件的路径,除此之外识别为脚本字符串。

(例1) 预设用于初始化的脚本文件。
# set LUA_INIT=@/lua/init.lua
(例2) 预设用于初始化的脚本。设置值中如果有特殊字符,需要用双引号或者单引号括起来。
# set LUA_INIT='rt.command("clear log")'

LUA_INIT的默认值未设置。

LUA_PATH(指定大写)

LUA_PATH中设置用于Lua 标准函数的require( )加载Lua模块的路径。Lua中使用“?”作为模块名的替换符号,但是路由器控制台中输入“?”后会出现帮助(help),因此,输入“?”之前请输入转译时序的 “\”。

(例) 加载的模块位于“usb1:/”目录下时
# set LUA_PATH="usb1:/\?.lua;"

LUA_PATH未设置时,“./?.lua;”用作为默认路径。

(注) 本功能中,不能用require( )加载C的模块。因此,不会使用LUA_CPATH。

PWD(指定大写)

PWD中用绝对路径设置指向脚本文件的相对路径基点的路径。通过lua 命令等、用相对路径指定脚本文件时,这个PWD为基点。没有末尾的“/”也没有关系。
PWD未设置时,“/”(RTFS 的路由)用作为默认路径。

(例) 设置脚本文件的保存路径。
# set PWD="/lua"

雅马哈路由器专用API

通过使用雅马哈路由器专用API,从而能够编程路由器的操作。计划随时追加API。

Open in new window 针对Lua雅马哈路由器专用API的公开网页(日文)

Lua编译器 (Luac)

通过执行luac 命令,能够编译Lua脚本、生成字节码(中间语言)。标准的luac命令选项中,不支持以标准输入(stdin)为输入对象的选项。Lua编译器同时只能启动一个。与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。Lua语言的规格依照Lua 5.1.4的规格。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( )函数等的格式format的类型转换指定符中不能使用e, E/f, F/g, G。

  • 不能在Lua脚本内使用已定义文件描述符的标准输入(stdin)/标准输出(stdout)/错误输出(stderr)。

  • Lua标准函数的require( )中不能加载C的模块。因此,本功能中不会使用LUA_CPATH。

命令

是否将Lua脚本功能设为有效的设置

[格式]
lua use SWITCH
no lua use [SWITCH]
[设置值]

SWITCH

  • on ... 设为有效
  • off ... 设为无效
[说明]

设置Lua脚本功能是否有效。
Lua脚本的运行过程中将Lua脚本功能设为无效时,正在运行的所有Lua脚本将被强行结束。

[初始值]
on

Lua脚本的执行

[格式]
lua [-e STAT] [-l MODULE] [-v] [--] [SCRIPT_FILE [ARGS ...]]
[设置值]
  • STAT ... 脚本字符串
  • MODULE ... 加载(require)的模块名称
  • SCRIPT_FILE ...用绝对路径或者相对路径指定脚本文件名或者字节码文件名
  • ARGS ... 传递给SCRIPT_FILE的可变个数参数
[说明]
  • 执行Lua脚本。
    基本的语法与Lua标准的lua命令相同,不过不支持以标准输入(stdin)为脚本输入对象的-i/-选项和无参数的执行。-v选项输出版本信息。--选项表示用记述的点(point)结束选项处理,SCRIPT_FILE及ARGS中能够指定以“-”开始的文件名及字符串。并且,-e/-l/-v的各个选项能够重复指定多个,但是不能在SCRIPT_FILE后面指定。SCRIPT_FILE只能指定一个,记述了SCRIPT_FILE点(point)以上的参数都将忽视。这时,不会输出错误消息。
  • SCRIPT_FILE中指定相对路径时,解释为以环境变量PWD为基点的路径。PWD能够用set命令进行更改,初始值为“/”。
[注解]

环境变量LUA_INIT已设置时,这个脚本将第一个执行。
SCRIPT_FILE中指定字节码文件时,只能执行路由器上生成的字节码,安装了Lua的PC等中生成的字节码不能执行。

Lua编译器的执行

[格式]
luac [-l] [-o OUTPUT_FILE] [-p] [-s] [-v] [--] SCRIPT_FILE [SCRIPT_FILE ..]
[设置值]
  • OUTPUT_FILE ... 用绝对路径或者相对路径指定字节码的输出先的文件名
  • SCRIPT_FILE ... 用绝对路径或者相对路径指定编译对象的脚本文件名
[说明]
  • 执行Lua编译器,生成字节码。
    基本的语法与Lua标准的luac命令相同,但是-选项不能指定。-l选项是列表显示已生成的字节码。-p选项只进行句法解析。-s选项取出注释等的调试信息。-v选项输出版本信息。--选项表示用记述的点(point)结束选项处理,SCRIPT_FILE中能够指定以“-”开始的文件名。并且能够指定多个SCRIPT_FILE,集中在一个字节码文件中。
  • SCRIPT_FILE/OUTPUT_FILE中指定相对路径时,解释为以环境变量PWD为基点的路径。PWD能够用set命令进行更改,初始值为“/”。
[初始值]
OUTPUT_FILE = luac.out (相对路径)

Lua脚本的运行状态的显示

[格式]
show status lua [INFO]
[设置值]
  • INFO ... 显示信息的种类
    • running ... 正在运行的脚本相关的信息
    • history ... 过去运行的脚本相关的信息
    • 省略时,显示全部的信息
[说明]

显示当前Lua脚本的运行状态及过去的运行历史记录。用lua use 命令将Lua脚本功能设为无效后,这些信息即被清除。

  • Lua的版本信息
  • 正在运行的脚本 [ running ]
    • Lua任务号码
    • 运行状态
      • RUN ... 正在运行
      • SLEEP ... 正在休眠
      • WATCH ... 正在监测SYSLOG (Lua任务正在休眠)
      • TERMINATE ... 正在强行结束
    • 触发器
      • lua 命令
      • luac 命令
      • 计划(schedule)
      • DOWNLOAD按钮
    • 命令行
    • 脚本文件名
    • 监测字符串 (正在监测SYSLOG时)
    • 开始时间/运行时间
  • 过去运行的脚本[history](从新到旧显示最新的10种)
    • 触发器
      • lua 命令
      • luac 命令
      • 计划(schedule)
      • DOWNLOAD按钮
    • 命令行
    • 脚本文件名
    • 运行次数/错误发生次数/错误历史记录(从新到旧显示最新的5次)
    • 上次的开始时间/结束时间/运行结果
[显示范例]
# show status lua
Lua库版本:Lua 5.1.4
Lua脚本功能版本:1.0

[running]
Lua任务ID (状态):  1  (RUN)
运行触发器:'lua' 命令
命令行:  lua test.lua
脚本文件:  /lua/test.lua
开始时间:2009/09/21 16:41:01
经过时间:6秒
-------------------------------------------------------------------------------
Lua任务ID (状态):  9  (SLEEP)
运行触发器:  DOWNLOAD按钮的执行
脚本文件:  usb1:/lua/test2.lua
开始时间:2009/09/21 16:40:32
经过时间:35秒

[history]
(1)
运行触发器:  DOWNLOAD按钮的执行
脚本文件:  usb1:/lua/mail.lua
运行次数:1
错误发生次数:  1
错误历史记录:
2009/09/21 16:37:51: lua: mail.lua:36: 'rt.mail': 'smtp_address' field of arg
ument #1 doesn't exist.
首次的开始时间:  2009/09/21 16:37:51
上次的开始时间:  2009/09/21 16:37:51
上次的结束时间:  2009/09/21 16:37:51
上次的运行结果:  错误结束
-------------------------------------------------------------------------------
(2)
运行触发器:'lua' 命令
命令行:  lua -e "print(rt.command(\"show environment\"))"
运行次数:3
错误发生次数:  0
首次的开始时间:  2009/09/21 16:35:47
上次的开始时间:  2009/09/21 16:36:57
上次的结束时间:  2009/09/21 16:36:57
上次的运行结果:  正常结束

Lua 脚本的强行结束

[格式]
terminate lua TASK_ID
terminate lua file SCRIPT_FILE
[设置值]
  • TASK_ID ... 强行结束的Lua任务的号码
    • all ... 全部的Lua任务号码
    • Lua任务的号码 (1 .. 10)
  • SCRIPT_FILE ... 用绝对路径或者相对路径指定强行结束的脚本文件名或者字节码文件名
[说明]

强行结束指定的Lua任务或者Lua脚本。

  • 第一格式中,强行结束用TASK_ID指定的Lua任务。能够用show status lua 命令确认Lua任务的号码及正在执行的脚本。
  • 第二格式中,强行结束所有的正在执行与SCRIPT_FILE中指定的路径和文件名完全一致的Lua任务。SCRIPT_FILE中指定相对路径时,替换为以环境变量PWD为基点的绝对路径后进行对象Lua任务的检索。
  • 使用lua 命令的-e选项,强行结束不使用脚本文件就执行的Lua脚本时,使用第一格式。

环境变量的设置

[格式]
set NAME=VALUE
no set NAME[=VALUE]
[设置值]
  • NAME ... 环境变量名
  • VALUE ... 设置值
[说明]

设置路由器的环境变量。
环境变量名的命名规则如下:

  • 能够使用半角英文数字和下划线“_”,但是不能以下划线或者数字作为首个字符。
  • 变量名长度没有限制,但是set命令不能超过命令行的最大长度4095个字符执行。
  • 区分英文字母大小写。例如,abc和Abc被作为不同的变量处理。

是否发出Lua脚本功能相关告警音的设置

[格式]
alarm lua SWITCH
no alarm lua [SWITCH]
[设置值]

SWITCH

  • on ... 发出
  • off ... 不发出
[说明]

选择是否发出Lua脚本功能相关的告警音。

[初始值]
on

按下DOWNLOAD按钮时执行的功能的设置(规格扩展)

[格式]
operation button function download FUNCTION [SCRIPT_FILE [ARGS ...]]
no operation button function download [FUNCTION] [SCRIPT_FILE [ARGS ...]]
[设置值]
  • FUNCTION ... 按下DOWNLOAD时执行的功能
    • http revision-up ... HTTP版本升级
    • execute batch ... 批处理文件的执行
    • mobile signal-strength ... 移动终端的电波接收电平的获取
    • execute lua ... Lua脚本的执行
  • SCRIPT_FILE ...用绝对路径或者相对路径指定脚本文件名或者字节码文件名
  • ARGS ... 传递给SCRIPT_FILE的可变个数参数
[说明]

设置按下DOWNLOAD按钮时执行的功能。功能执行工作过程中DOWNLOAD按钮下方的指示灯点亮,功能执行结束后熄灭。
FUNCTION中设置了execute lua时,必须指定SCRIPT_FILE。SCRIPT_FILE中指定了相对路径时,解释为以环境变量PWD为基点的路径。PWD能够用set 命令进行更改,初始值为“/”。

[注解]

执行Lua脚本时,如果已设置了环境变量LUA_INIT,则LUA_INIT的脚本比SCRIPT_FILE先执行。

[初始值]
http revision-up

计划的设置(规格扩展)

[格式]
schedule at ID [DATE] TIME * COMMAND ..
schedule at ID [DATE] TIME pp PEER_NUM COMMAND ..
schedule at ID [DATE] TIME tunnel TUNNEL_NUM COMMAND ..
no schedule at ID [[DATE] ..]
[设置值]
  • ID ... 计划号码
  • DATE ...日期 (可省略)
    • 月/日
    • 省略时视为*/*
  • TIME ...时间
    • hh:mm[:ss] ... 时(0..23 或者 *) : 分(0..59 或者 *) : 秒(0..59),秒可以省略
    • startup ... 启动时
    • usb-attached ... 识别USB设备时
  • PEER_NUM
    • 对方目的地信息号码
    • anonymous
  • TUNNEL_NUM .. 通道接口的号码
  • COMMAND ..执行的命令(有限制)
[说明]

在TIME中指定的时间,执行COMMAND中所指定的命令。
用第二、第三格式指定时,分别预先完成以下动作,即发行完所指定的对方目的地信息号码/通道号码中的pp select/tunnel select 命令。
schedule at命令能够指定多个,相同时间所指定的命令按照id从小到大的顺序执行。

TIME以hh:mm格式指定时,视为没有指定秒,以hh:mm:ss格式指定时,视为有指定秒。秒数中不能够用“-”指定范围或者用“*”指定全部。

以下的命令不能指定。
administrator、 administrator password、 cold start、 除console info和console prompt之外的以console 开始的命令、 date、 exit、 help、 http revision-up go、 INTERFACE reset、 以less开始的命令、 login password、 login timer、 luac、 ping、 ping6、 pp select、 provider interface dns server、provider INTERFACE name、 quit、 remote setup、 save、 schedule at、 以show开始的命令、 telnet、time、 timezone、 traceroute、 traceroute6、 tunnel select

[注解]
  • 输入时,对于COMMAND参数通过TAB键进行命令补全,但是执行时才能检测出句法错误等。通过schedule at命令执行所指定的命令时,将要执行的内容输出至INFO类型的SYSLOG中。
  • DATE中不能数字和星期几混杂指定。
  • 指定了startup的计划在路由器启动时执行。想要接通电源就立即发送数据等情况下非常方便。
[设置范例]

仅在周一至周五的8:00~17:00允许连接

# schedule at 1 */mon-fri 8:00 pp 1 isdn auto connect on
# schedule at 2 */mon-fri 17:00 pp 1 isdn auto connect off
# schedule at 3 */mon-fri 17:05 * disconnect 1

仅在每个小时0分至15分之间允许连接

# schedule at 1 *:00 pp 1 isdn auto connect on
# schedule at 2 *:15 pp 1 isdn auto connect off
# schedule at 3 *:15 * disconnect 1

这次元旦切换路由控制

# schedule at 1 1/1 0:0 * ip route NETWORK gateway pp 2

仅在每天12点至13点之间 每隔20秒执行Lua脚本

# schedule at 1 12:*:00 * lua script.lua
# schedule at 2 12:*:20 * lua script.lua
# schedule at 3 12:*:40 * lua script.lua

设置范例

路由器重启时用邮件发送Reboot信息

[config所需的设置]
schedule at 1 startup * lua /lua/restart.lua

设置路由器启动时执行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目录下。保存方法请参照这里

[脚本的说明]

/lua/restart.lua
“show status boot all”和“show log”的执行结果用邮件发送给管理员的脚本。如果预先设置了启动这个脚本时执行的计划,就能立即知道路由器已重启一事,一起获得解析所需的信息。

根据WAN的通信情况设置QoS,以一定间隔用邮件发送监测情况

[网络结构]
  • 本社-东京支社之间的IPsec-VPN连接
  • 东京支社向提供商终端型连接
  • 仅在数据包丢失多的时间段启用QoS
网络结构
[东京支社路由器的 config 例 ]
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
[config的说明]
set GATEWAY=172.16.10.254
set LUA_INIT=@/lua/init.lua
set PWD=/lua/tokyo

这是脚本中使用的环境变量的设置。

[Lua脚本]
-- ### 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/init.lua
    这是LUA_INIT中设置的用于初始化的脚本。初始化SYSLOG
  • /lua/tokyo/ping.lua
    这是主要的脚本。脚本的内容如下。请注意,这是无限循环的脚本,因此里面有rt.sleep( )。
    • 每隔10分钟向WAN端网关地址发送任意次数的PING。
    • 设置PING的数据包丢失率超过10%时、优先IPsec数据包的QoS。
    • PING的数据包丢失率不到1%时,解除QoS的设置。
    • 将每次的PING的执行结果记录在SYSLOG中。
    • 汇总一定次数的PING的执行结果,用邮件发送给管理员。
    • 有邮件发送时的QoS设置时,将“show status qos all”的输出结果追加至邮件正文。
[脚本的执行范例]
# lua ping.lua 30

通过串行(serial)或TELNET登录东京支社路由器,假设PING的发送次数设为30次,命令输入页面中输入上述内容。PWD已经设置了“/lua/tokyo”,因此,文件路径解释为“/lua/tokyo/ping.lua”。ping.lua进行无限循环,因此,希望中途结束它时,使用terminate lua命令。

参考信息

返回顶部Return to Top