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

# EEM(Embedded Event Manager)
[久しぶりにGNS3（その20：スクリプトその1）](https://qiita.com/infinite1oop/items/244c32b55187b26bd978)の続きである。EEMとは”Embedded Event Manager”の略、何かしらイベントが発生した時に実行するもの、、と考えればよい。

## 参考URL
1. [本家サイト　Embedded Event Manager Configuration Guide](https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/eem/configuration/xe-16/eem-xe-16-book.html)
1. [Cisco IOS Embedded Event Manager (EEM)](https://networklessons.com/cisco/ccie-routing-switching/cisco-ios-embedded-event-manager)
1. [Cisco EEM ( Embedded Event Manager )の設定例](https://www.unix-power.net/networking/post-163)
1. [EEMの設定](https://www.n-study.com/eem_2/)

## 環境
![topology.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/cc88833f-15e6-f13d-7716-201d2bdae1db.png)
[久しぶりにGNS3（その20：スクリプトその1）](https://qiita.com/infinite1oop/items/244c32b55187b26bd978)と同じである。

## サンプル１
上記#2のサイトなどでよく見かける、インターフェースがDownしたらRecoveryする、、をトライ。

### 入力
グローバルコンフィグレーションモードで、”event manager ...”以降を入力する。
```
Router(config)#
event manager applet ETH01_DOWN
 event syslog pattern "Interface Ethernet0/1, changed state to administratively down" period 1
 action 1.0 cli command "enable"
 action 2.0 cli command "config terminal"
 action 3.0 cli command "interface ethernet0/1"
 action 4.0 cli command "shutdown"
 action 5.0 cli command "no shutdown"
 action 6.0 syslog msg "========"
end
```
というわけで、これらは、running-configに記録され、”copy run start”などで保存することができる。この点では、前回のtclより、楽である。

### 実行
```
Router(config)#interface ethernet 0/1
Router(config-if)#shut
Router(config-if)#
*Jan  3 08:44:36.160: %LINK-5-CHANGED: Interface Ethernet0/1, changed state to administratively down
Router(config-if)#
*Jan  3 08:44:36.780: %HA_EM-6-LOG: ETH01_DOWN: ========
Router(config-if)#
*Jan  3 08:44:38.714: %LINK-3-UPDOWN: Interface Ethernet0/1, changed state to up
```
1. 手動でshutdownを実行
1. shutdownを検知
1. "shutdown"および"no shutdown"を実行
1. メッセージ出力
1. Recovery（Up）

一部（ここではメッセージ）を変更することも可能。
```
Router(config)#event manager applet ETH01_DOWN
Router(config-applet)#action 6.0 syslog msg "DOWN ETH01!!"
Router(config-applet)#end

Router(config)#interface ethernet 0/1
Router(config-if)#shut
Router(config-if)#
*Jan  3 08:46:31.478: %LINK-5-CHANGED: Interface Ethernet0/1, changed state to administratively down
Router(config-if)#
*Jan  3 08:46:32.088: %HA_EM-6-LOG: ETH01_DOWN: DOWN ETH01!!
Router(config-if)#
*Jan  3 08:46:34.027: %LINK-3-UPDOWN: Interface Ethernet0/1, changed state to up
```

## サンプル２
外部要因で、簡単に実現できるものを探したところ、物理I/FのDuplexの不一致があった。CDPの情報によると、上記環境のRouterもL2Switchもデフォルトでは、”Half duplex”となっていた。
```
Router#show cdp neighbors detail
-------------------------
Device ID: L2Switch
Entry address(es): 
Platform: Linux Unix,  Capabilities: Router Switch IGMP 
Interface: Ethernet0/0,  Port ID (outgoing port): Ethernet0/0
Holdtime : 133 sec

Version :
Cisco IOS Software, Linux Software (I86BI_LINUXL2-ADVIPSERVICESK9-M), Version 15.2(CML_NIGHTLY_20151103)FLO_DSGS7, EARLY DEPLOYMENT DEVELOPMENT BUILD, synced to  FLO_DSGS7_POSTCOLLAPSE_TEAM_TRACK_DSGS_PI5
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2015 by Cisco Systems, Inc.
Compiled Wed 04-Nov-15 02:31 by mmen

advertisement version: 2
VTP Management Domain: ''
Native VLAN: 1
Duplex: half


Total cdp entries displayed : 1
```
```
L2Switch#show cdp neighbors detail
-------------------------
Device ID: Router
Entry address(es): 
  IP address: 192.168.122.118
Platform: Linux Unix,  Capabilities: Router Source-Route-Bridge 
Interface: Ethernet0/0,  Port ID (outgoing port): Ethernet0/0
Holdtime : 173 sec

Version :
Cisco IOS Software, Linux Software (I86BI_LINUX-ADVENTERPRISEK9-M), Version 15.5(2)T, DEVELOPMENT TEST SOFTWARE
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2015 by Cisco Systems, Inc.
Compiled Thu 26-Mar-15 07:36 by prod_rel_team

advertisement version: 2
Duplex: half
Management address(es): 
  IP address: 192.168.122.118


Total cdp entries displayed : 1
```
ここでは、L2Switchを”Full duplex”に変更し、それを検知したRouter側も”Full duplex”に、自動的に変更する。

### 入力
```
event manager applet DUPLEX_MISMATCH
 event syslog pattern "duplex mismatch discovered on Ethernet0/0" period 1
 action 1.0 cli command "enable"
 action 2.0 cli command "config terminal"
 action 3.0 cli command "interface ethernet0/0"
 action 4.0 cli command "duplex full"
 action 5.0 syslog msg "To duplex full"
end
```

### 実行
L2Switchで、”duplex full”を実行する。
```
L2Switch(config-if)#duplex full
```
それを受けたRouterの状況が下記となる。
```
Router#
*Jan  3 11:15:05.255: %CDP-4-DUPLEX_MISMATCH: duplex mismatch discovered on Ethernet0/0 (not full duplex), with L2Switch Ethernet0/0 (full duplex).
Router#
*Jan  3 11:15:05.749: %HA_EM-6-LOG: DUPLEX_MISMATCH: To duplex full
```
その後、L2Switchに戻って、CDP情報を取得。
```
L2Switch(config-if)#do show cdp neighbors detail
-------------------------
Device ID: Router
Entry address(es): 
  IP address: 192.168.122.118
Platform: Linux Unix,  Capabilities: Router Source-Route-Bridge 
Interface: Ethernet0/0,  Port ID (outgoing port): Ethernet0/0
Holdtime : 172 sec

Version :
Cisco IOS Software, Linux Software (I86BI_LINUX-ADVENTERPRISEK9-M), Version 15.5(2)T, DEVELOPMENT TEST SOFTWARE
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2015 by Cisco Systems, Inc.
Compiled Thu 26-Mar-15 07:36 by prod_rel_team

advertisement version: 2
Duplex: full
Management address(es): 
  IP address: 192.168.122.118


Total cdp entries displayed : 1
```
Routerの”Duplex full”を検出している。

## 終わりに
次回は、”Linux Shell”にトライする。