--- loncom/Attic/lonManage 2003/10/28 11:28:35 1.17 +++ loncom/Attic/lonManage 2003/11/03 10:48:18 1.22 @@ -3,9 +3,9 @@ # # lonManage supports remote management of nodes in a LonCAPA cluster. # -# $Id: lonManage,v 1.17 2003/10/28 11:28:35 foxr Exp $ +# $Id: lonManage,v 1.22 2003/11/03 10:48:18 foxr Exp $ # -# $Id: lonManage,v 1.17 2003/10/28 11:28:35 foxr Exp $ +# $Id: lonManage,v 1.22 2003/11/03 10:48:18 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -71,25 +71,29 @@ use LondConnection; my %perlvar; # Perl variable defs from apache config. my %hostshash; # Host table as a host indexed hash. +my $MyHost=""; # Host name to use as me. +my $ForeignHostTab=""; # Name of foreign hosts table. +my $ServerPort; # Port used to connect to lond. + # # prints out utility's command usage info. # sub Usage { print "Usage:"; print < newfile [host] + lonManage [--myname=host --hosts=table] --push= newfile [host] Push to the lonTabs directory. Note that must be one of: host (hosts.tab) domain (domain.tab) - lonManage --reinit=lonc [host] + lonManage [--myname=host --hosts=table] --reinit=lonc [host] Causes lonc in the remote system to reread hosts.tab and adjust the set of clients that are being maintained to match the new file. - lonManage --reinit=lond [host] + lonManage [--myname=host --hosts=table] --reinit=lond [host] Causes lond in the remote system to reread the hosts.tab file and adjust the set of servers to match changes in that file. @@ -99,13 +103,35 @@ sub Usage { If [host] is omitted, all hosts in the hosts.tab file are iterated over. + For all of the above syntaxes if --myname=host and --hosts=table are + supplied (both must be present), the utility runs in standalone mode + presenting itself to the world as 'host' and using the hosts.tab file + specified in the --hosts switch. USAGE } + +sub MakeLondConnection { + my $host = shift; + + my $Connection = LondConnection->new($host, $ServerPort); + return return $Connection; +} + +sub NegotiateStartup { + my $connection = shift; + + return "ok"; +} +sub PerformTransaction { + my $connection = shift; + my $command = shift; + + return "ok"; +} # -# Lifted from lonnet.pm - and we need to figure out a way to get it back in. -# Performas a transaction with lond via the lonc proxy server. +# Performs a transaction direct to a remote lond. # Parameter: # cmd - The text of the request. # host - The host to which the request ultimately goes. @@ -114,17 +140,33 @@ USAGE # lond/lonc etc. # sub subreply { - my ($cmd,$server)=@_; - my $peerfile="$perlvar{'lonSockDir'}/$server"; - my $client=IO::Socket::UNIX->new(Peer =>"$peerfile", - Type => SOCK_STREAM, - Timeout => 10) - or return "con_lost"; - print $client "$cmd\n"; - my $answer=<$client>; - if (!$answer) { $answer="con_lost"; } - chomp($answer); - return $answer; + my $cmd = shift; + my $host = shift; + + + my $connection = MakeLondConnection($host); + if ($connection eq undef) { + return "Connect Failed"; + } + my $reply = NegotiateStartup($connection); + if($reply != "ok") { + return "connection negotiation failed"; + } + my $reply = PerformTransaction($connection, $cmd); + return $reply; + + + # my ($cmd,$server)=@_; + # my $peerfile="$perlvar{'lonSockDir'}/$server"; + # my $client=IO::Socket::UNIX->new(Peer =>"$peerfile", + # Type => SOCK_STREAM, + # Timeout => 10) + # or return "con_lost"; + # print $client "$cmd\n"; + # my $answer=<$client>; + # if (!$answer) { $answer="con_lost"; } + # chomp($answer); + # return $answer; } # >>> BUGBUG <<< # @@ -150,12 +192,24 @@ sub subreply { # returns an empty list if the parse fails. # + sub ParseArgs { my $pushing = ''; my $reinitting = ''; if(!GetOptions('push=s' => \$pushing, - 'reinit=s' => \$reinitting)) { + 'reinit=s' => \$reinitting, + 'myname=s' => \$MyHost, + 'hosts=s' => \$ForeignHostTab)) { + return (); + } + # The --myname and --hosts switch must have values and + # most both appear if either appears: + + if(($MyHost ne "") && ($ForeignHostTab eq "")) { + return (); + } + if(($ForeignHostTab ne "") && ($MyHost eq "")) { return (); } @@ -208,14 +262,27 @@ sub ParseArgs { return @result; } # -# Read the loncapa configuration stuff. +# Read the loncapa configuration stuff. If ForeignHostTab is empty, +# assume we are part of a loncapa cluster and read the hosts.tab +# file from the config directory. Otherwise, ForeignHossTab +# is the name of an alternate configuration file to read in +# standalone mode. # sub ReadConfig { - my $perlvarref = LondConnection::read_conf('loncapa.conf'); - %perlvar = %{$perlvarref}; - my $hoststab = LondConnection::read_hosts( - "$perlvar{'lonTabDir'}/hosts.tab"); - %hostshash = %{$hoststab}; + + if($ForeignHostTab eq "") { + my $perlvarref = LondConnection::read_conf('loncapa.conf'); + %perlvar = %{$perlvarref}; + my $hoststab = LondConnection::read_hosts( + "$perlvar{'lonTabDir'}/hosts.tab"); + %hostshash = %{$hoststab}; + $MyHost = $perlvar{lonHostID}; # Set hostname from vars. + $ServerPort = $perlvar{londPort}; + } else { + my $hoststab = LondConnection::read_hosts($ForeignHostTab); + %hostshash = %{$hoststab}; + $ServerPort = 5663; + } } # @@ -369,7 +436,6 @@ sub ReinitProcess { } #--------------------------- Entry point: -------------------------- -ReadConfig; # Read the configuration info (incl.hosts). # Parse the parameters @@ -389,6 +455,11 @@ if ($EUID != 0) { die "ENOPRIV - No privilege for requested operation" } +# +# Read the configuration file. +# + +ReadConfig; # Read the configuration info (incl.hosts). # Based on the operation requested invoke the appropriate function: