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