This commit was generated by cvs2svn to compensate for changes in r12472,
[freeside.git] / torrus / bin / acledit.in
1 #!@PERL@
2 #  Copyright (C) 2002  Stanislav Sinyagin
3 #
4 #  This program is free software; you can redistribute it and/or modify
5 #  it under the terms of the GNU General Public License as published by
6 #  the Free Software Foundation; either version 2 of the License, or
7 #  (at your option) any later version.
8 #
9 #  This program is distributed in the hope that it will be useful,
10 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 #  GNU General Public License for more details.
13 #
14 #  You should have received a copy of the GNU General Public License
15 #  along with this program; if not, write to the Free Software
16 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
17
18 # $Id: acledit.in,v 1.1 2010-12-27 00:04:01 ivan Exp $
19 # Stanislav Sinyagin <ssinyagin@yahoo.com>
20
21 BEGIN { require '@torrus_config_pl@'; }
22
23 use strict;
24 use Getopt::Long;
25
26 use Torrus::Log;
27 use Torrus::ACL::Edit;
28 use Torrus::SiteConfig;
29
30 exit(1) if not Torrus::SiteConfig::verify();
31
32 our %knownPrivileges =
33     ( 'DisplayTree' => 'tree',
34       'DisplayAdmInfo' => 'tree',
35       'DisplayReports' => 'tree',
36       'GlobalSearch' => 'global' );
37
38 our @addgroups;
39 our @delgroups;
40 our @modgroups;
41
42 our @permitprivs;
43 our @denyprivs;
44 our @forobjects;
45
46 our $adduser;
47 our $addhost;
48 our $deluser;
49 our $moduser;
50 our @addtogroups;
51 our @delfromgroups;
52 our $password;
53 our $host_password;
54 our $commonname;
55 our $exportfile;
56 our $exporttemplate = "aclexport.xml";
57 our $importfile;
58 our $clearconf;
59
60 our @showgroups;
61 our @showusers;
62 our $listall;
63
64 our $force;
65 our $debug;
66 our $verbose;
67 our $help_needed;
68
69 my $ok = GetOptions ('addgroup=s'     => \@addgroups,
70                      'delgroup=s'     => \@delgroups,
71                      'modgroup=s'     => \@modgroups,
72                      'permit=s'       => \@permitprivs,
73                      'deny=s'         => \@denyprivs,
74                      'for=s'          => \@forobjects,
75                      'adduser=s'      => \$adduser,
76                      'addhost=s'      => \$addhost,
77                      'deluser=s'      => \$deluser,
78                      'moduser=s'      => \$moduser,
79                      'addtogroup=s'   => \@addtogroups,
80                      'delfromgroup=s' => \@delfromgroups,
81                      'password=s'     => \$password,
82                      'hostpassword=s' => \$host_password,
83                      'cn=s'           => \$commonname,
84                      'export=s'       => \$exportfile,
85                      'template=s'     => \$exporttemplate,
86                      'import=s'       => \$importfile,
87                      'clear'          => \$clearconf,
88                      'showgroup=s'    => \@showgroups,
89                      'showuser=s'     => \@showusers,
90                      'list'           => \$listall,
91                      'force'          => \$force,
92                      'debug'    => \$debug,
93                      'verbose'  => \$verbose,
94                      'help'     => \$help_needed);
95
96 if( not $ok or $help_needed or scalar(@ARGV) > 0 or
97     ( @addgroups ? 1:0 ) + ( @delgroups ? 1:0 ) + ( @modgroups ? 1:0 ) > 1 or
98     ( ( @permitprivs or @denyprivs ) and not @forobjects ) or
99     ( $adduser ? 1:0 ) + ( $deluser ? 1:0 ) + ( $moduser ? 1:0 ) > 1 or
100     ( ( @addtogroups or @delfromgroups or
101         length($password) > 0 or
102         length($host_password) > 0 or
103         length($commonname) > 0 ) and
104       ( length($adduser) + length($addhost) + length($moduser) == 0 ) ) )
105 {
106     print STDERR "Usage: $0 [options...]\n",
107     "Group Options:\n",
108     "  --addgroup=GROUP        add group\n",
109     "  --delgroup=GROUP        delete group\n",
110     "  --modgroup=GROUP        modify group\n",
111     "  --permit=PRIVILEGE      add privilege to group(s)\n",
112     "  --deny=PRIVILEGE        revoke privilege from group(s)\n",
113     "  --for=TREE              subject of privilege or '*'\n",
114     "  --force                 change privilege for non-existent object\n",
115     "  --showgroup=GROUP       display group details\n",
116     "User Options:\n",
117     "  --adduser=UID           add new user\n",
118     "  --deluser=UID           delete user\n",
119     "  --moduser=UID           modify user\n",
120     "  --addtogroup=GROUP      add user to group(s)\n",
121     "  --delfromgroup=GROUP    delete user from group(s)\n",
122     "  --password=PASSWORD     set the user password\n",
123     "  --hostpassword=PASSWORD set the host password (UID must be a host)\n",
124     "  --cn=\"John Smith\"       set the user common name\n",
125     "  --showuser=USER         display user details\n",
126     "General Options:\n",
127     "  --export=FILE           export ACL config to a file\n",
128     "  --template=NAME         [aclexport.xml] export template \n",
129     "  --import=FILE           import ACL config from a file\n",
130     "  --clear                 delete ALL user and privileges configuration\n",
131     "  --list                  list all users and groups they belong to\n",
132     "  --debug                 set the log level to debug\n",
133     "  --verbose               set the log level to verbose\n",
134     "  --help                  this help message\n\n",
135     "Privileges:\n",
136     "  DisplayTree             see the datasources for a tree\n",
137     "  DisplayAdmInfo          see the administrative info for a tree\n",
138     "  DisplayReports          see the administrative info for a tree\n",
139     "  GlobalSearch            search globally for '*'\n";
140     exit 1;
141 }
142
143 if( $debug )
144 {
145     Torrus::Log::setLevel('debug');
146 }
147 elsif( $verbose )
148 {
149     Torrus::Log::setLevel('verbose');
150 }
151
152 # We set the signal handlers, but we actually don't react on
153 # signals, because the acledit is a fast utility
154 &Torrus::DB::setSafeSignalHandlers();
155
156 Verbose(sprintf("Torrus version %s", '@VERSION@'));
157
158 my $aclEdit = new Torrus::ACL::Edit;
159
160 if( $ok and $exportfile )
161 {
162     $ok = $aclEdit->exportACL( $exportfile, $exporttemplate ) ? $ok:0;
163 }
164
165 if( $ok and $clearconf )
166 {
167     $ok = $aclEdit->clearConfig() ? $ok:0;
168 }
169
170 if( @delgroups )
171 {
172     $ok = $aclEdit->deleteGroups( @delgroups ) ? $ok:0;
173 }
174
175 if( @addgroups )
176 {
177     $ok = $aclEdit->addGroups( @addgroups ) ? $ok:0;
178 }
179
180 if( @addgroups or @modgroups )
181 {
182     my $groups = [ @addgroups, @modgroups ];
183     if( @permitprivs )
184     {
185         $ok = setupPrivileges( $aclEdit, \@permitprivs,
186                                $groups, \@forobjects, 1 ) ? $ok:0;
187     }
188     if( @denyprivs )
189     {
190         $ok = setupPrivileges( $aclEdit, \@denyprivs,
191                                $groups, \@forobjects, 0 ) ? $ok:0;
192     }
193 }
194
195
196 my $attrValues = {};
197 my $uid;
198
199 if( $commonname )
200 {
201     $attrValues->{'cn'} = $commonname;
202 }
203
204 if( $adduser )
205 {
206     $uid = $adduser;
207     $ok = $aclEdit->addUser( $uid, $attrValues ) ? $ok:0;
208 }
209 elsif( $addhost )
210 {
211     $uid = $addhost;
212     $uid =~ s/\W/_/g;
213     $ok = $aclEdit->addUser( $uid, $attrValues ) ? $ok:0;
214 }
215
216 elsif( $moduser )
217 {
218     $uid = $moduser;
219     if( scalar( keys %{$attrValues} ) )
220     {
221         $ok = $aclEdit->setUserAttributes( $uid, $attrValues ) ? $ok:0;
222     }
223 }
224 elsif( $deluser )
225 {
226     $ok = $aclEdit->deleteUser( $deluser ) ? $ok:0;
227 }
228
229 if( $uid )
230 {
231     if( $password )
232     {
233         $ok = $aclEdit->setPassword( $uid, $password ) ? $ok:0;
234     }
235     elsif( $host_password )
236     {
237         $ok = $aclEdit->setPassword( $uid,
238                                      $uid . '//' . $host_password ) ? $ok:0;
239     }
240 }
241
242 if( $uid and scalar( @addtogroups ) )
243 {
244     $ok = $aclEdit->addUserToGroups( $uid, @addtogroups ) ? $ok:0;
245 }
246
247 if( $uid and scalar( @delfromgroups ) )
248 {
249     $ok = $aclEdit->delUserFromGroups( $uid, @delfromgroups ) ? $ok:0;
250 }
251
252 if( $ok and $importfile )
253 {
254     $ok = $aclEdit->importACL( $importfile ) ? $ok:0;
255 }
256
257 if( $listall )
258 {
259     @showusers = $aclEdit->listUsers();
260     @showgroups = $aclEdit->listGroups();
261 }
262
263 my %showGroupsHash;
264
265 if( @showgroups )
266 {
267     foreach my $group ( @showgroups )
268     {
269         if( $aclEdit->groupExists( $group ) )
270         {
271             $showGroupsHash{$group} = 1;
272         }
273         else
274         {
275             Error('No such group: ' . $group); $ok = 0;
276         }
277     }
278 }
279
280 if( @showusers )
281 {
282     foreach my $uid ( sort @showusers )
283     {
284         if( $aclEdit->userExists( $uid ) )
285         {
286             printf("User: %s (%s)\n",
287                    $uid, $aclEdit->userAttribute( $uid, 'cn' ) );
288             foreach my $group ( sort $aclEdit->memberOf( $uid ) )
289             {
290                 printf("Member of: %s\n", $group);
291                 $showGroupsHash{$group} = 1;
292             }
293
294             if( $verbose or $debug )
295             {
296                 printf("Modified: %s\n",
297                        $aclEdit->userAttribute( $uid, 'modified' ) );
298             }
299             printf ("\n");
300         }
301         else
302         {
303             Error('No such user: ' . $uid); $ok = 0;
304         }
305     }
306 }
307
308 if( %showGroupsHash )
309 {
310     foreach my $group ( sort keys %showGroupsHash )
311     {
312         printf("Group: %s\n", $group);
313
314         my $privs = $aclEdit->listPrivileges( $group );
315         foreach my $object ( sort keys %{$privs} )
316         {
317             foreach my $priv ( sort keys %{$privs->{$object}} )
318             {
319                 printf("Has privilege \"%s\" for %s \"%s\"\n", $priv,
320                        $knownPrivileges{$priv}, $object);
321             }
322         }
323
324         foreach my $uid ( sort @{$aclEdit->listGroupMembers( $group )} )
325         {
326             printf("Member: %s\n", $uid);
327         }
328
329         if( $verbose or $debug )
330         {
331             printf("Modified: %s\n",
332                    $aclEdit->groupAttribute( $group, 'modified' ) );
333         }
334
335         printf ("\n");
336     }
337 }
338
339 if( not $ok )
340 {
341     Warn('acledit exited with errors');
342 }
343 exit( $ok ? 0:1 );
344
345 sub setupPrivileges
346 {
347     my $aclEdtit = shift;
348     my $privs = shift;
349     my $groups = shift;
350     my $objects = shift;
351     my $permit = shift;
352
353     my $ok = 1;
354     foreach my $priv ( @{$privs} )
355     {
356         if( defined( $knownPrivileges{$priv} ) )
357         {
358             if( $knownPrivileges{$priv} eq 'tree' )
359             {
360                 foreach my $obj ( @{$objects} )
361                 {
362                     if( $obj eq '*' or
363                         Torrus::SiteConfig::treeExists( $obj ) or $force )
364                     {
365                         foreach my $group ( @{$groups} )
366                         {
367                             if( $permit )
368                             {
369                                 $ok = $aclEdit->
370                                     setPrivilege( $group, $obj,
371                                                   $priv ) ? $ok:0;
372                             }
373                             else
374                             {
375                                 $ok = $aclEdit->
376                                     clearPrivilege( $group, $obj,
377                                                     $priv ) ? $ok:0;
378                             }
379                         }
380                     }
381                     else
382                     {
383                         Error('No such tree: ' . $obj); $ok = 0;
384                     }
385                 }
386             }
387             elsif( $knownPrivileges{$priv} eq 'global' )
388             {
389                 foreach my $obj ( @{$objects} )
390                 {
391                     if( $obj ne '*' )
392                     {
393                         Error("Privilege GlobalSearch should be for '*'");
394                         $ok = 0;
395                     }                    
396                 }
397
398                 if( $ok )
399                 {
400                     foreach my $group ( @{$groups} )
401                     {
402                         if( $permit )
403                         {
404                             $ok = $aclEdit->
405                                 setPrivilege( $group, '*', $priv ) ? $ok:0;
406                         }
407                         else
408                         {
409                             $ok = $aclEdit->
410                                 clearPrivilege( $group, '*', $priv ) ? $ok:0;
411                         }
412                     }
413                 }
414             }
415         }
416         else
417         {
418             Error('Unknown privilege name: ' . $priv); $ok = 0;
419         }
420     }
421     return $ok;
422 }
423
424
425
426
427
428 # Local Variables:
429 # mode: perl
430 # indent-tabs-mode: nil
431 # perl-indent-level: 4
432 # End: