Lua脚本的导入步骤

本手册的导入流程是使用【范例Lua脚本】进行说明的。

导览

在本导入步骤的说明中,路由器的设置为出厂设置。
本说明使用的范例Lua脚本,需要使用路由器的DHCP服务器功能。

范例Lua脚本可以实现以下功能。

  1. 监控由DHCP功能输出的SYSLOG。
  2. 在检测出SYSLOG后,可以计算出该终端连接到路由器的哪个端口。
  3. 添加 2. 中计算出的端口号,形成新的SYSLOG,再次输出。

关于此Lua脚本,还可以变换为Case:2进行使用。
那就是,在由路由器和SWX2200构成的网络环境中,可以在SYSLOG中检测出PC连接在SWX2200的哪个端口上。
这样就可以取得PC连接过哪台交换机的哪个端口的信息。

1.将Lua脚本从主页下载至PC中

1-1.将Lua脚本从主页下载至PC中。

范例的Lua脚本

1-2.选择【另存为...】,将Lua脚本保存至PC。

1-3.根据实际情况修改Lua脚本中的设置值。

本手册中不需要改变设置值。

脚本中带有★的设置值是可以改变的。
可以根据实际情况,用记事本等文本文件编辑程序打开Lua脚本,修改后保存。

2.将Lua脚本从PC复制到路由器中

将从主页上下载并保存至PC的Lua脚本,复制到路由器中。

因为要将文件从PC复制到路由器中,将在此说明使用U盘和控制台命令的方法。

除了在此介绍的方法外,也可以使用TFTP的方式从PC复制文件到路由器。
关于此方式,请参考参考资料
技术资料「RTFS」-「详细」-「使用tftp的文件传输」

2-1.将U盘连接至PC,复制下载的Lua脚本至U盘中。

2-2.将U盘从PC取下,连接至路由器。
确认路由器的USB灯点亮。

2-3.打开路由器的控制台界面。

[解说]
路由器的控制台界面可以通过串口线或telnet进行连接使用。
使用方法请参考使用说明书。

2-4.用管理员的权限login,通过命令将文件复制到路由器中。
使用copy命令

copy(源文件) (目标文件)

指定文件时,不能使用相对路径,请使用绝对路径。

将Lua脚本从U盘的根目录复制到路由器根目录时,使用以下命令:
[路由器控制台]

# copy usb1:/dhcp_log_watch.lua /dhcp_log_watch.lua
#

[解说]
copy命令的具体参数,请参考此处
可以根据情况适当的改变文件名。
还可以使用microSD来代替U盘使用。
使用microSD时,将「usb1:」改成「sd1:」即可。

2-5.用命令来确认Lua脚本是否已经复制到路由器中。
使用show file list命令。
[路由器控制台]

# show file list /
2011/03/22 17:46:46 2033 dhcp_log_watch.lua
#

[解说]
show file list命令的详细说明,请参考此处

3.在路由器上运行Lua脚本

3-1.用命令来运行复制过来的Lua脚本。
使用lua命令。

lua(Lua脚本名)

请使用绝对路径来指定Lua脚本名。

运行保存在路由器根目录的Lua脚本时:
[路由器控制台]

# lua /dhcp_log_watch.lua
#

[解说]
有关lua命令的详细信息,请参考此处
如果想在路由器启动时就运行Lua脚本的话,可以使用schedule命令。
例:schedule at 1 startup * lua /dhcp_log_watch.lua

3-2.确认Lua脚本的运行状况。
使用show status lua命令。

[路由器控制台]

# show status lua
Lua Library Version: Lua 5.1.5
Lua Script Function Version: 1.06

[running]
Lua Task ID (State): 1 (WATCH)
Running Trigger: executed by 'lua' command
Command Line: lua /dhcp_log_watch.lua
Script File: /dhcp_log_watch.lua
Watch Pattern: "%[DHCPD%]"
Starting Date: 2011/03/23 15:21:30
Elapsed Time: 6 seconds

[history]
There is no history.
#
#

[解说]
Lua脚本如果是正常运行的话,就可以看到上述显示。
如果看到和上述显示不同的内容时,请参考下一项无法运行Lua脚本,进行问题的解决。
show status lua命令的详细信息,请参考此处

3-3.确认Lua脚本的运行效果。
范例的Lua脚本,会在SYSLOG中输出运行的结果。
为了确认运行的效果,请查看SYSLOG。

  1. 请将PC连接至路由器的LAN1。PC设置为可以从DHCP服务器处获得了IP地址。
  2. PC获得IP地址后,查看SYSLOG,确认Lua脚本的运行结果。
    使用show log命令。
    通过筛选Lua脚本输出的字符串"Host detect",可以只显示Lua脚本相关的Log。

