version 1.22, 2001/11/29 18:57:46
|
version 1.23.2.1, 2002/02/06 14:17:50
|
Line 39
|
Line 39
|
# 2/8,7/25 Gerd Kortemeyer |
# 2/8,7/25 Gerd Kortemeyer |
# 12/05 Scott Harrison |
# 12/05 Scott Harrison |
# 12/05 Gerd Kortemeyer |
# 12/05 Gerd Kortemeyer |
|
# YEAR=2001 |
# 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 |
# |
# |
# based on nonforker from Perl Cookbook |
# based on nonforker from Perl Cookbook |
# - server who multiplexes without forking |
# - server who multiplexes without forking |
Line 143 sub REAPER { # ta
|
Line 145 sub REAPER { # ta
|
|
|
sub HUNTSMAN { # signal handler for SIGINT |
sub HUNTSMAN { # signal handler for SIGINT |
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
local($SIG{CHLD}) = 'IGNORE'; # we're going to kill our children |
map { |
foreach (keys %children) { |
$wasserver=$children{$_}; |
$wasserver=$children{$_}; |
&status("Closing $wasserver"); |
&status("Closing $wasserver"); |
&logthis('Closing '.$wasserver.': '.&subreply('exit',$wasserver)); |
&logthis('Closing '.$wasserver.': '.&subreply('exit',$wasserver)); |
&status("Kill PID $_ for $wasserver"); |
&status("Kill PID $_ for $wasserver"); |
kill ('INT',$_); |
kill ('INT',$_); |
} keys %children; |
} |
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 158 sub HUNTSMAN { # si
|
Line 160 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 |
map { |
foreach (keys %children) { |
$wasserver=$children{$_}; |
$wasserver=$children{$_}; |
&status("Closing $wasserver"); |
&status("Closing $wasserver"); |
&logthis('Closing '.$wasserver.': '.&subreply('exit',$wasserver)); |
&logthis('Closing '.$wasserver.': '.&subreply('exit',$wasserver)); |
&status("Kill PID $_ for $wasserver"); |
&status("Kill PID $_ for $wasserver"); |
kill ('INT',$_); |
kill ('INT',$_); |
} keys %children; |
} |
&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 175 sub checkchildren {
|
Line 177 sub checkchildren {
|
&initnewstatus(); |
&initnewstatus(); |
&logstatus(); |
&logstatus(); |
&logthis('Going to check on the children'); |
&logthis('Going to check on the children'); |
map { |
foreach (sort keys %children) { |
sleep 1; |
sleep 1; |
unless (kill 'USR1' => $_) { |
unless (kill 'USR1' => $_) { |
&logthis ('Child '.$_.' is dead'); |
&logthis ('Child '.$_.' is dead'); |
&logstatus($$.' is dead'); |
&logstatus($$.' is dead'); |
} |
} |
} sort keys %children; |
} |
} |
} |
|
|
sub USRMAN { |
sub USRMAN { |
Line 447 if ($cipher=new IDEA $cipherkey) {
|
Line 449 if ($cipher=new IDEA $cipherkey) {
|
@allbuffered=grep /\.$conserver$/, readdir DIRHANDLE; |
@allbuffered=grep /\.$conserver$/, readdir DIRHANDLE; |
closedir(DIRHANDLE); |
closedir(DIRHANDLE); |
my $dfname; |
my $dfname; |
map { |
foreach (@allbuffered) { |
&status("Sending delayed $conserver $_"); |
&status("Sending delayed $conserver $_"); |
$dfname="$path/$_"; |
$dfname="$path/$_"; |
&logthis($dfname); |
&logthis($dfname); |
Line 488 if ($cipher=new IDEA $cipherkey) {
|
Line 490 if ($cipher=new IDEA $cipherkey) {
|
&logthis("Delayed $cmd to $conserver: >$answer<"); |
&logthis("Delayed $cmd to $conserver: >$answer<"); |
&logperm("S:$conserver:$bcmd"); |
&logperm("S:$conserver:$bcmd"); |
} |
} |
} @allbuffered; |
} |
|
|
# ------------------------------------------------------- Listen to UNIX socket |
# ------------------------------------------------------- Listen to UNIX socket |
&status("Opening socket $conserver"); |
&status("Opening socket $conserver"); |
Line 568 while (1) {
|
Line 570 while (1) {
|
|
|
# Any complete requests to process? |
# Any complete requests to process? |
foreach $client (keys %ready) { |
foreach $client (keys %ready) { |
handle($client); |
handle($client,$conserver); |
} |
} |
|
|
# 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 605 while (1) {
|
Line 606 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 613 sub handle {
|
Line 614 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 639 sub handle {
|
Line 641 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 673 sub handle {
|
Line 678 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 { |
Line 693 sub nonblock {
|
Line 698 sub nonblock {
|
or die "Can't make socket nonblocking: $!\n"; |
or die "Can't make socket nonblocking: $!\n"; |
} |
} |
|
|
|
# ----------------------------------- POD (plain old documentation, CPAN style) |
|
|
|
=head1 NAME |
|
|
|
lonc - LON TCP-MySQL-Server Daemon for handling database requests. |
|
|
|
=head1 SYNOPSIS |
|
|
|
Should only be run as user=www. This is a command-line script which |
|
is invoked by loncron. |
|
|
|
=head1 DESCRIPTION |
|
|
|
Provides persistent TCP connections to the other servers in the network |
|
through multiplexed domain sockets |
|
|
|
PID in subdir logs/lonc.pid |
|
kill kills |
|
HUP restarts |
|
USR1 tries to open connections again |
|
|
|
=head1 README |
|
|
|
Not yet written. |
|
|
|
=head1 PREREQUISITES |
|
|
|
POSIX |
|
IO::Socket |
|
IO::Select |
|
IO::File |
|
Socket |
|
Fcntl |
|
Tie::RefHash |
|
Crypt::IDEA |
|
|
|
=head1 COREQUISITES |
|
|
|
=head1 OSNAMES |
|
|
|
linux |
|
|
|
=head1 SCRIPT CATEGORIES |
|
|
|
Server/Process |
|
|
|
=cut |