package Mail::Toaster::Setup::Simscan;
use strict;
use warnings;
our $VERSION = '5.50';
use Carp;
#use Config;
#use Cwd;
#use Data::Dumper;
#use File::Copy;
#use File::Path;
use English '-no_match_vars';
use Params::Validate ':all';
use Sys::Hostname;
use lib 'lib';
use parent 'Mail::Toaster::Base';
sub install {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts },);
return $p{test_ok} if defined $p{test_ok}; # for testing
my $ver = $self->conf->{'install_simscan'} or do {
$self->audit( "simscan install, skipping (disabled)" );
return;
};
if ( $OSNAME eq 'freebsd' ) {
my $r = $self->install_freebsd_port;
return $r if $ver eq 'port';
};
my $user = $self->conf->{'simscan_user'} || "clamav";
my $reje = $self->conf->{'simscan_spam_hits_reject'};
my $qdir = $self->conf->{'qmail_dir'};
my $custom = $self->conf->{'simscan_custom_smtp_reject'};
if ( -x "$qdir/bin/simscan" ) {
return 0
if ! $self->util->yes_or_no(
"simscan is already installed, do you want to reinstall?",
timeout => 60,
);
}
my $bin;
my $confcmd = "./configure ";
$confcmd .= "--enable-user=$user ";
$confcmd .= $self->simscan_ripmime( $ver );
$confcmd .= $self->simscan_clamav;
$confcmd .= $self->simscan_spamassassin;
$confcmd .= $self->simscan_regex;
$confcmd .= "--enable-received=y " if $self->conf->{'simscan_received'};
$confcmd .= "--enable-spam-hits=$reje " if ($reje);
$confcmd .= "--enable-attach=y " if $self->conf->{'simscan_block_attachments'};
$confcmd .= "--enable-qmaildir=$qdir " if $qdir;
$confcmd .= "--enable-qmail-queue=$qdir/bin/qmail-queue " if $qdir;
$confcmd .= "--enable-per-domain=y " if $self->conf->{'simscan_per_domain'};
$confcmd .= "--enable-custom-smtp-reject=y " if $custom;
$confcmd .= "--enable-spam-passthru=y " if $self->conf->{'simscan_spam_passthru'};
if ( $self->conf->{'simscan_quarantine'} && -d $self->conf->{'simscan_quarantine'} ) {
$confcmd .= "--enable-quarantinedir=$self->conf->{'simscan_quarantine'}";
}
print "configure: $confcmd\n";
my $patches = [];
push @$patches, 'simscan-1.4.0-clamav.3.patch' if $confcmd =~ /clamavdb/;
$self->util->install_from_source(
'package' => "simscan-$ver",
# site => 'http://www.inter7.com',
site => "http://downloads.sourceforge.net",
url => '/simscan',
targets => [ $confcmd, 'make', 'make install-strip' ],
bintest => "$qdir/bin/simscan",
source_sub_dir => 'mail',
patches => $patches,
patch_url => $self->conf->{'toaster_dl_site'}.$self->conf->{'toaster_dl_url'}.'/patches',
);
$self->config;
}
sub simscan_clamav {
my ( $self ) = @_;
return '' if ! $self->conf->{'simscan_clamav'};
my $bin = $self->util->find_bin( "clamdscan", fatal => 0 );
croak "couldn't find $bin, install ClamAV!\n" if !-x $bin;
my $cmd .= "--enable-clamdscan=$bin ";
$cmd .= "--enable-clamavdb-path=";
$cmd .= -d "/var/db/clamav" ? "/var/db/clamav "
: -d "/usr/local/share/clamav" ? "/usr/local/share/clamav "
: -d "/opt/local/share/clamav" ? "/opt/local/share/clamav "
: croak "can't find the ClamAV db path!";
$bin = $self->util->find_bin( "sigtool", fatal => 0 );
croak "couldn't find $bin, install ClamAV!" if ! -x $bin;
$cmd .= "--enable-sigtool-path=$bin ";
return $cmd;
};
sub config {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts },);
my ( $file, @lines );
my $reje = $self->conf->{'simscan_spam_hits_reject'};
my @attach;
if ( $self->conf->{'simscan_block_attachments'} ) {
$file = "/var/qmail/control/ssattach";
foreach ( split( /,/, $self->conf->{'simscan_block_types'} ) ) {
push @attach, ".$_";
}
$self->util->file_write( $file, lines => \@attach );
}
$file = "/var/qmail/control/simcontrol";
if ( !-e $file ) {
my @opts;
$self->conf->{'simscan_clamav'}
? push @opts, "clam=yes"
: push @opts, "clam=no";
$self->conf->{'simscan_spamassassin'}
? push @opts, "spam=yes"
: push @opts, "spam=no";
$self->conf->{'simscan_trophie'}
? push @opts, "trophie=yes"
: push @opts, "trophie=no";
$reje
? push @opts, "spam_hits=$reje"
: print "no reject.\n";
if ( @attach > 0 ) {
my $line = "attach=";
my $first = shift @attach;
$line .= "$first";
foreach (@attach) { $line .= ":$_"; }
push @opts, $line;
}
@lines = "#postmaster\@example.com:" . join( ",", @opts );
push @lines, "#example.com:" . join( ",", @opts );
push @lines, "#";
push @lines, ":" . join( ",", @opts );
if ( -e $file ) {
$self->util->file_write( "$file.new", lines => \@lines );
print
"\nNOTICE: simcontrol written to $file.new. You need to review and install it!\n";
}
else {
$self->util->file_write( $file, lines => \@lines );
}
}
my $user = $self->conf->{'simscan_user'} || 'simscan';
my $group = $self->conf->{'smtpd_run_as_group'} || 'qmail';
$self->util->syscmd( "pw user mod simscan -G qmail,clamav" );
$self->util->chown( '/var/qmail/simscan', uid => $user, gid => $group );
$self->util->chown( '/var/qmail/bin/simscan', uid => $user, gid=>$group );
$self->util->chmod( dir => '/var/qmail/simscan', mode => '0770' );
if ( -x "/var/qmail/bin/simscanmk" ) {
$self->util->syscmd( "/var/qmail/bin/simscanmk" );
system "/var/qmail/bin/simscanmk";
}
}
sub install_freebsd_port {
my $self = shift;
my @args;
push @args, "SPAMC_ARGS=" . $self->conf->{simscan_spamc_args} if $self->conf->{simscan_spamc_args};
push @args, 'SPAM_HITS=' . $self->conf->{simscan_spam_hits_reject} if $self->conf->{simscan_spam_hits_reject};
push @args, 'SIMSCAN_USER=' . $self->conf->{simscan_user} if $self->conf->{simscan_user};
push @args, 'QUARANTINE_DIR=' . $self->conf->{simscan_quarantine} if $self->conf->{'simscan_quarantine'};
push @args, 'QMAIL_PREFIX=' . $self->conf->{qmail_dir} || '/var/qmail';
$self->freebsd->install_port( "simscan",
category => 'mail',
flags => join( ",", @args ),
options => "# Options for simscan-1.4.0_6
_OPTIONS_READ=simscan-1.4.0_6
_FILE_COMPLETE_OPTIONS_LIST=ATTACH CLAMAV DOMAIN DROPMSG DSPAM HEADERS PASSTHRU RIPMIME SPAMD USER
OPTIONS_FILE_SET+=ATTACH
OPTIONS_FILE_SET+=CLAMAV
OPTIONS_FILE_SET+=DOMAIN
OPTIONS_FILE_UNSET+=DROPMSG
OPTIONS_FILE_UNSET+=DSPAM
OPTIONS_FILE_SET+=HEADERS
OPTIONS_FILE_UNSET+=PASSTHRU
OPTIONS_FILE_SET+=RIPMIME
OPTIONS_FILE_SET+=SPAMD
OPTIONS_FILE_SET+=USER
",
);
return $self->config;
};
sub simscan_regex {
my ($self) = @_;
return '' if ! $self->conf->{'simscan_regex_scanner'};
my $config = "--enable-regex=y ";
if ( $OSNAME eq "freebsd" ) {
$self->freebsd->install_port( 'pcre' );
$config .= "--with-pcre-include=/usr/local/include ";
}
else {
print "\n\nWARNING: is pcre installed?\n\n";
}
return $config;
};
sub simscan_ripmime {
my ($self, $ver ) = @_;
if ( ! $self->setup->is_newer( min => "1.0.8", cur => $ver ) ) {
print "ripmime doesn't work with simcan < 1.0.8\n";
return '';
};
return "--disable-ripmime " if ! $self->conf->{'simscan_ripmime'};
my $bin = $self->util->find_bin( "ripmime", fatal => 0, verbose=>0);
unless ( -x $bin ) {
croak "couldn't find $bin, install ripmime!\n";
}
$self->setup->ripmime or return '';
return "--enable-ripmime=$bin ";
};
sub simscan_spamassassin {
my ($self) = @_;
return '' if ! $self->conf->{'simscan_spamassassin'};
my $spamc = $self->util->find_bin( "spamc", fatal => 0 );
my $cmd = "--enable-spam=y --enable-spamc-user=y --enable-spamc=$spamc ";
my $spamc_args = $self->conf->{'simscan_spamc_args'};
$cmd .= "--enable-spamc-args=$spamc_args " if $spamc_args;
if ( $self->conf->{'simscan_received'} ) {
my $bin = $self->util->find_bin( "spamassassin", fatal => 0 );
croak "couldn't find $bin, install SpamAssassin!\n" if !-x $bin;
$cmd .= "--enable-spamassassin-path=$bin ";
}
return $cmd;
};
sub test {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts },);
my $qdir = $self->conf->{qmail_dir};
if ( ! $self->conf->{install_simscan} ) {
print "simscan installation disabled, skipping test!\n";
return;
}
print "testing simscan...";
my $scan = "$qdir/bin/simscan";
if ( ! -x $scan ) {
print "FAILURE: Simscan could not be found at $scan!\n";
return;
}
$ENV{"QMAILQUEUE"} = $scan;
$self->setup->test->email_send;
}
1;