Handle hostnames with upper-case letters
[webmin.git] / cluster-usermin / refresh.cgi
1 #!/usr/local/bin/perl
2 # refresh.cgi
3 # Reload the list of modules from all managed hosts
4
5 require './cluster-usermin-lib.pl';
6 &ReadParse();
7 &ui_print_header(undef, $text{'refresh_title'}, "");
8 $| = 1;
9
10 # Setup error handler for down hosts
11 sub ref_error
12 {
13 $ref_error_msg = join("", @_);
14 }
15 &remote_error_setup(\&ref_error);
16
17 # Work out which hosts
18 @hosts = &list_usermin_hosts();
19 @servers = &list_servers();
20 if (defined($in{'id'})) {
21         @hosts = grep { $_->{'id'} == $in{'id'} } @hosts;
22         local ($s) = grep { $_->{'id'} == $hosts[0]->{'id'} } @servers;
23         print "<b>",&text('refresh_header5', undef,
24                           &server_name($s)),"</b><p>\n";
25         }
26 else {
27         @hosts = &create_on_parse("refresh_header");
28         #print "<b>$text{'refresh_header'}</b><p>\n";
29         }
30 $p = 0;
31 foreach $h (@hosts) {
32         local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
33
34         local ($rh = "READ$p", $wh = "WRITE$p");
35         pipe($rh, $wh);
36         if (!fork()) {
37                 close($rh);
38                 if ($s) {
39                         # Refresh the list
40                         &remote_foreign_require($s->{'host'}, "usermin",
41                                                 "usermin-lib.pl");
42                         if ($ref_error_msg) {
43                                 # Host is down ..
44                                 print $wh &serialise_variable($ref_error_msg);
45                                 exit;
46                                 }
47                         local $gconfig = &remote_foreign_config($s->{'host'},
48                                                                 undef);
49                         foreach $g ('os_type', 'os_version',
50                                     'real_os_type', 'real_os_version') {
51                                 $h->{$g} = $gconfig->{$g};
52                                 }
53                         $h->{'version'} = &remote_foreign_call($s->{'host'},
54                                         "usermin", "get_usermin_version");
55
56                         # Refresh modules and themes
57                         local @old = map { $_->{'dir'} } ( @{$h->{'modules'}},
58                                                            @{$h->{'themes'}} );
59                         undef($h->{'modules'});
60                         local @mods = &remote_foreign_call($s->{'host'},
61                                         "usermin", "list_modules");
62                         @mods = grep { !$_->{'clone'} } @mods;
63                         local @themes = &remote_foreign_call($s->{'host'},
64                                          "usermin", "list_themes");
65                         local @added;
66                         foreach $m (@mods, @themes) {
67                                 $idx = &indexof($m->{'dir'}, @old);
68                                 if ($idx < 0) {
69                                         push(@added, $m->{'dir'});
70                                         }
71                                 else {
72                                         splice(@old, $idx, 1);
73                                         }
74                                 }
75                         $h->{'modules'} = \@mods;
76                         $h->{'themes'} = \@themes;
77
78                         &save_usermin_host($h);
79                         $rv = [ \@added, \@old, $ud, $gd ];
80                         }
81                 else {
82                         # remove from managed list
83                         &delete_usermin_host($h);
84                         $rv = undef;
85                         }
86                 print $wh &serialise_variable($rv);
87                 close($wh);
88                 exit;
89                 }
90         close($wh);
91         $p++;
92         }
93
94 # Read back results
95 $p = 0;
96 foreach $h (@hosts) {
97         local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
98         local $d = &server_name($s);
99         local $rh = "READ$p";
100         local $line = <$rh>;
101         local $rv = &unserialise_variable($line);
102         close($rh);
103
104         if ($rv && ref($rv)) {
105                 @added = @{$rv->[0]};
106                 @old = @{$rv->[1]};
107                 if (@added && @old) {
108                         print &text('refresh_1', $d,
109                                     join(" ", @added),join(" ", @old)),"\n";
110                         }
111                 elsif (@added) {
112                         print &text('refresh_2', $d,
113                                     join(" ", @added)),"\n";
114                         }
115                 elsif (@old) {
116                         print &text('refresh_3', $d, join(" ", @old)),"\n";
117                         }
118                 else {
119                         print &text('refresh_4', $d),"\n";
120                         }
121                 print "<br>\n";
122                 }
123         elsif ($rv) {
124                 print &text('refresh_failed', $d, $rv),"<br>\n";
125                 }
126         else {
127                 print &text('refresh_del', $h->{'id'}),"<br>\n";
128                 }
129
130         $p++;
131         }
132
133 print "<p><b>$text{'refresh_done'}</b><p>\n";
134
135 &remote_finished();
136 if (defined($in{'id'})) {
137         &ui_print_footer("edit_host.cgi?id=$in{'id'}", $text{'host_return'},
138                          "", $text{'index_return'});
139         }
140 else {
141         &ui_print_footer("", $text{'index_return'});
142         }
143