1#!/usr/bin/perl 2 3# 4# adduserstogroups.pl 5# 6# add single or continuously numbered domain users 7# to a given single group or list of groups 8# 9# Copyright (C) Michael Adam <obnox@samba.org> 2007 10# 11# This program is free software; you can redistribute it and/or modify it 12# under the terms of the GNU General Public License as published by the Free 13# Software Foundation; either version 3 of the License, or (at your option) 14# any later version. 15# 16# This program is distributed in the hope that it will be useful, but WITHOUT 17# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 18# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 19# more details. 20# 21# You should have received a copy of the GNU General Public License along with 22# this program; if not, see <http://www.gnu.org/licenses/>. 23# 24 25# 26# WARNING: This script is still rather crude. 27# 28 29use strict; 30use Getopt::Std; 31 32my $net_cmd = "net"; 33 34# defaults: 35 36my $server; 37my $num_members = 1; 38my $startmem; # if empty, don't add numbers to member prefix 39my $member_prefix; # name prefix for member 40my $num_groups = 1; 41my $startgroup; # if empty, don't add numbers to group prefix 42my $group_prefix; # name prefix for group 43my $path; # path to rpcclient command 44my $net_path = $net_cmd; 45my $creds; 46 47sub usage { 48 print "USAGE: $0 [-h] -S server -U user\%pass \\\n" 49 . "\t-m member [-s startmem] [-n nummem] \\\n" 50 . "\t-g group [-G startgroup] [-N numgroups] \\\n" 51 . "\t[-P path]\n"; 52} 53 54# parse commandline: 55 56my %options = (); 57getopts("U:S:m:s:n:g:G:N:P:h", \%options); 58 59if (exists($options{h})) { 60 usage(); 61 exit 0; 62} 63 64if (exists($options{g})) { 65 $group_prefix = $options{g}; 66} 67else { 68 print "ERROR: mandatory argument '-g' missing\n"; 69 usage(); 70 exit 1; 71} 72 73if (exists($options{U})) { 74 $creds = "-U $options{U}"; 75 if ($creds !~ '%') { 76 print "ERROR: you need to specify credentials in the form -U user\%pass\n"; 77 usage(); 78 exit 1; 79 } 80} 81else { 82 print "ERROR: mandatory argument '-U' missing\n"; 83 usage(); 84 exit 1; 85} 86 87if (exists($options{S})) { 88 $server = $options{S}; 89} 90else { 91 print "ERROR: madatory argument '-S' missing\n"; 92 usage(); 93 exit 1; 94} 95 96if (exists($options{s})) { 97 $startmem = $options{s}; 98} 99 100if (exists($options{n})) { 101 $num_members = $options{n}; 102} 103 104if (exists($options{m})) { 105 $member_prefix = $options{m}; 106} 107else { 108 print "ERROR: mandatory argument '-m' missing\n"; 109 usage(); 110 exit 1; 111} 112 113if (exists($options{G})) { 114 $startgroup = $options{G}; 115} 116 117if (exists($options{N})) { 118 $num_groups = $options{N}; 119} 120 121if (exists($options{P})) { 122 $path = $options{p}; 123 $net_path = "$path/$net_cmd"; 124} 125 126if (@ARGV) { 127 print "ERROR: junk on the command line ('" . join(" ", @ARGV) . "')...\n"; 128 usage(); 129 exit 1; 130} 131 132# utility functions: 133 134sub do_add { 135 my $member_name = shift; 136 my $group_name = shift; 137 print "adding member $member_name to group $group_name\n"; 138 system("$net_path rpc -I $server ".$creds." group addmem $group_name $member_name"); 139} 140 141sub add_group_loop { 142 my $member_name = shift; 143 144 if ("x$startgroup" eq "x") { 145 do_add($member_name, $group_prefix); 146 } 147 else { 148 for (my $groupnum = 1; $groupnum <= $num_groups; ++$groupnum) { 149 do_add($member_name, 150 sprintf("%s%.05d", $group_prefix, $startgroup + $groupnum - 1)); 151 } 152 } 153} 154 155 156# main: 157 158if ("x$startmem" eq "x") { 159 add_group_loop($member_prefix); 160} 161else { 162 for (my $memnum = 1; $memnum <= $num_members; ++$memnum) { 163 add_group_loop(sprintf("%s%.05d", $member_prefix, $startmem + $memnum - 1)); 164 } 165} 166 167