NetXMS Support Forum

English Support => General Support => Topic started by: nisross on July 25, 2022, 03:11:15 AM

Title: How to cancel a timer used to daly email notification via NXSL.
Post by: nisross on July 25, 2022, 03:11:15 AM
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;
}

Title: Re: How to cancel a timer used to daly email notification via NXSL.
Post by: Victor Kirhenshtein on July 25, 2022, 03:45:33 PM
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
Title: Re: How to cancel a timer used to daly email notification via NXSL.
Post by: nisross on July 27, 2022, 02:54:13 AM
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;
}
Title: Re: How to cancel a timer used to daly email notification via NXSL.
Post by: Filipp Sudanov on August 01, 2022, 04:58:14 PM
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.
Title: Re: How to cancel a timer used to daly email notification via NXSL.
Post by: nisross on August 02, 2022, 12:58:00 AM
Hi Filipp

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

Ross