Luaスクリプト導入手順マニュアル

Luaスクリプト

はじめに

本導入手順の説明では、ルーターの設定は初期状態とします。
説明に使用するサンプルのLuaスクリプトは、ルーターのDHCPサーバー機能が動作していることが必要です。

サンプルのLuaスクリプトでは、次の処理を行います。

  1. DHCP機能によって出力されるSYSLOGを監視します。
  2. SYSLOGを検出した際、その内容から当該ホストが接続されているルーターのポートを割り出します。
  3. 検出したSYSLOGに 2. で割り出したポート番号を付加したSYSLOGを出力します。

本スクリプトの応用として、Case:2があります。
これは、ルーターとSWX2200で構成された環境で、PCが接続されたSWX2200のポート番号をSYSLOGに出力することができます。
PCがLANの中のどのスイッチのどのポートに接続されたのかの履歴を取ることができます。

1.LuaスクリプトをホームページからPCにダウンロードする

1-1.LuaスクリプトをホームページからPCにダウンロードします。

 サンプルのLuaスクリプト

1-2.保存を選択し、LuaスクリプトをPCに保存します。

1-3.必要に応じてLuaスクリプトに記述されている設定値を変更します。

本導入手順では設定値を変更しません。

各スクリプトの★がついている設定値は、変更することができます。
必要に応じて、メモ帳などのテキストエディタを使用してLuaスクリプトを開き、設定値を書き換えて保存します。

2.LuaスクリプトをPCからルーターにコピーする

ホームページからPCにダウンロードして保存したLuaスクリプトを、ルーターにコピーします。

ファイルをPCからルーターにコピーするために、USBメモリを使用してコンソールコマンドを利用する方法を説明します。

この方法の他に、TFTPを使用してPCからルーターにファイルをコピーすることもできます。
そちらの方法については、参考資料をご参照ください。
技術資料「RTFS」-「詳細」-「tftpを用いたファイル転送」

2-1.PCにUSBメモリを接続して、ダウンロードしたLuaスクリプトをUSBメモリにコピーします。

2-2.USBメモリをPCから取り外し、ルーターに接続します。
ルーターのUSBランプが点灯します。

2-3.ルーターコンソールを開きます。

[解説]
ルーターコンソールはシリアルケーブルやtelnetで接続して使用します。
使用方法については取扱説明書をご参照ください。

2-4.管理者権限でログインし、コマンドでルーターにコピーします。
copyコマンドを使用します

copy (コピー元のファイル) (コピー先のファイル)

ファイルを指定するパスとして相対パスは利用できません。絶対パスを使用してください。

USBメモリのルートディレクトリからルーターのルートディレクトリにLuaスクリプトをコピーする場合:
[ルーターコンソール]

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

[解説]
copyコマンドの詳細はこちらをご参照ください。
ファイル名を変更する場合は適宜合わせてください。
USBメモリの代わりにmicroSDメモリカードを使用することもできます。
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ライブラリバージョン: Lua 5.1.4
Luaスクリプト機能バージョン: 1.03

[running]
LuaタスクID (状態): 1 (WATCH)
走行トリガー: 'lua' コマンド
コマンドライン: lua /dhcp_log_watch.lua
スクリプトファイル: /dhcp_log_watch.lua
監視文字列: "%[DHCPD%]"
開始日時: 2011/03/23 15:21:30
経過時間: 6秒

[history]
過去の走行履歴はありません
#
#

[解説]
Luaスクリプトが正常に実行されていれば、上記のような表示となります。
もし上記の表示と異なる内容が表示されている場合には、次の項目からのLuaスクリプトが実行できないを確認し、問題の解決を行ってください。
show status luaコマンドの詳細はこちらをご参照ください。

3-3.Luaスクリプトの動作を確認します。
サンプルのLuaスクリプトは、実行結果をSYSLOGに出力します。
動作を確認するために、SYSLOGを確認します。

  1. ルーターのLAN1にPCを接続してください。PCはDHCPサーバーからIPアドレスを取得できるように設定しておく必要があります。
  2. PCがアドレスを取得した後、SYSLOGを確認し、Luaスクリプトの実行結果を確認します。
    show logコマンドを使用します。
    Luaスクリプトが出力する文字列"Host detect"で絞り込むことで、Luaスクリプトの実行結果のログだけを表示することができます。

[ルーターコンソール]

# 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スクリプトが実行できない

Luaスクリプトが実行できない、いくつかのパターンを掲載します。
正しく動作していない場合、まずshow logコマンドでluaに関するログを確認してください。

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タスクID (状態): 1 (WATCH)
走行トリガー: 'lua' コマンド
コマンドライン: lua /dhcp_log_watch.lua
スクリプトファイル: /dhcp_log_watch.lua
監視文字列: "%[DHCPD%]"
開始日時: 2011/03/23 19:08:17
経過時間: 12秒
#
#
# 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の1つ目の値が無効な値のためエラーが発生したことを出力しています。
log_levelの設定値を確認し、修正してください。

構成が間違っている

[解説]
ホームページで掲載しているLuaスクリプトの中には、掲載している構成と設定でのみ動作するものが含まれています。この場合、LANケーブルの接続ポート番号まで合わせる必要があります。もう一度、設定、構成を確認してください。

設定例

本設定例は、以下の機種に対応しています。

対応機種: RTX1210 RTX1200

本手順で利用したLuaスクリプトを使用する設定例です。

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

LANネットワークに接続されたホストの利用状況を履歴としてSYSLOGに出力し、管理することができます。DHCPのSYSLOGを監視し、PCが接続されているポート番号をSYSLOGに出力します。

LANの
インタフェースの設定
(LAN1ポートを使用)

ip lan1 address 192.168.100.1/24

LDHCPの設定

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

設定値

-- 検出したい 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

ページトップへ戻るReturn to Top