ā10-02-2023 07:54 AM
Hello everyone,
I'm new to the EEM scripts creation and I'm currently in the process of learning how to use it. I have a cellular switch IR1101 that uses EEM version 4.0. I am having issues with my routers where sometimes the cellular connection goes down and the link recovery feature on the switch tries to reboot the modem but it seems to get stuck and the modem reboot never takes place. Even if I try to reboot the modem manually, I get an error saying there is a reboot already taking place. The only solution that I've found so far is reloading the switch. With all this being said, I created the following script that waits for 15 minutes after BGP goes down and then calls another script that will actually reload the switch. I also have a third script that cancels the switch reload if BGP comes back up. Let me paste the scripts so that I can explain you better what's happening and maybe I could get some guidance for the solution. The script is the following:
--------------The script belows waits for 15 minutes after BGP goes down and then triggers the bgp-wait-15-minutes applets.------------
event manager applet bgp-neighbor-monitor authorization bypass
description Monitor BGP Neighbor Status
event syslog pattern "BGP-5-ADJCHANGE: neighbor.*Down" maxrun 1800
trigger delay 900
action 1.0 cli command "enable"
action 2.0 syslog msg "BGP is down. Initiating a 15 minutes reload timer"
action 3.0 cli command "event manager run bgp-wait-15-minutes"
---------------The applet below actually reloads the switch-------------------------
event manager applet bgp-wait-15-minutes
event none maxrun 1800
description Wait for 15 minutes after BGP goes down
action 1.0 syslog msg "15-minutes timer complete. Reloading device"
action 2.0 reload
action 3.0 cli command "end"
------------The applet below cancels the reload by using the no event manager applet bgp-wait-15-minutes applet---------
event manager applet bgp-up-monitor authorization bypass
description Monitor BGP Neighbor Status (Up)
event syslog pattern "BGP-5-ADJCHANGE: neighbor.*Up"
action 1.0 cli command "enable"
action 2.0 cli command "config t"
action 3.0 cli command "no event manager applet bgp-wait-15-minutes"
action 4.0 cli command "end"
The issue here is that since I'm using the no event manager applet-wait-15-minutes command, this actually deletes the applet from the registered policies, therefore, if BGP goes down again, there won't be an applet that will reload the switch. Is there a way to do this? Again, I'm just learning about EEM scripts and I'm trying to grasp the concept. I also don't have an idea on how to create TCL scripts. Any help/guidance would be really appreciated.
Solved! Go to Solution.
ā10-02-2023 08:50 AM
I would consolidate this into a single policy by keeping the trigger the same, then manually check the BGP neighbor. If BGP neighbor is NOT Established; reload.
event manager applet bgp-neighbor-monitor authorization bypass
description Monitor BGP Neighbor Status
event syslog pattern "BGP-5-ADJCHANGE: neighbor.*Down" maxrun 1800
action 010 regexp "BGP-5-ADJCHANGE: neighbor ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)" "$_syslog_msg" match neighborIp
action 020 cli command "enable"
action 030 wait 900
action 040 cli command "sh ip bgp neighbor $neighborIp | inc BGP state"
action 050 regexp "BGP state = Established" "$_cli_result"
action 060 if $_regexp_result eq "0"
action 070 reload
action 080 end
ā10-02-2023 08:50 AM
I would consolidate this into a single policy by keeping the trigger the same, then manually check the BGP neighbor. If BGP neighbor is NOT Established; reload.
event manager applet bgp-neighbor-monitor authorization bypass
description Monitor BGP Neighbor Status
event syslog pattern "BGP-5-ADJCHANGE: neighbor.*Down" maxrun 1800
action 010 regexp "BGP-5-ADJCHANGE: neighbor ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)" "$_syslog_msg" match neighborIp
action 020 cli command "enable"
action 030 wait 900
action 040 cli command "sh ip bgp neighbor $neighborIp | inc BGP state"
action 050 regexp "BGP state = Established" "$_cli_result"
action 060 if $_regexp_result eq "0"
action 070 reload
action 080 end
ā10-02-2023 09:01 AM
Thank you much Dan for the info. I've seen the reference to regexp_results on some of the research that I've done but for some reason, I haven't been able to make it work on my device. It seems that if I can't use it using the if statement. I would assume that since my device is using EEM 4.0 that option would be available but it seems like if it isn't or maybe I'm not using it correctly. I see that you are using it on your script as well on action 060 but this is what I get when I try to use it:
Van_0009(config-applet)#action 060 if $_regexp_result eq "0"
^
% Invalid input detected at '^' marker.
ā10-02-2023 09:10 AM
Applets are good for most things but when there are gaps TCL can be used. Go to this site to convert the applet to a TCL file. TCL will be able to support the regexp match.
https://www.marcuscom.com/convert_applet/
ā10-02-2023 09:46 AM
understood. I converted the applet to a tcl file as suggested and this is what I got:
array set arr_einfo [event_reqinfo]
if [catch {cli_open} result] {
error $result $errorInfo
} else {
array set cli1 $result
}
set _regexp_result [regexp {BGP-5-ADJCHANGE: neighbor ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)} $arr_einfo(msg) match neighborIp]
if [catch {cli_exec $cli1(fd) "enable"} _cli_result] {
error $_cli_result $errorInfo
}
after 900000
if [catch {cli_exec $cli1(fd) "sh ip bgp neighbor $neighborIp | inc BGP state"} _cli_result] {
error $_cli_result $errorInfo
}
set _regexp_result [regexp {BGP state = Established} $_cli_result]
if {$_regexp_result == "0"} {
action_reload
}
# Close open cli before exit.
catch {cli_close $cli1(fd) $cli1(tty_id)} result
After I did this, I uploaded the file to flash and then tried to run it and received the following error:
Van_0009(tcl)#source flash:bgp-monitoring.tcl
invalid command name "event_reqinfo" ^
% Invalid input detected at '^' marker.
Any idea on what I'm doing wrong?
ā10-02-2023 10:07 AM
EEM has libraries that extend the usefulness of TCL and can only be used in an EEM environment. The syntax you have is to run a normal TCL file in IOS. TCL does not know about the EEM libraries and this is what is generating the error. You need to trigger the EEM script with the BGP syslog message so that TCL will import the EEM extensions. You also need all the syntax that that web site translates starting at the top line to include in the tcl file.
ā10-04-2023 05:16 AM
Dan,
your solution worked very well for me. Thank you much for your help. Once I converted the file to tcl format, I then had to register it in EEM. Basically the process was to convert the applet to TCL and save it to a folder in flash. After that I had to register the directory in EEM by running this command: event manager directory user policy flash:/NAME OF DIRECTORY. As the last step was to register the tcl by running this command: event manager policy NAME_OF_SCRIPT.TCL
Again, Thank you so much for pointing me in the right direction.
ā10-02-2023 10:35 AM
Friend
Use ip sla tcp instead of monitor bgp session.
It simple not complicate.
ā10-03-2023 04:29 AM
Thank you MHM Cisco World for the suggestion. I also thought about that. My concern is that I still want to wait 15 minutes or so for the device to start responding and in the event that it start responding again, then I don't want the reload to happen. Once the applet starts running, I haven't found a way to prevent the reload other than deleting the applet completely but if I do that, then the applet won't be there to reload the switch again in the event that it becomes unreachable again.
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide