Process Event handler to fire external script
-
Thanks Phil
-
@phildunlap Hi Phil, right now I have a Virtual data source for the purpose of simulation but in production we will have a Modbus I/P datasource. So thinking ahead - say I were to use an ssh data source and data point to trigger my script. Then I would have to set up a point link between the Modbus I/P datapoint to trigger my SSH datapoint which would then trigger my script?
As for the SSH datapoint, are you suggesting to use either of the query command/settable command to execute my shell script?
I just want to make sure I understand the full picture before I attempt something that might not be suited for my production environment.
-
Then I would have to set up a point link between the Modbus I/P datapoint to trigger my SSH datapoint which would then trigger my script? As for the SSH datapoint, are you suggesting to use either of the query command/settable command to execute my shell script?
You could use a Set Point Event Handler. That's what I'd probably do. My script would look like,
//Since the command is hardcoded, we don't need to provide a meaningful // string to replace VALUE in the set command (see SSH DP help doc) return "";
which would send the Set Command and try to get a value, so that you can check the SSH point somewhere to see if the script did what it was supposed to.
Alternatively you could use the query command, but then the data source will poll with that command. In the SSH data source, after the set command is sent the query command if nonempty is sent as well, and then the response to either is read. Using the set would just be simpler: it will just be the command to invoke.
-
@phildunlap I've generated my private key and provided the path to the data source but it's not finding the private key. In my case the server I am ssh'ing to is my MangoES, which also is where my data source lies.
-
The id_rsa is the private key. So, you'll need to
cat id_rsa.pub >> authorized_keys
and the provide the path to id_rsa as the private key. -
@phildunlap Yes, I have already done that and my authorized_keys file looks like:
ssh-rsa AAAAB3N...N3EU3 mango@mangoES3439
In the log it just says:
java.io.FileNotFoundException: Private key file not found
To test that my key pair works, I've tested ssh IP_MANGOES via shell and I get in without being prompted for the user/pw. It looks like there might be an error with my datasource configuration.
-
Phil, woiuld a config file in the .ssh directory for ssh keys work in this case?
I do that and try SSH'ing manually first to make sure the remote ID is authenticated and that I go straight through with no issue. -
You could try an absolute path instead of a ~/, like /home/mango/.ssh/id_rsa
-
Ok, I think providing the full path worked. Thanks. Interesting that ~/.ssh/id_rsa is provided by default for the private key field but does not work.
For the set command field, is that where I could execute my shell script? For example:
-
That should work as usually the home directory is the default location a user logs in as unless stated otherwise in the user profile. This is assuming you've kept it in the /home/mango directory.. All else fails, absolute paths shouldn't fail you.
-
Yes, the script did fire after doing what Phil suggested (to create a Set Point event handler). Changing the value of the target data point caused the set command of the SSH data point to fire. Unfortunately, I get the same errors as before when I had my process event handler.
-
Since that's the case it's likely best you find the causes of them through virtualenv.
If they have env paths, echo them in the bash file. This will tell you if your ssh connection is inheriting all of the required information. -
Actually I mispoke - my set point event handler is not firing. It was the old process event handler that was firing that I forgot to deactivate. So now I am trying to set my ssh data point through the set point event handler.
This is what I have for the set point event handler ("MangoES - Trigger" is the SSH datapoint)"
It does not look like the event is firing though because my SSH datapoint is N/A.
-
@khuang Is there no information in logs??
Also enable logging on the ssh datasource and tail -f the log file. Would be interesting to see if anything comes through at all.
EDIT: check your syslogs as well. -
There isn't anything in the sys logs but tail -f for the session log file of the datasource gives me:
So it does look my test script is running but when I try to flip the bit back to 0 for my ssh data point, it just automatically executes my set point handler again and sets it back to 1. The set point handler shouldn't be activating unless there is a change from 0->1 for my source.
-
@khuang Make sure your point handler has normal as 0. also ensure the script to fire box when returning to normal is empty.
-
@mattfox What do you mean by setting the normal as 0? Do you mean creating an inactive action and scripting return 0?
Is this what you mean:
-
No set inactive action to none. From what I gather you've got the event to fire on change.. What's the logic you're after? if something goes high fire this script? Need more info to diagnose how to set an inactive region.
EDIT: Just read above. Get the point in context and check the value,if ( point.last(1,0)[0].value == 0 && point.value == 1 ) { return true; //fire handler } return false; //don't fire handler
That way it checks if the point has changed the right way and then only returns true for that; otherwise it returns false;
Ideally just set a high limit and set it to 1. The event will fire on 1 or above and return to normal on zero. -
Or, if the source point is binary, use a state detector on true and like Fox said, no inactive action.
-
@mattfox said in Process Event handler to fire external script:
if ( point.last(1,0)[0].value == 0 && point.value == 1 )
{
return true; //fire handler
}The logic that I am after is that it fires my script but I do not want the scripts to continuously fire.
Right now there are two problems:- the set point handler is triggering all the time (the reason why I believe it is triggering all the time is because my set point cannot be set back to 0) and setting my ssh data point to true all the time. It should execute once and be done. Right now the data point is stuck at 1, and I am unable to change it back to 0.
- my script which is in the set command of the ssh data point still is not executing, which is the purpose behind me pursuing ssh datasources and data points
EDIT: I recreated the SSH datapoint, and set point handler and I got the set command to fire but at a 6 second delay. It also looks like the entire MangoES box is lagging at the same rate.
EDIT2: After restarting the MangoES box and deactivating several other data sources that have various polling and triggers associated with it, the CPU reduced to 360% (8 cores). Before the CPU was being hit too hard so the script was not running correctly.
- the set point handler is triggering all the time (the reason why I believe it is triggering all the time is because my set point cannot be set back to 0) and setting my ssh data point to true all the time. It should execute once and be done. Right now the data point is stuck at 1, and I am unable to change it back to 0.