MOON
Server: Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4
System: Linux csr818.wilogic.com 2.6.18-419.el5xen #1 SMP Fri Feb 24 22:50:37 UTC 2017 x86_64
User: digitals (531)
PHP: 5.4.45
Disabled: NONE
Upload Files
File: //scripts.20110531.215904.25158/setupmailserver
#!/usr/bin/perl
# cpanel - setupmailserver                        Copyright(c) 2010 cPanel, Inc.
#                                                           All rights Reserved.
# copyright@cpanel.net                                         http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited

BEGIN { unshift @INC, '/usr/local/cpanel'; }

use strict;
use Cpanel::Config          ();
use Cpanel::Chkservd        ();
use Cpanel::Sys::OS         ();
use Cpanel::Services        ();
use Cpanel::SafeRun::Errors ();
use Cpanel::SSLCerts        ();
use Cpanel::Usage           ();
use Cpanel::PID             ();
use Cpanel::Init            ();
use Cpanel::Update          ();

my $help                    = 0;
my $man                     = 0;
my $force                   = 0;
my $current                 = 0;
my $skip_maildir_conversion = 0;
$| = 1;

delete $ENV{'cp_security_token'};
delete $ENV{'HTTP_REFERER'};

# Argument processing
my %opts = (
    'force'                   => \$force,
    'current'                 => \$current,
    'skip-maildir-conversion' => \$skip_maildir_conversion,
);

Cpanel::Usage::wrap_options( \@ARGV, \&usage, \%opts );

@ARGV = ( grep( !/^--/, @ARGV ) );

my $selected_mailserver = shift;
usage() unless ( $selected_mailserver || $current );

my $cpconf_ref = Cpanel::Config::loadcpconf();
my $storage_type = $cpconf_ref->{'maildir'} ? 'maildir' : 'mbox';
$cpconf_ref->{'mailserver'} = $storage_type eq 'mbox' ? 'cppop' : defined $cpconf_ref->{'mailserver'} ? $cpconf_ref->{'mailserver'} : 'courier';
my $last_active_mailserver = $cpconf_ref->{'mailserver'};
my $current_mailserver = Cpanel::Services::is_enabled('mail') ? $cpconf_ref->{'mailserver'} : 'disabled';

if ($current) {
    print "Current mailserver type: ${current_mailserver}\n";
    print "Current storage format: ${storage_type}\n";
    exit 0;
}

if ( $storage_type eq 'mbox' ) {
    if ( $selected_mailserver eq 'cppop' ) {
        print "Already configured.\n";
    }
    else {
        print "Before selecting a new mail server you must first convert\n";
        print "to the maildir storage format using /scripts/convert2maildir\n";
    }
    exit 0;
}

if ( !$force && $current_mailserver eq $selected_mailserver ) {
    print "Already configured.\n";
    exit 0;
}

unless ( $selected_mailserver eq 'dovecot' || $selected_mailserver eq 'courier' || $selected_mailserver eq 'disabled' ) {
    print "Unknown mailserver type specified.\nTry $0 --help\n";
    exit 1;
}

if ( $> != 0 ) {
    die "Conversion process must be performed as root";
}

my $pid_obj = Cpanel::PID->new( { 'pid_file' => '/var/run/setupmailserver.pid' } );
unless ( $pid_obj->create_pid_file() > 0 ) {
    print "Setupmailserver appears to be running already.\n";
    print "Please wait for the conversion to finish before attempting another.\n";
    exit 1;
}

$cpconf_ref->{'mailserver'} = $selected_mailserver if ( $selected_mailserver ne 'disabled' );
Cpanel::Config::savecpconf($cpconf_ref);
my $distro      = Cpanel::Sys::OS::getos();
my $init        = Cpanel::Init->new();
my $error_count = 0;

#branch to uninsall/install functions
disable_chksrvd_monitoring();

if ( $selected_mailserver eq 'courier' ) {
    disable_none();
    disable_dovecot();
    enable_courier();
    enable_chksrvd_monitoring();
}
elsif ( $selected_mailserver eq 'dovecot' ) {
    disable_none();
    disable_courier();
    enable_dovecot();
    enable_chksrvd_monitoring();
}
else {
    enable_none();
    disable_dovecot();
    disable_courier();
}

