#!/usr/bin/perl
# cpanel - autofixer2/repair_pure_ftpd_pkginstall
#                                                 Copyright(c) 2014 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;

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

use Cpanel::Config::LoadCpConf ();
use Cpanel::HttpRequest        ();
use Cpanel::FileUtils          ();

# Verify we're on 11.29.0.11
my $version;
if ( open my $ver_fh, '<', '/usr/local/cpanel/version' ) {
    $version = readline($ver_fh);
    close $ver_fh;
    chomp $version;
}
exit unless ( $version && $version eq '11.29.0.11' );

# Verify pure-ftpd is enabled
my $cpconf_ref = Cpanel::Config::LoadCpConf::loadcpconf();
my $ftpserver = defined $cpconf_ref->{'ftpserver'} ? uc $cpconf_ref->{'ftpserver'} : 'PURE-FTPD';
exit unless $ftpserver eq 'PURE-FTPD';

# Verify that this is our first run or the ftp server is failing to run
my $ftp_check = `/usr/local/cpanel/scripts/restartsrv_ftpserver --check`;
chomp $ftp_check;

exit if ( -e '/var/cpanel/version/pureftpd_11.29.0.11_fix' && !$ftp_check );

# Move the rpmpreinstall link back to the correct location if it exists
foreach my $cert_file (qw(/etc/ftpd-rsa.pem /etc/ftpd-rsa-key.pem /etc/ftpd-dhparam.pem /etc/ftpd-dsa-key.pem /etc/ftpd-dsa.pem /etc/ssl/private/pure-ftpd.pem)) {
    if ( -e $cert_file . '.preinstall' ) {
        rename $cert_file . '.preinstall', $cert_file;
    }
}

# Create the symlink if it doesn't exist
symlink '/var/cpanel/ssl/ftp/pure-ftpd.pem', '/etc/ssl/private/pure-ftpd.pem' unless ( -l '/etc/ssl/private/pure-ftpd.pem' || -e '/etc/ssl/private/pure-ftpd.pem' );

# Replace /ulc/Cpanel/CpPkg/Package/pure_ftpd.pm
my $url              = 'http://' . get_update_source() . '/autofixer2/Package-pure_ftpd.pm.fix';
my $package_file     = '/usr/local/cpanel/Cpanel/CpPkg/Package/pure_ftpd.pm';
my $new_package_file = "$package_file.fix";

my $httpClient = Cpanel::HttpRequest->new( 'hideOutput' => 0, 'signed' => 1 );
$httpClient->download( $url, $new_package_file );
if ( !-e $new_package_file || -z $new_package_file ) {
    die "Failed to download $url\n";
}

unlink "$package_file.Case48508";
rename $package_file,     "$package_file.Case48508" or die "Failed to rename previous $package_file: $!";
rename $new_package_file, $package_file             or do {
    warn "Failed to update $package_file: $!";
    rename "$package_file.Case48508", $package_file;
    exit 1;
};
unlink "$package_file.Case48508";

system '/usr/local/cpanel/scripts/restartsrv_ftpserver';

Cpanel::FileUtils::touchfile('/var/cpanel/version/pureftpd_11.29.0.11_fix');

print "Repair complete\n";
exit;

sub get_update_source {
    my $update_source = 'httpupdate.cpanel.net';
    my $source_file   = '/etc/cpsources.conf';
    if ( -r $source_file && -s $source_file ) {    # pull in from cpsources.conf if it's set.
        open( my $fh, "<", $source_file );
        while (<$fh>) {
            next if ( $_ !~ m/^\s*HTTPUPDATE\s*=\s*(\S+)/ );
            $update_source = "$1";
            last;
        }
    }

    return $update_source;
}
