cisco機器の show tech-supportをいくつも取るというケースがよくある。
そのとき tera termのマクロを作って自動化しようとしたが、
いろいろとうまくいかないことがある。
今回対応したのは以下の2点である。
1.ログの自動取得ができない。
2.意図しないところで中断してしまう。
1. ログの自動取得ができない
tera termマクロではログ取得のコマンドがあるが、tera term自体の設定でログを自動取得する設定にしている場合、ひと手間かけないと設定によるログ取得が優先されてコマンドによるログ取得ができない。
多分そうだろうな、とは思っていたのだが、自動取得されたログを使えばいいのでそのままにしていたのだが、やっぱりログファイル名を「hostname_show_tech-support」とかにしたくて調べたら簡単にできた。
logを取得するコマンドは logopenである。
logfilenameという変数にログファイル名が設定されているとき、
logopen logfilename 0 0
とすればよい。二つのゼロの引数は、binary flagとappend flagである。
0 0 の場合asciiモードで上書きである。
そして、このコマンドを実行したときにすでにログが取得されている場合、
つまりtera termの設定でログの自動取得が有効になっている場合、
このコマンドは実行されないようである。
tera termの設定を変更して自動ログ取得を無効にすることはしたくない。
この場合、loginfoというコマンドを使うと、現在のログ取得状態がわかる。
loginfo logname
このように実行するとlognameに現在取得中のログファイル名が格納され、
resultにログ取得時のフラグが格納される。
そしてログが取得されていない場合は resultに -1 が格納される。
だから、自動取得している場合に任意の名前でログを取得しなおしたければ、
loginfoコマンドを実行してresultが -1 でなければ、logcloseしてからlogopenすればよいのである。
2. 意図しないところで中断してしまう
これは常識なのかもしれないが...
私はいつもtera termマクロでコマンドを実行するとき、以下のようにしている。
sendln 'show version'
wait '#'
これでほとんどの場合はうまくいくのだが、show tech-supportでこうすると、
途中で終わってしまう。
なぜなら show tech-supportの結果の中に # が含まれているからだ。
show tech-supportでなくても、コマンド実行結果の途中に # が含まれるコマンドを実行すると、そこで wait '#'が機能してしまい、次の処理へ進んでしまう。
私はこの対策として、10秒待ってから任意の文字列をsendlnし、
その文字列をwaitするということをしていた。
これで大体の場合、うまくいった。
しかし、最近その方法がうまくいかないケースがあった。
show tech-supportの取得中に数十秒程度待つ状態がおこる機種があって、
10秒待って任意の文字列を送る、というのが機能しなかったのだ。
じゃあ60秒待てばよいかというと、そうしたら他の機種で余計な待ち時間が発生することになる。
そこで以下のように対応した。
まず、接続する装置はホスト名で指定することにする。
そのために、hostsファイルにホスト名とIPアドレスの対応を記載する。
macroではプロンプトを表示してホスト名を入力するようにする。
そして、入力したホスト名+"#"を変数に格納し、その変数をwaitする。
hostname = 'router01'
my_prompt = hostname
strconcat my_prompt '#'
sendln 'show tech-support'
wait my_prompt