TeraTerm: TTLマクロでファイルの中身をターミナルに流し込む

またまた TeraTerm Macro を使う事になりました。

工場リセットされた Cisco のスイッチに設定を行うことになり、最初は Copy & Paste で流し込む予定だったのですが、台数が100台。設定もスイッチごとにIPアドレスを変えなくちゃいけなくて、存在する設定ファイルは一番最初のスイッチに行う1個があるだけとのこと。これを元にスイッチ毎の設定を追加しないといけません。IPアドレスも決まっていないからシリアルポートから設定することになりました。

バカ正直に、設定ファイルを編集し、コピーバッファーに取り込み、TeraTerm にシリアルポートから流し込む。
これを100回くらい繰り返す、、、、なんて私向きじゃありません。途中で、「あれ!どのファイルをコピーしたっけ?」「貼り付け中なんだけど、今、ペーストしているのはどのスイッチのもの?」となるのは間違いありません。

今後も同様の作業が入りそうなので、この際、PowerShell で設定テンプレートから各スイッチ用の設定ファイルを作り、TeraTerm Macro から流し込めるようにしたいと思います。

設定作業の流れとしては、

  1. スイッチ数分の設定ファイルを作る。
  2. TTマクロで、1.で作った設定ファイルを先頭から一行ずつ読み込んで、シリアルポートにダンプするようにマクロテンプレートを作る。(ダンプスクリプト.TTL)
  3. 1台のスイッチに対して設定ファイルと1対1で対応するよう、ダンプリスト.TTLをスイッチ数分作る。

一つの設定ファイルやTTLマクロを必要数分作るためのPowerShell スクリプトに関しては、以前記述済み。ファイル名=スイッチ名 にしておく。ということで、1と3はテンプレートに変数を入れておくことで簡単に作成できる見込み。

今回のハードルは2のマクロ部分。
ファイルの中身を一行ずつ読み込む動作は、PowerShell なら get-content <File.txt> と foreach ループを使えばいいので簡単なのですが、TeraTerm Macro には foreach がありません。ファイルを一行ずつ読み込むのは filereadln を使いますが、for ループで読み込むならファイルの行数をあらかじめカウントしておくか、設定ファイルの末尾に何らかのマークを付けておくかになります。毎回設定ファイルの行数が同じならカウンターを固定できるのでいいのですが、スイッチ毎に設定行数が微妙に異なる(これはよくある話)と、毎回ループカウントを設定を忘れないように編集しないといけないので、実用的ではなくなります。コマンドの最後にマークを入れて if 文で判定する手段もありますけど、TT Macro にファイルを一行ずつ読み込んで末尾まで行ったらループを終わらせる方法がないかと検索してみたところ、いい記事がありました。環境に合わせてカスタマイズして使わせて頂くことにします。

これによると、

  • fileopen で設定が入ったファイルを指定
  • filereadln で1行ずつ読み込み
  • ファイル読み込みに失敗(つまり最終行の次の行)したら終わり。

という流れでマクロが書かれています。

少し改造して、プロンプトを待って、モードを変えて、設定を一行ずつ読み込んでプロンプトを待ち、最後まで送ったら、設定をROMに書き込んで終わり という流れにしました。

スイッチ毎のカスタマイズには、最初の行の switch_name を変数として使って、Powershell で複数のコマンドファイルを作ることにしました。

hostname = 'switch_name'
 
logdir = 'C:\temp\tterm_log\'
 
logfile = logdir
strconcat logfile hostname
strconcat logfile '.log'

; COMポート5 に 9600bps で接続
connect '/C=5 /BAUD=9600'
 
sendln ""
wait ">"
 
sendln "enable"
wait "#"
 
sendln "config t"
wait "#"

; デバッグ用のポーズ、コネクトが失敗するようならここで一旦停止させる。
;pause 20
 
;リストから読み込む
fileopen cmdlist 'C:\temp\config\switch_name.txt' 0
;ループ開始
:loopstart
filereadln cmdlist buf
;ファイルから行を読み込めなかった場合
if result<>0 then
    goto loopend
;ファイルから行を読み込めた場合
else
   ; 目的のプロンプトが返ってこない場合に備えてタイムアウトを設定
   ; set TIMEOUT 2秒
    timeout = 2
 
    wait '#'
    sendln buf
    goto loopstart
 
endif
;ループ終了
:loopend
fileclose cmdlist
;マクロ終了
;end
 
wait "#"
 
sendln "wr"
wait "#"
 
end

フローコントロールを使わない垂れ流しの場合、PCのスペックによって、文字と文字、行と行の間に十分なウェイトが入らない場合があるので、2ストップビットを使うか、ターミナルの設定で待ち時間を入れる必要があります。

このスクリプトを使って、電源を投入してOS起動が終わったスイッチにシリアルケーブルを使って設定を流し込むことが出来ました。もうちょっとカスタマイズしたいところです。

コメントを残す