[路由器控制台]

# show log | grep "Host detect"
Searching ...
2011/03/24 14:32:19: [Lua] Host detect 2011/03/24 14:32:18: [DHCPD] LAN1(port1)
Allocates 192.168.100.3: 00:25:64:68:ee:15 at LAN1 : port 1

[解说]
使用重定向至外部存储器功能的话,可以直接将运行结果以文件的形式输出至外部存储器中。

导入手册至此完毕。

在主页上刊登的其他Lua脚本也可以使用相同的方法导入,运行。
另外,也有运行Lua脚本,需要用到别的文件的情况。
文件的复制方法和Lua脚本的复制方法是一样的。详细信息请参考各脚本的说明。

无法运行Lua脚本

无法运行Lua脚本,在此刊登一些常见的原因。
在无法正常运行时,首先请用show log命令来确认lua相关的Log。

指定的lua脚本文件名或路径错误

# lua /test.lua
#
# show log
2011/03/23 15:41:06: lua: cannot open /test.lua: No such file or directory
#
#

[解说]
无法找到指定的Lua脚本文件名或路径,由此发生了错误。
请确认指定的文件名或路径是否正确。

设置值错误

<路由器控制台>
# lua /dhcp_log_watch.lua
#
# show status lua running
[running]
Lua Task ID (State): 1 (WATCH)
Running Trigger: executed by 'lua' command
Command Line: lua /dhcp_log_watch.lua
Script File: /dhcp_log_watch.lua
Watch Pattern: "%[DHCPD%]"
Starting Date: 2011/03/23 19:08:17
Elapsed Time: 12 seconds
#
#
# show log
2011/03/23 19:09:06: LAN1: PORT1 link up (100BASE-TX Full Duplex)
2011/03/23 19:09:13: [DHCPD] LAN1(port1) Allocates 192.168.100.3: 00:25:64:68:e
e:15
2011/03/23 19:09:13: lua: /dhcp_log_watch.lua:82: 'rt.syslog': argument #1
value is invalid.
#

<Lua脚本>
第82行
rt.syslog(log_level, "[Lua] Host detect" .. buf)

[解说]
因为log_level的设置值不对,而引起了错误的发生。
在SYSLOG中显示的是:Lua脚本的第82行的rt.syslog的第一个参数无效,所以发生了错误。
请确认log_level的设置值并修正。

网络结构问题

[解说]
在主页上刊登的Lua脚本中,也包含了只有这种网路结构和设置时才能运行的情况。这种时候,必须将网线插入指定的端口中。所以也请再一次的确认网络结构和设置是否正确。

设置例

使用了本操作手册中的Lua脚本。

LANネットワークのホストの履歴取得(2)

可以以履历的形式在SYSLOG中输出连接至LAN网段的终端的使用情况,并进行管理。 监视DHCP的SYSLOG,并在SYSLOG中输出PC连接的端口号。

RTX1200的设置例

LAN的
接口的设置
(使用LAN1接口)

ip lan1 address 192.168.100.1/24

DHCP的设置

dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.191/24

Lua脚本例

设置值

-- 想要检测的SYSLOG的字符串类型
ptn = "%[DHCPD%]"
-- MAC地址的字符串类型
mac_ptn = "%x%x:%x%x:%x%x:%x%x:%x%x:%x%x"
-- 输出SYSLOG的等级 (info, debug, notice)
log_level = "info"

终端检索

function search_host(mac)
  sw_route = nil
  route = nil
  port = nil

  rtn, str = rt.command("show status switching-hub macaddress " .. mac)
  port = string.match(str, "port (%d):")
  if (port) then
    route = "LAN1"
  else
    rtn, str = rt.command("show arp lan2")
    if (string.match(str, mac)) then
      route = "LAN2"
    else
      rtn, str = rt.command("show arp lan3")
      if (string.match(str, mac)) then
        route = "LAN3"
      end
    end
  end
  return route, port
end

主程序

local rtn, str
local buf

while (true) do
  rtn, str = rt.syslogwatch(ptn)
  mac = string.match(str[1], mac_ptn)
  if (mac) then
    route, port = search_host(mac)
    if (route) then
      buf = str[1]
      buf = buf .. " at " .. route
      if (port) then
        buf = buf .. " : port " .. port
      end
      rt.syslog(log_level, "[Lua] Host detect" .. buf)
    end
  end
end

返回顶部