version 1.367, 2007/03/28 22:46:44
|
version 1.369, 2007/04/04 00:02:50
|
Line 85 my $tmpsnum = 0; # Id of tmpputs.
|
Line 85 my $tmpsnum = 0; # Id of tmpputs.
|
|
|
my $ConnectionType; |
my $ConnectionType; |
|
|
my %hostid; # ID's for hosts in cluster by ip. |
|
my %hostdom; # LonCAPA domain for hosts in cluster. |
|
my %hostname; # DNSname -> ID's mapping. |
|
my %hostip; # IPs for hosts in cluster. |
|
my %hostdns; # ID's of hosts looked up by DNS name. |
|
|
|
my %managers; # Ip -> manager names |
my %managers; # Ip -> manager names |
|
|
my %perlvar; # Will have the apache conf defined perl vars. |
my %perlvar; # Will have the apache conf defined perl vars. |
Line 424 sub ReadManagerTable {
|
Line 418 sub ReadManagerTable {
|
if ($host =~ "^#") { # Comment line. |
if ($host =~ "^#") { # Comment line. |
next; |
next; |
} |
} |
if (!defined $hostip{$host}) { # This is a non cluster member |
if (!defined &Apache::lonnet::get_host_ip($host)) { # This is a non cluster member |
# The entry is of the form: |
# The entry is of the form: |
# cluname:hostname |
# cluname:hostname |
# cluname - A 'cluster hostname' is needed in order to negotiate |
# cluname - A 'cluster hostname' is needed in order to negotiate |
Line 442 sub ReadManagerTable {
|
Line 436 sub ReadManagerTable {
|
} |
} |
} else { |
} else { |
logthis('<font color="green"> existing host'." $host</font>\n"); |
logthis('<font color="green"> existing host'." $host</font>\n"); |
$managers{$hostip{$host}} = $host; # Use info from cluster tab if clumemeber |
$managers{&Apache::lonnet::get_host_ip($host)} = $host; # Use info from cluster tab if clumemeber |
} |
} |
} |
} |
} |
} |
Line 5020 sub HUPSMAN { # sig
|
Line 5014 sub HUPSMAN { # sig
|
} |
} |
|
|
# |
# |
# Kill off hashes that describe the host table prior to re-reading it. |
|
# Hashes affected are: |
|
# %hostid, %hostdom %hostip %hostdns. |
|
# |
|
sub KillHostHashes { |
|
foreach my $key (keys %hostid) { |
|
delete $hostid{$key}; |
|
} |
|
foreach my $key (keys %hostdom) { |
|
delete $hostdom{$key}; |
|
} |
|
foreach my $key (keys %hostip) { |
|
delete $hostip{$key}; |
|
} |
|
foreach my $key (keys %hostdns) { |
|
delete $hostdns{$key}; |
|
} |
|
} |
|
# |
|
# Read in the host table from file and distribute it into the various hashes: |
|
# |
|
# - %hostid - Indexed by IP, the loncapa hostname. |
|
# - %hostdom - Indexed by loncapa hostname, the domain. |
|
# - %hostip - Indexed by hostid, the Ip address of the host. |
|
sub ReadHostTable { |
|
|
|
open (CONFIG,"$perlvar{'lonTabDir'}/hosts.tab") || die "Can't read host file"; |
|
my $myloncapaname = $perlvar{'lonHostID'}; |
|
Debug("My loncapa name is : $myloncapaname"); |
|
my %name_to_ip; |
|
while (my $configline=<CONFIG>) { |
|
if ($configline !~ /^\s*\#/ && $configline !~ /^\s*$/ ) { |
|
my ($id,$domain,$role,$name)=split(/:/,$configline); |
|
$name=~s/\s//g; |
|
my $ip; |
|
if (!exists($name_to_ip{$name})) { |
|
$ip = gethostbyname($name); |
|
if (!$ip || length($ip) ne 4) { |
|
&logthis("Skipping host $id name $name no IP found\n"); |
|
next; |
|
} |
|
$ip=inet_ntoa($ip); |
|
$name_to_ip{$name} = $ip; |
|
} else { |
|
$ip = $name_to_ip{$name}; |
|
} |
|
$hostid{$ip}=$id; # LonCAPA name of host by IP. |
|
$hostdom{$id}=$domain; # LonCAPA domain name of host. |
|
$hostname{$id}=$name; # LonCAPA name -> DNS name |
|
$hostip{$id}=$ip; # IP address of host. |
|
$hostdns{$name} = $id; # LonCAPA name of host by DNS. |
|
|
|
if ($id eq $perlvar{'lonHostID'}) { |
|
Debug("Found me in the host table: $name"); |
|
$thisserver=$name; |
|
} |
|
} |
|
} |
|
close(CONFIG); |
|
} |
|
# |
|
# Reload the Apache daemon's state. |
# Reload the Apache daemon's state. |
# This is done by invoking /home/httpd/perl/apachereload |
# This is done by invoking /home/httpd/perl/apachereload |
# a setuid perl script that can be root for us to do this job. |
# a setuid perl script that can be root for us to do this job. |
Line 5111 sub UpdateHosts {
|
Line 5044 sub UpdateHosts {
|
# either dropped or changed hosts. Note that the re-read of the table |
# either dropped or changed hosts. Note that the re-read of the table |
# will take care of new and changed hosts as connections come into being. |
# will take care of new and changed hosts as connections come into being. |
|
|
|
#FIXME need a way to tell lonnet that it needs to reset host |
|
#cached host info |
|
|
KillHostHashes; |
foreach my $child (keys(%children)) { |
ReadHostTable; |
|
|
|
foreach my $child (keys %children) { |
|
my $childip = $children{$child}; |
my $childip = $children{$child}; |
if(!$hostid{$childip}) { |
if (defined(&Apache::lonnet::get_hosts_from_ip($childip))) { |
logthis('<font color="blue"> UpdateHosts killing child ' |
logthis('<font color="blue"> UpdateHosts killing child ' |
." $child for ip $childip </font>"); |
." $child for ip $childip </font>"); |
kill('INT', $child); |
kill('INT', $child); |
Line 5345 $SIG{USR1} = \&checkchildren;
|
Line 5277 $SIG{USR1} = \&checkchildren;
|
$SIG{USR2} = \&UpdateHosts; |
$SIG{USR2} = \&UpdateHosts; |
|
|
# Read the host hashes: |
# Read the host hashes: |
|
&Apache::lonnet::load_hosts_tab(); |
ReadHostTable; |
|
|
|
my $dist=`$perlvar{'lonDaemons'}/distprobe`; |
my $dist=`$perlvar{'lonDaemons'}/distprobe`; |
|
|
Line 5440 sub make_new_child {
|
Line 5371 sub make_new_child {
|
|
|
my $outsideip=$clientip; |
my $outsideip=$clientip; |
if ($clientip eq '127.0.0.1') { |
if ($clientip eq '127.0.0.1') { |
$outsideip=$hostip{$perlvar{'lonHostID'}}; |
$outsideip=&Apache::lonnet::get_host_ip($perlvar{'lonHostID'}); |
} |
} |
|
|
my $clientrec=($hostid{$outsideip} ne undef); |
my $clientrec=defined(&Apache::lonnet::get_hosts_from_ip($outsideip)); |
my $ismanager=($managers{$outsideip} ne undef); |
my $ismanager=($managers{$outsideip} ne undef); |
$clientname = "[unknonwn]"; |
$clientname = "[unknonwn]"; |
if($clientrec) { # Establish client type. |
if($clientrec) { # Establish client type. |
$ConnectionType = "client"; |
$ConnectionType = "client"; |
$clientname = $hostid{$outsideip}; |
$clientname = (&Apache::lonnet::get_hosts_from_ip($outsideip))[-1]; |
if($ismanager) { |
if($ismanager) { |
$ConnectionType = "both"; |
$ConnectionType = "both"; |
} |
} |
Line 5555 sub make_new_child {
|
Line 5486 sub make_new_child {
|
|
|
if ($clientok) { |
if ($clientok) { |
# ---------------- New known client connecting, could mean machine online again |
# ---------------- New known client connecting, could mean machine online again |
|
if (&Apache::lonnet::get_host_ip($currenthostid) ne $clientip |
if ($hostip{$currenthostid} ne $clientip |
|
&& $clientip ne '127.0.0.1') { |
&& $clientip ne '127.0.0.1') { |
&Apache::lonnet::reconlonc(); |
&Apache::lonnet::reconlonc(); |
} |
} |
Line 6241 sub sethost {
|
Line 6171 sub sethost {
|
} |
} |
|
|
if (!defined($hostid)) { $hostid=$perlvar{'lonHostID'}; } |
if (!defined($hostid)) { $hostid=$perlvar{'lonHostID'}; } |
if ($hostip{$perlvar{'lonHostID'}} eq $hostip{$hostid}) { |
if (&Apache::lonnet::get_host_ip($perlvar{'lonHostID'}) |
|
eq &Apache::lonnet::get_host_ip($hostid)) { |
$currenthostid =$hostid; |
$currenthostid =$hostid; |
$currentdomainid=$hostdom{$hostid}; |
$currentdomainid=&Apache::lonnet::host_domain($hostid); |
&logthis("Setting hostid to $hostid, and domain to $currentdomainid"); |
&logthis("Setting hostid to $hostid, and domain to $currentdomainid"); |
} else { |
} else { |
&logthis("Requested host id $hostid not an alias of ". |
&logthis("Requested host id $hostid not an alias of ". |