久しぶりにGNS3（その23：スクリプトその4）

 # EEMによる定期的なコマンド実行および実行結果の転送
Ciscoルーターで定期的なコマンド（ここでは”ping”）を実行し、その結果を実行時刻付きで、外部に転送することを実現した時の記録。[「スクリプトその２」](https://qiita.com/infinite1oop/items/462686ea24477f8ffbab)で利用したEEM(Embedded Event Manager)を利用している。

## 情報（URLなど）
実行結果を不揮発性領域に格納し、copyコマンドで転送しようとしたのであるが、
- [Cisco IOS システム管理 – kron(定期実行タスク)の設定](https://changineer.info/network/cisco_ios/cisco_ios_sysmanage/cisco_ios_sysmanage_kron.html)

に、「KronやEEMではcopyコマンドは使用不可である事に注意して下さい」との記載があり、実際に小生の環境にて、EEMではcopyできずであった。ただし、検索すると、EEMでcopyを用いているサンプルは相当数見つかる。真偽不明。
- [Sending generated file to tftp via EEM](https://community.cisco.com/t5/network-management/sending-generated-file-to-tftp-via-eem/td-p/4035320)

上記サイトに、moreコマンドで不揮発性領域にあるファイルを、redirectして外部に転送する情報が見つかり、これを利用することにした。同時に、ファイル名に時刻情報を入れる内容も記載されている。

その他の情報として、EEMのビルトイン変数については下記サイトが
- [EEM Built-in "Action" Variables](https://community.cisco.com/t5/networking-knowledge-base/eem-built-in-quot-action-quot-variables/ta-p/3123406)

正規表現については下記サイトが
- [CLI 出力の検索とフィルタリング](https://www.cisco.com/c/ja_jp/td/docs/cian/iosxe/iosxe3s/cg/009/fundamentals-xe-3s-book/fundamentals-xe-3s-book_chapter_0101.html)

が参考になる。

また、定期的に実行するものとして、kronもあるが、小生の環境では、ファイル内に時刻情報を埋めることがうまくできなかった。

## スクリプト
まず時刻をJSTに設定。
```
Router(config)# clock timezone JST 9
```
小生の環境では、tftpがうまく動作せず、ftpで転送することとした。
```
Router(config)# event manager applet PingLog
Router(config-applet)# event timer watchdog time 1800
Router(config-applet)# action 10 cli command "enable"
Router(config-applet)# action 20 cli command "sh clock"
Router(config-applet)# action 21 regexp "([0-9]+).([0-9]+).([0-9]+).*" "$_cli_result" match hour minute sec
Router(config-applet)# action 22 regexp ".* JST ... (...) ([0-9]+).*" "$_cli_result" match month day
Router(config-applet)# action 23 regexp ".*([0-9][0-9][0-9][0-9])" "$_cli_result" match year
Router(config-applet)# action 24 set result "Log-$year$month$day-$hour$minute$sec"
Router(config-applet)# action 25 set filename "$result.txt"
Router(config-applet)# action 30 file open LOGFILE nvram:/temp w
Router(config-applet)# action 40 set cmd "ping 8.8.8.8"
Router(config-applet)# action 42 file puts LOGFILE "$cmd at $year$month$day-$hour$minute$sec"
Router(config-applet)# action 44 cli command "$cmd"
Router(config-applet)# action 46 file puts LOGFILE "$_cli_result"
Router(config-applet)# action 50 file close LOGFILE
Router(config-applet)# action 60 cli command "more nvram:/temp | redirect ftp://testabc:HIMITSU@192.168.10.107//home/testabc/data/$filename"
Router(config-applet)# end
Router#
```
主なところを下記に説明。
- 30分（1800秒）ごとに本EEMを実行。
- 21：「sh clock」の実行結果（$_cli_result）から、時刻を取得。
- 22：日付を取得。
- 23：年を取得。
- 25：転送先に格納するファイル名（日時情報含む）のセット。
- 30：不揮発性領域に実行結果を格納するファイルをOpen。
- 44：コマンド（ping）を実行。
- 46：実行結果（$_cli_result）をファイルに格納。
- 50：ファイルをClose。
- 60：ファイルを指定先に転送。

## 実行結果
### 転送先の状況
![スクリーンショット 2023-03-04 19.00.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a53e2fd0-e748-3046-f43d-29610d12f5a8.png)
30分毎にファイルが転送されていることがわかる。

### EEMのデバッグログ
```
Router# debug event manager action cli 
Debug EEM action cli debugging is on
Router#
*Mar  4 08:56:27.169: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : CTL : cli_open called.
*Mar  4 08:56:27.171: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : OUT : Router>
*Mar  4 08:56:27.171: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : IN  : Router>enable
*Mar  4 08:56:27.294: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : OUT : Router#
*Mar  4 08:56:27.294: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : IN  : Router#sh clock
*Mar  4 08:56:27.409: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : OUT : *17:56:27.331 JST Sat Mar 4 2023
*Mar  4 08:56:27.409: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : OUT : Router#
*Mar  4 08:56:27.410: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : IN  : Router#ping 8.8.8.8
*Mar  4 08:56:27.535: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : OUT : Type escape sequence to abort.
*Mar  4 08:56:27.535: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : OUT : Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
*Mar  4 08:56:27.535: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : OUT : !!!!!
*Mar  4 08:56:27.536: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : OUT : Success rate is 100 percent (5/5), round-trip min/avg/max = 6/7/9 ms
*Mar  4 08:56:27.536: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : OUT : Router#
*Mar  4 08:56:27.536: 
Router#%HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : IN  : Router#more nvram:/temp | redirect ftp://testabc:HIMITSU@192.168.10.107//home/testabc/data/Log-2023Mar4-175627.txt
*Mar  4 08:56:28.180: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : OUT : Writing /home/testabc/data/Log-2023Mar4-175627.txt 
*Mar  4 08:56:28.180: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : OUT : Router#
*Mar  4 08:56:28.180: %HA_EM-6-LOG: PingLog : DEBUG(cli_lib) : : CTL : cli_close called.
*Mar  4 08:56:28.180: 
*Mar  4 08:56:28.180: tty is now going through its death sequence
Router#
```

EOF