--- /usr/lib/sympa/bin/alias_manager.pl.orig 2008-08-06 15:13:16.000000000 +0200 +++ /usr/lib/sympa/bin/alias_manager.pl 2008-08-18 08:23:22.000000000 +0200 @@ -41,14 +41,16 @@ exit(1); } my $tmp_alias_file = $Conf{'tmpdir'}.'/sympa_aliases.'.time; +my $tmp_virtual_file = $Conf{'tmpdir'}.'/sympa_virtual.'.time; - -my $alias_wrapper = '/usr/lib/sympa/bin/aliaswrapper'; +my $alias_wrapper = '/usr/sbin/postalias /etc/mail/sympa.aliases'; my $lock_file = '/var/lib/sympa/expl/alias_manager.lock'; my $default_domain; my $path_to_queue = '/usr/lib/sympa/bin/queue'; my $path_to_bouncequeue = '/usr/lib/sympa/bin/bouncequeue'; my $sympa_conf_file = '/etc/sympa/sympa.conf'; +my $virtual_file = '/etc/mail/sympa.virtual'; +my $virtual_wrapper = '/usr/sbin/postmap /etc/mail/sympa.virtual'; my ($operation, $listname, $domain, $file) = @ARGV; @@ -68,6 +70,11 @@ print STDERR "Unable to access $alias_file\n"; exit(5); } + +unless (-w "$virtual_file") { + print STDERR "Unable to access $virtual_file\n"; + exit(5); +} my %data; $data{'date'} = &POSIX::strftime("%d %b %Y", localtime(time)); @@ -93,6 +100,20 @@ print STDERR "No aliases defined\n"; exit(15); } +my @virtuals; + +if ($domain ne $default_domain) { + + my $virtual_dump; + &tt2::parse_tt2 (\%data, 'list_virtual.tt2',\$virtual_dump, $tt2_include_path); + + @virtuals = split /\n/, $virtual_dump; + + unless (@virtuals) { + print STDERR "No virtuals defined\n"; + exit(15); + } +} if ($operation eq 'add') { ## Create a lock @@ -118,6 +139,29 @@ } close ALIAS; + + if ($domain ne $default_domain) { + if (&already_defined_virtual(@virtuals)) { + printf STDERR "some virtual already exist\n"; + exit(13); + } + + unless (open VIRTUAL, ">> $virtual_file") { + print STDERR "Unable to append to $virtual_file\n"; + exit(5); + } + + foreach (@virtuals) { + print VIRTUAL "$_\n"; + } + close VIRTUAL; + + # Virtual wrapper + unless (system($virtual_wrapper) == 0) { + print STDERR "Failed to execute postmap: $!\n"; + exit(6) + } + } ## Newaliases unless ($file) { unless (system($alias_wrapper) == 0) { @@ -125,7 +169,6 @@ exit(6) } } - ## Unlock flock LF, 8; close LF; @@ -169,6 +212,42 @@ } close ALIAS ; close NEWALIAS; + + if ($domain ne $default_domain) { + unless (open VIRTUAL, "$virtual_file") { + print STDERR "Could not read $virtual_file\n"; + exit(7); + } + + unless (open NEWVIRTUAL, ">$tmp_virtual_file") { + printf STDERR "Could not create $tmp_virtual_file\n"; + exit (8); + } + + while (my $virtual = ) { + my $left_side = ''; + $left_side = $1 if ($virtual =~ /^([^ ]+) +/); + + my $to_be_deleted = 0; + + foreach my $new_virtual (@virtuals) { + next unless ($new_virtual =~ /^([^ ]+) +/); + my $new_left_side = $1; + + if ($left_side eq $new_left_side) { + push @deleted_lines, $virtual; + $to_be_deleted = 1; + last; + } + } + unless ($to_be_deleted) { + ## append to new virtual file + print NEWVIRTUAL $virtual; + } + } + close VIRTUAL; + close NEWVIRTUAL; + } if ($#deleted_lines == -1) { print STDERR "No matching line in $alias_file\n" ; @@ -189,6 +268,21 @@ close NEWALIAS; unlink $tmp_alias_file; + unless(open NEWVIRTUAL, "$tmp_virtual_file") { + print STDERR "Could not read $tmp_virtual_file\n"; + exit(10); + } + + unless (open OLDVIRTUAL, ">$virtual_file") { + print STDERR "Could not overwrite $virtual_file\n"; + exit(11); + } + print OLDVIRTUAL ; + close OLDVIRTUAL; + close NEWVIRTUAL; + unlink $tmp_virtual_file; + + ## Newaliases unless ($file) { unless (system($alias_wrapper) == 0) { @@ -196,6 +290,13 @@ exit (6); } } + + unless ($file) { + unless (system($virtual_wrapper) == 0) { + print STDERR "Failed to execute postmap: $!\n"; + exit(6); + } + } ## Unlock flock LF, 8; close LF; @@ -236,3 +337,31 @@ return 0; } +sub already_defined_virtual { + my @virtuals = @_; + + unless (open VIRTUAL, "$virtual_file") { + printf STDERR "Could not read $virtual_file\n"; + exit(7); + } + + while (my $virtual = ) { + # skip comment + next if $virtual =~ /^#/ ; + $virtual =~ /^([^ ]+) +/; + my $left_side = $1; + next unless ($left_side); + foreach (@virtuals) { + next unless ($_ =~ /^([^ ]+) +/); + my $new_left_side = $1; + if ($left_side eq $new_left_side) { + print STDERR "Virtual already defined : $left_side\n"; + return 1; + } + } + } + + close VIRTUAL; + return 0; +} +