1#!--PERL-- 2# -*- indent-tabs-mode: nil; -*- 3# vim:ft=perl:et:sw=4 4# $Id$ 5 6## This version of alias_manager.pl has been customized by Bea. 7## It has the ability to add/remove list aliases in a MySQL database for 8## vpopmail 9## To make sympa use this script, you should install it 10## as /home/sympa/bin/alias_manager.pl 11## You should edit all the $mysql_xxx below to use your own mysql database 12 13use strict; 14use warnings; 15use lib split(/:/, $ENV{SYMPALIB} || ''), '--modulesdir--'; 16use DBI; 17use POSIX; 18 19use Conf; 20use Sympa::Constants; 21use Sympa::Crash; # Show traceback. 22use Sympa::Template; 23 24$ENV{'PATH'} = ''; 25 26## Load Sympa.conf 27unless (Conf::load(Sympa::Constants::CONFIG)) { 28 print gettext("The configuration file contains errors.\n"); 29 exit(1); 30} 31 32## MYSQL configuration 33my $mysql_host = "localhost"; 34my $mysql_base = "vpopmail"; 35my $mysql_user = "vpopmail"; 36my $mysql_pass = "password"; 37 38my $default_domain; 39my $return_path_suffix; 40my ($operation, $listname, $domain, $file) = @ARGV; 41 42my $dbh; 43my $sql; 44my @enr; 45 46if (($operation !~ /^(add|del)$/) || ($#ARGV < 2)) { 47 printf "Usage: $0 <add|del> <listname> <domain> [<file>]\n"; 48 exit(2); 49} 50 51$default_domain = $Conf::Conf{'domain'}; 52$return_path_suffix = $Conf::Conf{'return_path_suffix'}; 53 54my %data; 55$data{'date'} = POSIX::strftime("%d %b %Y", localtime(time)); 56$data{'list'}{'domain'} = $data{'robot'} = $domain; 57$data{'list'}{'name'} = $listname; 58$data{'default_domain'} = $default_domain; 59#$data{'is_default_domain'} = 1 if ($domain eq $default_domain); 60$data{'is_default_domain'} = 1; 61$data{'return_path_suffix'} = $return_path_suffix; 62my @aliases; 63 64my $aliases_dump; 65my $template = Sympa::Template->new($domain); 66unless ($template->parse(\%data, 'list_aliases.tt2', \$aliases_dump)) { 67 print STDERR "Can't parse list_aliases.tt2\n"; 68 exit 15; 69} 70 71@aliases = split /\n/, $aliases_dump; 72 73unless (@aliases) { 74 print STDERR "No aliases defined\n"; 75 exit(15); 76} 77 78if ($operation eq 'add') { 79 80 ## Check existing aliases 81 if (already_defined(@aliases)) { 82 print STDERR "some alias already exist\n"; 83 exit(13); 84 } 85 86 if (!initialize_mysql()) { 87 print STDERR "Can't connect to MySQL database\n"; 88 exit(14); 89 } 90 91 foreach my $alias (@aliases) { 92 if ($alias =~ /^\#/) { 93 next; 94 } 95 96 $alias =~ /^([^\s:]+)[\s:]+(\".*\")$/; 97 my $alias_value = $1; 98 my $command_value = $2; 99 $command_value =~ s/\"//g; 100 101 # We create the new mysql alias. 102 $sql = 103 "INSERT INTO valias SET alias = '" 104 . $alias_value 105 . "', domain = '" 106 . $domain 107 . "', valias_line = '" 108 . $command_value . "'"; 109 110 # We finally add the entry 111 $dbh->do($sql) or die "$sql : $DBI::errstr"; 112 } 113 114 finalize_mysql(); 115 116} elsif ($operation eq 'del') { 117 118 if (!initialize_mysql()) { 119 print STDERR "Can't connect to MySQL database\n"; 120 exit(7); 121 } 122 123 foreach my $alias (@aliases) { 124 if ($alias =~ /^\#/) { 125 next; 126 } 127 128 $alias =~ /^([^\s:]+)[\s:]/; 129 my $alias_value = $1; 130 $alias_value =~ s/\+/\-/g; 131 132 $sql = 133 "DELETE FROM valias WHERE alias = '" 134 . $alias_value 135 . "' and domain = '" 136 . $domain . "'"; 137 $dbh->do($sql) or die "$sql : $DBI::errstr"; 138 } 139 140 finalize_mysql(); 141} else { 142 print STDERR "Action $operation not implemented yet\n"; 143 exit(2); 144} 145 146exit 0; 147 148## Check if an alias is already defined 149sub already_defined { 150 151 my @aliases = @_; 152 153 initialize_mysql(); 154 155 foreach my $alias (@aliases) { 156 if ($alias =~ /^\#/) { 157 next; 158 } 159 160 $alias =~ /^([^\s:]+)[\s:]/; 161 my $alias_value = $1; 162 $alias_value =~ s/\+/\-/g; 163 164 $sql = 165 "SELECT COUNT(alias) as e_alias FROM valias where alias = '" 166 . $alias_value 167 . "' and domain = '" 168 . $domain . "'"; 169 $dbh->do($sql) or die "$sql : $DBI::errstr"; 170 171 @enr = $dbh->selectrow_array($sql); 172 if ($enr[0] != 0) { 173 print STDERR "Alias already defined : $alias_value\n"; 174 finalize_mysql(); 175 return 1; 176 } 177 } 178 179 finalize_mysql(); 180 return 0; 181} 182 183## Connect to MySQL Database 184sub initialize_mysql { 185 unless ( 186 $dbh = DBI->connect( 187 "DBI:mysql:dbname=$mysql_base;host=$mysql_host", $mysql_user, 188 $mysql_pass 189 ) 190 ) { 191 print "Can't connect to Database :", $DBI::errstr; 192 return 0; 193 } 194 return 1; 195} 196 197## Close the MySQL Connection 198sub finalize_mysql { 199 $dbh->disconnect; 200} 201