3 # Saves an existing group
5 require './cluster-useradmin-lib.pl';
6 &error_setup($text{'gsave_err'});
8 @hosts = &list_useradmin_hosts();
9 @servers = &list_servers();
13 foreach $u (@{$h->{'users'}}) {
14 $exists{$u->{'user'}}++;
18 # Strip out \n characters in inputs
19 $in{'group'} =~ s/\r|\n//g;
20 $in{'pass'} =~ s/\r|\n//g;
21 $in{'encpass'} =~ s/\r|\n//g;
22 $in{'gid'} =~ s/\r|\n//g;
25 $in{'gid_def'} || $in{'gid'} =~ /^[0-9]+$/ ||
26 &error(&text('gsave_egid', $in{'gid'}));
27 if ($in{'members_def'} == 1) {
28 @add = split(/\s+/, $in{'membersadd'});
30 $exists{$u} || &error(&text('gsave_euser', $u));
33 elsif ($in{'members_def'} == 2) {
34 @del = split(/\s+/, $in{'membersdel'});
36 $exists{$u} || &error(&text('gsave_euser', $u));
40 # Setup error handler for down hosts
43 $mod_error_msg = join("", @_);
45 &remote_error_setup(\&mod_error);
47 # Do the changes across all hosts
48 &ui_print_header(undef, $text{'gedit_title'}, "");
49 foreach $host (@hosts) {
50 $mod_error_msg = undef;
51 ($group) = grep { $_->{'group'} eq $in{'group'} } @{$host->{'groups'}};
53 local ($serv) = grep { $_->{'id'} == $host->{'id'} } @servers;
54 print "<b>",&text('gsave_uon', $serv->{'desc'} ? $serv->{'desc'} :
55 $serv->{'host'}),"</b><p>\n";
57 &remote_foreign_require($serv->{'host'}, "useradmin", "user-lib.pl");
60 print &text('gsave_failed', $mod_error_msg),"<p>\n";
64 local @glist = &remote_foreign_call($serv->{'host'}, "useradmin",
66 ($group) = grep { $_->{'group'} eq $in{'group'} } @glist;
69 local %ogroup = %$group;
71 # Update changed fields
72 $group->{'gid'} = $in{'gid'} if (!$in{'gid_def'});
73 $salt = chr(int(rand(26))+65) . chr(int(rand(26))+65);
74 if ($in{'passmode'} == 0) {
75 $group->{'pass'} = "";
77 elsif ($in{'passmode'} == 1) {
78 $group->{'pass'} = $in{'encpass'};
80 elsif ($in{'passmode'} == 2) {
81 $group->{'pass'} = &unix_crypt($in{'pass'}, $salt);
83 local @mems = split(/,/, $group->{'members'});
85 @mems = &unique(@mems, @add);
88 @mems = grep { &indexof($_, @del) < 0 } @mems;
90 $group->{'members'} = join(",", @mems);
92 # Run the pre-change command
93 &remote_eval($serv->{'host'}, "useradmin", <<EOF
94 \$ENV{'USERADMIN_GROUP'} = '$group->{'group'}';
95 \$ENV{'USERADMIN_ACTION'} = 'MODIFY_GROUP';
98 $merr = &remote_foreign_call($serv->{'host'}, "useradmin",
100 if (defined($merr)) {
101 print &text('usave_emaking', "<tt>$merr</tt>"),"<p>\n";
106 # Update the group on the server
107 print "$text{'gsave_update'}<br>\n";
108 &remote_foreign_call($serv->{'host'}, "useradmin", "modify_group",
110 print "$text{'udel_done'}<p>\n";
114 if ($in{'servs'} || $host eq $hosts[0]) {
115 if ($group->{'gid'} != $ogroup{'gid'} && $in{'chgid'}) {
116 # Change GID on files if needed
117 if ($in{'chgid'} == 1) {
118 # Do all the home directories of users in
120 print "$text{'usave_gid'}<br>\n";
121 @ulist = &remote_foreign_call($serv->{'host'},
122 "useradmin", "list_users");
123 foreach $u (@ulist) {
124 if ($u->{'gid'} == $ogroup{'gid'} ||
125 &indexof($u->{'user'},@mems) >= 0) {
126 &remote_foreign_call(
132 -1, $group->{'gid'});
135 print "$text{'udel_done'}<p>\n";
137 elsif ($in{'chgid'} == 2) {
138 # Do all files in this group from the root dir
139 print "$text{'usave_gid'}<br>\n";
140 &remote_foreign_call($serv->{'host'},
141 "useradmin", "recursive_change", "/",
142 -1, $ogroup{'gid'}, -1,$group->{'gid'});
143 print "$text{'udel_done'}<p>\n";
148 # Run the post-change command
149 &remote_foreign_call($serv->{'host'}, "useradmin", "made_changes");
152 if (&supports_gothers($serv)) {
153 # Update the group in other modules
154 print "$text{'usave_mothers'}<br>\n";
155 &remote_foreign_call($serv->{'host'}, "useradmin",
156 "other_modules", "useradmin_modify_group",
158 print "$text{'udel_done'}<p>\n";
161 # Group syncing not supported
162 print "$text{'gsave_nosync'}<p>\n";
166 # Update in local list
167 $host->{'groups'} = \@glist;
169 $host->{'users'} = \@ulist;
171 &save_useradmin_host($host);
174 &webmin_log("modify", "group", $group->{'group'}, $group);
176 &ui_print_footer("", $text{'index_return'});