03b54e6f9875feb0f63f833d9247ff64961513b8
[freeside.git] / bin / sendmail.import
1 #!/usr/bin/perl -w
2
3 use strict;
4 use Term::Query qw(query);
5 use Net::SCP qw(iscp);
6 use FS::UID qw(adminsuidsetup datasrc);
7 use FS::Record qw(qsearch); #qsearchs);
8 ##use FS::svc_acct_sm;
9 #use FS::svc_domain;
10 #use FS::domain_record;
11 use FS::svc_acct;
12 ##use FS::part_svc;
13 use FS::svc_forward;
14 use FS::svc_domain;
15
16 my $user = shift or die &usage;
17 adminsuidsetup $user;
18
19 #$FS::svc_Common::noexport_hack = 1;
20 #$FS::domain_record::noserial_hack = 1;
21
22 use vars qw($defaultdomain);
23 $defaultdomain = 'surferz.net';
24
25 use vars qw($svcpart $domain_svcpart);
26 $svcpart = 2;
27 $domain_svcpart = 1;
28
29 use vars qw($spooldir);
30 $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/sendmail";
31 mkdir $spooldir unless -d $spooldir;
32
33 print "\n\n", <<END;
34 Enter the location and name of your Sendmail aliases file, for example
35 "mail.isp.com:/etc/mail/aliases"
36 END
37 my($aliases)=&getvalue(":");
38
39 use vars qw($aliases_machine $aliases_prefix);
40 $alises_machine = (split(/:/, $aliases))[0];
41 $aliases_prefix = "$spooldir/$aliases_machine";
42 mkdir $aliases_prefix unless -d $aliases_prefix;
43
44 iscp("root\@$aliases","$aliases_prefix/aliases.import");
45
46 print "\n\n", <<END;
47 Enter the location and name of your Sendmail virtusertable directory, for example
48 "mail.isp.com:/etc/mail/virtusertable"
49 END
50 my($virtusertable)=&getvalue(":");
51
52 use vars qw($virtusertable_machine $virtusertable_prefix);
53 $virtusertable_machine = (split(/:/, $virtusertable))[0];
54 $prefix = "$spooldir/$aliases_machine";
55 mkdir $prefix unless -d $prefix;
56 mkdir "$prefix/virtusertable.import" unless -d "$prefix/virtusertable.import";
57
58 iscp("root\@$virtusertable/*","$aliases_prefix/virtusertable.import/");
59
60 sub getvalue {
61   my $prompt = shift;
62   $^W=0; # Term::Query isn't -w-safe
63   my $return = query $prompt, '';
64   $^W=1;
65   $return;
66 }
67
68 print "\n\n";
69
70 ##
71
72 #!! handle all files
73
74 open(ALIASES,"<$aliases_prefix/aliases.import") or die $!;
75 while (<ALIASES>) {
76   next if /^\s*#/ || /^\s*$/; #skip comments & blank lines
77
78   #!! handle catchalls!!!
79
80   unless ( /^([\w\@\.]+):\s*()\s*$/ ) {
81     warn "Unparsable line: $_";
82     next;
83   }
84   my($rawusername, $rawdest) = ($1, $2)
85
86   my($username, $domain);
87   if ( $rawusername =~ /^(\w+)\@([\w\.]+)$/ ) {
88     $username = $1;
89     $domain = $2;
90   } elsif ( $rawusername =~ /\@/ ) {
91     die "Unparsable username: $rawusername\n";
92   } else {
93     $username = $rawusername;
94     $domain = $defaultdomain;
95   }
96
97   #find or create svc_acct record
98
99   my @svc_acct = grep { $_->cust_svc->svcpart == $svcpart }
100                    qsearch('svc_acct', {
101                      'username' => $username,
102                      'domain'   => $domain,
103                    });
104
105   if ( scalar(@svc_acct) > 1 ) {
106     die "multiple sources found for $username\@$domain !\n";
107   }
108
109   my $svc_acct;
110   if ( @svc_acct ) {
111     $svc_acct = $svc_acct[0];
112   } else {
113
114     my $svc_domain = qsearchs('svc_domain', { 'domain' => $domain } );
115     $svc_domain ||= new FS::svc_domain ({
116       'svcpart' => $domain_svcpart,
117       'domain'  => $domain,
118     });
119     unless ( $svc_domain->svcnum ) {
120       my $error = $svc_domain->insert;
121       if ( $error ) {
122         die "can't insert domain: $domain\n";
123       }
124     }
125
126     $svc_acct = new FS::svc_acct ({
127       svcpart => $svcpart,
128       username => $username,
129       domsvc   => $svc_domain->svcnum,
130     });
131     my $error = $svc_acct->insert;
132     if ( $error ) {
133       die "can't insert account: $username\@$domain\n";
134     }
135
136   }
137
138   #!!handle multiple destinations!
139
140   my $svc_forward = new FS::svc_forward ({
141     srcsvc => $svc_acct->srcsvc,
142     dstsvc => 
143     dst    =>
144   });
145   my $error = $svc_forward->insert;
146   if ( $error ) {
147     die "$rawusername: $rawdest: $error\n";
148   }
149
150 }
151
152 ##
153
154 sub usage {
155   die "Usage:\n\n  sendmail.import user\n";
156 }
157
158
159
160
161