MOON
Server: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4
System: Linux vps.panamaemb.org.sg 3.10.0-1160.80.1.vz7.191.4 #1 SMP Thu Dec 15 20:31:06 MSK 2022 x86_64
User: panama (500)
PHP: 5.2.17
Disabled: NONE
Upload Files
File: //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;