File: //proc/2/task/2/root/installd/RpmUtils.pm
package Cpanel::RpmUtils;
# cpanel12 - RpmUtils.pm Copyright(c) 2005-2008 cPanel, Inc.
# All rights Reserved.
# copyright@cpanel.net http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited
use strict;
use Carp ();
use Cpanel::SafeRun::Errors ();
use Cpanel::HttpRequest ();
use vars qw(@ISA @EXPORT $VERSION);
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(checkrpm rpmpreinstall rpmcmd);
$VERSION = '1.2';
sub isinstalled {
my (%ARGS) = @_;
my $rpm = $ARGS{'rpm'};
my $stripdot = $ARGS{'stripdot'};
my @RPM = split( /\./, $rpm );
pop @RPM;
my $arch = pop @RPM;
my $rpmname = join( '.', @RPM );
my (@RPMNAME) = split( /-/, $rpmname );
my $build = pop @RPMNAME;
my $version = pop @RPMNAME;
my $rpmbasename = join( '-', @RPMNAME );
if ( $stripdot && $build =~ /\./ ) { $rpmname =~ s/\.[^\.]+$//g; }
my $cver = Cpanel::SafeRun::Errors::saferunnoerror( 'rpm', '-q', '--queryformat', '%{name}-%{version}-%{release}', $rpmbasename );
my @CVER = split( /\n/, $cver );
$cver = $CVER[0];
return 1 if ( $cver eq $rpmname );
return 0;
}
sub rpmcmd {
my (@RPMARGS) = @_;
return if !rpm_is_installed();
my @URLS;
while ( $RPMARGS[$#RPMARGS] =~ /\.rpm$/ ) {
push( @URLS, pop(@RPMARGS) );
}
if ( !-e '/var/spool/cpupdates' ) {
mkdir '/var/spool/cpupdates', 0700;
}
my $httpClient = 0;
my @RPMFILES;
my @UNLINKFILES;
foreach my $url (@URLS) {
if ( $url =~ /^http:\/\// ) {
if ( $httpClient == 0 ) {
$httpClient = Cpanel::HttpRequest->new( 'hideOutput' => 0 );
}
my @path = split( /\//, $url );
my $file = $path[$#path];
$file =~ s/\.\.//g;
$httpClient->download( $url, '/var/spool/cpupdates/' . $file );
if ( !-e '/var/spool/cpupdates/' . $file ) {
die "Error fetching $url";
}
push @RPMFILES, '/var/spool/cpupdates/' . $file;
push @UNLINKFILES, '/var/spool/cpupdates/' . $file;
}
else {
#not a url
push @RPMFILES, $url;
}
}
# Run rpm command
system( 'rpm', @RPMARGS, @RPMFILES );
foreach my $file (@UNLINKFILES) {
unlink $file;
}
}
sub checkrpm {
my $file = shift;
return if !rpm_is_installed();
my $rpmversion = `rpm --version`;
chomp $rpmversion;
if ( defined $rpmversion && $rpmversion =~ m{ ([\d.]+) }xms ) {
$rpmversion = $1;
}
else {
$rpmversion = 'unknown';
}
my $disablesignature;
if ( $rpmversion ne 'unknown' ) {
my ( $maj, $min, $ver ) = split m{ [.] }xms, $rpmversion;
if ( defined $maj && $maj ne '' && defined $min && $min ne '' ) {
if ( $maj >= 4 ) {
if ( $min >= 2 ) {
$disablesignature = '--nosignature';
}
else {
$disablesignature = '--nogpg';
}
}
}
else {
Carp::confess "Problem parsing rpm version $rpmversion. Disabling signature checking.";
return 1;
}
}
else {
Carp::confess "Unable to get rpm version. Disabling signature checking.";
return 1;
}
my $status = Cpanel::SafeRun::Errors::saferunnoerror( 'rpm', '-K', $file );
return 1 if ( $status =~ m{\s* OK \s*}xms && $status !~ m{NOT}xms );
$status = Cpanel::SafeRun::Errors::saferunnoerror( 'rpm', '-K', $disablesignature, $file );
return 1 if ( $status =~ m{\s* OK \s*}xms && $status !~ m{NOT}xms );
return 0;
}
sub rpmpreinstall {
my $file = shift;
return if !rpm_is_installed();
open( RPM, '-|' ) || exec( 'rpm', '-qpl', $file );
while (<RPM>) {
chomp;
if ( -e $_ ) {
system 'chattr', '-i', $_;
}
}
close(RPM);
}
sub rpm_is_installed {
return if ( !-x '/bin/rpm'
&& !-x '/usr/bin/rpm'
&& !-x '/usr/local/bin/rpm' );
return 1;
}
sub checkupdatesystem {
my $message = q{};
local $ENV{'LANG'} = 'C';
my $updateok =
-e '/var/cpanel/useyum' ? checkyum( \$message )
: -e '/var/cpanel/useswup' ? checkswup( \$message )
: -e '/var/cpanel/useup2date' ? checkup2date( \$message )
: -e '/var/cpanel/useapt' ? checkapt( \$message )
: 1;
return wantarray ? ( $updateok, $message ) : $updateok;
}
sub _setupdatemessage {
my $value = shift;
if ( !defined $value ) { $value = 0; }
my $message_ref = shift || return;
my $updatemethod = shift || 'unknown';
if ( !$value ) { # Failed
if ( -t STDOUT ) {
$$message_ref = chr(27) . '[1;31m';
$$message_ref .= q{Your operating system's rpm update method };
$$message_ref .= qq{($updatemethod) was not able to locate the glibc package. };
$$message_ref .= q{This is an indication of an improper setup. };
$$message_ref .= q{You must correct this error before you can proceed.};
$$message_ref .= chr(27) . '[0;39m';
}
else {
$$message_ref .= q{Your operating system's rpm update method };
$$message_ref .= qq{($updatemethod) was not able to locate the glibc package. };
$$message_ref .= q{This is an indication of an improper setup. };
$$message_ref .= q{You must correct this error before you can proceed.};
}
}
else { # Passed
if ( -t STDOUT ) {
$$message_ref = chr(27) . '[1;32m';
$$message_ref .= q{Rpm Sanity Check PASSED!};
$$message_ref .= chr(27) . '[0;39m';
}
else {
$$message_ref .= q{Rpm Sanity Check PASSED!};
}
}
}
sub checkyum {
my $message_ref = shift;
my $glibcinfo = Cpanel::SafeRun::Errors::saferunallerrors( 'yum', 'info', 'glibc' ) || '';
if ( $glibcinfo !~ m{ (?: Installed | Available) \s+ Packages }xmsi ) {
# Failed
_setupdatemessage( 0, $message_ref, 'yum' );
return 0;
}
# Passed
_setupdatemessage( 1, $message_ref, 'yum' );
return 1;
}
sub checkswup {
my $message_ref = shift;
my $glibcinfo = Cpanel::SafeRun::Errors::saferunallerrors( 'swup', '--list-latest' ) || '';
if ( $glibcinfo !~ /^glibc-/mi ) {
# Failed
_setupdatemessage( 0, $message_ref, 'swup' );
return 0;
}
# Passed
_setupdatemessage( 1, $message_ref, 'swup' );
return 1;
}
sub checkup2date {
my $message_ref = shift;
my $glibcinfo = Cpanel::SafeRun::Errors::saferunallerrors( 'up2date', '--showall' ) || '';
if ( $glibcinfo !~ /^glibc-/mi ) {
# Failed
_setupdatemessage( 0, $message_ref, 'up2date' );
return 0;
}
# Passed
_setupdatemessage( 1, $message_ref, 'up2date' );
return 1;
}
sub checkapt {
my $message_ref = shift;
my $glibcinfo = Cpanel::SafeRun::Errors::saferunallerrors( 'apt-get', '-s', 'glibc' ) || '';
if ( $glibcinfo =~ /find package glibc/mi ) {
# Failed
_setupdatemessage( 0, $message_ref, 'apt' );
return 0;
}
# Passed
_setupdatemessage( 1, $message_ref, 'apt' );
return 1;
}
1;