File: //proc/self/root/proc/self/root/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;
}