INIT {
require Sys::Syslog;
- Sys::Syslog::openlog("lacemail","pid","mail");
+ Sys::Syslog::openlog("perlmail","pid","mail");
my @syslogging_stack;
sub syslogging_on_save
{
}
+use File::Basename;
+BEGIN {
+ use lib $ENV{"PERLMAIL_BASEDIR"} || File::Basename::dirname($0);
+ use PerlMail::Config;
+ use PerlMail::Lib;
+ }
+
use Mail::Audit qw(MAPS);
require IO::Handle;
use Carp qw(cluck confess);
use POSIX qw(WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG WIFSTOPPED WSTOPSIG);
require POSIX; # for ceil
use User::Utmp;
-require File::Basename;
use Getopt::Long;
require Mail::Address;
require MIME::Words;
require WWW::SMS;
-my $HOME="/home/lace";
-my $Mail="$HOME/Mail";
-my @ValidUsers=qw(root lace short kratochvil _local);
-my $IdleMax=10;
-my $MaxBodySMS=0x1000; # max bytes to pass to Lingua::EN::Squeeze
-my $SMSmailError='short+err@ucw.cz';
-my @SMSwebRcpt=qw(420 602 431329);
-my $SMSwebRcpt_username="lace2";
-my $SMScontact='<short@ucw.cz>';
-
our($Message,$Audit,@AuditStored,$store_ignore,$store_ignorenewmail,$store_profile,$DoBell);
our(%audit_profile,@sms_squeezes,@alternates_host,@dnsbl_whitelist); # imported
my %alternates_host; # from @alternates_host
exit 0;
}
-# FIXME: separate 'lacemail'-transfer together with lacemail-submit away
+# FIXME: separate 'perlmail'-transfer together with perlmail-submit away
sub inetd
{
die "Excessive arguments" if @ARGV;
return map({
my $l=160;
if (!$ignorenewmail) { # send by mail
- $l-=length("Z emailu $SMSmailError: ");
+ $l-=length("Z emailu FIXME SMSmailError: ");
$l-=length(smsbuild($_,$smscount));
}
else { # send by web
local $Audit=Mail::Audit->new(
"emergency"=>"$Mail/emergency",
"data"=>[map("$_\n",split("\n",$message))],
- "log"=>"$HOME/.lacemail.log",
+ "log"=>"$HOME/.perlmail.log",
"loglevel"=>99,
);
local @AuditStored=();
open CHILD,'|'
.'('.'(razor-check 2>&1;echo >&3 $?)'
.'|sed "s/^/razor-check: /"'
- .'|logger -t "lacemail['.$$.']" -p mail.crit'
+ .'|logger -t "perlmail['.$$.']" -p mail.crit'
.') 3>&1'
.'|exit `cat`'
or return 0;
return Mail::Audit::rblcheck($self_faked,$timeout);
}
-our %muttrc_pending=();
-sub muttrc
-{
-my($muttrc)=@_;
-
- $muttrc||="$HOME/.muttrc";
- $muttrc=~s/^\~/$HOME/;
- do { warn "Looping muttrc, ignoring: $muttrc"; return (); } if $muttrc_pending{$muttrc};
- local $muttrc_pending{$muttrc}=1;
- local *MUTTRC;
- open MUTTRC,$muttrc or do { warn "open \"$muttrc\": $!"; return (); };
- local $/="\n";
- local $_;
- my @r=();
- # far emulation mutt/init.c/mutt_parse_rc_line()
- while (<MUTTRC>) {
- s/^[\s;]*//s;
- s/[#;].*$//s;
- s/\s*$//s;
- next if !/^(\S+)\s*/s;
- if ($1 eq "source") {
- $_=$';
- do { warn "Wrong 'source' parameters at $muttrc:$.: $_"; next; } if !/^\S+$/;
- push @r,muttrc($_);
- next;
- }
- push @r,$_;
- }
- close MUTTRC or warn "close \"$muttrc\": $!";
- return wantarray() ? @r : join("",map("$_\n",@r));
-}
-
-my %mutteval_charmap=( # WARNING: Don't use "" or "0" here, see below for "|| warn"!
- '\\'=>"\\",
- 'r'=>"\r",
- 'n'=>"\n",
- 't'=>"\t",
- 'f'=>"\f",
- 'e'=>"\e",
- );
-# mutt/init.c/mutt_extract_token()
-sub mutteval
-{
- local $_=$_[0];
- return $_ if !s/^"//;
- do { warn "Missing trailing quote in: $_"; return $_; } if !s/"$//;
- s/\\(.)/$mutteval_charmap{$1} || warn "Undefined '\\$1' sequence in: $_";/ges;
- return $_;
-}
-
-sub muttrc_get
-{
-my(@headers)=@_;
-
- my @r=map({ (ref $_ ? $_ : qr/^\s*set\s+\Q$_\E\s*=\s*(.*?)\s*$/si); } @headers);
- my %r=map(($_=>undef()),@r);
- for (muttrc()) {
- for my $ritem (@r) {
- /$ritem/si or next;
- $r{$ritem}=mutteval $1;
- }
- }
- for my $var (grep { !defined($r{$_}) } @r) {
- warn "Variable '$var' not found in muttrc";
- return undef();
- }
- return wantarray() ? %r : $r{$r[0]};
-}
-
sub muttrc_aliases
{
my %r=();
return %r;
}
-# FIXME: Unify
-# BEGIN lacemail-sendmail
-# return: Mail::Address instance or undef()
-sub parseone
-{
-my($line)=@_;
-
- return undef() if !defined $line;
- my @r=Mail::Address->parse($line);
- warn "Got ".scalar(@r)." addresses while wanting just one; when parsing: $line" if 1!=@r;
- return $r[0];
-}
-# END lacemail-sendmail
-
# FIXME: host may get multiple recipients and thus not showing "for <...>"
# FIXME: muttrc_get("from") is too strict
sub store_muttrc_alternates
$text=~s/\b\Q$from\E\b/$to/gsi;
}
return if $text eq $orig;
- $Audit->put_header("X-LaceMail-header_remap-$header",$orig);
+ $Audit->put_header("X-PerlMail-header_remap-$header",$orig);
$Audit->replace_header($header,$text);
}
# MAIN
-my $basedir=File::Basename::dirname($0);
$Getopt::Long::ignorecase=0;
die "GetOptions error" if !Getopt::Long::GetOptions(
"inetd" ,sub { $opt_mode=\&inetd; },
"idle!" ,\$opt_idle,
"idletest" ,sub { syslogging_restore(); print((defined($_=useridle()) ? $_ : "<undef>")."\n"); exit 0; },
"muttrc" ,sub { syslogging_restore(); print scalar muttrc(); exit 0; },
- "d|basedir=s",\&basedir,
);
# "Excessive arguments" checked in &inetd
die "Missing mode" if !$opt_mode;
-my $filenameMyAudit="$basedir/My-Audit.pm";
-open AUDIT,$filenameMyAudit or die "open \"$filenameMyAudit\": $!";
-{
- local $/=undef();
- eval <AUDIT> or die "eval \"$filenameMyAudit\": $@";
- audit_init();
- %alternates_host=map((lc($_)=>1),@alternates_host);
- %dnsbl_whitelist=map(( $_ =>1),@dnsbl_whitelist);
- }
-close AUDIT or warn "close \"$filenameMyAudit\": $!";
+PerlMail::Config::audit_init();
+%alternates_host=map((lc($_)=>1),@alternates_host);
+%dnsbl_whitelist=map(( $_ =>1),@dnsbl_whitelist);
&$opt_mode();
die "NOTREACHED";