8 Replies Latest reply: Feb 23, 2011 8:10 AM by Geert De Peuter RSS

How to execute psl code remotely?

Rohit NameToUpdate

I am using remote_open to establish the connection and transferring the psl file using remote_file_send. But how can I execute that file remotely and get back its output on local machine.

  • 1. How to execute psl code remotely?
    Jonathan Coop

    Hi Rohit

     

    The way I do this is to have two KM's one at the remote end, and the other locally, I pass arguments on the outgoing event, with username, password, and hostname to log back to. Then I trigger a remote event, to the remote client, the class of the event has defined a Notification script defined.

     

    Below is some code I've used to send back a count of processes running back to the local machine, note that the code runs as a notification script in the event class definition. It is UNABLE to write to the system console, hance the degug output to file. Note that this code has some support for domain accounts.

     

    hdl=fopen(getenv("PATROL_TEMP")."/CrossMCProcMon_err.txt","a");

    # The args passed are as follows

    # inst,ownerLocal,returnDomain,returnUser,returnPasswd,returnHost,returnPort,localProcs;

    all_args="%{EV_ARGS}";

    ct=0;

    inst=replace(nthargf(all_args,++ct,""),"<null>","");

    ownerLocal=replace(nthargf(all_args,++ct,""),"<null>","");

    returnDomain=replace(nthargf(all_args,++ct,""),"<null>","");

    returnUser=replace(nthargf(all_args,++ct,""),"<null>","");

    returnPasswd=replace(nthargf(all_args,++ct,""),"<null>","");

    returnHost=replace(nthargf(all_args,++ct,""),"<null>","");

    returnPort=replace(nthargf(all_args,++ct,""),"<null>","");

    #put back any spaces

    localProcs=replace(ntharg(all_args,int(++ct)."-",""," "),",","\n");

    count=getProcCount();

    #If we cannot send info back, we can only report to file, cannot print to sys console, not send an event back!.

    if (returnDomain=="") {

        sessID=remote_open(returnHost,returnPort,"DES",returnUser,returnPasswd);

        error=errno;

    }else{

     

        sessID=remote_open(returnHost,returnPort,"DES",returnDomain."\\".returnUser,returnPasswd);

        error=errno;

    }

    close(hdl);

    if (sessID=="") {

        hdl=fopen(getenv("PATROL_TEMP")."/CrossMCProcMon_err.txt","a");

        if (hdl != "") {

            #If the handle is null we're stuffed, nowhere to write to!

            #write(hdl,"All args is: **".all_args."**\n");

            write(hdl,asctime(time(),"%d/%m/%Y %H:%M:%S")." Unable to send info to ".returnHost." on port ".returnPort." user ".returnUser." domain ".returnDomain."\n");

            write(hdl,"Error given (see PSL ref manual 1 for decode): ".error."\n");

            close(hdl);

        }

        exit;

    }

    res=remote_event_trigger(sessID,get("/name").".".inst,"CrossMCProcMon_CONTAINER","handleResults","INFORMATION","2",inst,count);

    if (res=="") {

        hdl=fopen(getenv("PATROL_TEMP")."/CrossMCProcMon_dbg.txt","a");

        if (hdl != "") {

            #If the handle is null we're stuffed, nowhere to write to!

            write(hdl,asctime(time(),"%d/%m/%Y %H:%M:%S")." Trying to send event to ".returnHost." on port ".returnPort." user ".returnUser." domain ".returnDomain."\n");

            write(hdl,"Count was ".count." for process ".inst." process string ".localProcs." owner ".ownerLocal."\n");

            close(hdl);

        }

    }   

    remote_close(sessID);

     

    Below is code to trigger the previous:

     

     

     

    res=remote_event_trigger(sessID,"countRemoteProcs","CrossMCProcMon_CONTAINER","countProcs","INFORMATION","2",inst,ownerRemote,thisDomain,thisUserName,thisPasswd,thisHost,thisPort,remoteProcs);   

     

    I'd post the entire code but I don't have documentation, which would seem unfair on anyone trying to use it!.

     

    Hope this helps

     

     

    Jon

  • 2. How to execute psl code remotely?
    Jonathan Coop

    I think you can also use remPSL event, but I believe the entire code to be passed has to go in the first argument, the results get posted remotely which you then have to query and bring back.

     

    The second argument you pass to remPSL is a unique identifier that you pass to identify the correct result.

     

    Jon

  • 3. How to execute psl code remotely?
    Rohit NameToUpdate

    Hey thanks joncoop2. Your suggestion seems to be helpful. Let me try this and then I'll again get back to you.

  • 4. How to execute psl code remotely?
    Rohit NameToUpdate

    Hi Jon,

    I did coding using remPSL event, and it really worked. But when I am giving .psl file as input to

    remote_event_trigger(......) , then it executes only first line.

    I need the whole to be executed correctly.

    Suppose if have

    i=1;

    while(i<5)

    {

    i++;

    }

    print(i);

     

    then it should return 5 as output on remote machine.

     

    My code is

     

     

    sessionID=remote_open("machine-name","3181","NONE","administrator","password");

    print(sessionID);

    chan=fopen("/tmp/test1.psl","r");

    tes=read(chan,100);

    print(tes);

    if(sessionID)

    {

     

    your_id = "my_id";

    remote_host="machine-name";

     

    trigger_res = remote_event_trigger(

    sessionID,

    remote_host,

    "STANDARD",

    "RemPsl",

    "INFORMATION","5",

    tes,

    your_id

    );

     

    print("Result of trigger->".trigger_res."\n");

     

    if(trigger_res)

    {

    query_res=remote_event_query(

    sessionID,

    "1",

    1,

    "",

    "%{EV_ARG1}\n",

    "","",

    "",

    "",

    "",

    "",

    your_id,

    "",

    ""

    );

     

    print("Result of query->".query_res."\n");

    }

     

    remote_close(sessionID);

    }

  • 5. How to execute psl code remotely?
    Jonathan Coop

    Hi

     

    I don't think your code will work because print, will not work when carried out this way, instead write to a file remotely and try that.

     

    Mind I don't use RemPSL, as my original post shows, remote triggering of events will not print to the System Output window.

     

    Regards

     

     

    Jon

  • 6. How to execute psl code remotely?
    Rohit NameToUpdate

    I was trying to execute it as psl task.

    It works perfectly fine but executes only 1st instruction of file. How could I execute the complete program in intact way?

  • 7. Re: How to execute psl code remotely?
    Jonathan Coop

    Hi Rohit

     

    Have you tried executing a remote PSL script without print statements?.

    If you have can you show such script, if you need to output data within your

    program write to file.

     

    Jon

  • 8. Re: How to execute psl code remotely?
    Geert De Peuter

    Here is a trick to execute multiple psl through RemPsl

     

    Let's say your script is

     

    output = "";

    for (i = 0; i < 10; i++) {

    output = output." ".i;

    }

     

    Then you have 2 problems

    1. Multiline script does not work with RemPsl (at least without this trick)
    2. There is no support for returning a variable

     

    A solution for this problem is rather simple

     

    1. start your script with xxx_pem = 0;
    2. then have your script
    3. copy the output in the xxx_pem variable

     

    So the script will become something like :

     

    xxx_pem = 0;

    output = "";

    for (i = 0; i < 10; i++) {

    output = output." ".i;

    }

    xxx_pem = output;

     

     

    And it will just work.

     

    -- Geert

     

    PS: For the purists ... as an alternative to the first line you can have 0; as well

     

    So the following will also work :

    0;

    output = "";

    for (i = 0; i < 10; i++) {

    output = output." ".i;

    }

    xxx_pem = output;