#!/usr/local/bin/perl # refresh.cgi # Reload the list of modules from all managed hosts require './cluster-webmin-lib.pl'; &ReadParse(); &ui_print_header(undef, $text{'refresh_title'}, ""); $| = 1; # Setup error handler for down hosts sub ref_error { $ref_error_msg = join("", @_); } &remote_error_setup(\&ref_error); # Work out which hosts @hosts = &list_webmin_hosts(); @servers = &list_servers(); if (defined($in{'id'})) { @hosts = grep { $_->{'id'} == $in{'id'} } @hosts; local ($s) = grep { $_->{'id'} == $hosts[0]->{'id'} } @servers; print "",&text('refresh_header5', undef, &server_name($s)),"
\n"; } else { @hosts = &create_on_parse("refresh_header"); #print "$text{'refresh_header'}
\n";
}
$p = 0;
foreach $h (@hosts) {
local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
local ($rh = "READ$p", $wh = "WRITE$p");
pipe($rh, $wh);
if (!fork()) {
close($rh);
if ($s) {
# Refresh the list
&remote_foreign_require($s->{'host'}, "webmin",
"webmin-lib.pl");
if ($ref_error_msg) {
# Host is down ..
print $wh &serialise_variable($ref_error_msg);
exit;
}
&remote_foreign_require($s->{'host'}, "acl",
"acl-lib.pl");
local $gconfig = &remote_foreign_config($s->{'host'},
undef);
foreach $g ('os_type', 'os_version',
'real_os_type', 'real_os_version') {
$h->{$g} = $gconfig->{$g};
}
$h->{'version'} = &remote_foreign_call($s->{'host'},
"webmin", "get_webmin_version");
# Refresh modules and themes
local @old = map { $_->{'dir'} } ( @{$h->{'modules'}},
@{$h->{'themes'}} );
undef($h->{'modules'});
local @mods = &remote_foreign_call($s->{'host'},
"webmin", "get_all_module_infos", 1);
@mods = grep { !$_->{'clone'} } @mods;
local @themes = &remote_foreign_call($s->{'host'},
"webmin", "list_themes");
local @added;
foreach $m (@mods, @themes) {
$idx = &indexof($m->{'dir'}, @old);
if ($idx < 0) {
push(@added, $m->{'dir'});
}
else {
splice(@old, $idx, 1);
}
}
$h->{'modules'} = \@mods;
$h->{'themes'} = \@themes;
# Refresh users and groups
local @users = &remote_foreign_call($s->{'host'},
"acl", "list_users");
local $ud = scalar(@users) - scalar(@{$h->{'users'}});
$h->{'users'} = \@users;
local @groups = &remote_foreign_call($s->{'host'},
"acl", "list_groups");
local $gd = scalar(@groups) - scalar(@{$h->{'groups'}});
$h->{'groups'} = \@groups;
&save_webmin_host($h);
$rv = [ \@added, \@old, $ud, $gd ];
}
else {
# remove from managed list
&delete_webmin_host($h);
$rv = undef;
}
print $wh &serialise_variable($rv);
close($wh);
exit;
}
close($wh);
$p++;
}
# Read back results
$p = 0;
foreach $h (@hosts) {
local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
local $d = &server_name($s);
local $rh = "READ$p";
local $line = <$rh>;
local $rv = &unserialise_variable($line);
close($rh);
if ($rv && ref($rv)) {
@added = @{$rv->[0]};
@old = @{$rv->[1]};
if (@added && @old) {
print &text('refresh_1', $d,
join(" ", @added),join(" ", @old)),"\n";
}
elsif (@added) {
print &text('refresh_2', $d,
join(" ", @added)),"\n";
}
elsif (@old) {
print &text('refresh_3', $d, join(" ", @old)),"\n";
}
else {
print &text('refresh_4', $d),"\n";
}
if ($rv->[2] > 0) {
print &text('refresh_u1', $rv->[2]),"\n";
}
elsif ($rv->[2] < 0) {
print &text('refresh_u2', -$rv->[2]),"\n";
}
if ($rv->[3] > 0) {
print &text('refresh_g1', $rv->[3]),"\n";
}
elsif ($rv->[3] < 0) {
print &text('refresh_g2', -$rv->[3]),"\n";
}
print "
\n";
}
elsif ($rv) {
print &text('refresh_failed', $d, $rv),"
\n";
}
else {
print &text('refresh_del', $h->{'id'}),"
\n";
}
$p++;
}
print "
$text{'refresh_done'}
\n"; &remote_finished(); if (defined($in{'id'})) { &ui_print_footer("edit_host.cgi?id=$in{'id'}", $text{'host_return'}, "", $text{'index_return'}); } else { &ui_print_footer("", $text{'index_return'}); }