Listing 3 check_pservers.pl
#!/usr/bin/perl # # ## Name: check_pservers.pl - proxy monitoring program # ## Author: Tom Northcutt ## Synopsis: Checks status of various proxy servers ## Description: # This script is designed to check the status of # various proxy servers and restart them if they # have stopped. # user defined section ##### ## HTTP PROXY SERVER CONFIGURATION: # process name in a ps -C listing $http_name = "squid"; #stop command my $http_stop = "/etc/init.d/squid stop"; #start command my $http_start = "/etc/init.d/squid start"; ## OTHER PROXY SERVERS (ftp proxy, etc.) # can be set up here # $other_name = ""; # my $other_stop = ""; # my $other_start = ""; # email address of person to receive homepage change warnings #my $admin_email = q"root@localhost"; my $admin_email = q([email protected]); # sendmail my $sendmail = "/usr/lib/sendmail -t"; # end user defined section ##### use Sys::Syslog qw(:DEFAULT setlogsock); setlogsock "UNIX"; my $used_attempts = 0; my %start = (); $start{"$http_name"} = $http_start; $start{"$other_name"} = $other_start; ## MAIN LOOP #### ##my @proxy = ($http_name, $other_name); my @proxy = ($http_name); foreach $proxy(@proxy){ $used_attempts = 0; unless (&is_running("$proxy")){ #we have a down process &restart($proxy, 3); } } 1; ## SUBROUTINES ### ##(is_running PROCESS_NAME) # Given a process name, this routine checks to see if a process # is currently running. If the process is up, the pid is # returned, otherwise 0. sub is_running { my ($process_name) = @_; my @ps_info = `/bin/ps -C $process_name`; $null = shift(@ps_info); #first line is ps header info my $ps_elem = @ps_info; #num elements in @it #icky perl my $ps_line = $ps_info[--$ps_elem]; $ps_line =~ s/^ +//; #ps output varies, remove all leading whitespace #in case server forked, process last line my ($pid, @null) = split(/ /, $ps_line); return $pid if $pid; return 0; } ## (restart PROCESS_NAME, ATTEMPTS) # Attempts to restart the server specified by PROCESS_NAME. # This process will try to restart a problematic server ATTEMPTS # times unless a running server is detected. sub restart { my $proxy = shift; my $attempts = shift; if ($attempts == 0){ unless(&is_running("$proxy")){ #print error message to syslog openlog('check_pservers', 'cons,pid', 'user'); syslog("notice", "proxy $proxy down, could not be restarted"); closelog(); #send error to admin mail_admin("PSERVER_ERROR: proxy $proxy down, could not be restarted", "After $used_attempts attempts, the proxy server $proxy could\ not be successfully restarted with the command:\ $start{$proxy}"); return 0; } }elsif(&is_running("$proxy")){ my $rval = &is_running("$proxy"); print "proxy $proxy restarted with pid $rval\n"; openlog('check_pservers', 'cons,pid', 'user'); syslog("notice", "proxy $proxy down, restarted with pid $rval"); closelog(); #send error to admin mail_admin("PSERVER_NOTICE: proxy $proxy down,restarted with pid $rval ", "After $used_attempts attempts, the proxy server $proxy was successfully restarted with the command:\ $start{$proxy}"); return $rval; }else{ #still down w/ more attempts system("$start{$proxy}"); $used_attempts++; $attempts--; sleep(30); #give it time to either stabilize or die &restart($proxy, $attempts); #recursive test } } ## (mail_admin SUBJECT, MESSAGE) # Send a message to the system administrator leting them know of # special circumstances. sub mail_admin { my ($subject,$message) = @_; open(MAIL, "| $sendmail") or die "PROXY-ALERT: Can't fork for sendmail: $!\n"; print MAIL <<"ENDMAIL"; From: $admin_email To: $admin_email Subject: $subject $message ENDMAIL close(MAIL); # close the pipe } =head1 NAME check_pservers.pl - proxy monitoring program =head1 AUTHOR Tom Northcutt =head1 SYNOPSIS Checks status of various proxy servers =head1 DESCRIPTION This script is designed to check the status of various proxy servers and restart them if they have stopped. =head1 SUBROUTINES =item B<sub is_running(PROCESS_NAME)> Given a process name, this routine checks to see if a process is currently running. If the process is up, the pid is returned, otherwise 0. =item B<sub restart(PROCESS_NAME, ATTEMPTS)> Attempts to restart the server specified by PROCESS_NAME. This process will try to restart a problematic server ATTEMPTS times unless a running server is detected. =item B<sub mail_admin(SUBJECT, MESSAGE)> Send a message to the system administrator leting them know of special circumstances. =cut