version 1.24, 2002/02/06 14:13:19
|
version 1.27, 2002/02/19 21:49:12
|
Line 43
|
Line 43
|
# 01/10/01 Scott Harrison |
# 01/10/01 Scott Harrison |
# 03/14/01,03/15,06/12,11/26,11/27,11/28 Gerd Kortemeyer |
# 03/14/01,03/15,06/12,11/26,11/27,11/28 Gerd Kortemeyer |
# 12/20 Scott Harrison |
# 12/20 Scott Harrison |
|
# YEAR=2002 |
|
# 2/19/02 |
# |
# |
# based on nonforker from Perl Cookbook |
# based on nonforker from Perl Cookbook |
# - server who multiplexes without forking |
# - server who multiplexes without forking |
Line 55 use Socket;
|
Line 57 use Socket;
|
use Fcntl; |
use Fcntl; |
use Tie::RefHash; |
use Tie::RefHash; |
use Crypt::IDEA; |
use Crypt::IDEA; |
|
use Net::Ping; |
|
use LWP::UserAgent(); |
|
|
my $status=''; |
my $status=''; |
my $lastlog=''; |
my $lastlog=''; |
Line 72 sub catchexception {
|
Line 76 sub catchexception {
|
|
|
$childmaxattempts=5; |
$childmaxattempts=5; |
|
|
|
# -------------------------------------- Routines to see if other box available |
|
|
|
sub online { |
|
my $host=shift; |
|
my $p=Net::Ping->new("tcp",20); |
|
my $online=$p->ping("$host"); |
|
$p->close(); |
|
undef ($p); |
|
return $online; |
|
} |
|
|
|
sub connected { |
|
my ($local,$remote)=@_; |
|
$local=~s/\W//g; |
|
$remote=~s/\W//g; |
|
|
|
unless ($hostname{$local}) { return 'local_unknown'; } |
|
unless ($hostname{$remote}) { return 'remote_unknown'; } |
|
|
|
unless (&online($hostname{$local})) { return 'local_offline'; } |
|
|
|
my $ua=new LWP::UserAgent; |
|
|
|
my $request=new HTTP::Request('GET', |
|
"http://".$hostname{$local}.'/cgi-bin/ping.pl?'.$remote); |
|
|
|
my $response=$ua->request($request); |
|
|
|
unless ($response->is_success) { return 'local_error'; } |
|
|
|
my $reply=$response->content; |
|
$reply=(split("\n",$reply))[0]; |
|
$reply=~s/\W//g; |
|
if ($reply ne $remote) { return $reply; } |
|
return 'ok'; |
|
} |
|
|
|
|
# -------------------------------- Set signal handlers to record abnormal exits |
# -------------------------------- Set signal handlers to record abnormal exits |
|
|
$SIG{'QUIT'}=\&catchexception; |
$SIG{QUIT}=\&catchexception; |
$SIG{__DIE__}=\&catchexception; |
$SIG{__DIE__}=\&catchexception; |
|
|
# ------------------------------------ Read httpd access.conf and get variables |
# ------------------------------------ Read httpd access.conf and get variables |
Line 119 while ($configline=<CONFIG>) {
|
Line 161 while ($configline=<CONFIG>) {
|
my ($id,$domain,$role,$name,$ip)=split(/:/,$configline); |
my ($id,$domain,$role,$name,$ip)=split(/:/,$configline); |
chomp($ip); |
chomp($ip); |
$hostip{$id}=$ip; |
$hostip{$id}=$ip; |
|
$hostname{$id}=$name; |
} |
} |
|
|
close(CONFIG); |
close(CONFIG); |
|
|
# -------------------------------------------------------- Routines for forking |
# -------------------------------------------------------- Routines for forking |
Line 143 sub REAPER { # ta
|
Line 187 sub REAPER { # ta
|
unlink($port); |
unlink($port); |
} |
} |
|
|
sub HUNTSMAN { # signal handler for SIGINT |
sub hangup { |
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
|
foreach (keys %children) { |
foreach (keys %children) { |
$wasserver=$children{$_}; |
$wasserver=$children{$_}; |
&status("Closing $wasserver"); |
&status("Closing $wasserver"); |
Line 152 sub HUNTSMAN { # si
|
Line 195 sub HUNTSMAN { # si
|
&status("Kill PID $_ for $wasserver"); |
&status("Kill PID $_ for $wasserver"); |
kill ('INT',$_); |
kill ('INT',$_); |
} |
} |
|
} |
|
|
|
sub HUNTSMAN { # signal handler for SIGINT |
|
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
|
&hangup(); |
my $execdir=$perlvar{'lonDaemons'}; |
my $execdir=$perlvar{'lonDaemons'}; |
unlink("$execdir/logs/lonc.pid"); |
unlink("$execdir/logs/lonc.pid"); |
&logthis("<font color=red>CRITICAL: Shutting down</font>"); |
&logthis("<font color=red>CRITICAL: Shutting down</font>"); |
Line 160 sub HUNTSMAN { # si
|
Line 208 sub HUNTSMAN { # si
|
|
|
sub HUPSMAN { # signal handler for SIGHUP |
sub HUPSMAN { # signal handler for SIGHUP |
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
foreach (keys %children) { |
&hangup(); |
$wasserver=$children{$_}; |
|
&status("Closing $wasserver"); |
|
&logthis('Closing '.$wasserver.': '.&subreply('exit',$wasserver)); |
|
&status("Kill PID $_ for $wasserver"); |
|
kill ('INT',$_); |
|
} |
|
&logthis("<font color=red>CRITICAL: Restarting</font>"); |
&logthis("<font color=red>CRITICAL: Restarting</font>"); |
unlink("$execdir/logs/lonc.pid"); |
unlink("$execdir/logs/lonc.pid"); |
my $execdir=$perlvar{'lonDaemons'}; |
my $execdir=$perlvar{'lonDaemons'}; |
Line 188 sub checkchildren {
|
Line 230 sub checkchildren {
|
|
|
sub USRMAN { |
sub USRMAN { |
&logthis("USR1: Trying to establish connections again"); |
&logthis("USR1: Trying to establish connections again"); |
foreach $thisserver (keys %hostip) { |
|
$answer=subreply("ping",$thisserver); |
|
&logthis("USR1: Ping $thisserver " |
|
."(pid >$childpid{$thisserver}<, $childatt{thisserver} attempts): " |
|
." >$answer<"); |
|
} |
|
%childatt=(); |
%childatt=(); |
&checkchildren(); |
&checkchildren(); |
} |
} |
Line 298 $SIG{HUP}=$SIG{USR1}='IGNORE';
|
Line 334 $SIG{HUP}=$SIG{USR1}='IGNORE';
|
&status("Forking ..."); |
&status("Forking ..."); |
|
|
foreach $thisserver (keys %hostip) { |
foreach $thisserver (keys %hostip) { |
make_new_child($thisserver); |
if (&online($hostname{$thisserver})) { |
|
make_new_child($thisserver); |
|
} |
} |
} |
|
|
&logthis("Done starting initial servers"); |
&logthis("Done starting initial servers"); |
Line 317 while (1) {
|
Line 355 while (1) {
|
&status("Woke up"); |
&status("Woke up"); |
foreach $thisserver (keys %hostip) { |
foreach $thisserver (keys %hostip) { |
if (!$childpid{$thisserver}) { |
if (!$childpid{$thisserver}) { |
if ($childatt{$thisserver}<$childmaxattempts) { |
if (($childatt{$thisserver}<$childmaxattempts) && |
|
(&online($hostname{$thisserver}))) { |
$childatt{$thisserver}++; |
$childatt{$thisserver}++; |
&logthis( |
&logthis( |
"<font color=yellow>INFO: Trying to reconnect for $thisserver " |
"<font color=yellow>INFO: Trying to reconnect for $thisserver " |
."($childatt{$thisserver} of $childmaxattempts attempts)</font>"); |
."($childatt{$thisserver} of $childmaxattempts attempts)</font>"); |
make_new_child($thisserver); |
make_new_child($thisserver); |
} |
} else { |
|
&logthis( |
|
"<font color=yellow>INFO: Skipping $thisserver " |
|
."($childatt{$thisserver} of $childmaxattempts attempts)</font>"); |
|
} |
|
|
} |
} |
} |
} |
} |
} |
Line 570 while (1) {
|
Line 614 while (1) {
|
|
|
# Any complete requests to process? |
# Any complete requests to process? |
foreach $client (keys %ready) { |
foreach $client (keys %ready) { |
handle($client,$conserver); |
handle($client); |
} |
} |
|
|
# Buffers to flush? |
# Buffers to flush? |
foreach $client ($select->can_write(1)) { |
foreach $client ($select->can_write(1)) { |
# Skip this client if we have nothing to say |
# Skip this client if we have nothing to say |
next unless exists $outbuffer{$client}; |
next unless exists $outbuffer{$client}; |
|
|
$rv = $client->send($outbuffer{$client}, 0); |
$rv = $client->send($outbuffer{$client}, 0); |
unless (defined $rv) { |
unless (defined $rv) { |
# Whine, but move on. |
# Whine, but move on. |
Line 606 while (1) {
|
Line 651 while (1) {
|
} |
} |
} |
} |
} |
} |
} |
|
# ------------------------------------------------------- End of make_new_child |
# ------------------------------------------------------- End of make_new_child |
|
|
# handle($socket) deals with all pending requests for $client |
# handle($socket) deals with all pending requests for $client |
Line 614 sub handle {
|
Line 659 sub handle {
|
# requests are in $ready{$client} |
# requests are in $ready{$client} |
# send output to $outbuffer{$client} |
# send output to $outbuffer{$client} |
my $client = shift; |
my $client = shift; |
my $conserver = shift; |
|
my $request; |
my $request; |
|
|
foreach $request (@{$ready{$client}}) { |
foreach $request (@{$ready{$client}}) { |
Line 641 sub handle {
|
Line 685 sub handle {
|
eval { |
eval { |
alarm(300); |
alarm(300); |
&status("Sending $conserver: $request"); |
&status("Sending $conserver: $request"); |
&logthis("Sending $conserver: $request"); |
|
print $remotesock "$request"; |
print $remotesock "$request"; |
&status("Waiting for reply from $conserver: $request"); |
&status("Waiting for reply from $conserver: $request"); |
&logthis("Waiting for reply from $conserver: $request"); |
|
$answer=<$remotesock>; |
$answer=<$remotesock>; |
&status("Received reply: $request"); |
&status("Received reply: $request"); |
&logthis("Received reply $conserver: $answer"); |
|
alarm(0); |
alarm(0); |
}; |
}; |
if ($@=~/timeout/) { |
if ($@=~/timeout/) { |
Line 678 sub handle {
|
Line 719 sub handle {
|
} |
} |
|
|
# ===================================================== Done processing request |
# ===================================================== Done processing request |
&logthis("Completed $conserver: $request"); |
|
} |
} |
delete $ready{$client}; |
delete $ready{$client}; |
&status("Completed $conserver: $request"); |
&status("Completed $conserver: $request"); |
# -------------------------------------------------------------- End non-forker |
# -------------------------------------------------------------- End non-forker |
} |
} |
# ---------------------------------------------------------- End make_new_child |
# ---------------------------------------------------------- End make_new_child |
|
} |
|
|
# nonblock($socket) puts socket into nonblocking mode |
# nonblock($socket) puts socket into nonblocking mode |
sub nonblock { |
sub nonblock { |