Draff has asked for the wisdom of the Perl Monks concerning the following question:

Dear all intellegent monks, How can I write a perl script for server A to make a call to server B to execute another perl script on that server (server B).
Basically what i need is that when server A encounter a problem it will run the perl script to control the server B to play a alert sound. Is that anyway i can do it with perl.
Thank you.
Draff
  • Comment on Execute a perl script fpr another Computer

Replies are listed 'Best First'.
Re: Execute a perl script fpr another Computer
by tachyon (Chancellor) on Dec 29, 2002 at 05:02 UTC

    If server B can run CGI scripts it is really easy. On server b put this in the cgi-bin

    #/usr/bin/perl -w use strict; use CGI; my $q = new CGI; print $q->header(); # my $caller = $q->remote_host() so you know who called you my $err = do_something() print $err ? $err : "OK"; sub do_something { ... }

    Then all server A has to do is call the script (assuming server b is at IP 192.168.0.123:

    #!/usr/bin/perl -w use strict; use LWP::Simple while (1) { if ( some_event() ) { my $response = get('http://192.168.0.123/cgi-bin/server_b_scri +pt.pl'); warn $response =~ m/OK/ ? "Notified server b OK\n" : "$respons +e\n"; } sleep 10; } # check for some event sub some_event { ... }

    Using Apache/IIS and CGI is a simple solution as you already have a server listening on port 80 on the remote machine. If you don't have this facility you essentially need to have a server script listening on a port on server b and a client on server a. There are plenty of examples of this on the site. Depending on the OS there may also be other ways to do it using native OS utilities.

    cheers tachyon

    s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

      Hi Tachyon,
      I have try what you recomended here is the script I follow. But there is some error. Here is the script.
      My server B have Apache cgi install. And this is the script i put in. name : servert.pl
      #/usr/bin/perl -w use strict; use CGI; my $q = new CGI; print $q->header(); my $err = do_something(); print $err ? $err : "OK"; sub do_something { for (my $i=0;$i<20;$i++ { print "\7"; } }


      Then the server A i have put in the script name clientt.pl inside one of the folder.

      #!/usr/bin/perl -w use strict; use LWP::Simple #while (1) { # if ( some_event() ) { my $response = get('http://192.168.0.123/cgi-bin/servert.pl'); warn $response =~ m/OK/ ? "Notified server b OK\n" : "$respons +e\n"; # } sleep 10; #} # check for some event #sub some_event { ... }


      I have take out the while and the sub function because i just want to test whether it can call to the server B. but it reply me with the error below, even i didn't remark it.

      Use of uninitialized value in pattern match (m//) at clientt.pl line 1 +0. <br> Use of uninitialized value in concatenation (.) or string at clientt.p +l line 10<br>

        Your CGI will not compile for a start (missing closing ) after for... Plus you totally miss the point of the error check. The do_something() sub should either return 0 ie false if there was no error or the error message if whatever the hell it is supposed to do fails (just like a system call that returns 0 for OK or the error code). We then print out 'OK' if there was no error message or the error message if there was and error. You should be able to call this script and get either the error message or OK in your browser.

        The address you type in to get to this script ie http://mysite.com/cgi-bin/script.pl if the address that the second script need to use. Once you have that working the rest will work fine provided you modify the second script to point at this CGI and don't just blindly paste in the IP address I posted - your server is probably not at http://192.168.0.123/ - this needs to be changed.

        #/usr/bin/perl -w use strict; use CGI; my $q = new CGI; print $q->header(); my $err = do_something(); print $err ? $err : "OK"; sub do_something { if ( 1 + 1 == 2 ) { return 0; } else { return 'An error has occurred 1 + 1 is not equal to 2!' } }

        cheers

        tachyon

        s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

Re: Execute a perl script fpr another Computer
by pg (Canon) on Dec 29, 2002 at 04:50 UTC
    A better design would be, to run an alert program on server B.

    This alert program just listening at a UDP or TCP port (UDP sounds good enough), when it receives alert from any other program in your networked environment, it just make a sound as you suggested, or doing some more complex process, logging etc.

    This makes the alert program more useful, and you may define a unified alert messaging interface for your corporate environment.
Re: Execute a perl script fpr another Computer
by Ryszard (Priest) on Dec 31, 2002 at 08:43 UTC
    In a fully blown production environment this kind of thing is normally handled by centralised monitoring system (ala NetX). You can then write your own SNMP traps in whatever language you like on the client machines.

    When a threshold or condition is met your agent would then fire off a trap to the monitoring server, which would do any number of things from paging, emailing, displaying an alert on a display or whatever.

    Having said all that, it can be quite tricky to set something like that up as it involves defining business processes, standards and may be just plain overkill.

    In that case, I like the simplicity of tachyon's approach using a cgi.

      On the client side you can just use Net::SNMP, it comes with a snmp trap example script.
      On the server side you will need something that is capable of dealing with SNMP traps.

      As far as I know Net::SNMP does not support being on the server-side of the SNMP trap.
      Does anyone have recommendations for freeware SNMP Server ?