【YAMAHA RTX】transix IPv6アドレス通知用「lua」スクリプトの作成とアップロードの方法をまとめてみた!

RTXのルータを用いて、「transix」網にアクセスする際には、アップデートサーバに通知する「lua」ファイルの作成が必須です。
そこで、作成方法とアップロードする方法をまとめました。

「transix IPv6アドレス通知用」の「lua」ファイルは、指定したインターフェースに新しいIPv6プレフィックスが付与されたとき、アップデートサーバーにIPv6アドレスの更新通知を行うスクリプトになっています。

目次

「lua」ファイルの作成

まずは、「lua」ファイルを作成します。
ファイルは2種類あり、「ひかり電話」を利用しているか、していないかでどちらを使用するか判別します。

  • 「ひかり電話を契約していない」「RAプロキシ」
  • 「ひかり電話を契約している」「DHCPv6-PDプロキシ」

では、上記の内容を把握した上で、実際の「lua」ファイルを確認してみます。

ひかり電話を契約していない「RAプロキシ」の場合

----------------------------------------
-- 設定値                             --
----------------------------------------
-- アップデートサーバーのURL
UPD_SV = "アップデートサーバーのURL"

-- ユーザー名
USERNAME = "ユーザー名"

-- パスワード
PASSWORD = "パスワード"

-- IPIPトンネルを貼るインターフェース名
TUNNEL_IF = "LAN1"

-- WANインターフェース名
WAN_IF = "LAN2"

-- IPv6プレフィックスが追加されたときの
-- SYSLOGパターン
LOG_PTN = "Add%s+IPv6%s+prefix.+%(Lifetime%:%s+%d+%)%s+via%s+" .. TUNNEL_IF .. "%s+by"

-- ステートレスDHCPv6でDNS情報を取得するコマンド
DHCPv6_IR_CMD = "ipv6 "  .. string.lower(WAN_IF) .. " dhcp service client ir=on"

-- リトライの間隔 (s)
RETRY_INTVL = 10

-- リトライ回数
RETRY_NUM = 3

-- SYSLOGのレベル
LOG_LEVEL = "info"

-- SYSLOGのプレフィックス
LOG_PFX = "[transix]"

-- 通知失敗時のメッセージ
FAIL_MSG = "アップデートサーバーへの通知に失敗しました。 (リトライ: 残り%d回)"


----------------------------------------
-- SYSLOGを出力する関数               --
----------------------------------------
function logger(msg)
  rt.syslog(LOG_LEVEL, string.format("%s %s", LOG_PFX, msg))
end

----------------------------------------
-- メインルーチン                     --
----------------------------------------
local rtn, count, log, result
local req_t = {}
local res_t

--------------------
-- 初期化

-- HTTPリクエストの準備
req_t.url = string.format("%s?username=%s&password=%s", UPD_SV,
                          USERNAME, PASSWORD)
req_t.method = "GET"

--------------------
-- 監視

while true do
  -- SYSLOGを監視する
  rtn = rt.syslogwatch(LOG_PTN)

  -- パターンにマッチした
  if rtn then

    -- リトライ回数をリセット
    count = RETRY_NUM

    while true do

      -- HTTPリクエストを実行
      res_t = rt.httprequest(req_t)
      
      if res_t.rtn1 then
        -- リクエストに成功
        logger("アップデートサーバーへの通知を実行しました。")

        -- アップデートの結果をログに出力する
        if res_t.code == 200 then
          result = "成功"
        else
          result = "失敗"
        end

        log = string.format("アップデートに%sしました。(code=%d, body=%s)",
                            result, res_t.code, res_t.body)
        logger(log)

        -- ループを抜け、SYSLOGの監視を再開する
        break
        
      else

        -- リクエストの応答がない場合、DNS情報が取得できていない可能性があるため
        -- DNS情報を再取得する
        rt.command(DHCPv6_IR_CMD)
      end

      -- リクエストに失敗
      count = count - 1
      if count > 0 then
        -- (RETRY_INTVL)秒後、リトライ
        logger(string.format(FAIL_MSG, count))
        rt.sleep(RETRY_INTVL)
      else
        -- リトライ上限を超えたので諦め、SYSLOGの監視を再開する
        logger("アップデートサーバーへの通知に失敗しました。")
        break
      end

    end
  end
