Handle hostnames with upper-case letters
[webmin.git] / cluster-useradmin / delete_user.cgi
1 #!/usr/local/bin/perl
2 # delete_user.cgi
3 # Delete a user, after asking for confirmation
4
5 require './cluster-useradmin-lib.pl';
6 &foreign_require("useradmin", "user-lib.pl");
7 &ReadParse();
8 &error_setup($text{'udel_err'});
9 @hosts = &list_useradmin_hosts();
10 @servers = &list_servers();
11
12 foreach $h (@hosts) {
13         local ($u) = grep { $_->{'user'} eq $in{'user'} } @{$h->{'users'}};
14         if ($u) {
15                 %user = %$u;
16                 last;
17                 }
18         }
19 %user || &error($text{'udel_ealready'});
20
21 # Setup error handler for down hosts
22 sub del_error
23 {
24 $del_error_msg = join("", @_);
25 }
26 &remote_error_setup(\&del_error);
27
28 $| = 1;
29 &ui_print_header(undef, $text{'udel_title'}, "");
30 if ($in{'confirmed'}) {
31         # Do the deletion on all hosts
32         foreach $host (@hosts) {
33                 $del_error_msg = undef;
34                 ($serv) = grep { $_->{'id'} == $host->{'id'} } @servers;
35                 ($user) = grep { $_->{'user'} eq $in{'user'} }
36                                      @{$host->{'users'}};
37                 next if (!$user);
38                 print "<b>",&text('udel_on', $serv->{'desc'} ? $serv->{'desc'} :
39                                              $serv->{'host'}),"</b><p>\n";
40                 print "<ul>\n";
41                 &remote_foreign_require($serv->{'host'},
42                                         "useradmin", "user-lib.pl");
43                 if ($del_error_msg) {
44                         # Host is down ..
45                         print &text('udel_failed', $del_error_msg),"<p>\n";
46                         print "</ul>\n";
47                         next;
48                         }
49                 local @ulist = &remote_foreign_call($serv->{'host'},
50                                         "useradmin", "list_users");
51                 ($user) = grep { $_->{'user'} eq $in{'user'} } @ulist;
52                 if (!$user) {
53                         # Already deleted?
54                         print "$text{'udel_gone'}<p>\n";
55                         print "</ul>\n";
56                         next;
57                         }
58
59                 # Run the before command
60                 &remote_eval($serv->{'host'}, "useradmin", <<EOF
61 \$ENV{'USERADMIN_USER'} = '$user->{'user'}';
62 \$ENV{'USERADMIN_UID'} = '$user->{'uid'}';
63 \$ENV{'USERADMIN_REAL'} = '$user->{'real'}';
64 \$ENV{'USERADMIN_SHELL'} = '$user->{'shell'}';
65 \$ENV{'USERADMIN_HOME'} = '$user->{'home'}';
66 \$ENV{'USERADMIN_GID'} = '$user->{'gid'}';
67 \$ENV{'USERADMIN_ACTION'} = 'DELETE_USER';
68 EOF
69         );
70                 $merr = &remote_foreign_call($serv->{'host'}, "useradmin",
71                                              "making_changes");
72                 if (defined($merr)) {
73                         print &text('usave_emaking', "<tt>$merr</tt>"),"<p>\n";
74                         print "</ul>\n";
75                         next;
76                         }
77
78                 if ($in{'others'}) {
79                         # Delete from other modules
80                         print "$text{'udel_dothers'}<br>\n";
81                         &remote_foreign_call($serv->{'host'}, "useradmin",
82                                      "other_modules", "useradmin_delete_user",
83                                      $user);
84                         print "$text{'udel_done'}<p>\n";
85                         }
86
87                 # Delete the user
88                 print "$text{'udel_pass'}<br>\n";
89                 &remote_foreign_call($serv->{'host'}, "useradmin",
90                                      "delete_user", $user);
91                 print "$text{'udel_done'}<p>\n";
92
93                 # Delete from any secondary groups
94                 print "$text{'udel_groups'}<br>\n";
95                 local @glist = &remote_foreign_call($serv->{'host'},
96                                         "useradmin", "list_groups");
97                 foreach $g (@glist) {
98                         local %oldg = %$g;
99                         local @mems = split(/,/, $g->{'members'});
100                         $idx = &indexof($user->{'user'}, @mems);
101                         if ($idx >= 0) {
102                                 splice(@mems, $idx, 1);
103                                 $g->{'members'} = join(',', @mems);
104                                 &remote_foreign_call($serv->{'host'},
105                                     "useradmin", "modify_group", \%oldg, $g);
106                                 }
107                         }
108                 print "$text{'udel_done'}<p>\n";
109
110                 # Delete home directory
111                 if ($in{'servs'} || $host eq $hosts[0]) {
112                         local $exists = &remote_eval($serv->{'host'},
113                                 "useradmin", "-d '$user{'home'}'");
114                         if ($in{'delhome'} && $user{'home'} !~ /^\/+$/ &&
115                             $exists) {
116                                 print "$text{'udel_home'}<br>\n";
117                                 &remote_eval($serv->{'host'}, "useradmin",
118                                         "system(\"rm -rf '$user{'home'}'\")");
119                                 print "$text{'udel_done'}<p>\n";
120                                 }
121                         }
122
123                 # Run the post-change command
124                 &remote_foreign_call($serv->{'host'}, "useradmin",
125                                      "made_changes");
126
127                 # Update in local list
128                 @ulist = grep { $_ ne $user } @ulist;
129                 $host->{'users'} = \@ulist;
130                 $host->{'groups'} = \@glist;
131                 &save_useradmin_host($host);
132                 print "</ul>\n";
133                 }
134         &webmin_log("delete", "user", $user->{'user'}, $user);
135
136         &ui_print_footer("", $text{'index_return'});
137         }
138 else {
139         # Ask if the user is sure
140         ($serv) = grep { $_->{'id'} == $host->{'id'} } @servers;
141         &remote_foreign_require($serv->{'host'}, "useradmin", "user-lib.pl");
142         print "<form action=delete_user.cgi>\n";
143         print "<input type=hidden name=user value=\"$user{'user'}\">\n";
144         print "<input type=hidden name=confirmed value=1>\n";
145
146         $size = &remote_foreign_call($serv->{'host'}, "useradmin",
147                                      "disk_usage_kb", $user{'home'});
148         print "<center>\n";
149         if ($user{'home'} ne "/" && $size) {
150                 print "<b>",&text('udel_sure', $user{'user'},
151                                   $user{'home'}, $size),"</b><p>\n";
152                 print "<input type=submit value=\"$text{'udel_del1'}\">\n";
153                 print "<input name=delhome type=submit ",
154                       "value=\"$text{'udel_del2'}\"><br>\n";
155                 print "<b>$text{'udel_servs'}</b>\n";
156                 print "<input type=radio name=servs value=1> ",
157                       "$text{'uedit_mall'}\n";
158                 print "<input type=radio name=servs value=0 checked> ",
159                       "$text{'uedit_mthis'}<br>\n";
160                 }
161         else {
162                 print "<center><b>",&text('udel_sure2',
163                                            $user{'user'}),"</b><p>\n";
164                 print "<input type=submit value=\"$text{'udel_del1'}\">\n";
165                 }
166         if ($user{'user'} eq 'root') {
167                 print "<b><font color=#ff0000>$text{'udel_root'}",
168                       "</font></b></center>\n";
169                 }
170
171         print "<br><b>$text{'udel_others'}</b>\n";
172         print "<input type=radio name=others value=1 checked> $text{'yes'}\n";
173         print "<input type=radio name=others value=0> $text{'no'}\n";
174
175         print "</form></center>\n";
176         &ui_print_footer("", $text{'index_return'});
177         }
178