#!/usr/bin/perl # # Adapted from the alias_manager.pl provided with the Sympa distribution # See alias_manager.pl.bak for the original version. # This script is intended to create automatically list aliases when using Sympa. # Aliases are created for use with the qmail virtual host installation in /var/qmail # $ENV{'PATH'} = ''; # Load Sympa.conf use strict; use lib '/home/sympa/bin'; use Conf; use POSIX; require "tools.pl"; require "tt2.pl"; unless ( Conf::load('/etc/sympa.conf') ) { print STDERR gettext("The configuration file /etc/sympa.conf contains errors.\n"); exit(1); } my $alias_wrapper = '/home/sympa/bin/aliaswrapper'; my $lock_file = '/home/sympa/expl/alias_manager.lock'; my $default_domain; my $path_to_queue = '/home/sympa/bin/queue'; my $path_to_bouncequeue = '/home/sympa/bin/bouncequeue'; my $sympa_conf_file = '/etc/sympa.conf'; my ( $operation, $listname, $domain, $file ) = @ARGV; if ( ( $operation !~ /^(add)|(del)$/ ) || ( $#ARGV < 2 ) ) { printf STDERR "Usage: $0 []\n"; exit(2); } # Ensure that the domain parameter was provided if ( ! $domain ) { print STDERR "Usage: robot/domain parameter required\n"; exit(2); } $default_domain = $Conf{'domain'}; my %data; $data{'date'} = &POSIX::strftime( "%d %b %Y", localtime(time) ); $data{'list'}{'domain'} = $data{'robot'} = $domain; $data{'list'}{'name'} = $listname; $data{'default_domain'} = $default_domain; $data{'is_default_domain'} = 1 if ( $domain eq $default_domain ); $data{'return_path_suffix'} = &Conf::get_robot_conf( $domain, 'return_path_suffix' ); my $qmail_mailname_dir = '/var/qmail/mailnames/' . $domain . '/'; # Set up hash of alias files and their contents to add/delete my %aliases = ( ".qmail-$listname" => "|/home/sympa/bin/queue $listname\@$domain", ".qmail-$listname-request" => "|/home/sympa/bin/queue $listname-request\@$domain", ".qmail-$listname-editor" => "|/home/sympa/bin/queue $listname-editor\@$domain", ".qmail-$listname-subscribe" => "|/home/sympa/bin/queue $listname-subscribe\@$domain", ".qmail-$listname-unsubscribe" => "|/home/sympa/bin/queue $listname-unsubscribe\@$domain", ".qmail-$listname-owner" => "|/home/sympa/bin/queue $listname-owner\@$domain" ); if ( $operation eq 'add' ) { # Create a lock unless ( open( LF, ">>$lock_file" ) ) { print STDERR "Can't open lock file $lock_file\n"; exit(14); } flock LF, 2; # Iterate over aliases, create as needed foreach my $alias_file ( keys %aliases ) { # Check for existing alias if ( -r "$qmail_mailname_dir/$alias_file" ) { print STDERR "Alias file $alias_file already exists\n"; next; } unless ( open ALIAS, "> $qmail_mailname_dir/$alias_file" ) { print STDERR "Unable to open file $qmail_mailname_dir/$alias_file: $!\n"; exit(5); } print ALIAS $aliases{$alias_file}; unless ( close ALIAS ) { print STDERR "Unable to close file: $!\n"; exit(5); } # # TODO: uid & guid are popuser.popuser - this should really be done in a better way # (i.e., create files AS popuser.popuser by changing effective uid/gid of script) # chown 110, 110, "$qmail_mailname_dir/$alias_file"; } # Unlock flock LF, 8; close LF; } elsif ( $operation eq 'del' ) { # Create a lock open( LF, ">>$lock_file" ) || die "Can't open lock file $lock_file"; flock LF, 2; # Iterate over aliases, remove as needed foreach my $alias_file ( keys %aliases ) { # Check for existing alias if ( ! -f "$qmail_mailname_dir/$alias_file" ) { print STDERR "Alias file $alias_file does not exist\n"; next; } unless ( unlink "$qmail_mailname_dir/$alias_file" ) { print STDERR "Unable to remove alias file $alias_file: $!\n"; exit(11); } } # Unlock flock LF, 8; close LF; } else { print STDERR "Action $operation not implemented yet\n"; exit(2); } exit 0;