#!/usr/bin/perl # # createdomobj.pl # # create single or continuously numbered domain # users/groups/aliases via rpc # # Copyright (C) Michael Adam 2007 # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation; either version 3 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # You should have received a copy of the GNU General Public License along with # this program; if not, see . # # # WARNING: This script is still rather crude. # use strict; use Getopt::Std; my $target_type = "group"; # what type of object to create my $rpc_cmd = "createdom".$target_type; my $rpccli_cmd = "rpcclient"; # defaults: my $server; my $num_targets = 1; my $startnum; # if empty, don't add numbers to prefix my $prefix; # name-prefix my $path; # path to rpcclient command my $rpccli_path = $rpccli_cmd; my $creds; sub usage { print "USAGE: $0 [-h] -S server -U user\%pass [-p prefix] \\\n" . "\t[-t {alias|group|user}] [-s startnum] [-n numobjs] [-P path] \n"; } # parse commandline: my %options = (); getopts("U:t:S:s:n:p:P:h", \%options); if (exists($options{h})) { usage(); exit 0; } if (exists($options{t})) { $target_type = $options{t}; if ($target_type !~ /^(alias|user|group)$/) { print "ERROR: invalid target type given\n"; usage(); exit 1; } $rpc_cmd = "createdom".$target_type; } if (exists($options{U})) { $creds = "-U $options{U}"; if ($creds !~ '%') { print "ERROR: you need to specify credentials in the form -U user\%pass\n"; usage(); exit 1; } } else { print "ERROR: mandatory argument '-U' missing\n"; usage(); exit 1; } if (exists($options{S})) { $server = $options{S}; } else { print "ERROR: madatory argument '-S' missing\n"; usage(); exit 1; } if (exists($options{s})) { $startnum = $options{s}; } if (exists($options{n})) { $num_targets = $options{n}; } if (exists($options{p})) { $prefix = $options{p}; } else { $prefix = $target_type; } if (exists($options{P})) { $path = $options{p}; $rpccli_path = "$path/$rpccli_cmd"; } if (@ARGV) { print "ERROR: junk on the command line ('" . join(" ", @ARGV) . "')...\n"; usage(); exit 1; } # utility functions: sub open_rpc_pipe { print "opening rpc pipe\n"; open(IPC, "| $rpccli_cmd $server $creds -d0") or die "error opening rpc pipe."; } sub close_rpc_pipe { print "closing rpc pipe\n"; close(IPC); } sub do_create { my $target_name = shift; print "creating $target_type $target_name\n"; print IPC "$rpc_cmd $target_name\n"; } # main: open_rpc_pipe(); if ("x$startnum" eq "x") { do_create($prefix); } else { for (my $num = 1; $num <= $num_targets; ++$num) { do_create(sprintf "%s%.05d", $prefix, $startnum + $num - 1); if (($num) % 500 == 0) { printf("500 ".$target_type."s created\n"); close_rpc_pipe(); sleep 2; open_rpc_pipe(); } } } close_rpc_pipe();