#!/usr/bin/perl -w #============================================================================== # lat-pseudonyms # ============== # 0.9.0 (2004-09-08) # (c)2003-2004 Altiplano bvba #============================================================================== package esmith; use strict; use esmith::db; use esmith::util; use Getopt::Long; use Pod::Usage; my %conf; tie %conf, 'esmith::config'; my %accounts; tie %accounts, 'esmith::config', '/home/e-smith/db/accounts'; my %domains; tie %domains, 'esmith::config', '/home/e-smith/db/domains'; my ($Hlp, $Cml, $Frc, $Inp); my $Add =0; my $Del =0; #============================================================================== # Main #============================================================================== # Analyze commandline options GetOptions ("help" => \$Hlp, "add" => \$Add, "delete" => \$Del, "force" => \$Frc, "command-line=s" => \$Cml, "input-file=s" => \$Inp); if ( $Hlp ) { &PrintPod(9); exit; } # We need one argument or the other, but not both if ((($Cml && $Inp) || (! $Cml && ! $Inp)) || ($Add + $Del != 1)) { &PrintPod(1); exit; } my @records; if ($Inp) { open(LIST,"< $Inp") || die "Can't find $Inp.\n"; @records = grep(!/(^\s*#)|(^\s*$)/,); close(LIST); } elsif ($Cml) { @records=($Cml); } else { &PrintPod(1); exit; } # Process each user foreach my $record (@records) { my @fields=split(/\|/,$record); for (my $cnt=0; $cnt <= $#fields; ++$cnt) { for ($fields[$cnt]) { s/^\s+//; s/\s+$//; }} if (((db_get(\%accounts, $fields[0])) && (db_get_type(\%accounts, $fields[0]) eq "user" )) || ((db_get(\%accounts, $fields[0])) && (db_get_type(\%accounts, $fields[0]) eq "group")) || ($fields[0] eq 'admin')) { if (@fields == 1 ) { print "We need at least one pseudonym for user '$fields[0]' to perform this action.\n\a"; } for (my $count=1; $count<@fields;++$count) { # Add pseudonyms if ($Add) { if ( ! db_get(\%accounts, $fields[$count])) { if ( &TestName($fields[$count])) { print "Creating pseudonym '$fields[$count]' for user $fields[0]...\n"; db_set(\%accounts, $fields[$count], 'pseudonym', {"Account", $fields[0]}); system("/sbin/e-smith/signal-event", "pseudonym-create", $fields[$count], $fields[0]) == 0 or die("An error occurred while creating pseudonym '$fields[$count]'.\n\a"); } } else { print "Pseudonym '$fields[$count]'already exists.\n\a"; } } # Delete pseudonyms if ($Del) { if ((db_get(\%accounts, $fields[$count])) && (db_get_type(\%accounts, $fields[$count]) eq "pseudonym")) { my $yn = 'yes'; if (! $Frc) { print "Do you want to delete pseudonym '$fields[$count]' [yes/NO/all]? "; $yn = ; if ($yn =~ /^a/i) { $Frc = -1; $yn="yes"; } } if ($yn =~ /^y/i) { print "Deleting pseudonym '$fields[$count]'.\n"; db_delete(\%accounts, $fields[$count], 'pseudonym', {"Account", $fields[0]}); system("/sbin/e-smith/signal-event", "pseudonym-delete", $fields[$count], $fields[0]) == 0 or die("An error occurred while deleting pseudonym '$fields[$count]'.\n\a"); } } else { print "Pseudonym '$fields[$count]' does not exist on this server.\n\a"; } } } } else { print "There is no user or group with the name '$fields[0]' on this server.\a\n"; } } #============================================================================== # Subroutines #============================================================================== # Test name for illegal characters sub TestName { if ( $_[0] =~ /^[a-z][a-z\-\_\d\.]*$/ ) { return -1; } elsif ( $_[0] =~ /^[a-z][a-z\-\_\d\.]*\@([a-z\-\_\d\.]*)$/ ) { print "Trying to create a pseudonym specific for $1 domain,\n"; print "checking if domain is configured for this server... \n"; if (((db_get(\%domains, $1)) && (db_get_type(\%domains, $1) eq "domain" )) ){ print "yes, it exists, go on!!\n"; return -1 } } else { print "The pseudonym '$_[0]' contains illegal characters. The name should "; print "contain only\nlower-case letters, numbers, hyphens, periods "; print "and underscores, and should\nstart with a lower-case letter.\n\a"; return 0; } } #============================================================================== # Print the pod text as a help screen sub PrintPod { my ($verbose, $message) = @_; pod2usage(-verbose => $verbose, -message => $message, -exitval => 64); } #============================================================================== =pod =head1 NAME B - The lazy administrator's tool to add pseudonyms =head1 DESCRIPTION Adds or deletes e-mail pseudonyms to existing user or group accounts on Mitel's SME servers (5.x/6.x). This tool is functionally equivalent to the 'Pseudonyms' option in the server-manager, but can be run from the command line or called from an other script. It allows you, for example, to create a large number of e-mail aliases in a batch process, or delete the standard pseudonyms on a remote machine via an ssh console. See F for the format of the input file. =head1 SYNOPSIS B -a -c "username | pseudonym1 | pseudonym2" B -a -i /path/to/quota.list B -d [-f] -c "user | pseudonym" B -d [-f] -i /path/to/quota.list =head1 OPTIONS The following options are supported: =over 4 =item B<-a>, B<--add> Add a pseudonym to a user or group. =item B<-c "Arguments">, B<--command-line="Arguments"> Take arguments from the command line. See the 'Arguments' section below for the various arguments that are accepted. =item B<-d>, B<--delete> Delete a pseudonym from the server =item B<-f>, B<--force> Don't prompt before deleting. =item B<-h>, B<--help> Extended help for this tool =item B<-i FILE>, B<--input-file=FILE> Use the information from FILE to create or delete the pseudonyms. =back =head2 Arguments: user* : Must be a valid user or group on the server. pseudonym* : Must contain only lower-case letters, numbers, hyphens, arobase, periods and underscores, and should start with a lower-case letter. * mandatory field =head1 EXAMPLES B Creates the pseudonyms 'wizard', 'seeker' and 'potter@existinglocaldomain.com' for user 'harry'. B Creates the pseudonyms defined in F. Refer to F for an example of an input file. B Deletes pseudonyms 'wizard' and 'seeker' from user 'harry'. The pseudonyms are deleted without prompting (-f). =head1 SEE ALSO lat-group(8), lat-users(8), lat-ibays(8), lat-quota(8), lat-domains(8), lat-hosts(8), lat-procmail(8), lat-pptp(8), lat-dump(8) =head1 VERSION Version 0.9.0 (2004-09-08). The latest version is hosted at B =head1 COPYRIGHT (c)2003-2004, Altiplano bvba (B). Released under the terms of the GNU license. =head1 BUGS Please report bugs to =cut #==============================================================================