Require Perl script to get system load and uptime on remote UNIX hosts

I need help in executing the uptime on remote unix servers mainly linux and solaris as well as sun containers. I am able to get the uptime on local system but when I execute the code with arguments  I am unable to get the logic right. I need to pass arguments with perl script which i have to integrate with a monitoring tool to set the threshold.


#!/usr/bin/perl -w

 # my $MYHOME=$ENV($MYHOME);
 # $MYHOME="/home/anil" if (not $MYHOME);
 open(LOG, ">/tmp/uptime.pl.log") or die "Can't open file: $!";
 my $ScriptDir="/home/anil";
 print LOG  "Arg1=$ARGV[0], Arg2=$ARGV[1], Arg3=$ARGV[2], Arg4=$ARGV[3]\n";

 exit if not ($ARGV[0] eq "-stat" || $ARGV[0] eq "-config");

  my $ip=$ARGV[3];
  exit 1 if (not $ip);
  
  my $user="root";
  $user=$ARGV[4] if ($ARGV[4]);
  #my @result;
  my $keyfile="/root/.ssh/id_rsa";
	sub query {
	open (RESULT, "ssh 2>/dev/null -l $user -i $keyfile -oStrictHostKeyChecking=no -oBatchMode=yes $ip $cmd |") || die "can't connect to $ip";
	@result = <RESULT>;
	close RESULT;
}       
	$os = `uname -s`;

 	if ($os =~ /Linux/)
 {	
     $uptime=`ps -eo pid,comm,etime | grep init`;
 }
 else 
 {
     $uptime=`ps -p 1 -o etime | tail -1`;
 }

 if ($uptime =~ /[0-9]+\-/) 
 {
     ($Days, $Hours, $Minutes, $Seconds) = $uptime =~ /([0-9]*)\-?([0-9]+):([0-9]+):([0-9]+)/;
 } 
 elsif  
     ($uptime =~ /[0-9]+:[0-9]+:[0-9]+/) 
 {
     ($Hours, $Minutes, $Seconds) = $uptime =~ /([0-9]+):([0-9]+):([0-9]+)/;
      $Days = 0;
 } 
 else 
 {
     ($Minutes, $Seconds) = $uptime =~ /([0-9]+):([0-9]+)/;
      $Days = 0;
      $Hours = 0;
 }
  query();
    for each $_ (@result) {
     $t_uptime = eval($Days*24*60 + $Hours*60 + $Minutes);
    } 
     print ("uptime: $t_uptime \n");

Open in new window

amk2121Asked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

amk2121Author Commented:
I require a solution to the above. I have the script which runs when the remote execution code from the perl script is removed.. I need to execute the script on a remote Unix server (Linux /Solaris) using ssh and secure RSA key to first get the uptime and convert the uptime into total minutes.

Please let me know if you require more information
0
Jan SpringerCommented:
Please give an example of some arguments.  If I'm understanding the question properly, you may need to "shift" in the beginning of your script.
0
amk2121Author Commented:
the script will remotely log into a target server and report the following data by printing it to stdout

Response Time=NNN  (in seconds)
Uptime=NNN  (in minutes)
System Load=NN.mm (float number)
AVAILABILITY=   (0 or 100)

The script will have input argument specifying desired timeout in seconds
If operation can not be completed in that time then AVAILABILITY reported should be set to 0
The script must finish after TimeOut seconds and should not be hanging around waiting for connection (hint: use timeout parameter to ssh command).


The script will be called with these arguments:

ScriptName Arg1 Arg2 TimeOut TargetServer UserName
 
You can ignore Arg1 and Arg2 but they will be there!
0
The Five Tenets of the Most Secure Backup

Data loss can hit a business in any number of ways. In reality, companies should expect to lose data at some point. The challenge is having a plan to recover from such an event.

APNFSSCCommented:
have a look at Net::SSH to run the remote commands... also I'm not sure if this is true on all nix systems but /proc/uptime contains the uptime in seconds if that is any help.

Also have a look at Getopt::Long to help with handling the arguments that your passing through.

As for the timeout I'm not sure how you can handle that... i think the ssh will just time out by itself if it cannot connect.
0
ckhsu1977Commented:
a bit curious about your script.
Regardless of what user you set $user, you'll still use /root/.ssh/id_rsa as the private key. Seems odd.
How are you passing and what commands are you passing for $cmd in the subroutine query?
0
amk2121Author Commented:
I got the script working and yes there was a wrong logic expressed in my code snippet above.

Thanks for all your support
0
APNFSSCCommented:
What did you end out altering that made it work?
0
amk2121Author Commented:
I changed the script and used a logic pertaining to my requirement.

$user = "root";
$ips=$ARGV[0];                    ## this holds the command needs to run on remote host.
@ipary= split(/\,/,$ips);       ## split if there are more then one host
for $ipary(@ipary){

print ("\n");
print "connecting ......$ipary \n";
$CMD="ps -eo pid,comm,etime | grep init > xyz.dat";
$IDENT="/root/.ssh/id_rsa";
system("ssh $user\@$ipary -i $IDENT -o ConnectTimeout=$ARGV[1]  $CMD");    ## execute ssh command
$uptime=`cat xyz.dat | tail -1`;
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
amk2121Author Commented:
all went well and my script works good
0
amk2121Author Commented:
I got help from others and made changes to the script which ultimately worked
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Unix OS

From novice to tech pro — start learning today.