Handle hostnames with upper-case letters
[webmin.git] / cluster-webmin / delete_mod.cgi
1 #!/usr/local/bin/perl
2 # delete_mod.cgi
3 # Delete a module from one or all servers, after asking for confirmation
4
5 require './cluster-webmin-lib.pl';
6 &ReadParse();
7 @servers = &list_servers();
8 @hosts = &list_webmin_hosts();
9 if ($in{'server'} < 0) {
10         # Find servers that have the module or theme
11         foreach $h (@hosts) {
12                 foreach $m (@{$h->{'modules'}}, @{$h->{'themes'}}) {
13                         if ($m->{'dir'} eq $in{'mod'}) {
14                                 local ($s) = grep { $_->{'id'} == $h->{'id'} }
15                                                   @servers;
16                                 push(@got, $s);
17                                 $gotmap{$s} = $h;
18                                 $best = $s if (!$s->{'id'});
19                                 last;
20                                 }
21                         }
22                 }
23         $s = $best ? $best : $got[0];
24         }
25 else {
26         ($s) = grep { $_->{'id'} == $in{'server'} } @servers;
27         ($h) = grep { $_->{'id'} == $in{'server'} } @hosts;
28         @got = ( $s );
29         $gotmap{$s} = $h;
30         }
31 $h = $gotmap{$s};
32 foreach $m ($in{'type'} eq 'mod' ? @{$h->{'modules'}} : @{$h->{'themes'}}) {
33         $info = $m if ($m->{'dir'} eq $in{'mod'});
34         }
35
36 # Setup error handler for down hosts
37 sub del_error
38 {
39 $del_error_msg = join("", @_);
40 }
41 &remote_error_setup(\&del_error);
42 &remote_foreign_require($s->{'host'}, "webmin", "webmin-lib.pl");
43
44 &ui_print_header(undef, $text{'delete_title'}, "");
45 if ($in{'sure'}) {
46         # do the deletion in separate processes
47         print "<br><b>",&text("delete_header_$in{'type'}",
48                               $info->{'desc'}),"</b><p>\n";
49         $p = 0;
50         foreach $g (@got) {
51                 local ($rh = "READ$p", $wh = "WRITE$p");
52                 pipe($rh, $wh);
53                 if (!fork()) {
54                         close($rh);
55                         local $h = $gotmap{$g};
56
57                         # Check for any dependencies on this host
58                         foreach $m (@{$h->{'modules'}}) {
59                                 foreach $d (split(/\s+/, $m->{'depends'})) {
60                                         push(@{$ondeps{$d}}, $m);
61                                         }
62                                 }
63                         if ($ondeps{$in{'mod'}}) {
64                                 print $wh &serialise_variable([ 0, &text('delete_edepends', join(", ", map { $_->{'desc'} } @{$ondeps{$in{'mod'}}})) ]);
65                                 exit;
66                                 }
67
68                         # Delete the module
69                         &remote_foreign_require($g->{'host'}, "webmin",
70                                              "webmin-lib.pl") if ($s ne $g);
71                         &remote_foreign_require($g->{'host'}, "acl",
72                                                 "acl-lib.pl");
73                         local $desc = &remote_foreign_call($g->{'host'},
74                                 "webmin", "delete_webmin_module", $in{'mod'},
75                                 $in{'acls'});
76                         if ($del_error_msg) {
77                                 print $wh &serialise_variable([ 0, $del_error_msg ]);
78                                 }
79                         elsif ($desc) {
80                                 print $wh &serialise_variable([ 1, $desc ]);
81                                 }
82                         else {
83                                 print $wh &serialise_variable([ 0, $text{'delete_egone'} ]);
84                                 }
85
86                         # Re-request all users and groups from the server
87                         local @newmods = grep { $_->{'dir'} ne $in{'mod'} }
88                                               @{$h->{'modules'}};
89                         local @newthemes = grep { $_->{'dir'} ne $in{'mod'} }
90                                                 @{$h->{'themes'}};
91                         $h->{'modules'} = \@newmods;
92                         $h->{'themes'} = \@newthemes;
93                         $h->{'users'} = [ &remote_foreign_call($g->{'host'},
94                                                 "acl", "list_users") ];
95                         $h->{'groups'} = [ &remote_foreign_call($g->{'host'},
96                                                 "acl", "list_groups") ];
97                         &save_webmin_host($h);
98
99                         close($wh);
100                         exit;
101                         }
102                 close($wh);
103                 $p++;
104                 }
105
106         # Read back the results
107         $p = 0;
108         foreach $g (@got) {
109                 local $rh = "READ$p";
110                 local $line = <$rh>;
111                 local $rv = &unserialise_variable($line);
112                 close($rh);
113                 local $d = &server_name($g);
114
115                 if (!$rv->[0]) {
116                         print &text('delete_error', $d, $rv->[1]),"<br>\n";
117                         }
118                 else {
119                         print &text('delete_success', $d, $rv->[1]),"<br>\n";
120                         }
121                 $p++;
122                 }
123         print "<p><b>$text{'delete_done'}</b><p>\n";
124         }
125 else {
126         # Ask if the user is sure..
127         $rroot = &remote_eval($s->{'host'}, "webmin", '$root_directory');
128         $sz = &remote_foreign_call($s->{'host'}, "webmin", "disk_usage_kb",
129                                    "$rroot/$in{'mod'}");
130         print "<center>\n";
131         if ($in{'server'} < 0) {
132                 print &text("delete_rusure_$in{'type'}",
133                     "<b>$info->{'desc'}</b>", $sz),"<p>\n";
134                 }
135         else {
136                 print &text("delete_rusure2_$in{'type'}",
137                     "<b>$info->{'desc'}</b>", $sz, &server_name($s)),"<p>\n";
138                 }
139         print "<form action=delete_mod.cgi>\n";
140         print "<input type=hidden name=mod value=\"$in{'mod'}\">\n";
141         print "<input type=hidden name=type value=\"$in{'type'}\">\n";
142         print "<input type=hidden name=server value=\"$in{'server'}\">\n";
143         print "<input type=hidden name=sure value=1>\n";
144         print "<input type=submit value=\"$text{'delete_ok'}\"><br>\n";
145         print "<input type=checkbox name=acls value=1> $text{'delete_acls'}\n";
146         print "</center></form>\n";
147         }
148
149 &remote_finished();
150 &ui_print_footer("", $text{'index_return'});
151