reconfigure_exim();
run_fastmail();
$pid_obj->remove_pid_file();
if ($error_count) {
    print "\nWARNING: Some errors encountered during the conversion process\n";
    exit 1;
}
else {
    print "\nMailserver conversion complete\n";
    exit 0;
}

sub run_fastmail {
    system '/scripts/fastmail';
}

sub disable_none {
    unlink '/etc/imapdisable'   if ( -e '/etc/imapdisable' );
    unlink '/etc/cpimapdisable' if ( -e '/etc/cpimapdisable' );
    unlink '/etc/imapddisable'  if ( -e '/etc/imapddisable' );
}

sub disable_dovecot {
    print "\nHalting Dovecot\n";
    my $output = $init->run_command( 'dovecot', 'stop' );
    print "\nDisabling Dovecot in init system\n";
    $output = $init->run_command_for_one( 'disable', 'dovecot' );
}

sub disable_courier {
    print "\nHalting Courier\n";
    my @services = qw(courier-imap courier-authlib);
    if ( $distro eq 'freebsd' ) {
        @services = qw(courier-imap-pop3d courier-imap-pop3d-ssl courier-imap-imapd courier-imap-imapd-ssl courier-authdaemond);
    }
    foreach my $service (@services) {
        my $output = $init->run_command( $service, 'stop' );
    }
    print "\nDisabling Courier in init system\n";
    foreach my $service (@services) {
        my $output = $init->run_command_for_one( 'disable', $service );
    }
}

# Strictly speaking, touching /etc/imapdisable will cause chksrvd to skip over
# restarting Dovecot or Courier, but this will stop it from even polling for these processes
sub disable_chksrvd_monitoring {
    my %monitored_services = Cpanel::Chkservd::getmonitored();
    if ( !$monitored_services{'imap'} && !$monitored_services{'pop'} ) {
        print "\nChksrvd monitoring is disabled\n";
    }
    else {
        print "\nDisabling Chksrvd monitoring\n";
        Cpanel::Chkservd::disable('imap');
        Cpanel::Chkservd::disable('pop');
        system('/scripts/restartsrv_chksrvd');
    }
}

sub enable_none {
    system( 'touch', '/etc/imapdisable' );
    print "\nDisabling mail server updates\n";
    my $updateconf = Cpanel::Update::loadupdateconfig();
    $updateconf->{'COURIERUP'} = 'never';
    $updateconf->{'DOVECOTUP'} = 'never';
    Cpanel::Update::saveupdateconfig($updateconf);
}

sub enable_dovecot {
    print "\nChecking that Dovecot is up to date\n";
    my $updateconf      = Cpanel::Update::loadupdateconfig();
    my %orig_updateconf = %{$updateconf};
    $updateconf->{'COURIERUP'} = 'never';
    $updateconf->{'DOVECOTUP'} = 'daily';
    $updateconf->{'SYSUP'}     = 'daily';
    Cpanel::Update::saveupdateconfig($updateconf);
    my @dovecotup = ('/scripts/dovecotup');
    push @dovecotup, '--force' if ($force);
    system(@dovecotup);

    unless ( $skip_maildir_conversion || ( !$force && $last_active_mailserver eq 'dovecot' ) ) {
        print "\nConverting user maildirs to Dovecot format...\n";
        system('/scripts/maildir_converter --forreal --overwrite --to-dovecot');
        $error_count++ if ($?);
    }

    print "\nChecking SSL cert...";
    my $dovecot_cert_ref = Cpanel::SSLCerts::fetchSSLFiles( 'service' => 'dovecot' );
    unless ( $dovecot_cert_ref->{'crt'} ) {
        print "missing\n";
        print "Generating default cert...";
        open OLDSTDERR, '>&STDERR';
        open STDERR, '>', '/dev/null';
        Cpanel::SSLCerts::createDefaultSSLFiles( 'service' => 'dovecot' );
        open STDERR, '>&OLDSTDERR';
        print "done\n";
        my $courier_cert_ref = Cpanel::SSLCerts::fetchSSLFiles( 'service' => 'courier-imapd' );

        if ( $courier_cert_ref->{'crt'} ) {
            print "Reusing existing Courier-IMAP cert...";
            $courier_cert_ref->{'service'} = 'dovecot';
            $courier_cert_ref->{'quiet'}   = 1;
            my @result = Cpanel::SSLCerts::installSSLFiles( %{$courier_cert_ref} );
            print "done\n";
        }
    }
    else {
        print "done\n";
    }

    print "\nChecking for expired SSL certs...";
    system '/usr/local/cpanel/bin/checkallsslcerts';
    print "done\n";

    print "\nEnabling Dovecot in init system\n";
    my $output = $init->run_command_for_one( 'enable', 'dovecot' );
    print "\nStarting Dovecot\n";
    $output = $init->run_command( 'dovecot', 'start' );
    print "\nEnabling Dovecot updates\n";
    $orig_updateconf{'DOVECOTUP'} = 'inherit';
    $orig_updateconf{'COURIERUP'} = 'never';
    Cpanel::Update::saveupdateconfig( \%orig_updateconf );
}

