From 8c7c167c5287758a16c6e9e57c3bc1c3dc3a1e2b Mon Sep 17 00:00:00 2001 From: ivan Date: Fri, 13 Feb 2004 14:04:22 +0000 Subject: add postfix export --- bin/postfix.export | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100755 bin/postfix.export (limited to 'bin/postfix.export') diff --git a/bin/postfix.export b/bin/postfix.export new file mode 100755 index 000000000..7894a3ad7 --- /dev/null +++ b/bin/postfix.export @@ -0,0 +1,121 @@ +#!/usr/bin/perl -w + +use strict; +#use File::Path; +use File::Rsync; +use Net::SSH qw(ssh); +use FS::UID qw(adminsuidsetup datasrc); +use FS::Record qw(qsearch); # qsearchs); +use FS::part_export; +#use FS::cust_pkg; +use FS::cust_svc; +#use FS::svc_domain; + +my $user = shift or die &usage; +adminsuidsetup $user; + +my $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/postfix"; +mkdir $spooldir, 0700 unless -d $spooldir; + +my @exports = qsearch('part_export', { 'exporttype' => 'postfix' } ); + +my $rsync = File::Rsync->new({ + rsh => 'ssh', +# dry_run => 1, +}); + +foreach my $export ( @exports ) { + + my $machine = $export->machine; + my $prefix = "$spooldir/$machine"; + mkdir $prefix, 0700 unless -d $prefix; + + #construct %domain hash + + my $mydomain = $export->option('mydomain'); + my %domain; + foreach my $svc_forward ( $export->svc_x ) { + + my( $username, $domain ); + my $srcsvc_acct = $svc_forward->srcsvc_acct; + if ( $srcsvc_acct ) { + ( $username, $domain ) = ( $srcsvc_acct->username, $srcsvc_acct->domain ); + } elsif ( $svc_forward->src =~ /([^@]*)\@([^@]+)$/ ) { + ( $username, $domain ) = ( $1, $2 ); + } else { + die "bad svc_forward record? svcnum ". $svc_forward->svcnum. "\n"; + } + + my( $dusername, $ddomain ); + my $dstsvc_acct = $svc_forward->dstsvc_acct; + if ( $dstsvc_acct ) { + $dusername = $dstsvc_acct->username; + $ddomain = $dstsvc_acct->domain; + } elsif ( $svc_forward->dst =~ /([^@]+)\@([^@]+)$/ ) { + ( $dusername, $ddomain ) = ( $1, $2 ); + } else { + die "bad svc_forward record? svcnum ". $svc_forward->svcnum. "\n"; + } + my $dest; + if ( $ddomain eq $mydomain ) { + $dest = $dusername; + } else { + $dest = "$dusername\@$ddomain"; + } + + push @{$domain{$domain}{$username}}, $dest; + + } + + #write aliases + + my $aliases = delete $domain{$mydomain}; + open(ALIASES, ">$prefix/aliases") or die "can't open $prefix/aliases: $!"; + foreach my $alias ( keys %$aliases ) { + print ALIASES "$alias: ". join(',', @{ $aliases->{$alias} } ). "\n"; + } + close ALIASES; + + #write virtual + + open(VIRTUAL, ">$prefix/virtual") or die "can't open $prefix/virtual: $!"; + foreach my $domain ( keys %domain ) { + print VIRTUAL "$domain DOMAIN\n"; + #foreach my $virtual ( sort { $a ne '' <=> $b ne '' } keys %{$domain{$domain}} ) { + foreach my $virtual ( sort { ( ($b ne '') <=> ($a ne '') ) || $a cmp $b } keys %{$domain{$domain}} ) { + print VIRTUAL "$virtual\@$domain ". + join(',', @{ $domain{$domain}{$virtual} } ). "\n"; + } + print VIRTUAL "\n"; + } + close VIRTUAL; + + #rsync + + my $user = $export->option('user'); + $rsync->exec( { + src => "$prefix/aliases", + dest => "$user\@$machine:". $export->option('aliases'), + } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err); +# warn $rsync->out; + + ssh("$user\@$machine", "newaliases"); +# ssh("$user\@$machine", "postfix reload"); + + $rsync->exec( { + src => "$prefix/virtual", + dest => "$user\@$machine:". $export->option('virtual'), + } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err); +# warn $rsync->out; + + ssh("$user\@$machine", "postfix reload"); + +} + +# ----- + +sub usage { + die "Usage:\n postfix.export user\n"; +} + + -- cgit v1.2.1 From ed9253ea9ea732fa3c827b10bbadf0ff7784c0b2 Mon Sep 17 00:00:00 2001 From: ivan Date: Fri, 13 Feb 2004 18:58:47 +0000 Subject: postfix export --- bin/postfix.export | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bin/postfix.export') diff --git a/bin/postfix.export b/bin/postfix.export index 7894a3ad7..64d973837 100755 --- a/bin/postfix.export +++ b/bin/postfix.export @@ -107,7 +107,7 @@ foreach my $export ( @exports ) { dest => "$user\@$machine:". $export->option('virtual'), } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err); # warn $rsync->out; - + ssh("$user\@$machine", "postmap hash:/etc/postfix/virtual"); ssh("$user\@$machine", "postfix reload"); } -- cgit v1.2.1 From 4121477dde8c9400bf81023bea3e0d980b34bf91 Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 10 May 2004 11:10:58 +0000 Subject: make postfix export commands configrable --- bin/postfix.export | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'bin/postfix.export') diff --git a/bin/postfix.export b/bin/postfix.export index 64d973837..dbb08ceb9 100755 --- a/bin/postfix.export +++ b/bin/postfix.export @@ -99,7 +99,7 @@ foreach my $export ( @exports ) { } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err); # warn $rsync->out; - ssh("$user\@$machine", "newaliases"); + ssh("$user\@$machine", $export->option('newaliases') || 'newaliases'); # ssh("$user\@$machine", "postfix reload"); $rsync->exec( { @@ -107,8 +107,9 @@ foreach my $export ( @exports ) { dest => "$user\@$machine:". $export->option('virtual'), } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err); # warn $rsync->out; - ssh("$user\@$machine", "postmap hash:/etc/postfix/virtual"); - ssh("$user\@$machine", "postfix reload"); + ssh("$user\@$machine", $export->option('postmap') + || 'postmap hash:/etc/postfix/virtual'); + ssh("$user\@$machine", $export->option('reload') || 'postfix reload'); } -- cgit v1.2.1