Mail-Toaster
view release on metacpan or search on metacpan
lib/Mail/Toaster/Setup.pm view on Meta::CPAN
}
unless ( getpwnam($clamuser) ) {
print "User clamav user installation FAILED, I cannot continue!\n";
return 0;
}
# install via ports if selected
if ( $OSNAME eq "darwin" && $ver eq "port" ) {
$self->darwin->install_port( "clamav" ) or return;
return $self->clamav_post_install;
}
# port installs didn't work out, time to build from sources
# set a default version of ClamAV if not provided
if ( $ver eq "1" ) { $ver = "0.97.8"; }; # latest as of 6/2013
# download the sources, build, and install ClamAV
$self->util->install_from_source(
package => 'clamav-' . $ver,
site => 'http://' . $self->conf->{toaster_sf_mirror},
url => '/clamav',
targets => [ './configure', 'make', 'make install' ],
bintest => 'clamdscan',
source_sub_dir => 'mail',
);
$self->util->find_bin( "clamdscan", fatal => 0 ) or
return $self->error( "clamav: install FAILED" );
$self->audit( "clamav: installed ok" );
return $self->clamav_post_install;
}
sub clamav_post_install {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts } );
$self->clamav_update or return;
$self->clamav_perms or return;
$self->clamav_start or return;
return 1;
}
sub clamav_perms {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts } );
my $prefix = $self->conf->{toaster_prefix} || "/usr/local";
my $confdir = $self->conf->{system_config_dir} || "/usr/local/etc";
my $clamuid = $self->conf->{install_clamav_user} || "clamav";
my $share = "$prefix/share/clamav";
foreach my $file ( $share, "$share/daily.cvd", "$share/main.cvd",
"$share/viruses.db", "$share/viruses.db2", "/var/log/clamav/freshclam.log", ) {
if ( -e $file ) {
print "setting the ownership of $file to $clamuid.\n";
$self->util->chown( $file, uid => $clamuid, gid => 'clamav' );
};
}
$self->util->syscmd( "pw user mod clamav -G qmail" )
or return $self->error( "failed to add clamav to the qmail group" );
return 1;
}
sub clamav_start {
# get ClamAV running
my $self = shift;
my %p = validate( @_, { $self->get_std_opts } );
if ( $self->util->is_process_running('clamd') ) {
$self->audit( "clamav: starting up, ok (already running)" );
}
print "Starting up ClamAV...\n";
if ( $OSNAME ne "freebsd" ) {
$self->util->_incomplete_feature( {
mess => "start up ClamAV on $OSNAME",
action =>
'You will need to start up ClamAV yourself and make sure it is configured to launch at boot time.',
}
);
return;
};
$self->freebsd->conf_check(
check => "clamav_clamd_enable",
line => 'clamav_clamd_enable="YES"',
);
$self->freebsd->conf_check(
check => "clamav_freshclam_enable",
line => 'clamav_freshclam_enable="YES"',
);
print "(Re)starting ClamAV's clamd...";
my $start = "/usr/local/etc/rc.d/clamav-freshclam";
$start = "$start.sh" if ! -x $start;
if ( -x $start ) {
system "$start restart";
print "done.\n";
}
else {
print
"ERROR: I could not find the startup (rc.d) file for clamAV!\n";
}
print "(Re)starting ClamAV's freshclam...";
$start = "/usr/local/etc/rc.d/clamav-clamd";
$start = "$start.sh" if ! -x $start;
system "$start restart";
if ( $self->util->is_process_running('clamd', verbose=>0) ) {
$self->audit( "clamav: starting up, ok" );
lib/Mail/Toaster/Setup.pm view on Meta::CPAN
unless ( $OSNAME eq "freebsd" ) {
$self->error( "sorry, no dovecot startup support on $OSNAME", fatal => 0);
return;
};
$self->dovecot_1_conf();
$self->dovecot_2_conf();
# append dovecot_enable to /etc/rc.conf
$self->freebsd->conf_check(
check => "dovecot_enable",
line => 'dovecot_enable="YES"',
);
# start dovecot
if ( -x "/usr/local/etc/rc.d/dovecot" ) {
$self->util->syscmd("/usr/local/etc/rc.d/dovecot restart", verbose=>0);
};
}
sub enable_all_spam {
my $self = shift;
my $qmail_dir = $self->qmail->get_qmail_dir;
my $spam_cmd = $self->conf->{qmailadmin_spam_command} ||
'| /usr/local/bin/maildrop /usr/local/etc/mail/mailfilter';
my @domains = $self->qmail->get_domains_from_assign(
assign => "$qmail_dir/users/assign",
);
my $number_of_domains = @domains;
$self->audit( "enable_all_spam: found $number_of_domains domains.");
for (my $i = 0; $i < $number_of_domains; $i++) {
my $domain = $domains[$i]{dom};
$self->audit( "Enabling spam processing for $domain mailboxes");
my @paths = `~vpopmail/bin/vuserinfo -d -D $domain`;
PATH:
foreach my $path (@paths) {
chomp($path);
if ( ! $path || ! -d $path) {
$self->audit( " $path does not exist!");
next PATH;
};
my $qpath = "$path/.qmail";
if (-f $qpath) {
$self->audit( " .qmail already exists in $path.");
next PATH;
};
$self->audit( " .qmail created in $path.");
system "echo \"$spam_cmd \" >> $path/.qmail";
my $uid = getpwnam("vpopmail");
my $gid = getgrnam("vchkpw");
chown( $uid, $gid, "$path/.qmail" );
chmod oct('0644'), "$path/.qmail";
}
}
return 1;
}
sub expat {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts } );
return $p{test_ok} if defined $p{test_ok}; # for testing only
if ( !$self->conf->{install_expat} ) {
$self->audit( "expat: installing, skipping (disabled)" );
return;
}
if ( $OSNAME eq "freebsd" ) {
if ( -d "/usr/ports/textproc/expat" ) {
return $self->freebsd->install_port( "expat" );
}
else {
return $self->freebsd->install_port( "expat", dir => 'expat2');
}
}
elsif ( $OSNAME eq "darwin" ) {
$self->darwin->install_port( "expat" );
}
else {
print "Sorry, build support for expat on $OSNAME is incomplete.\n";
}
}
sub expect {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts } );
return $p{test_ok} if defined $p{test_ok};
return if $OSNAME ne "freebsd";
return $self->freebsd->install_port( 'expect',
flags => "WITHOUT_X11=yes",
fatal => $p{fatal},
);
}
sub ezmlm {
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_ezmlm};
my $confdir = $self->conf->{system_config_dir} || "/usr/local/etc";
if ( !$ver ) {
$self->audit( "installing Ezmlm-Idx, (disabled)", verbose=>1 );
return;
lib/Mail/Toaster/Setup.pm view on Meta::CPAN
$self->lighttpd_config();
$self->lighttpd_vhost();
$self->php();
$self->lighttpd_start();
return 1;
};
sub lighttpd_freebsd {
my $self = shift;
# installing manually overrides the dialogs
$self->freebsd->install_port( 'm4',
options => "# this file installed by mail-toaster
# Options for m4-1.4.16_1,1
_OPTIONS_READ=m4-1.4.16_1,1
_FILE_COMPLETE_OPTIONS_LIST=LIBSIGSEGV
OPTIONS_FILE_UNSET+=LIBSIGSEGV
",
);
$self->freebsd->install_port( 'help2man',
options => "# this file installed by mail-toaster
# Options for help2man-1.43.2
_OPTIONS_READ=help2man-1.43.2
_FILE_COMPLETE_OPTIONS_LIST=NLS
OPTIONS_FILE_UNSET+=NLS
",
);
$self->freebsd->install_port( 'lighttpd',
options => "#\n# This file was generated by mail-toaster
# Options for lighttpd-1.4.32_1
_OPTIONS_READ=lighttpd-1.4.32_1
_FILE_COMPLETE_OPTIONS_LIST=BZIP2 FAM GDBM IPV6 LDAP LIBEV LUA MEMCACHE MYSQL MYSQLAUTH NODELAY OPENSSL REMOTEUSER SPAWNFCGI VALGRIND WEBDAV
OPTIONS_FILE_SET+=BZIP2
OPTIONS_FILE_UNSET+=FAM
OPTIONS_FILE_UNSET+=GDBM
OPTIONS_FILE_UNSET+=IPV6
OPTIONS_FILE_UNSET+=LDAP
OPTIONS_FILE_UNSET+=LIBEV
OPTIONS_FILE_UNSET+=LUA
OPTIONS_FILE_UNSET+=MEMCACHE
OPTIONS_FILE_UNSET+=MYSQL
OPTIONS_FILE_UNSET+=MYSQLAUTH
OPTIONS_FILE_UNSET+=NODELAY
OPTIONS_FILE_SET+=OPENSSL
OPTIONS_FILE_UNSET+=REMOTEUSER
OPTIONS_FILE_SET+=SPAWNFCGI
OPTIONS_FILE_UNSET+=VALGRIND
OPTIONS_FILE_UNSET+=WEBDAV
",
);
$self->freebsd->conf_check(
check => "lighttpd_enable",
line => 'lighttpd_enable="YES"',
);
my @logs = qw/ lighttpd.error.log lighttpd.access.log /;
foreach ( @logs ) {
$self->util->file_write( "/var/log/$_", lines => [' '] )
if ! -e "/var/log/$_";
$self->util->chown("/var/log/$_", uid => 'www', gid => 'www');
};
};
sub lighttpd_config {
my $self = shift;
my $letc = '/usr/local/etc';
$letc = "$letc/lighttpd" if -d "$letc/lighttpd";
my $lconf = "$letc/lighttpd.conf";
`grep toaster $letc/lighttpd.conf`
and return $self->audit("lighttpd configuration already done");
my $cgi_bin = $self->conf->{toaster_cgi_bin} || '/usr/local/www/cgi-bin.toaster/';
my $htdocs = $self->conf->{toaster_http_docs} || '/usr/local/www/toaster';
$self->config->apply_tweaks(
file => "$letc/lighttpd.conf",
changes => [
{ search => q{# "mod_redirect",},
replace => q{ "mod_redirect",},
},
{ search => q{# "mod_alias",},
replace => q{ "mod_alias",},
},
{ search => q{# "mod_auth",},
replace => q{ "mod_auth",},
},
{ search => q{# "mod_setenv",},
replace => q{ "mod_setenv",},
},
{ search => q{# "mod_fastcgi",},
replace => q{ "mod_fastcgi",},
},
{ search => q{# "mod_cgi",},
replace => q{ "mod_cgi",},
},
{ search => q{# "mod_compress",},
replace => q{ "mod_compress",},
},
{ search => q{server.document-root = "/usr/local/www/data/"},
replace => qq{server.document-root = "$htdocs/"},
},
{ search => q{server.document-root = "/usr/local/www/data/"},
replace => qq{server.document-root = "$htdocs/"},
},
{ search => q{var.server_root = "/usr/local/www/data"},
replace => qq{var.server_root = "$htdocs"},
},
{ search => q{#include_shell "cat /usr/local/etc/lighttpd/vhosts.d/*.conf"},
replace => q{include_shell "cat /usr/local/etc/lighttpd/vhosts.d/*.conf"},
},
{ search => q'$SERVER["socket"] == "0.0.0.0:80" { }',
replace => q'#$SERVER["socket"] == "0.0.0.0:80" { }',
},
],
);
$self->config->apply_tweaks(
lib/Mail/Toaster/Setup.pm view on Meta::CPAN
my $fatal = $p{fatal};
$verbose = $p{verbose};
my $perlbin = $self->util->find_bin( "perl", verbose => $verbose );
my @targets = ( "$perlbin Makefile.PL", "make", "make install" );
push @targets, "make test" if $verbose;
$self->util->install_module_from_src( 'Apache-Logmonster',
site => 'http://www.tnpi.net',
archive => 'Apache-Logmonster',
url => '/internet/www/logmonster',
targets => \@targets,
verbose => $verbose,
);
}
sub maildrop {
require Mail::Toaster::Setup::Maildrop;
return Mail::Toaster::Setup::Maildrop->new;
};
sub maillogs {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts } );
my %args = $self->get_std_args( %p );
return $p{test_ok} if defined $p{test_ok}; # for testing
my $user = $self->conf->{qmail_log_user} || "qmaill";
my $group = $self->conf->{qmail_log_group} || "qnofiles";
my $logdir = $self->conf->{qmail_log_base} || "/var/log/mail";
my $uid = getpwnam($user);
my $gid = getgrnam($group);
return $self->error( "The user $user or group $group does not exist." )
unless ( defined $uid && defined $gid );
$self->toaster->supervise_dirs_create( verbose=>1 );
$self->maillogs_create_dirs();
$self->cronolog();
$self->isoqlog();
$self->logs->verify_settings();
}
sub maillogs_create_dirs {
my $self = shift;
my $user = $self->conf->{qmail_log_user} || "qmaill";
my $group = $self->conf->{qmail_log_group} || "qnofiles";
my $uid = getpwnam($user);
my $gid = getgrnam($group);
# if it exists, make sure it's owned by qmail:qnofiles
my $logdir = $self->conf->{qmail_log_base} || "/var/log/mail";
if ( -w $logdir ) {
chown( $uid, $gid, $logdir )
or $self->error( "Couldn't chown $logdir to $uid: $!");
$self->audit( "maillogs: set ownership of $logdir to $user",verbose=>1 );
}
if ( ! -d $logdir ) {
mkdir( $logdir, oct('0755') )
or $self->error( "maillogs: couldn't create $logdir: $!" );
chown( $uid, $gid, $logdir )
or $self->error( "maillogs: couldn't chown $logdir: $!");
$self->audit( "maillogs: created $logdir", verbose=>1 );
}
foreach my $prot (qw/ send smtp pop3 submit /) {
my $dir = "$logdir/$prot";
if ( -d $dir ) {
$self->audit( "maillogs: create $dir, (exists)", verbose=>1 );
}
else {
mkdir( $dir, oct('0755') )
or $self->error( "maillogs: couldn't create $dir: $!" );
$self->audit( "maillogs: created $dir", verbose=>1);
}
chown( $uid, $gid, $dir )
or $self->error( "maillogs: chown $dir failed: $!");
}
};
sub mrm {
my $self = shift;
my $verbose = $self->{verbose};
my %p = validate( @_, {
'fatal' => { type => BOOLEAN, optional => 1, default => 1 },
'verbose' => { type => BOOLEAN, optional => 1, default => $verbose },
'test_ok' => { type => BOOLEAN, optional => 1, },
},
);
my $fatal = $p{fatal};
$verbose = $p{verbose};
return $p{test_ok} if defined $p{test_ok}; # for testing only
my $perlbin = $self->util->find_bin( "perl" );
my @targets = ( "$perlbin Makefile.PL", "make", "make install" );
push @targets, "make test" if $verbose;
$self->util->install_module_from_src(
'Mysql-Replication',
archive => 'Mysql-Replication.tar.gz',
url => '/internet/sql/mrm',
targets => \@targets,
);
}
sub munin {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts } );
return $p{test_ok} if defined $p{test_ok}; # for testing
if ( ! $self->conf->{install_munin} ) {
$self->audit("skipping munin install (disabled)");
return;
};
$self->rrdtool();
return $self->audit("no munin install support for $OSNAME")
if $OSNAME ne 'freebsd';
$self->freebsd->install_port('p5-Date-Manip');
$self->munin_node();
$self->freebsd->install_port('munin-master');
return 1;
};
sub munin_node {
my $self = shift;
$self->freebsd->install_port('munin-node');
$self->freebsd->conf_check(
check => "munin_node_enable",
lib/Mail/Toaster/Setup.pm view on Meta::CPAN
$self->util->get_url(
"http://".$self->conf->{toaster_sf_mirror}."/qmailadmin/qmailadmin-help/$ver/$helpfile.tar.gz"
);
}
if ( !-e "$helpfile.tar.gz" ) {
carp "qmailadmin: FAILED: help files couldn't be downloaded!\n";
return;
}
$self->util->extract_archive( "$helpfile.tar.gz" );
move( $helpfile, $helpdir ) or
$self->error( "Could not move $helpfile to $helpdir");
$self->audit( "qmailadmin: installed help files, ok" );
}
sub qmailadmin_freebsd_port {
my $self = shift;
my $conf = $self->conf;
my $help = $conf->{qmailadmin_help_links} ? 'SET' : 'UNSET';
my $catchall = $conf->{qmailadmin_catchall} ? 'SET' : 'UNSET';
my $quotam = $conf->{qmailadmin_modify_quotas} ? 'SET' : 'UNSET';
my $domauto = $conf->{qmailadmin_domain_autofill} ? 'SET' : 'UNSET';
my $spam = $conf->{qmailadmin_spam_option} ? 'SET' : 'UNSET';
my @args;
push @args, 'QMAIL_DIR="'.$conf->{qmail_dir}.'"'
if $conf->{qmail_dir} ne '/var/qmail';
if ( $spam eq 'SET' && $conf->{qmailadmin_spam_command} ) {
push @args, 'SPAM_COMMAND="'.$conf->{qmailadmin_spam_command}.'"';
}
$self->freebsd->install_port( "qmailadmin",
flags => join( ',', @args ),
options => "# This file installed by mail::toaster
# Options for qmailadmin-1.2.15_5,2
_OPTIONS_READ=qmailadmin-1.2.15_5,2
_FILE_COMPLETE_OPTIONS_LIST=CATCHALL DOMAIN_AUTOFILL HELP IDX IDX_SQL IPAUTH MODIFY_QUOTA NOCACHE SPAM_DETECTION SPAM_NEEDS_EMAIL TRIVIAL_PASSWORD USER_INDEX
OPTIONS_FILE_$catchall+=CATCHALL
OPTIONS_FILE_SET+=DOMAIN_AUTOFILL
OPTIONS_FILE_$help+=HELP
OPTIONS_FILE_SET+=IDX
OPTIONS_FILE_UNSET+=IDX_SQL
OPTIONS_FILE_SET+=IPAUTH
OPTIONS_FILE_$quotam+=MODIFY_QUOTA
OPTIONS_FILE_UNSET+=NOCACHE
OPTIONS_FILE_$spam+=SPAM_DETECTION
OPTIONS_FILE_UNSET+=SPAM_NEEDS_EMAIL
OPTIONS_FILE_SET+=TRIVIAL_PASSWORD
OPTIONS_FILE_SET+=USER_INDEX
",
);
if ( $conf->{qmailadmin_install_as_root} ) {
my $gid = getgrnam("vchkpw");
chown( 0, $gid, "/usr/local/www/cgi-bin.default/qmailadmin/qmailadmin" );
}
}
sub qpsmtpd {
my $self = shift;
# install Qmail::Deliverable
# install vpopmaild service
# install qpsmtpd
print '
- git clone https://github.com/qpsmtpd-dev/qpsmtpd-dev
- cp -r config.sample config
- chown smtpd:smtpd qpsmtpd
- chmod +s qpsmtpd
';
# install qpsmtpd service
print '
- services stop
- rm /var/service/smtp
- stop toaster-watcher and do previous step again
- ln -s /usr/local/src/qpsmtpd-dev/ /var/serivces/qpsmtpd
- cp /var/qmail/supervise/smtp/log/run log/run
';
# install qpsmtpd SSL certs
print '
- add clamav user to smtpd user group
- echo 0770 > config/spool_perms # Hmmmm... quite open.. how did we do
this with current toaster? clamav needs to read vpopmail files
- echo /var/spool/clamd > spool_dir
- edits in config/plugins
- disable: ident/geoip
- disable: quit_fortune
- enable: auth/auth_checkpassword
checkpw /usr/local/vpopmail/bin/vchkpw true /usr/bin/true
- disable: auth/auth_flat_file
- disable: dspam learn_from_sa 7 reject 1
- enable: virus/clamdscan deny_viruses yes
clamd_socket /var/run/clamav/clamd.sock max_size 3072
- enable: queue/qmail-queue
- enable: sender_permitted_from
- install Qmail::Deliverable
- enable: qmail_deliverable
- install clamav::client
- edit run file QPUSER=vpopmail
- services start
- clamdscan plugin modification:
';
};
sub razor {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts },);
my $ver = $self->conf->{install_razor} or do {
$self->audit( "razor: installing, skipping (disabled)" );
return;
};
return $p{test_ok} if defined $p{test_ok}; # for testing
$self->util->install_module( "Digest::Nilsimsa" );
$self->util->install_module( "Digest::SHA1" );
if ( $ver eq "port" ) {
if ( $OSNAME eq "freebsd" ) {
$self->freebsd->install_port( "razor-agents" );
}
elsif ( $OSNAME eq "darwin" ) {
# old ports tree, deprecated
$self->darwin->install_port( "razor" );
# this one should work
lib/Mail/Toaster/Setup.pm view on Meta::CPAN
$self->freebsd->install_port( "roundcube",
category=> 'mail',
options => "# Options for roundcube-0.9.2,1
_OPTIONS_READ=roundcube-0.9.2,1
_FILE_COMPLETE_OPTIONS_LIST=GD LDAP NSC PSPELL SSL MYSQL PGSQL SQLITE
OPTIONS_FILE_UNSET+=GD
OPTIONS_FILE_UNSET+=LDAP
OPTIONS_FILE_UNSET+=NSC
OPTIONS_FILE_UNSET+=PSPELL
OPTIONS_FILE_SET+=SSL
OPTIONS_FILE_UNSET+=MYSQL
OPTIONS_FILE_UNSET+=PGSQL
OPTIONS_FILE_SET+=SQLITE
",
) or return;
$self->roundcube_config();
};
sub roundcube_config {
my $self = shift;
my $rcdir = "/usr/local/www/roundcube";
my $config = "$rcdir/config";
foreach my $c ( qw/ db.inc.php main.inc.php / ) {
copy( "$config/$c.dist", "$config/$c" ) if ! -e "$config/$c";
};
if ( ! -f "$config/db.inc.php" ) {
warn "unable to find roundcube/config/db.inc.php. Edit it with appropriate DSN settings\n";
return;
};
$self->config->apply_tweaks(
file => "$config/main.inc.php",
changes => [
{ search => q{$rcmail_config['default_host'] = '';},
replace => q{$rcmail_config['default_host'] = 'localhost';},
},
{ search => q{$rcmail_config['session_lifetime'] = 10;},
replace => q{$rcmail_config['session_lifetime'] = 30;},
},
{ search => q{$rcmail_config['imap_auth_type'] = null;},
replace => q{$rcmail_config['imap_auth_type'] = plain;},
},
],
);
return $self->roundcube_config_sqlite();
};
sub roundcube_config_sqlite {
my $self = shift;
my $rcdir = "/usr/local/www/roundcube";
my $config = "$rcdir/config/db.inc.php";
my $spool = '/var/spool/roundcubemail';
mkpath $spool;
my (undef,undef,$uid,$gid) = getpwnam('www');
chown $uid, $gid, $spool;
# configure roundcube to use sqlite for DB
$self->config->apply_tweaks(
file => $config,
changes => [
{ search => q{$rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';},
replace => q{$rcmail_config['db_dsnw'] = 'sqlite:////var/spool/roundcubemail/sqlite.db?mode=0646';},
},
],
);
};
sub rsync {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts },);
return $p{test_ok} if defined $p{test_ok}; # for testing
if ( $OSNAME eq "freebsd" ) {
$self->freebsd->install_port( "rsync",
options => "#\n
# This file was generated by mail-toaster
# Options for rsync-3.0.9_3
_OPTIONS_READ=rsync-3.0.9_3
_FILE_COMPLETE_OPTIONS_LIST=ACL ATIMES DOCS FLAGS ICONV POPT_PORT RENAMED SSH TIMELIMIT
OPTIONS_FILE_UNSET+=ACL
OPTIONS_FILE_UNSET+=ATIMES
OPTIONS_FILE_SET+=DOCS
OPTIONS_FILE_UNSET+=FLAGS
OPTIONS_FILE_UNSET+=ICONV
OPTIONS_FILE_UNSET+=POPT_PORT
OPTIONS_FILE_UNSET+=RENAMED
OPTIONS_FILE_SET+=SSH
OPTIONS_FILE_UNSET+=TIMELIMIT\n",
);
}
elsif ( $OSNAME eq "darwin" ) {
$self->darwin->install_port( "rsync" );
}
else {
die
"please install rsync manually. Support for $OSNAME is not available yet.\n";
}
return $self->util->find_bin('rsync',verbose=>0);
}
sub set_config {
my $self = shift;
my $newconf = shift;
return $self->conf if ! $newconf;
$self->conf( $newconf );
return $newconf;
};
sub simscan {
require Mail::Toaster::Setup::Simscan;
return Mail::Toaster::Setup::Simscan->new;
}
sub socklog {
my $self = shift;
my %p = validate( @_, { 'ip' => SCALAR, $self->get_std_opts, },);
my $ip = $p{ip};
my $user = $self->conf->{qmail_log_user} || "qmaill";
my $group = $self->conf->{qmail_log_group} || "qnofiles";
my $uid = getpwnam($user);
my $gid = getgrnam($group);
my $logdir = $self->conf->{qmail_log_base};
unless ( -d $logdir ) { $logdir = "/var/log/mail" }
if ( $OSNAME eq "freebsd" ) {
$self->freebsd->install_port( "socklog" );
}
else {
print "\n\nNOTICE: Be sure to install socklog!!\n\n";
}
$self->socklog_qmail_control( 'send', $ip, $user, $logdir );
$self->socklog_qmail_control( 'smtp', $ip, $user, $logdir );
$self->socklog_qmail_control( 'pop3', $ip, $user, $logdir );
unless ( -d $logdir ) {
mkdir( $logdir, oct('0755') ) or croak "socklog: couldn't create $logdir: $!";
chown( $uid, $gid, $logdir ) or croak "socklog: couldn't chown $logdir: $!";
}
foreach my $prot (qw/ send smtp pop3 /) {
unless ( -d "$logdir/$prot" ) {
mkdir( "$logdir/$prot", oct('0755') )
or croak "socklog: couldn't create $logdir/$prot: $!";
}
chown( $uid, $gid, "$logdir/$prot" )
or croak "socklog: couldn't chown $logdir/$prot: $!";
}
}
sub socklog_qmail_control {
my ( $self, $serv, $ip, $user, $log ) = @_;
$ip ||= "192.168.2.9";
$user ||= "qmaill";
my $qmdir = $self->qmail->get_qmail_dir;
my $supervise = $self->qmail->get_supervise_dir;
$log ||= "/var/log/mail";
my $run_f = "$supervise/$serv/log/run";
if ( -s $run_f ) {
print "socklog_qmail_control skipping: $run_f exists!\n";
return 1;
}
print "socklog_qmail_control creating: $run_f...";
my @socklog_run_file = <<EO_SOCKLOG;
#!/bin/sh
LOGDIR=$log
LOGSERVERIP=$ip
PORT=10116
PATH=$qmdir/bin:/usr/local/bin:/usr/bin:/bin
export PATH
exec setuidgid $user multilog t s4096 n20 \
!"tryto -pv tcpclient -v \$LOGSERVERIP \$PORT sh -c 'cat >&7'" \
\${LOGDIR}/$serv
EO_SOCKLOG
$self->util->file_write( $run_f, lines => \@socklog_run_file, mode => '0755' );
print "done.\n";
}
sub spamassassin {
my $self = shift;
my %p = validate( @_, { $self->get_std_opts },);
return $p{test_ok} if defined $p{test_ok};
if ( !$self->conf->{install_spamassassin} ) {
$self->audit( "spamassassin: installing, skipping (disabled)" );
return;
}
if ( $OSNAME eq "freebsd" ) {
$self->spamassassin_freebsd();
}
elsif ( $OSNAME eq "darwin" ) {
$self->darwin->install_port( "procmail" )
if $self->conf->{install_procmail};
$self->darwin->install_port( "unzip" );
$self->darwin->install_port( "p5-mail-audit" );
$self->darwin->install_port( "p5-mail-spamassassin" );
$self->darwin->install_port( "bogofilter" ) if $self->conf->{install_bogofilter};
}
lib/Mail/Toaster/Setup.pm view on Meta::CPAN
$self->util->get_url( "$site/$package.tar.bz2" );
unless ( -e "$package.tar.bz2" ) {
croak "sqwebmail FAILED: coudn't fetch $package\n";
}
}
$self->util->extract_archive( "$package.tar.bz2" );
chdir($package) or croak "sqwebmail FAILED: coudn't chdir $package\n";
my $cmd = "./configure --prefix=$prefix --with-htmldir=$prefix/share/sqwebmail "
. "--with-cachedir=/var/run/sqwebmail --enable-webpass=vpopmail "
. "--with-module=authvchkpw --enable-https --enable-logincache "
. "--enable-imagedir=$datadir/webmail --without-authdaemon "
. "--enable-mimetypes=$mime --enable-cgibindir=" . $cgi;
if ( $OSNAME eq "darwin" ) { $cmd .= " --with-cacheowner=daemon"; };
my $make = $self->util->find_bin("gmake", fatal=>0, verbose=>0);
$make ||= $self->util->find_bin("make", fatal=>0, verbose=>0);
$self->util->syscmd( $cmd );
$self->util->syscmd( "$make configure-check" );
$self->util->syscmd( "$make check" );
$self->util->syscmd( "$make" );
my $share = "$prefix/share/sqwebmail";
if ( -d $share ) {
$self->util->syscmd( "make install-exec" );
print
"\n\nWARNING: I have only installed the $package binaries, thus\n";
print "preserving any custom settings you might have in $share.\n";
print
"If you wish to do a full install, overwriting any customizations\n";
print "you might have, then do this:\n\n";
print "\tcd $src/mail/$package; make install\n";
}
else {
$self->util->syscmd( "$make install" );
chmod oct('0755'), $share;
chmod oct('0755'), "$datadir/sqwebmail";
copy( "$share/ldapaddressbook.dist", "$share/ldapaddressbook" )
or croak "copy failed: $!";
}
$self->util->syscmd( "$make install-configure", fatal => 0 );
$self->sqwebmail_conf();
}
sub sqwebmail_conf {
my $self = shift;
my %p = validate(@_, { $self->get_std_opts },);
my $cachedir = "/var/run/sqwebmail";
my $prefix = $self->conf->{toaster_prefix} || "/usr/local";
unless ( -e $cachedir ) {
my $uid = getpwnam("bin");
my $gid = getgrnam("bin");
mkdir( $cachedir, oct('0755') );
chown( $uid, $gid, $cachedir );
}
my $file = "/usr/local/etc/sqwebmail/sqwebmaild";
return if ! -w $file;
my @lines = $self->util->file_read( $file );
foreach my $line (@lines) { #
if ( $line =~ /^[#]{0,1}PIDFILE/ ) {
$line = "PIDFILE=$cachedir/sqwebmaild.pid";
};
};
$self->util->file_write( $file, lines=>\@lines );
}
sub sqwebmail_freebsd_port {
my $self = shift;
$self->gnupg_install;
$self->courier_authlib;
my $cgi = $self->conf->{toaster_cgi_bin};
my $datadir = $self->conf->{toaster_http_docs};
my $cachedir = "/var/run/sqwebmail";
if ( $cgi =~ /\/usr\/local\/(.*)$/ ) { $cgi = $1; }
if ( $datadir =~ /\/usr\/local\/(.*)$/ ) { $datadir = $1; }
my @args = "CGIBINDIR=$cgi";
push @args, "CGIBINSUBDIR=''";
push @args, "WEBDATADIR=$datadir";
push @args, "CACHEDIR=$cachedir";
$self->freebsd->install_port( "sqwebmail",
flags => join( ",", @args ),
options => "# Options for sqwebmail-5.6.1
_OPTIONS_READ=sqwebmail-5.6.1
_FILE_COMPLETE_OPTIONS_LIST=AUTH_LDAP AUTH_MYSQL AUTH_PGSQL AUTH_USERDB AUTH_VCHKPW CACHEDIR CHARSET FAM GDBM GZIP HTTPS HTTPS_LOGIN ISPELL MIMETYPES SENTRENAME
OPTIONS_FILE_UNSET+=AUTH_LDAP
OPTIONS_FILE_UNSET+=AUTH_MYSQL
OPTIONS_FILE_UNSET+=AUTH_PGSQL
OPTIONS_FILE_UNSET+=AUTH_USERDB
OPTIONS_FILE_SET+=AUTH_VCHKPW
OPTIONS_FILE_SET+=CACHEDIR
OPTIONS_FILE_UNSET+=CHARSET
OPTIONS_FILE_UNSET+=FAM
OPTIONS_FILE_UNSET+=GDBM
OPTIONS_FILE_SET+=GZIP
OPTIONS_FILE_SET+=HTTPS
OPTIONS_FILE_UNSET+=HTTPS_LOGIN
OPTIONS_FILE_SET+=ISPELL
OPTIONS_FILE_SET+=MIMETYPES
OPTIONS_FILE_UNSET+=SENTRENAME
",
);
$self->freebsd->conf_check(
check => "sqwebmaild_enable",
line => 'sqwebmaild_enable="YES"',
);
( run in 0.864 second using v1.01-cache-2.11-cpan-71847e10f99 )