diff options
Diffstat (limited to 'bin/sendmail.import')
| -rw-r--r-- | bin/sendmail.import | 178 | 
1 files changed, 178 insertions, 0 deletions
| diff --git a/bin/sendmail.import b/bin/sendmail.import new file mode 100644 index 000000000..ef745fc46 --- /dev/null +++ b/bin/sendmail.import @@ -0,0 +1,178 @@ +#!/usr/bin/perl -w + +use strict; +use Term::Query qw(query); +use Net::SCP qw(iscp); +use FS::UID qw(adminsuidsetup datasrc); +use FS::Record qw(qsearch qsearchs); +##use FS::svc_acct_sm; +#use FS::svc_domain; +#use FS::domain_record; +use FS::svc_acct; +##use FS::part_svc; +use FS::svc_forward; +use FS::svc_domain; + +my $user = shift or die &usage; +adminsuidsetup $user; + +#$FS::svc_Common::noexport_hack = 1; +#$FS::domain_record::noserial_hack = 1; + +use vars qw($defaultdomain); +$defaultdomain = '295.ca'; + +use vars qw(@svcpart $forward_svcpart); +@svcpart = qw( 2 4 ); +$forward_svcpart = 7; + +use vars qw($spooldir); +$spooldir = "/usr/local/etc/freeside/export.". datasrc. "/sendmail"; +mkdir($spooldir, 0755) unless -d $spooldir; + +print "\n\n", <<END; +Enter the location and name of your Sendmail aliases file, for example +"mail.isp.com:/etc/mail/aliases" +END +my($aliases)=&getvalue(":"); + +use vars qw($aliases_machine $aliases_prefix); +$aliases_machine = (split(/:/, $aliases))[0]; +$aliases_prefix = "$spooldir/$aliases_machine"; +mkdir($aliases_prefix, 0755) unless -d $aliases_prefix; + +#iscp("root\@$aliases","$aliases_prefix/aliases.import"); +iscp("ivan\@$aliases","$aliases_prefix/aliases.import"); + +print "\n\n", <<END; +Enter the location and name of your Sendmail virtusertable directory, for example +"mail.isp.com:/etc/mail/virtusertable" +END +my($virtusertable)=&getvalue(":"); + +use vars qw($virtusertable_machine $virtusertable_prefix); +$virtusertable_machine = (split(/:/, $virtusertable))[0]; +$virtusertable_prefix = "$spooldir/$virtusertable_machine"; +mkdir($virtusertable_prefix, 0755) unless -d $virtusertable_prefix; +mkdir("$virtusertable_prefix/virtusertable.import", 0755) +  unless -d "$virtusertable_prefix/virtusertable.import"; + +#iscp("root\@$virtusertable/*","$aliases_prefix/virtusertable.import/"); +iscp("ivan\@$virtusertable/*","$aliases_prefix/virtusertable.import/"); + +sub getvalue { +  my $prompt = shift; +  $^W=0; # Term::Query isn't -w-safe +  my $return = query $prompt, ''; +  $^W=1; +  $return; +} + +print "\n\n"; + +## + +foreach my $file (  +  "$aliases_prefix/aliases.import", +  glob("$aliases_prefix/virtusertable.import/*"), +) { + +  warn "importing $file\n"; +   +  open(FILE,"<$file") or die $!; +  while (<FILE>) { +    next if /^\s*#/ || /^\s*$/; #skip comments & blank lines +   +    unless ( /^([\w\@\.\-]+)[:\s]\s*(.*\S)\s*$/ ) { +      warn "Unparsable line: $_"; +      next; +    } +    my($rawusername, $rawdest) = ($1, $2); +   +    my($username, $domain); +    if ( $rawusername =~ /^([\w\-\.\&]*)\@([\w\.\-]+)$/ ) { +      $username = $1; +      $domain = $2; +    } elsif ( $rawusername =~ /\@/ ) { +      die "Unparsable username: $rawusername\n"; +    } else { +      $username = $rawusername; +      $domain = $defaultdomain; +    } +   +    #find svc_acct record or set $src +    my($srcsvc, $src) = &svcnum_or_literal($username, $domain); + +    foreach my $dest ( split(/,/, $rawdest) ) { + +      my($dusername, $ddomain); +      if ( $dest =~ /^([\w\-\.\&]+)\@([\w\.\-]+)$/ ) { +        $dusername = $1; +        $ddomain = $2;           +      } elsif ( $dest =~ /\@/ ) { +        die "Unparsable username: $dest\n"; +      } else {                  +        $dusername = $dest; +        $ddomain = $defaultdomain; +      } +      my($dstsvc, $dst) = &svcnum_or_literal($dusername, $ddomain); + +      my $svc_forward = new FS::svc_forward ({ +        svcpart => $forward_svcpart, +        srcsvc => $srcsvc, +        src    => $src, +        dstsvc => $dstsvc, +        dst    => $dst, +      }); +      my $error = $svc_forward->insert; +      #my $error = $svc_forward->check; +      if ( $error ) { +        die "$rawusername: $rawdest: $error\n"; +      } +    } + + +  } #next entry + +} #next file +   +## + +sub svcnum_or_literal { +  my($username, $domain) = @_; + +  my $svc_domain = qsearchs('svc_domain', { 'domain' => $domain } ); +  my $domsvc = $svc_domain ? $svc_domain->svcnum : ''; + +  my @svc_acct = grep { my $svc_acct = $_; +                        grep { $svc_acct->cust_svc->svcpart == $_ } @svcpart +                      } +                   qsearch('svc_acct', { +                     'username' => $username, +                     'domsvc'   => $domsvc, +                   }); + +  if ( scalar(@svc_acct) > 1 ) { +    die "multiple sources found for $username\@$domain !\n"; +  } + +  my( $svcnum, $literal ) = ('', ''); +  if ( @svc_acct ) { +    my $svc_acct = $svc_acct[0]; +    $svcnum = $svc_acct->svcnum; +  } else { +    $literal = "$username\@$domain"; +  } + +  return( $svcnum, $literal ); + +} + +sub usage { +  die "Usage:\n\n  sendmail.import user\n"; +} + + + + + | 
