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 )