Handle hostnames with upper-case letters
[webmin.git] / cluster-webmin / delete_group.cgi
1 #!/usr/local/bin/perl
2 # delete_group.cgi
3 # Delete a webmin group across all servers
4
5 require './cluster-webmin-lib.pl';
6 &ReadParse();
7 &ui_print_header(undef, $text{'gdelete_title'}, "");
8
9 # Find groups and members on all hosts
10 foreach $h (&list_webmin_hosts()) {
11         foreach $g (@{$h->{'groups'}}) {
12                 if ($g->{'name'} eq $in{'group'}) {
13                         push(@hosts, $h);
14                         push(@mems, @{$g->{'members'}});
15                         foreach $m (@{$g->{'members'}}) {
16                                 $onhost{$h,$m}++;
17                                 ($mg) = grep { $_->{'name'} eq $m }
18                                              @{$h->{'groups'}};
19                                 push(@subs, $mg->{'name'}) if ($mg);
20                                 }
21                         last;
22                         }
23                 }
24         }
25 @mems = &unique(@mems);
26
27 if (@subs) {
28         print &text('gdelete_esub',
29                 "<b>".join(" ", &unique(@subs))."</b>"),"<p>\n";
30         &ui_print_footer("", $text{'index_return'});
31         exit;
32         }
33 if (!$in{'confirm'} && @mems) {
34         # Ask if the user really wants to delete the group and members
35         print "<center><form action=delete_group.cgi>\n";
36         print "<input type=hidden name=group value='$in{'group'}'>\n";
37         print &text('gdelete_desc', "<b>$in{'group'}</b>",
38                     "<b>".join(" ", @mems)."</b>"),"<p>\n";
39         print "<input type=submit name=confirm value='$text{'gdelete_ok'}'>\n";
40         print "</form></center>\n";
41         &ui_print_footer("", $text{'index_return'});
42         exit;
43         }
44
45 print "<b>",&text('gdelete_doing', $in{'group'}),"</b><p>\n";
46
47 # Setup error handler for down hosts
48 sub group_error
49 {
50 $group_error_msg = join("", @_);
51 }
52 &remote_error_setup(\&group_error);
53
54 @servers = &list_servers();
55 $p = 0;
56 foreach $h (@hosts) {
57         local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
58         local ($rh = "READ$p", $wh = "WRITE$p");
59         pipe($rh, $wh);
60         if (!fork()) {
61                 close($rh);
62                 &remote_foreign_require($s->{'host'}, "acl", "acl-lib.pl");
63                 if ($group_error_msg) {
64                         # Host is down
65                         print $wh &serialise_variable([ 0, $group_error_msg ]);
66                         exit;
67                         }
68
69                 # Delete the group
70                 &remote_foreign_call($s->{'host'}, "acl", "delete_group",
71                                      $in{'group'});
72                 $h->{'groups'} = [ grep { $_->{'name'} ne $in{'group'} }
73                                         @{$h->{'groups'}} ];
74
75                 # Remove from any groups
76                 foreach $g (@{$h->{'groups'}}) {
77                         local @mems = @{$g->{'members'}};
78                         local $i = &indexof($in{'group'}, @mems);
79                         if ($i >= 0) {
80                                 splice(@mems, $i, 1);
81                                 $g->{'members'} = \@mems;
82                                 &remote_foreign_call($s->{'host'}, "acl",
83                                                 "modify_group", $g->{'name'}, $g);
84                                 }
85                         }
86
87                 # Delete any members
88                 foreach $u (grep { $onhost{$h,$_} } @mems) {
89                         &remote_foreign_call($s->{'host'}, "acl",
90                                              "delete_user", $u);
91                         $h->{'users'} = [ grep { $_->{'name'} ne $u }
92                                                @{$h->{'users'}} ];
93                         }
94                 &save_webmin_host($h);
95
96                 # Restart the remote webmin
97                 print $wh &serialise_variable([ 1 ]);
98                 &remote_foreign_call($s->{'host'}, "acl", "restart_miniserv");
99                 exit;
100                 }
101         close($wh);
102         $p++;
103         }
104
105 # Read back the results
106 $p = 0;
107 foreach $h (@hosts) {
108         local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
109         local $d = &server_name($s);
110         local $rh = "READ$p";
111         local $line = <$rh>;
112         local $rv = &unserialise_variable($line);
113         close($rh);
114
115         if ($rv && $rv->[0] == 1) {
116                 # It worked
117                 print &text('gdelete_success', $d),"<br>\n";
118                 }
119         else {
120                 # Something went wrong
121                 print &text('gdelete_failed', $d, $rv->[1]),"<br>\n";
122                 }
123         $p++;
124         }
125
126 print "<p><b>$text{'gdelete_done'}</b><p>\n";
127
128 &remote_finished();
129 &ui_print_footer("", $text{'index_return'});
130