File: //scripts.20110531.215904.25158/rpmup2
#!/usr/bin/perl
# cpanel - rpmup2 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, '/scripts', '/usr/local/cpanel';
if ( -e '/var/cpanel/brokenfutex' ) {
$ENV{'LD_ASSUME_KERNEL'} = '2.4.1';
}
}
use strict;
use Cpanel::Config ();
use Cpanel::Sys::OS ();
use Cpanel::OSSys ();
my $system = Cpanel::OSSys::get_system();
exit if $system eq 'freebsd';
my %UPCONF = Cpanel::Config::loadConfig('/etc/cpupdate.conf');
exit if $UPCONF{'RPMUP'} eq 'never';
my $distro = Cpanel::Sys::OS::getos();
if ( $distro eq 'mandrake' ) {
require Cpanel::SysPkgs;
my $syspkgobj = Cpanel::SysPkgs->new();
if ( !$syspkgobj ) { die print "Could not create SysPkgs object\n"; }
$syspkgobj->update();
}
elsif ( -e '/var/cpanel/useyum' ) {
system '/scripts/checkyum', '--kernel';
system 'yum', '-y', 'update';
exec '/scripts/checkyum', '--nokernel';
die "Failed to update /etc/yum.conf";
}
elsif ( -e '/var/cpanel/useapt' ) {
$ENV{'DEBIAN_FRONTEND'} = 'noninteractive';
$ENV{'DEBCONF_FRONTEND'} = 'noninteractive';
exec 'apt-get', '-y', 'upgrade';
}
elsif ( -e '/var/cpanel/useup2date' ) {
exec 'up2date', '--nox', '-u';
}
elsif ( -e '/var/cpanel/useswup' ) {
exec '/usr/bin/swup', '--upgrade';
}
elsif ( -e '/var/cpanel/userug' ) {
exec '/usr/bin/rug', '-y', 'update';
}
elsif ( -e '/var/cpanel/useemerge' ) {
exec '/usr/bin/emerge', '-uk', 'world';
}
else {
# Using Legacy RPM update methods
my $version = Cpanel::Sys::OS::getreleaseversion(); # This will die on unsupported distros
require cPanelRPM;
my $rpm = cPanelRPM->new;
my @IGNORERPMS = ( 'wu-ftpd', 'perl', 'k_', 'kernel', 'httpd', 'apache', 'php', 'exim', 'proftpd', 'MySQL', 'webmin', 'postfix', 'libmysql', 'mrtg' );
my @POSTUP;
my $arch = 'x86'; #we only support x86 right now
if ( -e '/proc/vz/veinfo' ) {
push( @IGNORERPMS, 'quota' );
my $quotarpm = `rpm -q quota`;
if ( $quotarpm !~ m/swsoft/ && $quotarpm !~ m/sw-soft/ && $quotarpm !~ m/zzo/ ) {
require Cpanel::RpmUtils;
Cpanel::RpmUtils::rpmcmd( '-Uvh', '--force', "http://httpupdate.cpanel.net/vzzo-rpms/${distro}/${version}/quota.rpm" );
}
}
my %INSTALLED = $rpm->installedlist();
my $priarch = `rpm -q glibc --qf "%{ARCH}"`;
chomp $priarch;
if ( !$priarch ) {
die "Unable to determine ARCH from glibc rpm!";
}
print 'Fetching rpmup update list....';
my @TUPDATES = Chttpreq( $arch, 'httpupdate.cpanel.net', "/pub/rpmup/$distro/$version/$arch/updates.db" );
my @NOARCHUPDATES = Chttpreq( 'noarch', 'httpupdate.cpanel.net', "/pub/rpmup/$distro/$version/noarch/updates.db" );
foreach (@NOARCHUPDATES) {
push( @TUPDATES, $_ );
}
my $parch;
my @PUPDATES;
my @UPDATES;
if ( $priarch eq 'i586' ) {
$parch = '586';
@PUPDATES = Chttpreq( '586', 'httpupdate.cpanel.net', "/pub/rpmup/$distro/$version/586/updates.db" );
}
elsif ( $priarch eq 'i686' ) {
$parch = '686';
@PUPDATES = Chttpreq( '686', 'httpupdate.cpanel.net', "/pub/rpmup/$distro/$version/686/updates.db" );
}
print "Done\n";
my ($rpmrpm) = '';
foreach my $tupdate (@TUPDATES) {
my ( $tname, $trpmv, $tfile, undef, $trpmbuilddate ) = split( /=/, $tupdate, 5 );
my $hasopt = 0;
foreach my $pupdate (@PUPDATES) {
my ( $pname, $prpmv, $pfile, undef, $prpmbuilddate ) = split( /=/, $pupdate, 5 );
if ( $pname eq $tname ) {
#add optimzed update
$pupdate =~ s/\n//g;
$pupdate .= "=${parch}";
if ( $pname eq 'rpm' ) { $rpmrpm = $pupdate; }
else {
push( @UPDATES, $pupdate );
}
$hasopt = 1;
}
}
if ( !$hasopt ) {
#add standard update
if ( $tname eq 'rpm' ) {
$rpmrpm = $tupdate;
}
else {
push( @UPDATES, $tupdate );
}
}
}
if ( $rpmrpm ne '' ) {
unshift( @UPDATES, $rpmrpm );
}
my (@TRUEUPDATES);
foreach (@UPDATES) {
if (/^glibc=/) { push( @TRUEUPDATES, $_ ); }
}
foreach (@UPDATES) {
if ( !/^glibc=/ ) { push( @TRUEUPDATES, $_ ); }
}
undef @UPDATES;
foreach (@TRUEUPDATES) {
s/\n//g;
my ( $name, $rpmv, $file, undef, $rpmbuilddate, $installarch ) = split( /=/, $_, 6 );
if ( $ARGV[0] ne '' ) {
if ( $name ne $ARGV[0] ) {
next;
}
}
my $crpmv = $INSTALLED{$name};
if ( $crpmv eq '' ) { $crpmv = 'not installed'; }
my $ignore = 0;
foreach my $ignorerpms (@IGNORERPMS) {
if ( $name =~ /^${ignorerpms}/ ) {
$ignore = 1;
}
}
if ( $crpmv =~ /^bind/ && $crpmv =~ /LARGEFD/ ) {
$ignore = 1;
}
if ( $crpmv =~ /^bind/ && $crpmv =~ /NOCAP/ ) {
$ignore = 1;
}
if ($ignore) {
print "Ignoring $name\n";
next;
}
if ( $crpmv =~ /not installed/ ) {
#print "Skipping $name, not installed\n";
next;
}
my @CRPMS = split( /\n/, $crpmv );
my $up2date = 0;
foreach my $rpml (@CRPMS) {
if ( $rpml eq $rpmv ) { $up2date = 1; }
}
if ( !$up2date ) {
foreach my $rpml (@CRPMS) {
my ($wants) = $rpmv;
my ($has) = $rpml;
my ($regexname) = $name;
$regexname =~ s/\+/\\\+/g;
$wants =~ s/^${regexname}-//g;
$has =~ s/^${regexname}-//g;
my $compareopt = cPanelRPM::compareversion( $wants, $has );
if ( $compareopt >= 0 ) { $up2date = 1; }
}
}
if ( !$up2date ) {
my $builddate = `rpm -q --qf "%{BUILDTIME}" $name 2>/dev/null`;
$builddate =~ /^(\d+)$/;
$builddate = $1;
if ( $builddate > 0 ) {
if ( $builddate > $rpmbuilddate ) {
$up2date = 1;
}
}
}
if ($up2date) {
print "$name is up to date\n";
}
else {
print "Updating $name\n";
$rpm->install($name);
}
}
}
sub getmd5sum {
my ($file) = @_;
my ($md5);
open( MD5, "-|" ) || exec 'md5sum', $file;
while (<MD5>) {
chomp();
( $md5, undef ) = split( /\s+/, $_ );
last();
}
close(MD5);
return ($md5);
}
sub Chttpreq {
my ( $cf, $host, $url ) = @_;
my $dest = "/root/.cpupdates/rpmup.${cf}.db";
if ( -e $dest && ( ( stat($dest) )[9] + 360 ) > time() ) {
print "\n\tcached ${cf} database: ok (new)\n";
}
else {
my $localmd5sum;
if ( -e $dest ) {
$localmd5sum = getmd5sum("/root/.cpupdates/rpmup.${cf}.db");
}
my $md5sum = cPanelRPM::httpreq( $host, $url . ".md5" );
if ( $md5sum ne $localmd5sum ) {
cPanelRPM::httpreq( $host, $url . ".gz", $dest . ".gz" );
if ( -e $dest . ".gz" ) {
system( "gzip", "-d", "-f", $dest . ".gz" );
}
}
else {
print "\n\tcached ${cf} database: ok\n";
}
}
open( DDF, "<", $dest );
my @DDFC = <DDF>;
close(DDF);
return @DDFC;
}