File: //scripts.20110531.215904.25158/upcp
#!/usr/bin/perl
# cpanel - upcp 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';
if ( !grep /\-\-use\-check/, @ARGV ) {
system('perl -c /scripts/upcp --use-check');
if ( $? != 0 ) {
print "determined that upcp had compilation issues.. updating\n";
system("/scripts/updatenow.static manual");
}
}
}
require 5.006;
use strict;
use IO::Handle;
use Socket;
use IPC::Open3 ();
use Cpanel::CleanupStub ();
use Cpanel::Config::Sources ();
use Cpanel::Env ();
use Cpanel::FindBin ();
use Cpanel::Hostname ();
use Cpanel::HttpRequest ();
use Cpanel::OSSys ();
use Cpanel::ProcessCheck ();
use Cpanel::SafeFile ();
use Cpanel::SafeRun::Errors ();
use Cpanel::Update ();
use Cpanel::WHMAPI ();
use Cpanel::Config::LoadUserDomains ();
use Cpanel::PwCache ();
use Cpanel::AccessIds ();
use Cpanel::Version::Compare ();
my $output;
$| = 1;
if ( $> != 0 ) {
die "upcp must be run as root";
}
umask(0022);
my $pidfile = '/var/run/upcp.pid';
my $security_token = $ENV{'cp_security_token'} || '';
setupenv();
$SIG{'PIPE'} = 'IGNORE';
$SIG{'HUP'} = 'IGNORE';
$SIG{'ALRM'} = 'IGNORE';
my $parent = getppid();
if ( -e '/var/cpanel/upcpcheck' ) {
my %PPIDS = Cpanel::ProcessCheck::previouspids( 'process' => 'upcp' );
delete $PPIDS{$parent};
delete $PPIDS{$$};
my $upcppidcount = scalar keys %PPIDS;
if ($upcppidcount) {
my $pidfile_mtime = ( stat($pidfile) )[9];
my $pidfile_age = ( time - $pidfile_mtime );
if ( $pidfile_age > 21600 ) { # 21600 seconds = 6 hours
foreach my $formerpid ( keys %PPIDS ) {
kill 9, $formerpid;
print "Restarting upcp process \"$formerpid\"\n";
}
}
else { # give warning about it already running
print "cPanel Update (upcp) is already running. Please wait for the previous upcp to complete, or kill off all upcp processes and try again. You may wish to use '--force'\n";
updateprogress(10);
exit 1;
}
}
}
my %PPIDS = Cpanel::ProcessCheck::previouspids( 'process' => 'easyapache' );
if ( scalar keys %PPIDS ) {
print "EasyApache is currently running. Please wait for EasyApache to complete before running cPanel Update (upcp).\n";
updateprogress(10);
exit 1;
}
# Check for available disk space in /tmp. Cpanel::Filesys::disk_space_check returns true if 4096 block available.
# Initially disabled by default for testing purposes
if ( -e '/var/cpanel/upcpdiskcheck' ) {
require Cpanel::Filesys;
if ( !Cpanel::Filesys::disk_space_check('/tmp') ) {
my $disk_info_ref = Cpanel::Filesys::_filesystem_info('/tmp');
print "\nERROR: Insufficient free space in /tmp (4096 blocks required).\n\tUpdate disabled until additional free space available.\n";
my $mount = '/tmp';
if ( $disk_info_ref->{'filesystem'} ne '/tmp' ) {
$mount = $disk_info_ref->{'filesystem'};
print "Directory /tmp is mounted on $mount\n";
}
print "\tThe mount point $mount is currently using $disk_info_ref->{'blocks_used'}\/$disk_info_ref->{'blocks_free'} blocks \[$disk_info_ref->{'percent_used'}\%\]\n";
print "\tNOTE: To ignore this check remove the file /var/cpanel/upcpdiskcheck\n\n";
updateprogress(10);
exit 1;
}
}
# all checks done, continuing with startup
# write parent pid to pid file
if ( open my $pid_fh, '>', $pidfile ) {
print {$pid_fh} $$ . "\n";
close $pid_fh;
}
else {
die "Failed to write upcp pid file: $!";
}
my $gotSigALRM = 0;
my $connecttimeout = 30;
my $liveconnect = 0;
my $connectedhost = q{};
my @HOST_IPs = ();
my %CPSRC = Cpanel::Config::Sources::loadcpsources();
my $hostname = Cpanel::Hostname::gethostname();
my $system = Cpanel::OSSys::get_system();
my $dnsonly = -e '/var/cpanel/dnsonly' ? 1 : 0;
my %UPCONF = Cpanel::Update::loadupdateconfig();
my $usejs = 0;
my $usejs2 = 0;
my $ishuman = checkifhuman();
my $firsttime = ( $ENV{'CPANEL_BASE_INSTALL'} && !-e '/usr/local/cpanel/cpanel' ) ? 1 : 0;
my @retain_argv = @ARGV;
if ( $ARGV[1] eq 'usejs' ) {
$usejs = 1;
}
elsif ( $ARGV[1] eq 'usejs2' ) {
$usejs2 = 1;
}
if ( $ARGV[0] eq '--force' ) {
shift @ARGV;
$ishuman = 1;
$ENV{'FORCEDCPUPDATE'} = 1;
}
if (check_dbmap_downgrade($UPCONF{'CPANEL'})) {
print "\n\nDetected an attempt to downgrade to a version of cPanel that doesn't have Database Mapping after having turned off the Database Prefixing.\n";
print "This is not allowed.\n\n";
exit 1;
}
my $now = time();
setup_and_clean_updatelogs();
my $logfile = '/var/cpanel/updatelogs/update.' . $now . '.log';
if ( $UPCONF{'CPANEL'} =~ m/^\s*(edge|beta|nightly)\s*$/i ) {
$UPCONF{'CPANEL'} = 'manual-' . lc $1;
}
if ( open my $ver_fh, '<', '/usr/local/cpanel/version' ) {
my $ver = readline $ver_fh;
close $ver_fh;
if ( $ver =~ m/^(?:8|9|10)\./ ) {
my $version = $1;
foreach ( 1 .. 5 ) {
print "cPanel 11.x $0 running on a $version.x machine!!! /scripts were updated without cPanel!\n";
print "Updating to RELEASE now to ensure synchronization.\n";
}
$UPCONF{'CPANEL'} = 'release';
$ishuman = 1;
$ENV{'FORCEDCPUPDATE'} = 1;
}
}
if ( -x '/scripts/preupcp' ) {
system '/scripts/preupcp';
}
if ( !-e '/usr/local/cpanel/cpanel.lisc' && -x '/usr/local/cpanel/cpkeyclt' ) {
system '/usr/local/cpanel/cpkeyclt';
}
if ( -e '/usr/local/cpanel/cpanel.lisc' ) {
# If you remove this check you will likely be installing a build that your current license file
# is not licensed for and as a result your system will no longer function.
#
# This check is only here as a safety check and does not perform the actual license test.
#
# By removing the license file you are accepting the risk that your system will no longer
# function properly. Any downtime seen as a result of that action is solely your responsibility.
if ( open my $cplisc_fh, '<', '/usr/local/cpanel/cpanel.lisc' ) {
while ( my $line = readline($cplisc_fh) ) {
if ( $line =~ m/^updates_expire_time:\s+(\d+)/ ) {
my $updates_expire_time = $1;
#
# One week safety to prevent things from breaking with clock drift.
#
if ( $UPCONF{'UPDATE_EXP_TIME'} > $updates_expire_time ) {
$updates_expire_time = $UPCONF{'UPDATE_EXP_TIME'};
}
if ( $updates_expire_time && $now > ( $updates_expire_time - ( 86400 * 7 ) ) ) {
if ($dnsonly) {
print <<'EOM';
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
License with expired updates detected for this server running
DNSONLY. Update will proceed. Please keep in mind that this server
cannot be reset to a non-DNSONLY version of cPanel without purchasing
an update extension.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
EOM
sleep 5;
last;
}
else {
print <<"EOM";
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
cPanel software update unable to continue. This server's license is
no longer eligible for software updates. In order to update this
server's cPanel software, you will need to purchase an update
extension for this server. Please contact customer service for more
information on software updates and update extensions.
https://tickets.cpanel.net/submit/?reqtype=cs
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
EOM
close($cplisc_fh);
exit 0;
}
}
}
elsif ( $line =~ m/^$/ ) {
last;
}
}
close($cplisc_fh);
}
else {
die "Unable to read license file: $!";
}
}
elsif ( !$firsttime && !$dnsonly ) {
print "No license file found. Your cPanel software will not function properly.\n";
print "Please execute /usr/local/cpanel/cpkeyclt via the command line to rectify this issue.\n";
}
my $updatedscripts = 0;
my $self_mtime = ( stat('/scripts/upcp') )[9];
if ( Cpanel::Update::automatic_updates_enabled() || $ishuman ) {
$updatedscripts = 1;
$output .= Cpanel::WHMAPI::setstatus('Updating /scripts');
print "\n";
## cpdev: updates /usr/local/cpanel/Cpanel, /scripts, and perl modules
$output .= Cpanel::Update::update_scripts( \%UPCONF );
# Injected code to upgrade to 11.30 if possible.
if(-x '/scripts/upcp_11.30_prep') {
# If upcp_11.30_prep has 0 exit code, re-run upcp.
my $prep_for_1130_failed = system("/scripts/upcp_11.30_prep >> $logfile 2>&1");
unless( $prep_for_1130_failed ) {
$ENV{'CPANEL_IS_CRON'} = $ishuman ? 0 : 1;
# Rename the 11.30 scripts and exec into them.
rename('/usr/local/cpanel/scripts/upcp.1130.static', '/usr/local/cpanel/scripts/upcp.static');
rename('/usr/local/cpanel/scripts/updatenow.1130.static', '/usr/local/cpanel/scripts/updatenow');
exec( '/usr/local/cpanel/scripts/upcp.static', "--log=$logfile", $usejs2 ? qw{usejs2} : () );
exit;
} else {
eval { require Cpanel::iContact; };
if ( exists $INC{'Cpanel/iContact.pm'} ) {
Cpanel::iContact::icontact(
'application' => 'upcp',
'subject' => 'Cannot upgrade past 11.28',
'message' => ("Errors detected trying to convert to 11.30. You are being upgraded to the latest 11.28 version until this is resolved:\n"
. `/bin/cat $logfile`),
'level' => 1
);
}
}
}
my $new_self_mtime = ( stat('/scripts/upcp') )[9];
if ( $new_self_mtime != $self_mtime && !grep( /^--newversion$/, @ARGV ) ) {
$output .= Cpanel::WHMAPI::setstatus('Received updated version of upcp, restarting');
print "\n";
exec '/scripts/upcp', @retain_argv, '--newversion';
die;
}
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( my $updatepid = fork() ) {
# write child pid to pid file
if ( open my $pid_fh, '>>', $pidfile ) {
print {$pid_fh} $updatepid . "\n";
close $pid_fh;
}
else {
die "Failed to write upcp pid file: $!";
}
$0 = 'cPanel Update (upcp) - Master';
my $count = 0;
while ( !-e $logfile ) {
$count++;
sleep(1);
if ( $count > 4000 ) { last; }
}
my $io = new IO::Handle;
my $buf;
open( $io, '<', $logfile );
$io->blocking(0);
while ( waitpid( $updatepid, 1 ) != -1 ) {
$buf = '';
sysread( $io, $buf, 4096 ) || sleep(1);
print $buf;
}
close $io;
}
else {
$0 = 'cPanel Update (upcp) - Slave';
open( RNULL, '<', '/dev/null' );
chdir '/';
open( LOGFILE, '>>', $logfile );
open( STDOUT, ">&LOGFILE" );
open( STDERR, ">&LOGFILE" );
Cpanel::CleanupStub::closefds();
Cpanel::OSSys::setsid();
if ( -x '/scripts/recoverymgmt' ) {
$output .= Cpanel::WHMAPI::setstatus('Doing Recovery Management');
$output .= Cpanel::WHMAPI::status_cmd( '/scripts/recoverymgmt', '--fromupcp' );
$output .= Cpanel::WHMAPI::setstatusdone();
}
$output .= Cpanel::WHMAPI::setstatus('Checking for main ip changes');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/mainipcheck');
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus('Checking mySQL to ensure we can connect');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/mysqlconnectioncheck');
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus('Sending usage data (if enabled)');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/send_anonymous_usage_data');
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus('Validating cPanel system users');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/checkusers');
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus('Updating email whitelists');
if ( -x '/usr/local/cpanel/bin/rim_bis_update' ) {
$output .= Cpanel::WHMAPI::status_cmd( '/usr/local/cpanel/bin/rim_bis_update', '--quiet' );
}
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus('Checking and Repairing System Package Setup');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/checksyspkgsetup');
$output .= Cpanel::WHMAPI::setstatusdone();
if ( !$dnsonly ) {
$output .= Cpanel::WHMAPI::setstatus("Running Platform Specific Optimizations");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/vps_optimizer');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/disable_unused_xinetd');
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( !-e '/etc/nameddisable' && !-e '/etc/binddisable' ) {
$output .= Cpanel::WHMAPI::setstatus('Checking and Repairing Nameserver Config');
if ( $system !~ m/bsd/i && !-e '/var/named' ) {
mkdir( '/var/named', 0755 );
$output .= Cpanel::WHMAPI::status_cmd( '/scripts/fixrndc', '-f' );
}
else {
$output .= Cpanel::WHMAPI::status_cmd('/scripts/fixrndc');
}
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( !-e '/etc/wwwacct.conf' ) {
$output .= Cpanel::WHMAPI::setstatus('Creating Account Configuration');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/mkwwwacctconf');
$output .= Cpanel::WHMAPI::setstatusdone();
}
#----------------------------------------------------------------------
$output .= Cpanel::WHMAPI::setstatus('Setting up ip startup');
if ( -x '/scripts/cpservice' ) {
$output .= Cpanel::WHMAPI::status_cmd( '/scripts/cpservice', 'ipaliases', 'enable', '35' );
}
else {
$output .= Cpanel::WHMAPI::setstatus('/scripts/cpservice is missing or not executable.');
}
$output .= Cpanel::WHMAPI::setstatusdone();
#----------------------------------------------------------------------
$output .= Cpanel::WHMAPI::setstatus('Configuring editors');
if ( -e '/usr/bin/nano' && !-e '/usr/bin/pico' ) {
symlink '/usr/bin/nano', '/usr/bin/pico';
}
$output .= Cpanel::WHMAPI::setstatusdone();
if ( $system =~ m/bsd/i && -e '/etc/make.conf' ) {
$output .= Cpanel::WHMAPI::setstatus('Configuring BSD make.conf');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/setupmakeconf');
$output .= Cpanel::WHMAPI::setstatusdone();
}
$output .= Cpanel::WHMAPI::setstatus('Creating symlinks for common binaries');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/fixbinpath');
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus('Setting Clock');
$output .= Cpanel::WHMAPI::status_cmd( '/usr/bin/rdate', '-s', 'rdate.cpanel.net' );
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus('Running Env Auto Repair');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/vzzo-fixer');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/quota_auto_fix');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/futexfix');
$output .= Cpanel::WHMAPI::status_cmd( '/scripts/autorepair', 'autorepair' );
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus('Running Cleanups');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/checkinfopages') unless $dnsonly;
$output .= Cpanel::WHMAPI::status_cmd( '/scripts/resetmailmanurls', '--from-upcp' ) unless $dnsonly;
if ( $system =~ m/freebsd/i ) {
$output .= Cpanel::WHMAPI::status_cmd('/scripts/bsdldconfig');
}
#$output .= Cpanel::WHMAPI::status_cmd('/scripts/supportvoidcheck');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/checkccompiler');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/cleanupcheck');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/purge_old_config_caches');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/cleansessions');
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus('Updating services & databases');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/findphpversion') unless $dnsonly;
$output .= Cpanel::WHMAPI::status_cmd('/scripts/checkbashshell');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/checkallowoverride') unless $dnsonly;
$output .= Cpanel::WHMAPI::status_cmd('/scripts/checkerrorlogsafe') unless $dnsonly;
$output .= Cpanel::WHMAPI::status_cmd('/scripts/listcheck') unless $dnsonly;
$output .= Cpanel::WHMAPI::status_cmd('/scripts/checkfpkey') unless $dnsonly;
$output .= Cpanel::WHMAPI::status_cmd('/scripts/fixspamassassinfailedupdate') unless $dnsonly;
$output .= Cpanel::WHMAPI::status_cmd('/scripts/ftpquotacheck') unless $dnsonly;
$output .= Cpanel::WHMAPI::status_cmd('/scripts/updateuserdomains') unless $dnsonly;
$output .= Cpanel::WHMAPI::status_cmd('/scripts/build_maxemails_config') unless $dnsonly;
$output .= Cpanel::WHMAPI::status_cmd('/scripts/updateuserdatacache --force') unless $dnsonly;
$output .= Cpanel::WHMAPI::setstatusdone();
updateprogress(1);
# Fix sendmail on FreeBSD
if ( !$dnsonly && $system =~ m/freebsd/i ) {
my $smlink = readlink('/usr/lib/sendmail');
if ( $smlink !~ /exim/ ) {
unlink '/usr/lib/sendmail';
symlink '../local/sbin/exim', '/usr/lib/sendmail';
}
$output .= Cpanel::WHMAPI::status_cmd('/scripts/checkbsdgroups');
if ( !-e '/nonexistent' ) {
mkdir '/nonexistent', 0755;
}
}
if ( -e '/etc/shadow.tmpeditlib' ) { chmod 0600, '/etc/shadow.tmpeditlib'; }
if ( -e '/etc/master.passwd.tmpeditlib' ) { chmod 0600, '/etc/master.passwd.tmpeditlib'; }
if ( !$dnsonly && -e '/usr/local/etc/rc.d/mysqld.sh' ) {
$output .= Cpanel::WHMAPI::setstatus('Repairing mysql startup');
unlink '/usr/local/etc/rc.d/mysqld.sh';
$output .= Cpanel::WHMAPI::status_cmd( '/scripts/restartsrv', 'mysql' );
$output .= Cpanel::WHMAPI::setstatusdone();
}
# Remove old cruft
unlink '/etc/cpanelbeta' if -e '/etc/cpanelbeta';
if ( $ishuman == 1 ) {
Cpanel::WHMAPI::status_note("Doing a manual update...\n");
}
my $cpanelserver = loadupdateserver();
Cpanel::WHMAPI::status_note("Cpanel updates are coming from $cpanelserver\n");
$ENV{'CPRSYNCSERVER'} = $cpanelserver;
if ( open my $disable_chkservd_fh, '>>', '/var/run/chkservd.suspend' ) {
close $disable_chkservd_fh;
}
else {
warn "Unable to disable chkservd\n";
}
$output .= Cpanel::WHMAPI::setstatus("Setting Up Crontab");
setupcrontab();
$output .= Cpanel::WHMAPI::status_cmd('/scripts/dnsqueuecron');
$output .= Cpanel::WHMAPI::setstatusdone();
if ( !$dnsonly ) {
$output .= Cpanel::WHMAPI::setstatus("Setting Up update_db_cache Crontab");
setupdbcachecrontab();
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Setting Up optimizefs Crontab");
setupoptimizefscrontab();
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Setting Up dcpumon Crontab");
setupdcpumoncrontab();
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Repairing Mailman Permissions");
if ( my $pid = fork() ) {
waitpid( $pid, 0 );
}
else {
chdir('/usr/local/cpanel/3rdparty/mailman/bin');
## case 32177: --noarchives option prevents recursion into $MAILMAN/archives/private
Cpanel::SafeRun::Errors::saferunnoerror( './check_perms', '-f', '--noarchives' );
exit(1);
}
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Running Sanity Checks & Notifications");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/chkpaths');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/ndbmcheck');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/hackcheck');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/oopscheck');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/fixetchosts');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/ipcheck');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/quotacheck');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/smartcheck');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/compilerscheck');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/updatephpconf');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/checksuexecpatch');
$output .= Cpanel::WHMAPI::status_cmd('/usr/local/cpanel/bin/fix_userdata_perms') if -x '/usr/local/cpanel/bin/fix_userdata_perms';
$output .= Cpanel::WHMAPI::setstatusdone();
}
$output .= Cpanel::WHMAPI::setstatus("Running Named Checks");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/fixbuggynamed');
$output .= Cpanel::WHMAPI::setstatusdone();
updateprogress(2);
if ( !$dnsonly && -e "/usr/bin/freshclam" ) {
$output .= Cpanel::WHMAPI::setstatus("Updating Virus Patterns");
$output .= Cpanel::WHMAPI::status_cmd( "/usr/bin/freshclam", "--quiet", "-l", "/var/log/clam-update.log" );
$output .= Cpanel::WHMAPI::setstatusdone();
}
elsif ( !$dnsonly && -e "/usr/local/bin/freshclam" ) {
$output .= Cpanel::WHMAPI::setstatus("Updating Virus Patterns");
$output .= Cpanel::WHMAPI::status_cmd( "/usr/local/bin/freshclam", "--quiet", "-l", "/var/log/clam-update.log" );
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( !$dnsonly ) {
if ( $system =~ m/freebsd/i ) {
if ( $UPCONF{'PORTSUP'} ne 'manual' || $ishuman ) {
$output .= Cpanel::WHMAPI::setstatus("Updating FreeBSD ports");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/portsup');
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( $UPCONF{'SYSUP'} ne 'manual' || $ishuman ) {
update_base_pkgs();
}
if ( $UPCONF{'RPMUP'} ne 'manual' || $ishuman ) {
$output .= Cpanel::WHMAPI::setstatus("Updating system packages");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/rpmup');
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( $UPCONF{'SARULESUP'} ne 'never' && ( $UPCONF{'SARULESUP'} ne 'manual' || $ishuman ) ) {
$output .= Cpanel::WHMAPI::setstatus("Updating SpamAssassin rules");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/sa-update_wrapper');
$output .= Cpanel::WHMAPI::setstatusdone();
}
$output .= Cpanel::WHMAPI::setstatus("Restoring compiler permissions");
$output .= Cpanel::WHMAPI::status_cmd( '/scripts/compilers', 'restore' );
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Installing initscripts");
$output .= Cpanel::WHMAPI::status_cmd( '/scripts/installcpbsdpkg', 'initscripts' );
$output .= Cpanel::WHMAPI::setstatusdone();
}
else {
if ( -e '/etc/gentoo-release' && ( $UPCONF{'PORTSUP'} ne 'manual' || $ishuman ) ) {
$output .= Cpanel::WHMAPI::setstatus("Updating Gentoo ports");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/gentooportsup');
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( $UPCONF{'SYSUP'} ne 'manual' || $ishuman ) {
update_base_pkgs();
}
if ( $UPCONF{'RPMUP'} ne 'manual' || $ishuman ) {
$output .= Cpanel::WHMAPI::setstatus("Updating system packages");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/rpmup');
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( $UPCONF{'SARULESUP'} ne 'never' && ( $UPCONF{'SARULESUP'} ne 'manual' || $ishuman ) ) {
$output .= Cpanel::WHMAPI::setstatus("Updating SpamAssassin rules");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/sa-update_wrapper');
$output .= Cpanel::WHMAPI::setstatusdone();
}
$output .= Cpanel::WHMAPI::setstatus("Restoring compiler permissions");
$output .= Cpanel::WHMAPI::status_cmd( '/scripts/compilers', 'restore' );
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Repairing mysql");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/fixmysql');
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Optimizing Databases");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/optimize_eximstats');
$output .= Cpanel::WHMAPI::setstatusdone();
}
unless ( Cpanel::Update::automatic_updates_enabled() || $ishuman ) {
$output .= Cpanel::WHMAPI::setstatus('Automatic cPanel & WHM updates are not enabled, finalizing maintenance');
unlink '/var/run/chkservd.suspend';
$output .= Cpanel::WHMAPI::status_cmd( '/usr/local/cpanel/bin/dcpumon', '--killproc' );
$output .= Cpanel::WHMAPI::status_cmd('/usr/local/cpanel/bin/scanfornewmail');
$output .= Cpanel::WHMAPI::status_cmd('/scripts/fixsuexeccgiscripts');
$output .= Cpanel::WHMAPI::setstatusdone();
updateprogress(10);
exit;
}
# Exim sanity checks
if ( !-e '/etc/exim.pl' || -z _ ) {
$output .= Cpanel::WHMAPI::status_cmd( '/scripts/eximup', '--force' );
}
elsif ( !-e '/etc/exim.conf' || -z _ || !-e '/etc/exim.pl.local' || -z _ ) {
$output .= Cpanel::WHMAPI::status_cmd('/scripts/buildeximconf');
}
}
if ( $UPCONF{'SYSUP'} ne 'manual' || $ishuman ) {
update_pkgs_all_platforms();
}
# Prevent updates for 'never'
if ( $UPCONF{'CPANEL'} =~ m/^never$/i ) { updateprogress(10); exit; }
## FIXME?: given the scripts invoked above, does this need to happen earlier?
if ( !$updatedscripts ) {
$output .= Cpanel::WHMAPI::setstatus("Updating /scripts");
$output .= Cpanel::Update::update_scripts( \%UPCONF );
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( -e '/scripts/recoverymgmt' ) {
$output .= Cpanel::WHMAPI::setstatus("Doing Recovery Management");
$output .= Cpanel::WHMAPI::status_cmd( '/scripts/recoverymgmt', '--fromupcp' );
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( !$dnsonly ) {
$output .= Cpanel::WHMAPI::setstatus("Configuring Frontpage");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/initfpsuexec');
$output .= Cpanel::WHMAPI::setstatusdone();
}
my $requrl;
if ( $UPCONF{'CPANEL'} eq 'stable' || $UPCONF{'CPANEL'} eq 'manual' ) {
$ENV{'CPBUILD'} = 'STABLE';
$requrl = "/STABLE-installer/";
}
# Don't add release or stable here
elsif ( $UPCONF{'CPANEL'} =~ /^(manual-)?(dnsonly-beta|dnsonly-edge|dnsonly-nightly|dnsonly|demo|nightly|edge|beta|current)/i ) {
$ENV{'CPBUILD'} = uc $2;
my $tree = uc $2;
if ( $tree =~ m/demo/i ) { $tree = 'NIGHTLY'; }
$requrl = '/' . $tree . '-installer/';
}
else {
# this is the release tree.. we need no tag as it is default
$requrl = '/installer/';
}
##################################################
## cpdev: download and invoke the installer
## note: file paths listed as './' are relative to '/usr/local/cpanel/'
## 1. $script below is the contents of e.g. http://httpupdate.cpanel.net/EDGE-installer/
## which is a shell script with embedded perl
## 2. $script downloads perl script e.g. http://httpupdate.cpanel.net/cpanelsync/EDGE/install
## renames it to '/var/cpanel/perl/installer', and executes it (now referred to as INSTALLER)
## 3. INSTALLER syncs (via /scripts/cpanelsync) the local filesystem with the various
## subdirectories of http://httpupdate.cpanel.net/cpanelsync/EDGE/
## See INSTALLER's *CPANELSYNC_REPOS arrays and &sync_build_files.
## 4. INSTALLER invokes various post_install scripts in ./install/,
## e.g. ./install/perlmod, and the list of scripts in ./install.list
## 5. INSTALLER invokes various ./bin/ programs, as described in ./install/cpanelpost
## 6. INSTALLER restarts services as described in ./etc/init/startup
$output .= Cpanel::WHMAPI::setstatus("Fetching Installer");
my $httpClient = Cpanel::HttpRequest->new();
my $script = $httpClient->request(
'host' => loadupdateserver(),
'url' => $requrl,
'protocol' => 0,
);
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Running Installer");
{
local $ENV{'cp_security_token'} = $security_token;
my $install_pid = IPC::Open3::open3( \*INSTALLIN, ">&STDOUT", ">&STDERR", '/bin/sh' );
print INSTALLIN $script;
close(INSTALLIN);
waitpid( $install_pid, 0 );
}
$output .= Cpanel::WHMAPI::setstatusdone();
##################################################
$output .= Cpanel::WHMAPI::setstatus('Ensuring locale databases');
Cpanel::SafeRun::Errors::saferunnoerror( '/usr/local/cpanel/bin/servers_queue', '--plugin=LocaleTasks', 'queue', 'build_locale_databases' . ( $ENV{'FORCEDCPUPDATE'} ? ' --force' : '' ) );
$output .= 'locale database rebuild scheduled.';
$output .= Cpanel::WHMAPI::setstatusdone();
if ( !$dnsonly && -e "/usr/local/cpanel/whostmgr/bin/whostmgr2.updateaddons" ) {
$output .= Cpanel::WHMAPI::setstatus("Updating Addons");
$output .= Cpanel::WHMAPI::status_cmd( "/usr/local/cpanel/whostmgr/bin/whostmgr2", "--updateaddons" );
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( !$dnsonly ) {
$output .= Cpanel::WHMAPI::setstatus("Cleaning Squirrelmail attachment directories");
&clean_user_squirrelmail_attachment_dirs();
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( -x '/scripts/postupcp' ) {
$output .= Cpanel::WHMAPI::setstatus("Running /scripts/postupcp");
$output .= Cpanel::WHMAPI::status_cmd("/scripts/postupcp");
$output .= Cpanel::WHMAPI::setstatusdone();
}
updateprogress(10);
if ( !$dnsonly ) {
$output .= Cpanel::WHMAPI::setstatus("Running postinstall scripts");
$output .= Cpanel::WHMAPI::status_cmd( "/usr/local/cpanel/bin/dcpumon", "--killproc" );
$output .= Cpanel::WHMAPI::status_cmd("/usr/local/cpanel/bin/scanfornewmail");
$output .= Cpanel::WHMAPI::status_cmd("/scripts/fixsuexeccgiscripts");
$output .= Cpanel::WHMAPI::status_cmd("/usr/local/cpanel/bin/setupdbmap");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/spamassassin_dbm_cleaner') if -x '/scripts/spamassassin_dbm_cleaner';
$output .= Cpanel::WHMAPI::setstatusdone("Running postinstall scripts");
}
$output .= Cpanel::WHMAPI::clearstatus();
print LOGFILE $output;
close(RNULL);
close(LOGFILE);
sleep(3);
exit();
}
resume_chkservd_in_ten_seconds();
# Only restart cpsrvd if we did not earlier
#
if ( $ENV{'NOWHOSTMRRES'} ) {
restart_cpsrvd();
}
sub restart_cpsrvd {
if ( my $ipid = fork() ) {
waitpid( $ipid, 0 );
}
else {
chdir '/';
Cpanel::OSSys::setsid();
Cpanel::CleanupStub::daemonclosefds();
if ( -x '/usr/local/cpanel/etc/init/startstunnel' ) {
exec '/usr/local/cpanel/etc/init/startstunnel';
}
exit;
}
if ( my $ipid = fork() ) {
waitpid( $ipid, 0 );
}
else {
chdir '/';
Cpanel::OSSys::setsid();
Cpanel::CleanupStub::daemonclosefds();
if ( -x '/usr/local/cpanel/etc/init/startcpsrvd' ) {
exec '/usr/local/cpanel/etc/init/startcpsrvd';
}
exit;
}
}
sub loadupdateserver {
return $CPSRC{'HTTPUPDATE'};
}
sub updateprogress {
my ($actualmoved) = @_;
if ($usejs2) {
my $percent = 10 * $actualmoved;
print "<script>parent.update_percent($percent)</script>";
}
elsif ($usejs) {
print "<script>";
my $pb = $security_token . "/scripts/progressbar?num=${actualmoved}&total=10&width=450";
print "parent.progressw.window.location.href = '$pb';</script> ";
if ( $actualmoved == 10 ) {
print "<script>parent.updater.window.location.href = '${security_token}/updatecomplete';</script>";
$output .= Cpanel::WHMAPI::clearstatus();
}
}
elsif ( -t STDOUT ) {
my $percent = ( $actualmoved * 10 );
print "\033]0;$ENV{USER}\@${hostname} cPanel Update ${percent}% Complete\007";
}
}
sub checkifhuman {
return if $ENV{'TERM'} eq 'dumb';
return 1 if -t STDOUT;
return 1 if $ENV{'SSH_CLIENT'};
return 1 if readlink "/proc/${parent}/exe" =~ m/whostmgrd/;
return 1 if $ARGV[0] eq 'manual';
return 1 if $ENV{'NOWHOSTMRRES'};
return;
}
sub setupcrontab {
my $has_upcp = 0;
my $has_cpbackup = 0;
my $has_tail_chk = 0;
my $has_mailman_chown_archives = 0;
my $has_mysqluserstore = 0;
my $has_dbindex = 0;
## 2010-05-19: /scripts/mailman_chown_archives is looked for and filtered, but no longer added;
## the intent is to remove the script from the crontab; all reference to mailman_chown_archives
## can be removed a few releases after 11.25.1
if ( !exists $CPSRC{'HTTPUPDATE'} ) {
$CPSRC{'HTTPUPDATE'} = 'httpupdate.cpanel.net';
}
my @_crontab_lines = split( /\n/, Cpanel::SafeRun::Errors::saferunnoerror( 'crontab', '-l' ) );
my @CT = grep( !/$CPSRC{'HTTPUPDATE'}/, grep( !/^\#/, @_crontab_lines ) );
## case 36563: preserve previous runtime of upcp (see $has_upcp and $old_upcp_line)
my $old_upcp_line;
foreach my $line (@CT) {
if ( $line =~ m!/scripts/upcp! ) {
$has_upcp = 1;
$old_upcp_line = $line;
}
elsif ( $line =~ m!/scripts/cpbackup! ) { $has_cpbackup = 1; }
elsif ( $line =~ m!/usr/local/cpanel/bin/tail-check! ) { $has_tail_chk = 1; }
elsif ( $line =~ m!/usr/local/cpanel/bin/tailwatchd-chk! ) { $has_tail_chk = 0; } #remove old cruft
elsif ( $line =~ m!/scripts/mailman_chown_archives! ) { $has_mailman_chown_archives = 1; }
elsif ( $line =~ m!/usr/local/cpanel/bin/mysqluserstore!) { $has_mysqluserstore = 1; }
elsif ( $line =~ m!/usr/local/cpanel/bin/dbindex!) { $has_dbindex = 1; }
}
## note: reversed the conditional on $has_mailman; this block runs if the crontab *does* have it
if ( !$has_upcp || !$has_cpbackup || !$has_tail_chk || $has_mailman_chown_archives || !$has_mysqluserstore || !$has_dbindex) {
@CT = grep( !m!/scripts/upcp!, @CT );
@CT = grep( !m!/scripts/cpbackup!, @CT );
@CT = grep( !m!/usr/local/cpanel/bin/tailwatchd-chk!, @CT ); #remove old cruft
@CT = grep( !m!/usr/local/cpanel/bin/tail-check!, @CT );
@CT = grep( !m!/scripts/mailman_chown_archives!, @CT );
@CT = grep( !m!/usr/local/cpanel/bin/mysqluserstore!, @CT );
@CT = grep( !m!/usr/local/cpanel/bin/dbindex!, @CT );
# Adding test for executable to ensure that cron job does not throw
# spurious errors on systems downgraded to a version that does not
# include /usr/local/cpanel/bin/tail-check
my $test_bin = Cpanel::FindBin::findbin('test');
if ($test_bin) {
$test_bin .= ' -x /usr/local/cpanel/bin/tail-check && ';
}
else {
$test_bin = '';
}
if ( $has_upcp && $old_upcp_line ) {
push( @CT, $old_upcp_line );
}
else {
my $rt = int( rand(2.9999999) );
my $hour = int( rand(6) );
if ( $rt == 0 ) {
$hour = ( 24 - int( rand(4) ) );
}
if ( $hour == 24 ) { $hour = 0; }
push( @CT, int( rand(60) ) . ' ' . $hour . " * * * /scripts/upcp" );
}
push( @CT, "0 1 * * * /scripts/cpbackup" );
push( @CT, "35 * * * * ${test_bin}/usr/local/cpanel/bin/tail-check" );
if (!$dnsonly) {
push( @CT, "30 */2 * * * /usr/local/cpanel/bin/mysqluserstore >/dev/null 2>&1");
push( @CT, "15 */2 * * * /usr/local/cpanel/bin/dbindex >/dev/null 2>&1");
}
open( my $cr_fh, ">", "/scripts/.crontab" );
print {$cr_fh} join( "\n", @CT ) . "\n";
close($cr_fh);
$output .= Cpanel::WHMAPI::status_cmd( "crontab", "/scripts/.crontab" );
unlink("/scripts/.crontab");
}
}
sub setupoptimizefscrontab {
my $has_optimizefs = 0;
my $test_bin = Cpanel::FindBin::findbin('test');
if ($test_bin) {
$test_bin .= ' -x /usr/local/cpanel/bin/optimizefs && ';
}
else {
$test_bin = '';
}
my @CT = grep( !/^#/, split( /\n/, Cpanel::SafeRun::Errors::saferunnoerror( 'crontab', '-l' ) ) );
foreach my $line (@CT) {
if ( $line =~ m/\/usr\/local\/cpanel\/bin\/optimizefs/ ) {
if ($test_bin) {
if ( $line =~ m/test/ ) {
$has_optimizefs = 1;
}
}
else {
$has_optimizefs = 1;
}
}
}
if ( !$has_optimizefs ) {
@CT = grep( !/optimizefs/, @CT );
push( @CT, "45 */8 * * * ${test_bin}/usr/local/cpanel/bin/optimizefs" );
open( my $cr_fh, '>', '/scripts/.crontab' );
print {$cr_fh} join( "\n", @CT ) . "\n";
close($cr_fh);
$output .= Cpanel::WHMAPI::status_cmd( 'crontab', '/scripts/.crontab' );
unlink '/scripts/.crontab';
}
}
sub setupdbcachecrontab {
my $has_dbcache = 0;
my $test_bin = Cpanel::FindBin::findbin('test');
if ($test_bin) {
$test_bin .= ' -x /scripts/update_db_cache && ';
}
else {
$test_bin = '';
}
my @CT = grep( !/^#/, split( /\n/, Cpanel::SafeRun::Errors::saferunnoerror( 'crontab', '-l' ) ) );
foreach my $line (@CT) {
if ( $line =~ m/\/scripts\/update_db_cache/ ) {
if ($test_bin) {
if ( $line =~ m/test/ ) {
$has_dbcache = 1;
}
}
else {
$has_dbcache = 1;
}
}
}
if ( !$has_dbcache ) {
@CT = grep( !/update_db_cache/, @CT );
push( @CT, "30 */4 * * * ${test_bin}/scripts/update_db_cache" );
open( my $cr_fh, '>', '/scripts/.crontab' );
print {$cr_fh} join( "\n", @CT ) . "\n";
close($cr_fh);
$output .= Cpanel::WHMAPI::status_cmd( 'crontab', '/scripts/.crontab' );
unlink '/scripts/.crontab';
}
}
sub setupdcpumoncrontab {
my $has_dcpumon = 0;
if ( !exists $CPSRC{'HTTPUPDATE'} ) {
$CPSRC{'HTTPUPDATE'} = 'httpupdate.cpanel.net';
}
my @CT = grep( !/$CPSRC{'HTTPUPDATE'}/, grep( !/^#/, split( /\n/, Cpanel::SafeRun::Errors::saferunnoerror( 'crontab', '-l' ) ) ) );
if ( grep( /dcpumon/, @CT ) ) { $has_dcpumon = 1; }
if ( !$has_dcpumon ) {
@CT = grep( !/dcpumon/, @CT );
push( @CT, "*/5 * * * * /usr/local/cpanel/bin/dcpumon >/dev/null 2>&1" );
open( my $cr_fh, ">", "/scripts/.crontab" );
print {$cr_fh} join( "\n", @CT ) . "\n";
close($cr_fh);
$output .= Cpanel::WHMAPI::status_cmd( "crontab", "/scripts/.crontab" );
unlink("/scripts/.crontab");
}
}
sub setupenv {
Cpanel::Env::cleanenv();
delete $ENV{'DOCUMENT_ROOT'};
delete $ENV{'SERVER_SOFTWARE'};
if ( $ENV{'WHM50'} || $ENV{'NOWHOSTMRRES'} ) {
$ENV{'GATEWAY_INTERFACE'} = 'CGI/1.1';
}
( $ENV{'USER'}, $ENV{'HOME'} ) = ( getpwuid($>) )[ 0, 7 ];
$ENV{'PATH'} .= ':/sbin:/usr/sbin:/usr/bin:/bin:/usr/local/bin';
$ENV{'LANG'} = 'C';
$ENV{'LC_ALL'} = 'C';
if ( !-e '/var/cpanel/disablefutexcheck' ) {
$output .= Cpanel::WHMAPI::setstatus("Running Futex Check/Fix");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/futexfix');
$output .= Cpanel::WHMAPI::setstatusdone();
}
if ( -e '/var/cpanel/brokenfutex' ) {
$output .= Cpanel::WHMAPI::setstatus("Futexes override enabled");
$ENV{'LD_ASSUME_KERNEL'} = q{2.4.1};
$output .= Cpanel::WHMAPI::setstatusdone();
}
}
sub setup_and_clean_updatelogs {
if ( !-d '/var/cpanel/updatelogs' ) {
unlink('/var/cpanel/updatelogs');
mkdir( '/var/cpanel/updatelogs', 0700 );
}
opendir( ULS, '/var/cpanel/updatelogs' );
while ( my $file = readdir(ULS) ) {
if ( -f '/var/cpanel/updatelogs/' . $file
&& ( stat( '/var/cpanel/updatelogs/' . $file ) )[9] < ( $now - ( 86400 * 10 ) ) ) {
unlink("/var/cpanel/updatelogs/${file}");
}
}
closedir(ULS);
}
sub update_base_pkgs {
$output .= Cpanel::WHMAPI::setstatus("Updating FTP Server");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/ftpup');
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Updating bandmin");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/bandminup');
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Updating IMAP Server");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/imapup');
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Updating DNS Server");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/nsdup');
$output .= Cpanel::WHMAPI::setstatusdone();
}
sub update_pkgs_all_platforms {
$output .= Cpanel::WHMAPI::setstatus("Updating MySQL Server");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/mysqlup');
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Updating SMTP (exim) Server");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/eximup');
$output .= Cpanel::WHMAPI::setstatusdone();
$output .= Cpanel::WHMAPI::setstatus("Installing system packages and perl modules");
$output .= Cpanel::WHMAPI::status_cmd('/scripts/sysup');
$output .= Cpanel::WHMAPI::setstatusdone();
}
sub resume_chkservd_in_ten_seconds {
if ( my $ipid = fork() ) {
}
else {
alarm(15);
local $SIG{'HUP'} = 'IGNORE';
local $SIG{'INT'} = 'IGNORE';
chdir '/';
Cpanel::OSSys::setsid();
Cpanel::CleanupStub::daemonclosefds();
sleep 10;
unlink '/var/run/chkservd.suspend';
exit 0;
}
}
## Iterates through users' .sqmailattach directory, deleting files that are more than 7 days old
sub clean_user_squirrelmail_attachment_dirs {
my %TRUEDOMAINS;
Cpanel::Config::LoadUserDomains::loadtrueuserdomains( \%TRUEDOMAINS );
my @users = sort values %TRUEDOMAINS;
my $time = time();
for my $username (@users) {
my @pwinfo = Cpanel::PwCache::getpwnam($username);
my ($homedir) = $pwinfo[7];
## defined as a closure, as the coderef accepted by do_as_user takes no args (see $homedir)
my $clean_sqmailattach_as_user = sub {
my $sqmailattach = "$homedir/.sqmailattach";
return unless ( -e $sqmailattach && -d _ );
opendir( my $dirh, $sqmailattach );
my @attachments = grep { !m/^\.{1,2}$/ } readdir($dirh);
for my $file (@attachments) {
my $full = "$sqmailattach/$file";
my $age_in_secs = $time - ( stat($full) )[9];
## unlink if the attachment is more than 7 days old
if ( $age_in_secs > ( 60 * 60 * 24 * 7 ) ) {
## this prevents unlink from failing, by offering a regex to
## the taint gods or something
my ($untaint) = ( $full =~ m/^(.*)$/ );
unlink($untaint);
}
}
};
Cpanel::AccessIds::do_as_user( $username, $clean_sqmailattach_as_user );
}
return;
}
# Return true if we are down grading to a version that doesn't support DB mapping
sub check_dbmap_downgrade {
my ($tree) = @_;
$tree = Cpanel::Update::getupdatepath($tree);
my $httpClient = Cpanel::HttpRequest->new();
if ( -e '/var/cpanel/version/11.25.1' ) {
my $full_update_version = $httpClient->request(
host => 'httpupdate.cpanel.net',
url => "/cpanelsync/${tree}/cpanel/version",
);
my ($update_version) = split( /-/, $full_update_version );
return Cpanel::Version::Compare::compare( '11.27.1', '>', $update_version );
}
}