TeraTerm から config ファイルにある ip アドレスに ping をうつ


Config ファイルを何個も流し込むときに、設定を流し込んだつもりで電源だけ入れて終わってたりしないか、違う機械の設定を入れていないかなど、簡易的な確認を ping で行う。
Config ファイルのフォーマットは以下のような形式であることを想定。

```config:
...
setenv name AP-1
setenv ipaddr 192.168.0.1
...
```

一旦、シリアルで対象機器にログインしてからマクロを実行する。
そうすると、Config ファイルのあるディレクトリーを聞いてくるので、答えてやるとそのディレクトリの *.txt ファイルをすべて舐めて ホスト名と IP アドレスを抽出し、IP アドレスへ ping をうつ。

```ttl:

; 設定ファイルから ip アドレスを読み込んで ping をうつ
;
; 変数の初期化
;
Prompt = '# '
Timeout = 5	; この時間内に ping が終わらないと判定エラーとなる

; 一時ファイル %TEMP% の下に作る
; getenv 'TEMP' TempFile
; makepath TempFile TempFile 'This is a temporary file. It can be erased.'

;
; 設定ファイルの拡張子
Configs = '*.txt'
; 設定ファイルのフルパス (利用時にダイアログで選択)
Configs_Full = ''
; 設定ファイル名 (ループ用)
Config_File = ''

; 結果表示用。デスクトップにファイルを作成、結果をメモ帳で開く。
ResultMess = ''
getenv 'USERPROFILE' ResultLogFile
makepath ResultLogFile ResultLogFile 'Result.log'
Notepad = 'C:\Windows\notepad.exe'

; 正規表現指定
; regexoption 'SYNTAX_PERL_NG' 'ENCODING_UTF8' 'OPTION_FIND_LONGEST'

;;
; ping サブルーチン用 (sub_Ping)
; 宛先と返却値
; 実行コマンド (オプション付き、後ろにスペース要)
Ping_target = ''
PingResult = ''

Cmd = ''
Cmd_Default = 'ping '
Cmd_Post_Default = ' count 3'


dirnamebox '設定ファイルを読み込むディレクトリを指定してください' ''
if result = 0 then
	messagebox 'ディレクトリが選択されませんでした' '終了します'
	end
endif


setdir inputstr
; makepath Configs_Full inputstr Configs

Ping_target = ''
Ping_host = ''

; 設定ファイルを順番に開く
findfirst dir_h Configs Config_File
; ログファイルを作成
fileopen logOut_h ResultLogFile 0

while result
	fileopen file_h Config_File 0

:	Config_File_next_line
	filereadln file_h line

	; 設定ファイルの終端
	if result then
		strcompare Ping_target ''
		if result = 0 goto Config_File_next_file

;		strcompare Ping_target '%IPADDR%'
		strmatch Ping_target '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
		if result = 0 goto Config_File_next_file

		call sub_Ping					; ping を実行
		strconcat ResultMess PingResult

		sprintf '%s (%s) : %s' Ping_host Ping_target PingResult
		strspecial inputstr
		filewriteln logOut_h inputstr	; 結果をログを書き込む

		Ping_target = ''
		Ping_host = ''

		goto Config_File_next_file	; ファイルを読み終わったら次のファイルへ
	endif


	; 設定ファイルからホスト名と IP アドレスを読み込む
	strreplace line 1 'setenv\s+name\s+' ''
	if result=1 then
		Ping_host = line
		sprintf '\n%s ' line
		strconcat ResultMess inputstr

		strspecial line
		; messagebox line Config_File
	endif

	strreplace line 1 'setenv\s+ipaddr\s+' ''
	if result=1 then
		Ping_target = line
		sprintf '(%s) : ' line
		strconcat ResultMess inputstr

		strspecial line
		; messagebox line Config_File
	endif

	goto Config_File_next_line	; 次の行へ

;	ファイルを閉じて次のファイルを開く
:	Config_File_next_file

	fileclose file_h
	pause 1
	findnext dir_h Config_File
endwhile

findclose dir_h
fileclose logOut_h
pause 1

Cmd = Notepad
strconcat Cmd ' '
strconcat Cmd ResultLogFile
exec Cmd

sendln
sendln
sendln

wait Prompt

end


;;; ping 用サブルーチン
;
; 必要な値
; Ping_target : ping の送信先
;
; 返却値
; PingResult

:sub_Ping
PingResult = '■‍判定エラー■\n'


; 同期モードに入る
setsync 1

; sendln 'console character ascii'
flushrecv		; バッファのクリア

Cmd = Cmd_Default
strconcat Cmd Ping_target
strconcat Cmd Cmd_Post_Default 
sendln Cmd
; wait 'Success rate is 0 percent' 'Success rate is 100 percent' 'Success rate is '
waitregex ', 0 packets received.*$' ', 3 packets received.*$' ', [1-2] packets received.*$'

if result = 0 then
	PingResult = '★タイムアウト★\n'
	sendln 'q'						; ping を止める
else
	if result = 1 PingResult = '■失敗■\n'
	if result = 2 PingResult = '　成功　\n'
	if result = 3 PingResult = '▼不安定▼\n'

;	strreplace inputstr 1 #13#10 ''	; 改行コードを削除できない
	sprintf '<<< %s >>>' inputstr
	strconcat PingResult inputstr
endif


; sendln 'no console character'
; バッファのゴミ掃除
flushrecv
sendln
wait Prompt
flushrecv
sendln
wait Prompt

; 非同期モードへ戻る
setsync 0
flushrecv

return
```

設定ファイルがこんな感じであるときに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/a78bbbcb-3d75-1c86-5055-ce3ed11a26a6.png)

TeraTerm でマクロを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/117f250a-fb8a-1f6d-1af3-dd04ea913267.png)

そうすると、ping が返って来たかどうかを一覧で返します。 (この RTX には何も繋がっていません...orz)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/2af91aeb-bea5-d6c7-2eb4-0aa059fd6ad9.png)
必要であればテキストファイルに落としたり、ログを取りながら実行したり。