How to cancel a timer used to daly email notification via NXSL.

Started by nisross, July 25, 2022, 03:11:15 AM

Previous topic - Next topic

nisross

Hi all

We are currently running 3.8.366 and was wanting to implement a script that would supress node down and node up emails within a specified down time period, e.g., 5 minutes. I've basically sussed things out but have no idea how to cancel the timer, nodetimer_%i, used to delay the node down email. Any advice would be greatly appreciated.

interval = 300;
nodeId = d2x($node->id,8);
a = ("timestamp_0x".nodeId);
if (ReadPersistentStorage(a) != "" ) {
if ((time() - ReadPersistentStorage(a)) > interval) return true;
WritePersistentStorage(a, NULL);
alarm = FindAlarmByKey("NODE_DOWN2_0x".nodeId);
timer = ("nodetimer_0x".nodeId);
$event->setNamedParameter(timer, "");
alarm->resolve();
return false;
}


Victor Kirhenshtein

Hi!

You cannot cancel timer directly from NXSL. However, you can generate special event to cancel timer. For example, in your script you can have something like

PostEvent($object, "CANCEL_TIMER", null, timer);   // Variable "timer" contains timer key

and in EPP you create separate rule that handles event CANCEL_TIMER and the only action is "cancel timer" with %1 as key.

Of course you also have to create event CANCEL_TIMER.

Also, if you need macro string expanded within NXSL, you can use function ExpandString. In your example you can do

timer = ExpandString("nodetimer_%i", $node);

That way you are guaranteed to have exactly same string in NXSL as in other EPP places.

Best regards,
Victor

nisross

Hi Victor

Thanks for the assistance. Modified code and EPP below. For some reason the timer cancellation doesn't get applied though, i.e., Node Down Email is still sent. %1 is expanded and sent correctly as displayed in event log, i.e., nodetimer_0x0000364. Any pointers appreciated.

Regards

Ross

interval = 300;
timestamp = ExpandString("timestamp_%i",$node);
if (ReadPersistentStorage(timestamp) != "" ) {
if ((time() - ReadPersistentStorage(timestamp)) > interval) return true;
WritePersistentStorage(timestamp, NULL);
alarmkey = ExpandString("NODE_DOWN2_%i",$node);
alarm = FindAlarmByKey(alarmkey);
timer = ExpandString("nodetimer_%i",$node);
PostEvent($node,"CANCEL_TIMER",null,timer);
alarm->terminate();
return false;
}

Filipp Sudanov

It looks that there's a space in nodetimer_ %i after _ sign when setting the timer.

In overall - do I understand correctly, that you want do delay node down notification and send node up notification only if node down notification was sent? If so, currently this can be achieved without scripting, by filling in "Snooze/Blocking timer key" field in recovery notification properties.

nisross

Hi Filipp

Thanks for the tip. And yes there was a space.

Ross