#!/usr/bin/perl

# This fix detects when updatenow has faulty logic, based on the local cpanel version and the md5 of updatenow.
# When it detects this, the remote updatenow script is downloaded and installed so updatenow won't loop infinitley.

BEGIN { unshift @INC, '/usr/local/cpanel'; }

eval { require Cpanel::Version; 1; } or exit;
exit unless ( Cpanel::Version->can('get_version_full') );
my $version = Cpanel::Version::get_version_full();
exit unless ( $version eq '11.30.0.27' or $version eq '11.30.0.28' );

# We know this version of updatenow had bad logic for --checkremoteversion when updates were manual
my $file = '/usr/local/cpanel/scripts/updatenow';
my $md5  = get_md5($file);
exit unless ( !$md5 or $md5 eq '37b0bb04e02d66817e9e4bb31bea509e' );

# The md5 is known to be a bad script. Update it.
require Cpanel::Config::Sources;
require Cpanel::HttpRequest;

my $req   = Cpanel::HttpRequest->new( 'die_on_404' => 1, 'retry_dns' => 1, 'hideOutput' => 0, 'signed' => 1 );
my $CPSRC = Cpanel::Config::Sources::loadcpsources();
my $host  = $CPSRC->{'HTTPUPDATE'};

my @return = $req->request(
    'host'     => $host,
    'url'      => '/autofixer2/updatenow.11.30.0.29',
    'protocol' => 0,
    'destfile' => "$file.new",
);

my $new_md5 = get_md5("$file.new");
unless ( !$new_md5 or $new_md5 eq 'f338f4c5361f3ed86f2fef77d059962a' ) {
    print "\n\n";
    print STDERR "WARNING: Failed to download '$file'\n";
    exit 1;
}

rename "$file.new", $file;
chmod 0700, $file;
print "Updated '$file'\n";
exit;

sub get_md5 {
    my $file = shift;

    if ( $ENV{'PATH'} !~ m/\/sbin/ ) {
        $ENV{'PATH'} .= ':/sbin';
    }

    if (   -e '/bin/md5sum'
        || -e '/usr/bin/md5sum'
        || -e '/usr/local/bin/md5sum' ) {
        open( MD5, '-|' ) || exec 'md5sum', $file;
    }
    else {
        open( MD5, '-|' ) || exec 'md5', '-r', $file;
    }

    my $md5;
    while (<MD5>) {
        chomp();
        ( $md5, undef ) = split( /\s+/, $_ );
        last();
    }
    close(MD5);
    return $md5;
}