end

ひかり電話を契約している「DHCPv6-PD」の場合

----------------------------------------
-- 設定値                             --
----------------------------------------
-- アップデートサーバーのURL
UPD_SV = "アップデートサーバーのURL"

-- ユーザー名
USERNAME = "ユーザー名"

-- パスワード
PASSWORD = "パスワード"

-- IPIPトンネルを貼るインターフェース名
TUNNEL_IF = "LAN1"

-- IPv6プレフィックスが追加されたときの
-- SYSLOGパターン
LOG_PTN = "Add%s+IPv6%s+prefix.+%(Lifetime%:%s+%d+%)%s+via%s+" .. TUNNEL_IF .. "%s+by"

-- リトライの間隔 (s)
RETRY_INTVL = 10

-- リトライ回数
RETRY_NUM = 3

-- SYSLOGのレベル
LOG_LEVEL = "info"

-- SYSLOGのプレフィックス
LOG_PFX = "[transix]"

-- 通知失敗時のメッセージ
FAIL_MSG = "アップデートサーバーへの通知に失敗しました。 (リトライ: 残り%d回)"


----------------------------------------
-- SYSLOGを出力する関数               --
----------------------------------------
function logger(msg)
  rt.syslog(LOG_LEVEL, string.format("%s %s", LOG_PFX, msg))
end

----------------------------------------
-- メインルーチン                     --
----------------------------------------
local rtn, count, log, result
local req_t = {}
local res_t

--------------------
-- 初期化

-- HTTPリクエストの準備
req_t.url = string.format("%s?username=%s&password=%s", UPD_SV,
                          USERNAME, PASSWORD)
req_t.method = "GET"

--------------------
-- 監視

while true do
  -- SYSLOGを監視する
  rtn = rt.syslogwatch(LOG_PTN)

  -- パターンにマッチした
  if rtn then

    -- リトライ回数をリセット
    count = RETRY_NUM

    while true do

      -- HTTPリクエストを実行
      res_t = rt.httprequest(req_t)
      
      if res_t.rtn1 then
        -- リクエストに成功
        logger("アップデートサーバーへの通知を実行しました。")

        -- アップデートの結果をログに出力する
        if res_t.code == 200 then
          result = "成功"
        else
          result = "失敗"
        end

        log = string.format("アップデートに%sしました。(code=%d, body=%s)",
                            result, res_t.code, res_t.body)
        logger(log)

        -- ループを抜け、SYSLOGの監視を再開する
        break
      end

      -- リクエストに失敗
      count = count - 1
      if count > 0 then
        -- (RETRY_INTVL)秒後、リトライ
        logger(string.format(FAIL_MSG, count))
        rt.sleep(RETRY_INTVL)
      else
        -- リトライ上限を超えたので諦め、SYSLOGの監視を再開する
        logger("アップデートサーバーへの通知に失敗しました。")
        break
      end

    end
  end
end

「lua」ファイルの編集

ファイルは一部修正が必要な箇所があるので、注意してください。

主な変更箇所は以下の通りです。
プロバイダから発行された設定情報シートに明記されているので、「lua」ファイルに反映させた上でファイルを保存します。

「TUNNEL_IF」の項目は、実際に割り当てるインターフェース名に変更してください。

  • UPD_SV = “アップデートサーバーのURL”
  • USERNAME = “ユーザー名”
  • PASSWORD = “パスワード”
  • TUNNEL_IF = “LAN1”

修正が完了したら、次のステップに進みます。

「tftp」を使ってアップロード

以下の手順でファイルをRTX本体にアップロードします。

# 作成した「lua」ファイルがある階層に移動します。
cd C:\Users\Administrator\Desktop\

# RTXのIPアドレスを入力し、tftpでアップロードします。(パスワードは設定済みのものを入力してください。)
tftp 192.168.1.1 put update.lua /update.lua/"RTXのパスワード”

以上で、アップロード完了です。

アップロード完了の確認

RTXルータのコンソールから、ファイルがアップロードされているか下記コマンドで確認します。

show file list /
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次