version 1.32, 2002/03/08 03:56:19
|
version 1.34, 2002/03/20 03:44:11
|
Line 45
|
Line 45
|
# 12/20 Scott Harrison |
# 12/20 Scott Harrison |
# YEAR=2002 |
# YEAR=2002 |
# 2/19/02,02/22/02,02/25/02 Gerd Kortemeyer |
# 2/19/02,02/22/02,02/25/02 Gerd Kortemeyer |
# |
# 3/07/02 Ron Fox |
# based on nonforker from Perl Cookbook |
# based on nonforker from Perl Cookbook |
# - server who multiplexes without forking |
# - server who multiplexes without forking |
|
|
Line 279 unlink($port);
|
Line 279 unlink($port);
|
} |
} |
$cmd="enc:$cmdlength:$encrequest\n"; |
$cmd="enc:$cmdlength:$encrequest\n"; |
} |
} |
$SIG{ALRM}=sub { die "timeout" }; |
$answer = londtransaction($remotesock, $cmd, 60); |
$SIG{__DIE__}='DEFAULT'; |
|
eval { |
|
alarm(60); |
|
print $remotesock "$cmd\n"; |
|
$answer=<$remotesock>; |
|
chomp($answer); |
chomp($answer); |
alarm(0); |
|
}; |
|
$SIG{ALRM}='DEFAULT'; |
|
$SIG{__DIE__}=\&catchexception; |
|
|
|
if (($answer ne '') && ($@!~/timeout/)) { |
if (($answer ne '') && ($@!~/timeout/)) { |
unlink("$dfname"); |
unlink("$dfname"); |
Line 309 unless (
|
Line 300 unless (
|
my $st=120+int(rand(240)); |
my $st=120+int(rand(240)); |
&logthis( |
&logthis( |
"<font color=blue>WARNING: ". |
"<font color=blue>WARNING: ". |
"Can't make server socket ($st secs): $@ .. exiting</font>"); |
"Can't make server socket ($st secs): .. exiting</font>"); |
sleep($st); |
sleep($st); |
exit; |
exit; |
}; |
}; |
Line 339 while (1) {
|
Line 330 while (1) {
|
|
|
# anything to read or accept? |
# anything to read or accept? |
|
|
foreach $client ($select->can_read(100.0)) { |
foreach $client ($select->can_read(00.10)) { |
if ($client == $server) { |
if ($client == $server) { |
# accept a new connection |
# accept a new connection |
&status("Accept new connection: $conserver"); |
&status("Accept new connection: $conserver"); |
Line 441 sub handle {
|
Line 432 sub handle {
|
# $request is the text of the request |
# $request is the text of the request |
# put text of reply into $outbuffer{$client} |
# put text of reply into $outbuffer{$client} |
# ------------------------------------------------------------ Is this the end? |
# ------------------------------------------------------------ Is this the end? |
|
chomp($request); |
if($DEBUG) { |
if($DEBUG) { |
&logthis("<font color=green> Request $request processing starts</font>"); |
&logthis("<font color=green> Request $request processing starts</font>"); |
} |
} |
Line 464 sub handle {
|
Line 456 sub handle {
|
$encrequest.= |
$encrequest.= |
unpack("H16",$cipher->encrypt(substr($cmd,$encidx,8))); |
unpack("H16",$cipher->encrypt(substr($cmd,$encidx,8))); |
} |
} |
$request="enc:$cmdlength:$encrequest\n"; |
$request="enc:$cmdlength:$encrequest"; |
} |
} |
# --------------------------------------------------------------- Main exchange |
# --------------------------------------------------------------- Main exchange |
$SIG{ALRM}=sub { die "timeout" }; |
$answer = londtransaction($remotesock, $request, 300); |
$SIG{__DIE__}='DEFAULT'; |
|
eval { |
if($DEBUG) { |
alarm(300); |
&logthis("<font color=green> Request data exchange complete"); |
&status("Sending: $request"); |
} |
print $remotesock "$request"; |
if ($@=~/timeout/) { |
&status("Waiting for reply from $conserver: $request"); |
$answer=''; |
$answer=<$remotesock>; |
&logthis( |
&status("Received reply: $request"); |
"<font color=red>CRITICAL: Timeout: $request</font>"); |
alarm(0); |
} |
}; |
|
if($DEBUG) { |
|
&logthis("<font color=green> Request data exchange complete"); |
|
} |
|
if ($@=~/timeout/) { |
|
$answer=''; |
|
&logthis( |
|
"<font color=red>CRITICAL: Timeout: $request</font>"); |
|
} |
|
$SIG{ALRM}='DEFAULT'; |
|
$SIG{__DIE__}=\&catchexception; |
|
|
|
|
|
if ($answer) { |
if ($answer) { |
Line 503 sub handle {
|
Line 484 sub handle {
|
$answer=substr($answer,0,$cmdlength); |
$answer=substr($answer,0,$cmdlength); |
$answer.="\n"; |
$answer.="\n"; |
} |
} |
|
if($DEBUG) { |
|
&logthis("sending $answer to client\n"); |
|
} |
$outbuffer{$client} .= $answer; |
$outbuffer{$client} .= $answer; |
} else { |
} else { |
$outbuffer{$client} .= "con_lost\n"; |
$outbuffer{$client} .= "con_lost\n"; |
Line 552 unless (
|
Line 536 unless (
|
) { |
) { |
|
|
&logthis( |
&logthis( |
"<font color=blue>WARNING: Couldn't connect to $conserver ($st secs): $@</font>"); |
"<font color=blue>WARNING: Couldn't connect to $conserver ($st secs): </font>"); |
sleep($st); |
sleep($st); |
exit; |
exit; |
}; |
}; |
Line 561 unless (
|
Line 545 unless (
|
&logthis("<font color=green>INFO Connected to $conserver, initing </font>"); |
&logthis("<font color=green>INFO Connected to $conserver, initing </font>"); |
&status("Init dialogue: $conserver"); |
&status("Init dialogue: $conserver"); |
|
|
$SIG{ALRM}=sub { die "timeout" }; |
$answer = londtransaction($remotesock, "init", 60); |
$SIG{__DIE__}='DEFAULT'; |
chomp($answer); |
eval { |
$answer = londtransaction($remotesock, $answer, 60); |
alarm(60); |
chomp($answer); |
print $remotesock "init\n"; |
|
$answer=<$remotesock>; |
|
print $remotesock "$answer"; |
|
$answer=<$remotesock>; |
|
chomp($answer); |
|
alarm(0); |
|
}; |
|
$SIG{ALRM}='DEFAULT'; |
|
$SIG{__DIE__}=\&catchexception; |
|
|
|
if ($@=~/timeout/) { |
if ($@=~/timeout/) { |
&logthis("Timed out during init.. exiting"); |
&logthis("Timed out during init.. exiting"); |
Line 632 sub catchexception {
|
Line 607 sub catchexception {
|
chomp($signal); |
chomp($signal); |
&logthis("<font color=red>CRITICAL: " |
&logthis("<font color=red>CRITICAL: " |
."ABNORMAL EXIT. Child $$ for server [$wasserver] died through " |
."ABNORMAL EXIT. Child $$ for server [$wasserver] died through " |
."\"$signal\" with parameter [$@]</font>"); |
."\"$signal\" with parameter </font>"); |
die($@); |
die("Signal abend"); |
} |
} |
|
|
# -------------------------------------- Routines to see if other box available |
# -------------------------------------- Routines to see if other box available |
Line 736 sub subreply {
|
Line 711 sub subreply {
|
or return "con_lost"; |
or return "con_lost"; |
|
|
|
|
$SIG{ALRM}=sub { die "timeout" }; |
$answer = londtransaction($sclient, $cmd, 10); |
$SIG{__DIE__}='DEFAULT'; |
|
eval { |
|
alarm(10); |
|
print $sclient "$cmd\n"; |
|
$answer=<$sclient>; |
|
chomp($answer); |
|
alarm(0); |
|
}; |
|
if ((!$answer) || ($@=~/timeout/)) { $answer="con_lost"; } |
if ((!$answer) || ($@=~/timeout/)) { $answer="con_lost"; } |
$SIG{ALRM}='DEFAULT'; |
$SIG{ALRM}='DEFAULT'; |
$SIG{__DIE__}=\&catchexception; |
$SIG{__DIE__}=\&catchexception; |
Line 764 sub logthis {
|
Line 732 sub logthis {
|
print $fh "$local ($$) [$conserver] [$status]: $message\n"; |
print $fh "$local ($$) [$conserver] [$status]: $message\n"; |
} |
} |
|
|
|
#-------------------------------------- londtransaction: |
|
# |
|
# Performs a transaction with lond with timeout support. |
|
# result = londtransaction(socket,request,timeout) |
|
# |
|
sub londtransaction { |
|
my ($socket, $request, $tmo) = @_; |
|
|
|
if($DEBUG) { |
|
&logthis("londtransaction request: $request"); |
|
} |
|
|
|
# Set the signal handlers: ALRM for timeout and disble the others. |
|
|
|
$SIG{ALRM} = sub { die "timeout" }; |
|
$SIG{__DIE__} = 'DEFAULT'; |
|
|
|
# Disable all but alarm so that only that can interupt the |
|
# send /receive. |
|
# |
|
my $sigset = POSIX::SigSet->new(QUIT, USR1, HUP, INT, TERM); |
|
my $priorsigs = POSIX::SigSet->new; |
|
unless (defined sigprocmask(SIG_BLOCK, $sigset, $priorsigs)) { |
|
&logthis("<font color=red> CRITICAL -- londtransaction ". |
|
"failed to block signals </font>"); |
|
die "could not block signals in londtransaction"; |
|
} |
|
$answer = ''; |
|
# |
|
# Send request to lond. |
|
# |
|
eval { |
|
alarm($tmo); |
|
print $socket "$request\n"; |
|
alarm(0); |
|
}; |
|
# If request didn't timeout, try for the response. |
|
# |
|
|
|
if ($@!~/timeout/) { |
|
eval { |
|
alarm($tmo); |
|
$answer = <$socket>; |
|
if($DEBUG) { |
|
&logthis("Received $answer in londtransaction"); |
|
} |
|
alarm(0); |
|
}; |
|
} else { |
|
if($DEBUG) { |
|
&logthis("Timeout on send in londtransaction"); |
|
} |
|
} |
|
if( ($@ =~ /timeout/) && ($DEBUG)) { |
|
&logthis("Timeout on receive in londtransaction"); |
|
} |
|
# |
|
# Restore the initial sigmask set. |
|
# |
|
unless (defined sigprocmask(SIG_UNBLOCK, $priorsigs)) { |
|
&logthis("<font color=red> CRITICAL -- londtransaction ". |
|
"failed to re-enable signal processing. </font>"); |
|
die "londtransaction failed to re-enable signals"; |
|
} |
|
# |
|
# go back to the prior handler set. |
|
# |
|
$SIG{ALRM} = 'DEFAULT'; |
|
$SIG{__DIE__} = \&cathcexception; |
|
|
|
# chomp $answer; |
|
if ($DEBUG) { |
|
&logthis("Returning $answer in londtransaction"); |
|
} |
|
return $answer; |
|
|
|
} |
|
|
sub logperm { |
sub logperm { |
my $message=shift; |
my $message=shift; |
Line 824 B<lonc> forks off children processes tha
|
Line 869 B<lonc> forks off children processes tha
|
in the network. Management of these processes can be done at the |
in the network. Management of these processes can be done at the |
parent process level or the child process level. |
parent process level or the child process level. |
|
|
|
After forking off the children, B<lonc> the B<parent> |
|
executes a main loop which simply waits for processes to exit. |
|
As a process exits, a new process managing a link to the same |
|
peer as the exiting process is created. |
|
|
B<logs/lonc.log> is the location of log messages. |
B<logs/lonc.log> is the location of log messages. |
|
|
The process management is now explained in terms of linux shell commands, |
The process management is now explained in terms of linux shell commands, |
Line 899 Subroutine B<USRMAN>:
|
Line 949 Subroutine B<USRMAN>:
|
SIGUSR1 is sent to all the children, and the status of |
SIGUSR1 is sent to all the children, and the status of |
each connection is logged. |
each connection is logged. |
|
|
=item * |
|
|
|
SIGCHLD |
|
|
|
|
|
Child signal assignment: |
|
none |
|
|
|
Command-line invocations: |
|
B<kill> B<-s> SIGCHLD I<PID> |
|
|
|
Subroutine B<REAPER>: |
|
This is only invoked for the B<lonc> parent I<PID>. |
|
Information pertaining to the child is removed. |
|
The socket port is cleaned up. |
|
|
|
=back |
=back |
|
|