version 1.8, 2000/12/05 03:23:59
|
version 1.16, 2001/06/12 15:32:38
|
Line 12
|
Line 12
|
|
|
# 6/4/99,6/5,6/7,6/8,6/9,6/10,6/11,6/12,7/14,7/19, |
# 6/4/99,6/5,6/7,6/8,6/9,6/10,6/11,6/12,7/14,7/19, |
# 10/8,10/9,10/15,11/18,12/22, |
# 10/8,10/9,10/15,11/18,12/22, |
# 2/8,7/25 Gerd Kortemeyer |
# 2/8,7/25 Gerd Kortemeyer |
|
# 12/05 Scott Harrison |
|
# 12/05 Gerd Kortemeyer |
|
# 01/10/01 Scott Harrison |
|
# 03/14/01,03/15,06/12 Gerd Kortemeyer |
|
# |
# based on nonforker from Perl Cookbook |
# based on nonforker from Perl Cookbook |
# - server who multiplexes without forking |
# - server who multiplexes without forking |
|
|
Line 25 use Fcntl;
|
Line 30 use Fcntl;
|
use Tie::RefHash; |
use Tie::RefHash; |
use Crypt::IDEA; |
use Crypt::IDEA; |
|
|
|
# grabs exception and records it to log before exiting |
|
sub catchexception { |
|
my ($signal)=@_; |
|
$SIG{'QUIT'}='DEFAULT'; |
|
$SIG{__DIE__}='DEFAULT'; |
|
&logthis("<font color=red>CRITICAL: " |
|
."ABNORMAL EXIT. Child $$ for server $wasserver died through " |
|
."\"$signal\" with this parameter->[$@]</font>"); |
|
die($@); |
|
} |
|
|
$childmaxattempts=10; |
$childmaxattempts=10; |
|
|
# -------------------------------- Set signal handlers to record abnormal exits |
# -------------------------------- Set signal handlers to record abnormal exits |
Line 34 $SIG{__DIE__}=\&catchexception;
|
Line 50 $SIG{__DIE__}=\&catchexception;
|
|
|
# ------------------------------------ Read httpd access.conf and get variables |
# ------------------------------------ Read httpd access.conf and get variables |
|
|
open (CONFIG,"/etc/httpd/conf/access.conf") |
open (CONFIG,"/etc/httpd/conf/access.conf") || die "Can't read access.conf"; |
|| catchdie "Can't read access.conf"; |
|
|
|
while ($configline=<CONFIG>) { |
while ($configline=<CONFIG>) { |
if ($configline =~ /PerlSetVar/) { |
if ($configline =~ /PerlSetVar/) { |
Line 46 while ($configline=<CONFIG>) {
|
Line 61 while ($configline=<CONFIG>) {
|
} |
} |
close(CONFIG); |
close(CONFIG); |
|
|
|
# ----------------------------- Make sure this process is running from user=www |
|
my $wwwid=getpwnam('www'); |
|
if ($wwwid!=$<) { |
|
$emailto="$perlvar{'lonAdmEMail'},$perlvar{'lonSysEMail'}"; |
|
$subj="LON: $perlvar{'lonHostID'} User ID mismatch"; |
|
system("echo 'User ID mismatch. lonc must be run as user www.' |\ |
|
mailto $emailto -s '$subj' > /dev/null"); |
|
exit 1; |
|
} |
|
|
# --------------------------------------------- Check if other instance running |
# --------------------------------------------- Check if other instance running |
|
|
my $pidfile="$perlvar{'lonDaemons'}/logs/lonc.pid"; |
my $pidfile="$perlvar{'lonDaemons'}/logs/lonc.pid"; |
Line 54 if (-e $pidfile) {
|
Line 79 if (-e $pidfile) {
|
my $lfh=IO::File->new("$pidfile"); |
my $lfh=IO::File->new("$pidfile"); |
my $pide=<$lfh>; |
my $pide=<$lfh>; |
chomp($pide); |
chomp($pide); |
if (kill 0 => $pide) { catchdie "already running"; } |
if (kill 0 => $pide) { die "already running"; } |
} |
} |
|
|
# ------------------------------------------------------------- Read hosts file |
# ------------------------------------------------------------- Read hosts file |
|
|
open (CONFIG,"$perlvar{'lonTabDir'}/hosts.tab") |
open (CONFIG,"$perlvar{'lonTabDir'}/hosts.tab") || die "Can't read host file"; |
|| catchdie "Can't read host file"; |
|
|
|
while ($configline=<CONFIG>) { |
while ($configline=<CONFIG>) { |
my ($id,$domain,$role,$name,$ip)=split(/:/,$configline); |
my ($id,$domain,$role,$name,$ip)=split(/:/,$configline); |
Line 103 sub HUPSMAN { # sig
|
Line 127 sub HUPSMAN { # sig
|
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
kill 'INT' => keys %children; |
kill 'INT' => keys %children; |
&logthis("<font color=red>CRITICAL: Restarting</font>"); |
&logthis("<font color=red>CRITICAL: Restarting</font>"); |
|
unlink("$execdir/logs/lonc.pid"); |
my $execdir=$perlvar{'lonDaemons'}; |
my $execdir=$perlvar{'lonDaemons'}; |
exec("$execdir/lonc"); # here we go again |
exec("$execdir/lonc"); # here we go again |
} |
} |
Line 161 sub logperm {
|
Line 186 sub logperm {
|
|
|
$fpid=fork; |
$fpid=fork; |
exit if $fpid; |
exit if $fpid; |
catchdie "Couldn't fork: $!" unless defined ($fpid); |
die "Couldn't fork: $!" unless defined ($fpid); |
|
|
POSIX::setsid() or catchdie "Can't start new session: $!"; |
POSIX::setsid() or die "Can't start new session: $!"; |
|
|
# ------------------------------------------------------- Write our PID on disk |
# ------------------------------------------------------- Write our PID on disk |
|
|
Line 218 sub make_new_child {
|
Line 243 sub make_new_child {
|
# block signal for fork |
# block signal for fork |
$sigset = POSIX::SigSet->new(SIGINT); |
$sigset = POSIX::SigSet->new(SIGINT); |
sigprocmask(SIG_BLOCK, $sigset) |
sigprocmask(SIG_BLOCK, $sigset) |
or catchdie "Can't block SIGINT for fork: $!\n"; |
or die "Can't block SIGINT for fork: $!\n"; |
|
|
catchdie "fork: $!" unless defined ($pid = fork); |
die "fork: $!" unless defined ($pid = fork); |
|
|
if ($pid) { |
if ($pid) { |
# Parent records the child's birth and returns. |
# Parent records the child's birth and returns. |
sigprocmask(SIG_UNBLOCK, $sigset) |
sigprocmask(SIG_UNBLOCK, $sigset) |
or catchdie "Can't unblock SIGINT for fork: $!\n"; |
or die "Can't unblock SIGINT for fork: $!\n"; |
$children{$pid} = $conserver; |
$children{$pid} = $conserver; |
$childpid{$conserver} = $pid; |
$childpid{$conserver} = $pid; |
return; |
return; |
Line 235 sub make_new_child {
|
Line 260 sub make_new_child {
|
|
|
# unblock signals |
# unblock signals |
sigprocmask(SIG_UNBLOCK, $sigset) |
sigprocmask(SIG_UNBLOCK, $sigset) |
or catchdie "Can't unblock SIGINT for fork: $!\n"; |
or die "Can't unblock SIGINT for fork: $!\n"; |
|
|
# ----------------------------- This is the modified main program of non-forker |
# ----------------------------- This is the modified main program of non-forker |
|
|
Line 279 $key=$key.$buildkey.$key.$buildkey.$key.
|
Line 304 $key=$key.$buildkey.$key.$buildkey.$key.
|
$key=substr($key,0,32); |
$key=substr($key,0,32); |
my $cipherkey=pack("H32",$key); |
my $cipherkey=pack("H32",$key); |
if ($cipher=new IDEA $cipherkey) { |
if ($cipher=new IDEA $cipherkey) { |
&logthis("Secure connection inititalized: $conserver"); |
&logthis("Secure connection initialized: $conserver"); |
} else { |
} else { |
my $st=120+int(rand(240)); |
my $st=120+int(rand(240)); |
&logthis( |
&logthis( |
Line 369 while (1) {
|
Line 394 while (1) {
|
# check for new information on the connections we have |
# check for new information on the connections we have |
|
|
# anything to read or accept? |
# anything to read or accept? |
foreach $client ($select->can_read(1)) { |
foreach $client ($select->can_read(0.1)) { |
|
|
if ($client == $server) { |
if ($client == $server) { |
# accept a new connection |
# accept a new connection |
Line 418 while (1) {
|
Line 443 while (1) {
|
$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. |
warn "I was told I could write, but I can't.\n"; |
&logthis("I was told I could write, but I can't.\n"); |
next; |
next; |
} |
} |
|
$errno=$!; |
if (($rv == length $outbuffer{$client}) || |
if (($rv == length $outbuffer{$client}) || |
($! == POSIX::EWOULDBLOCK)) { |
($errno == POSIX::EWOULDBLOCK) || ($errno == 0)) { |
substr($outbuffer{$client}, 0, $rv) = ''; |
substr($outbuffer{$client}, 0, $rv) = ''; |
delete $outbuffer{$client} unless length $outbuffer{$client}; |
delete $outbuffer{$client} unless length $outbuffer{$client}; |
} else { |
} else { |
# Couldn't write all the data, and it wasn't because |
# Couldn't write all the data, and it wasn't because |
# it would have blocked. Shutdown and move on. |
# it would have blocked. Shutdown and move on. |
|
|
|
&logthis("Dropping data with ".$errno.": ". |
|
length($outbuffer{$client}).", $rv"); |
|
|
delete $inbuffer{$client}; |
delete $inbuffer{$client}; |
delete $outbuffer{$client}; |
delete $outbuffer{$client}; |
delete $ready{$client}; |
delete $ready{$client}; |
Line 502 sub nonblock {
|
Line 532 sub nonblock {
|
|
|
|
|
$flags = fcntl($socket, F_GETFL, 0) |
$flags = fcntl($socket, F_GETFL, 0) |
or catchdie "Can't get flags for socket: $!\n"; |
or die "Can't get flags for socket: $!\n"; |
fcntl($socket, F_SETFL, $flags | O_NONBLOCK) |
fcntl($socket, F_SETFL, $flags | O_NONBLOCK) |
or catchdie "Can't make socket nonblocking: $!\n"; |
or die "Can't make socket nonblocking: $!\n"; |
} |
|
|
|
# grabs exception and records it to log before exiting |
|
sub catchexception { |
|
my ($signal)=@_; |
|
&logthis("<font color=red>CRITICAL: " |
|
."ABNORMAL EXIT. Child $$ for server $wasserver died through " |
|
."$signal with this parameter->[$@]</font>"); |
|
die($@); |
|
} |
|
|
|
# grabs exception and records it to log before exiting |
|
# NOTE: we must NOT use the regular (non-overrided) die function in |
|
# the code because a handler CANNOT be attached to it |
|
# (despite what some of the documentation says about SIG{__DIE__}. |
|
sub catchdie { |
|
my ($message)=@_; |
|
&logthis("<font color=red>CRITICAL: " |
|
."ABNORMAL EXIT. Child $$ for server $wasserver died through " |
|
."\_\_DIE\_\_ with this parameter->[$message]</font>"); |
|
die($message); |
|
} |
} |
|
|