--- loncom/clusteradmin 2011/05/12 14:08:54 1.4 +++ loncom/clusteradmin 2011/05/16 15:48:26 1.5 @@ -152,6 +152,7 @@ sub usage { my $config_vars = LONCAPA::Configuration::read_conf('loncapa.conf'); my %config = %{$config_vars}; +my $logfile = $config{'lonDaemons'}.'/logs/dns_updates.log'; sub construct_table_path { @@ -175,9 +176,9 @@ sub get_dns_hosts() while (my $line = ) { chomp($line); if ($line =~ /^\^/) { - $line =~ s/^\^//; # Get rid of leading ^ - $line =~ s/\s*$//; # and any trailing whitespace. - push(@result, $line); + if ($line =~ /^\^([\w.\-]+)/) { + push(@result,$1); + } } } return (@result); @@ -198,7 +199,7 @@ sub get_dns_hosts() # 0 - Failure with appropriate output to stderr. # sub push_file { - my ($specifier, $pushfile, $hosts) = @_; + my ($specifier, $pushfile, $hosts, $fh) = @_; # Read in the entire file: @@ -217,15 +218,21 @@ sub push_file { # Iterate over the hosts and run cmd as a critical # operation: + my @ids=&Apache::lonnet::current_machine_ids(); foreach my $host (@$hosts) { my $loncapa_name = &Apache::lonnet::host_from_dns($host); - next if ($loncapa_name eq $config{'lonHostID'}); + next if (grep(/^\Q$loncapa_name\E$/,@ids)); my $reply = &Apache::lonnet::critical($cmd, $loncapa_name); - if ($reply ne 'ok') { - print STDERR "Reply from $host ($loncapa_name) not 'ok' was: $reply\n"; - } + my $msg; + if ($reply eq 'ok') { + $msg = "$pushfile pushed to $host ($loncapa_name): $reply\n"; + } else { + $msg = "Reply from $host ($loncapa_name) not 'ok' was: $reply\n"; + } + print $fh $msg; + print STDERR $msg; } - + return; } # @@ -248,11 +255,25 @@ sub update_file { # Validate the filename: - if ($filename eq 'dns_hosts.tab' || $filename eq 'dns_domain.tab') { - my $pushfile = &construct_table_path($filename); - my $specifier = basename($filename, ('.tab')); - my @hosts = (&get_dns_hosts()); - return &push_file($specifier, $pushfile, \@hosts); + if (($filename eq 'dns_hosts.tab') || ($filename eq 'dns_domain.tab') || + ($filename eq 'hosts.tab') || ($filename eq 'domain.tab')) { + my ($result,$fh); + if (!-e $logfile) { + system("touch $logfile"); + system("chown www:www $logfile"); + } + if (open ($fh,">>$logfile")) { + print $fh "clusteradmin update started: ".localtime(time)."\n"; + my $pushfile = &construct_table_path($filename); + my $specifier = basename($filename, ('.tab')); + my @hosts = (&get_dns_hosts()); + $result = &push_file($specifier, $pushfile, \@hosts, $fh); + print $fh "ended: ".localtime(time)."\n"; + close($fh); + } else { + print STDERR "Could not open $logfile to append. Exiting.\n"; + } + return $result; } else { print STDERR "Only dns_hosts.tab or dns_domain.tab can be updated\n"; &usage(); @@ -301,6 +322,12 @@ sub is_manager { # dispatch to the appropriate command processor. # +if ($< != 0) { # Am I root? + print('You must be root in order to run clusteradmin.'. + "\n"); + exit(-1); +} + my $argc = scalar(@ARGV); if ($argc == 0) { print STDERR "Missing subcommand\n";