【TTL】はじめてのTTLマクロ 11 ログイン先機器一覧を用いてttlを実行
はじめに
前の記事まではbatファイルにログイン先の機器の情報(アドレス、ホスト名、ユーザ名など)を記載していましたが、これをcsvファイルに外だしします。
図にすると下記のようになります。
logget.bat
@echo off
cscript //nologo .\conf\logget.js
pause
devices.csv
telnetはユーザ名を聞かれないのでユーザ名を"-"にしています。
LAN-G-L3-001はshowコマンドのほかにpingとtraceも確認したいので、command.txtをping.txtやtrace.txtにしつつ、ログ名も末尾にping/traceを記載しています。
; 機器一覧
; セミコロンでコメントアウト。 行頭にEOFがあればそこで終了
; 機器1台当たりのログ取得に時間がかかるその他拠点から配置する
WAN-A-RT-001.log,192.168.11.254,tpass,epass,-,WAN-A-L2-001,command.txt,telnet
CEN-M-RT-001.log,192.168.11.111,rpass,epass,ruser,CEN-M-RT-001,command.txt,ssh2
LOC-M-RT-001.log,192.168.11.112,rpass,epass,ruser,LOC-M-RT-001,command.txt,ssh2
LAN-G-L3-001.log,192.168.11.113,tpass,epass,-,LAN-G-L3-001,command.txt,telnet
LAN-G-L3-001_ping.log,192.168.11.113,tpass,epass,-,LAN-G-L3-001,ping.txt,telnet
LAN-G-L3-001_trace.log,192.168.11.113,tpass,epass,-,LAN-G-L3-001,trace.txt,telnet
EOF
logget.js
ttlを実行する部分は同様の処理が機器台数分以上発生するので関数として記載します。
また、4並列でログ取得を実施するようにします。
"use strict";
// 設定
var strDevicesFilename = "devices.csv";
var waitTimeMsec=1000;
// スクリプトがあるディレクトリを取得
var objFS = new ActiveXObject("Scripting.FileSystemObject");
var strScriptDir = objFS.GetParentFolderName(WScript.ScriptFullName); // スクリプトがあるディレクトリ
WScript.echo("スクリプトのあるディレクトリ:" + strScriptDir);
// 機器一覧を読み込む
WScript.echo("機器一覧の読み込みを開始");
var arrayInput = [];
var file = objFS.OpenTextFile(strScriptDir+"\\"+strDevicesFilename, 1, true, 0); // ファイルを読み取り専用で開く
while (!file.AtEndOfStream) {
arrayInput.push(file.ReadLine());
}
file.Close(); // ファイルを閉じる
WScript.echo("devices.csvの行数 :" + arrayInput.length)
// 対象機器を整理する
var arrayDevices = [];
for (var i = 0; i < arrayInput.length; i++) {
// 取得対象機器をdevices.txtの上部に持ってきて、その下のEOFを書く手がある
if(arrayInput[i].search(/^EOF/) > -1) break; // EOFを見たら終了
if(arrayInput[i].search(/^;/) > -1) continue; // コメントアウト処理
if(arrayInput[i].replace(/\s+| /g, "").length == 0) continue; // 空行は無視
if(arrayInput[i].replace(/,|\s/g, "").length == 0) continue; // ,のみの行は無視
arrayDevices.push(arrayInput[i]);
}
WScript.echo("ログ取得対象機器台数:" + arrayDevices.length)
// ttlを実行する関数
var objWSH = new ActiveXObject("WScript.Shell");
var ExecTTL = function(numDeviceCounter) {
WScript.Echo(arrayDevices[numDeviceCounter] + "の実行を開始");
var arrTemp = arrayDevices[numDeviceCounter].split(",");
var strTemp = "";
strTemp = strTemp + "\"" + strScriptDir + "\\teraterm-5.2\\ttpmacro.exe\" /V " + strScriptDir + "\\logget.ttl";
strTemp = strTemp + " " + arrTemp[0];
strTemp = strTemp + " " + arrTemp[1];
strTemp = strTemp + " " + arrTemp[2];
strTemp = strTemp + " " + arrTemp[3];
strTemp = strTemp + " " + arrTemp[4];
strTemp = strTemp + " " + arrTemp[5];
strTemp = strTemp + " " + arrTemp[6];
strTemp = strTemp + " " + arrTemp[7];
WScript.Echo(strTemp);
return objWSH.Exec(strTemp);
}
var printProgress = function( a, b){
if(a==b){
WScript.echo("進行度:すべての機器のログ取得開始済み。動いているteratarmがすべて終了したらログ取得完了です。");
}else{
WScript.echo("進行度:" + (a + 1) + "/" + b);
}
}
// 並列処理でログを取得していく
var numDeviceCounter = 0; // 固定値
var numDeviceCounterMax = arrayDevices.length; // スクリプト数
printProgress(numDeviceCounter,numDeviceCounterMax)
var job1 = ExecTTL(numDeviceCounter);
numDeviceCounter = numDeviceCounter + 1;
WScript.Sleep( waitTimeMsec );
printProgress(numDeviceCounter,numDeviceCounterMax)
var job2 = ExecTTL(numDeviceCounter);
numDeviceCounter = numDeviceCounter + 1;
WScript.Sleep( waitTimeMsec );
printProgress(numDeviceCounter,numDeviceCounterMax)
var job3 = ExecTTL(numDeviceCounter);
numDeviceCounter = numDeviceCounter + 1;
WScript.Sleep( waitTimeMsec );
printProgress(numDeviceCounter,numDeviceCounterMax)
var job4 = ExecTTL(numDeviceCounter);
numDeviceCounter = numDeviceCounter + 1;
WScript.Sleep( waitTimeMsec );
// 実行中の間ループ
var cnt = 0;
while(true){
printProgress(numDeviceCounter,numDeviceCounterMax)
WScript.Sleep( waitTimeMsec ); // 1秒停止
if(job1.Status == 1 && numDeviceCounter != numDeviceCounterMax ){
job1 = ExecTTL(numDeviceCounter);
numDeviceCounter = numDeviceCounter + 1;
continue;
}
if(job2.Status == 1 && numDeviceCounter != numDeviceCounterMax ){
job2 = ExecTTL(numDeviceCounter);
numDeviceCounter = numDeviceCounter + 1;
continue;
}
if(job3.Status == 1 && numDeviceCounter != numDeviceCounterMax ){
job3 = ExecTTL(numDeviceCounter);
numDeviceCounter = numDeviceCounter + 1;
continue;
}
if(job4.Status == 1 && numDeviceCounter != numDeviceCounterMax ){
job4 = ExecTTL(numDeviceCounter);
numDeviceCounter = numDeviceCounter + 1;
continue;
}
if(numDeviceCounter == numDeviceCounterMax && job1.Status == 1 && job2.Status == 1 && job3.Status == 1 && job4.Status == 1){
break;
}
}
WScript.Echo("すべてのスクリプトの実行が完了。\n今動いているttlマクロの停止を待ってください");
// オブジェクトを解放
objFS = null;
objWSH = null;
logget.ttl
ログ保存先のファイル名とcommand.txtのパスを変更する。
;------------------------------------------------------------------------------
;変数設定
;------------------------------------------------------------------------------
(略)
;フォルダ名・ファイル名を設定
strIniFileName = ".\TERATERM.INI"
strLogDirName = "..\log" ;ログ保存先のファイル名
strCommandsDirName = "..\conf" ;command.txt保存先のファイル名
(略)