ASR9k EEM + TCL Interactive Scripting
Requirement:
1. Capture interface tunnel port each 5 minutes, if traffics > X, will capture other information.
2. Store those information to disk0/harddisk.
In fact, the requirement is very easy by Python + CRT, but customer couldn’t find a PC to continue to run python script, so only use EEM + TCL on ASR9k. And in TCL script, I use two function: foreach and scan.
Follow CLI need config before do script, if you change any variable or script, you need re-config “event manager policy tac_te.tcl username cisco”:
aaa authorization eventmanager default local event manager environment _cron_entry1 */5 * * * * event manager directory user policy disk0: event manager policy tac_te.tcl username cisco persist-time 3600 type user
Follow output result, a,b,x,y… are test flag:
RP/0/RSP0/CPU0:Jan 5 16:13:38.545 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: Starting scripts! RP/0/RSP0/CPU0:Jan 5 16:13:39.557 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: a RP/0/RSP0/CPU0:Jan 5 16:13:40.041 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: b RP/0/RSP0/CPU0:Jan 5 16:13:40.042 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.043 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.044 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.045 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.045 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.046 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.047 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.048 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.825 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: b RP/0/RSP0/CPU0:Jan 5 16:13:40.826 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.827 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.828 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.828 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.829 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.830 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.831 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.832 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.832 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.833 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.834 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.835 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.835 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.836 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.837 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.838 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.839 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.839 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.840 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.841 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.842 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.842 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.843 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.844 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.845 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.846 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.846 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.847 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.848 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.849 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.850 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.851 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.851 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.852 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.853 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: z RP/0/RSP0/CPU0:Jan 5 16:13:40.854 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: xx RP/0/RSP0/CPU0:Jan 5 16:13:40.855 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: x RP/0/RSP0/CPU0:Jan 5 16:13:40.856 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: y RP/0/RSP0/CPU0:Jan 5 16:13:40.856 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: z RP/0/RSP0/CPU0:Jan 5 16:13:40.857 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: xx RP/0/RSP0/CPU0:Jan 5 16:13:40.858 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: zz RP/0/RSP0/CPU0:Jan 5 16:13:40.859 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: Writing Capture Info... RP/0/RSP0/CPU0:Jan 5 16:13:40.860 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: c RP/0/RSP0/CPU0:Jan 5 16:13:41.424 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: e RP/0/RSP0/CPU0:Jan 5 16:13:41.501 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: f RP/0/RSP0/CPU0:Jan 5 16:13:41.508 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: g RP/0/RSP0/CPU0:Jan 5 16:13:41.508 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: c RP/0/RSP0/CPU0:Jan 5 16:13:45.077 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: e RP/0/RSP0/CPU0:Jan 5 16:13:45.080 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: f RP/0/RSP0/CPU0:Jan 5 16:13:45.166 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: g RP/0/RSP0/CPU0:Jan 5 16:13:45.167 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: c RP/0/RSP0/CPU0:Jan 5 16:13:55.027 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: e RP/0/RSP0/CPU0:Jan 5 16:13:55.145 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: f RP/0/RSP0/CPU0:Jan 5 16:13:55.160 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: g RP/0/RSP0/CPU0:Jan 5 16:13:55.161 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: h RP/0/RSP0/CPU0:Jan 5 16:13:56.466 : tclsh[65783]: %HA-HA_EEM-6-ACTION_SYSLOG_LOG_INFO : tac_te.tcl: End script RP/0/RSP0/CPU0:ASR9001-1#dir disk0:CASE-TS.txt Mon Jan 5 16:14:24.840 UTC Directory of disk0: 11726670 -rw- 44276 Mon Jan 5 16:13:55 2015 CASE-TS.txt 4026515456 bytes total (2994521088 bytes free) RP/0/RSP0/CPU0:ASR9001-1#dir disk0:CASE-TS.txt Mon Jan 5 16:42:51.630 UTC Directory of disk0: 11726670 -rw- 1195452 Mon Jan 5 16:39:55 2015 CASE-TS.txt 4026515456 bytes total (2993374208 bytes free)
Follow script:
# # XR TCL Offical Document # http://www.cisco.com/c/en/us/td/docs/routers/crs/software/crs_r4-2/system_monitoring/configuration/guide/b_sysmon_cg42crs/b_sysmon_cg42crs_chapter_010.html#con_1219664 # #::cisco::eem::event_register_timer watchdog name timer sec 60 maxrun_sec 900 ::cisco::eem::event_register_timer cron name crontimer1 cron_entry $_cron_entry1 namespace import ::cisco::eem::* namespace import ::cisco::lib::* # # errorInf gets set by namespace if any of the auto_path directories do not # contain a valid tclIndex file. It is not an error just left over stuff. # So we set the errorInfo value to null so that we don't have left # over errors in it. # set errorInfo "" set a "" set b "" set condition_commond_list [list \ " sh int MgmtEth0/RSP0/CPU0/0" \ ] set command_list [list \ " show platform" \ " show ins ac sum" \ " show interface" \ ] # Notify users that we're collecting action_syslog priority info msg "Starting scripts!" # Query the event info, check error, you should not change array set arr_einfo [event_reqinfo] if {$_cerrno != 0} { set result [format "component=%s; subsys err=%s; posix err=%s;\n%s" \ $_cerr_sub_num $_cerr_sub_err $_cerr_posix_err $_cerr_str] error $result } # Open a cli connection if [catch {cli_open} result] { error $result $errorInfo } else { array set cli1 $result } # Loop through the command list1 action_syslog priority info msg "a" foreach comm_temp1 $condition_commond_list { if [catch {cli_exec $cli1(fd) $comm_temp1} cli_show] { error $result $errorInfo } action_syslog priority info msg "b" foreach line [split $cli_show \n] { action_syslog priority info msg "x" # If find "input rate", match1 is available variable, so that should 1 # If not find, match1 is unavailable variable, so that should 0 # Attention: the regexp() couldn't have bank! set match1 [regexp (rate) $line match] action_syslog priority info msg "y" # Trigger condition is bobcat port traffics > 10M if {$match1 == 1} { action_syslog priority info msg "z" # String must exactly match $line, include bank! scan $line " 5 minute input rate %d bits/sec, %d packets/sec" a b action_syslog priority info msg "xx" if {$a > 500} { set condition 1 action_syslog priority info msg "zz" break } } } } # Capture information when issue happened set filename "/disk0:/CASE-TS.txt" if {$condition==1} { action_syslog priority info msg "Writing Capture Info..." foreach comm_temp_2 $command_list { action_syslog priority info msg "c" if [catch {cli_exec $cli1(fd) $comm_temp_2} cli_show_2] { action_syslog priority info msg "d" error $result $errorInfo } action_syslog priority info msg "e" # must re-set outfile before puts set outfile [open $filename a+] puts $outfile "$cli_show_2" action_syslog priority info msg "f" close $outfile action_syslog priority info msg "g" } action_syslog priority info msg "h" } #close the cli connection if [catch {cli_close $cli1(fd) $cli1(tty_id)} result] { error $result $errorInfo } #Notify users that we have finished checking the memory set output_msg "End script" action_syslog priority info msg $output_msg
Follow good site, can reference convert from EEM to TCL script:
Convert an EEM Applet to a Tcl Policy
版权声明:
本文链接:ASR9k EEM + TCL Interactive Scripting
版权声明:本文为原创文章,仅代表个人观点,版权归 Frank Zhao 所有,转载时请注明本文出处及文章链接