##EEM(Embedded Event Manager)
シスコルータやスイッチで動作するIOSでは、事前定義した任意のイベント検出に基いてコマンド実行やSyslog送信といったアクションを実行する機能があります。イベントは、タイマーや装置内部でのSNMPポーリングといった周期的なものや、起動後に一回だけ、Syslogの正規表現によるマッチ、フローのカウンタの閾値やデルタ、任意のIPアドレスへのリンクダウン検出、など様々な定義が可能です。
アクションまで含めてIOS CLIで設定可能ですが、EEMロジックの定義として、Tcl(Tool Command Language)が古くからサポートされており、今後は全面的にPythonもサポートされてきます。Tclは、良くも悪くも「枯れきって」いるため、「困ったときのEEM/Tcl頼み」といった感じで、裏方では日本国内でも利用実績が豊富にあります。
##やってみる
もっとも簡単なスクリプトを作成し、IOS上で動作させてみます。
Tclスクリプトを作成します。エディターは(もちろん)何でも結構です。
::cisco::eem::event_register_none
namespace import ::cisco::eem::*
namespace import ::cisco::lib::*
action_syslog msg "Hello Tcl from Syslog!"
puts "Hello Tcl!"
一行名はイベントの定義、ここではNONE(イベントなし)とし、テスト用に手動で実行とします。Tcl標準コマンドに加えて、シスコIOSがサポートするコマンド(syslog、CLI、ルータからメール送信、SNMPポーリングなどなど)を使えるようにnamespaceをimportしておきます。ほぼ、決め打ちだと思います。
作成後、ルータやスイッチに転送します。(copyコマンドや、USBフラッシュで物理的に..など。)
ルータ上でTclファイルが確認できます。
C4331-02#sh bootflash: | i .tcl
30 168 Mar 09 2017 01:44:45 +00:00 /bootflash/test.tcl
EEM用のTclスクリプトのPathを設定し、先ほど転送したtest.tclを登録します。以上で終了です。
C4331-02#conf t
C4331-02(config)#event manager directory user policy "bootflash:/"
C4331-02(config)#event manager policy test.tcl type user
C4331-02(config)#end
C4331-02#
さて、イベントを発行(NONEイベントを手動で実行)してみましょう!
C4331-02#event manager run test.tcl
Hello Tcl!
C4331-02#
Mar 9 02:02:18.369: %HA_EM-6-LOG: test.tcl: Hello Tcl from Syslog!
C4331-02#
putsと、syslogによるコンソール出力の二つが確認できました。実行させるだけなら、とても簡単ですが、スクリプトを工夫すれば(メーカーが機能として提供していないものも含めて)ものすごく高度なロジックが実装できます。
※アクセススイッチからコアルータまで、サポート範囲も広く、ライセンス料もかかりません。