sub enable_courier {
    print "\nChecking that Courier is up to date\n";
    my $updateconf      = Cpanel::Update::loadupdateconfig();
    my %orig_updateconf = %{$updateconf};
    $updateconf->{'COURIERUP'} = 'daily';
    $updateconf->{'DOVECOTUP'} = 'never';
    $updateconf->{'SYSUP'}     = 'daily';
    Cpanel::Update::saveupdateconfig($updateconf);
    my @courierup = ('/scripts/courierup');
    push @courierup, '--force' if ($force);
    system(@courierup);

    unless ( $skip_maildir_conversion || ( !$force && $last_active_mailserver eq 'courier' ) ) {
        print "\nConverting user maildirs to Courier format...\n";
        system('/scripts/maildir_converter --forreal --overwrite --to-courier');
        $error_count++ if ($?);
    }
    if ( $distro eq 'freebsd' ) {
        print "\nEnabling courier-authdaemond in init system\n";
        my $output = $init->run_command_for_one( 'enable', 'courier-authdaemond' );

        # Rebuilding the config file on FreeBSD will update the rc.conf settings
        print "\nReconfiguring other Courier services\n";
        system( '/scripts/courierup', '--reconfig' );

        print "\nRestarting Courier\n";
        system('/scripts/restartsrv_imap');
    }
    else {
        foreach my $service (qw(courier-authlib  courier-imap)) {
            print "\nEnabling $service in init system\n";
            my $output = $init->run_command_for_one( 'enable', $service );
            print "\nStarting $service\n";
            $output = $init->run_command( $service, 'start' );
        }
    }
    print "\nEnabling Courier updates\n";
    $orig_updateconf{'COURIERUP'} = 'inherit';
    $orig_updateconf{'DOVECOTUP'} = 'never';
    Cpanel::Update::saveupdateconfig($updateconf);
}

# Both Dovecot and Courier are monitored by chksrvd using restartsrv_imap
sub enable_chksrvd_monitoring {
    my %monitored_services = Cpanel::Chkservd::getmonitored();
    if ( $monitored_services{'imap'} ) {
        print "\nChksrvd monitoring is enabled\n";
    }
    else {
        print "\nEnabling chksrvd monitoring\n";
        Cpanel::Chkservd::enable('imap');
        system('/scripts/restartsrv_chksrvd');
    }
}

sub reconfigure_exim {
    print "\nReconfiguring EXIM for new mailserver\n";
    my $output = Cpanel::SafeRun::Errors::saferunallerrors('/scripts/buildeximconf');
    if ($?) {
        $error_count++;
        print $output;
        print "\nWARNING: EXIM will not be restarted!\n";
    }
    else {
        print "\nRestarting EXIM\n";
        system('/scripts/restartsrv_exim');
    }
}

sub usage {
    print "Usage: setupmailserver [options] <mailserver>\n\n";
    print "Options:\n";
    print "  --force                    Perform conversion even if server is already configured\n";
    print "  --current                  Display the currently configured mail server\n";
    print "  --skip-maildir-conversion  Don't convert user maildirs during the server conversion\n";
    print "\n";
    print "MailServers:\n";
    print "  courier    Standard mail server on cPanel systems\n";
    print "  dovecot    Lower memory usage mail server\n";
    print "  disabled   Disable local POP3 and IMAP functionality\n";
    print "\n";

    exit 0;
}