#!/usr/bin/perl
# cpanel - cpsources_mirror                       Copyright(c) 2015 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'; }

use strict;

use Cpanel::SafeRun  ();
use Cpanel::SafeFile ();

sub mirror_resolves {
    my ($mirror) = @_;

    # If dig doesn't exist, we're going to pretend everything's okay.  They have
    # bigger problems.
    return 1 unless -x '/usr/bin/dig';
    my $output = Cpanel::SafeRun::saferunallerrors( '/usr/bin/dig', $mirror );

    return $output =~ /^\Q$mirror.\E.*\s+IN\s+(?:A|AAAA)\s+[0-9a-f.:]+/m;
}

sub current_mirror {
    return eval {
        require Cpanel::Config::Sources;
        Cpanel::Config::Sources::loadcpsources()->{'HTTPUPDATE'};
    } || '';
}

sub is_affected {
    my $mirror = current_mirror();
    return $mirror =~ /^httpupdate\d+\.cpanel\.net$/ && !mirror_resolves($mirror);
}

sub fix {
    my $filename = '/etc/cpsources.conf';
    if ( my $lock = Cpanel::SafeFile::safeopen( my $fh, '<', $filename ) ) {
        my @lines = grep { !/^\s*HTTPUPDATE=/ } <$fh>;
        Cpanel::SafeFile::safeclose( $fh, $lock );

        my $data = join( '', @lines );
        if ( eval { require Cpanel::FileUtils::Write } ) {
            Cpanel::FileUtils::Write::writefile( $filename, $data, 0644 ) or warn "Can't rewrite $filename: $!";
        }
    }
    return !is_affected();
}

sub script {
    return 0 unless is_affected();

    my $is_fixed = fix();
    print "cpsources fix was " . ( $is_fixed ? "successful" : "unsuccessful" ), "\n";
    return !$is_fixed;
}

exit script() unless caller;
