MOON
Server: Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4
System: Linux csr818.wilogic.com 2.6.18-419.el5xen #1 SMP Fri Feb 24 22:50:37 UTC 2017 x86_64
User: digitals (531)
PHP: 5.4.45
Disabled: NONE
Upload Files
File: //proc/self/root/scripts.20110531.215904.25158/ftpup
#!/usr/bin/perl
# cpanel - ftpup                                  Copyright(c) 2010 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', '/scripts'; }

use IPC::Open3                 ();
use Cpanel::OSSys              ();
use Cpanel::Sys                ();
use Cpanel::SysPkgs            ();
use Cpanel::Logger             ();
use Cpanel::Config::LoadCpConf ();
use Cpanel::FtpUtils::Config   ();
use Cpanel::RpmStor            ();
use Cpanel::HttpRequest        ();
use Cpanel::RpmUtils           ();
use Cpanel::Update             ();
use Cpanel::Proc               ();
use Cpanel::Sys::OS            ();
use Cpanel::Init               ();
use Cpanel::SSLCerts           ();
use cPpkgversions              ();
use Fcntl                      ();
use RestartSrv;

Cpanel::Update::safe_update_environment('ftp');
Cpanel::Update::init_UP_update('ftp');

my $logger = Cpanel::Logger->new();

my ( $system, $release, $machine ) = ( Cpanel::OSSys::uname() )[ 0, 2, 4 ];
my $httpClient = Cpanel::HttpRequest->new( 'hideOutput' => 0 );
my $hostname   = Cpanel::Sys::gethostname();
my $cpconf_ref = Cpanel::Config::LoadCpConf::loadcpconf();
my $pkg        = $cpconf_ref->{'ftpserver'} || 'pure-ftpd';
my $kill       = $pkg eq 'pure-ftpd' ? 'proftpd' : 'pure-ftpd';
my $now        = time;
my $latest     = 0;
my $src        = 0;
my $force      = 0;
if (@ARGV) {
    if ( grep( /force/,  @ARGV ) ) { $force  = 1; }
    if ( grep( /source/, @ARGV ) ) { $src    = 1; }
    if ( grep( /latest/, @ARGV ) ) { $latest = 1; }
    if ( grep( /\Q$kill\E/, @ARGV ) ) {
        print "/scripts/ftpup does not support arguments to change the configured FTP server.\n";
        print "Use \"/scripts/setupftpserver $kill\" instead.\n";
        exit 1;
    }
}

unless ( $pkg eq 'pure-ftpd' || $pkg eq 'proftpd' ) {
    die "Unknown FTP server: $pkg";
}

print "Ftp Setup Script Version 6.1\n";

$ENV{'PATH'} = $ENV{'PATH'} . ':/usr/sbin';

my $syspkgobj = Cpanel::SysPkgs->new();
if ( !$syspkgobj ) {
    die print "Could not create SysPkgs object\n";
}

my @pkgs = ($pkg);

if ( $system =~ /freebsd/i ) {
    system("/scripts/checkmakeconf");
    system("/scripts/portsup");
    my $result;

    print "This is the $pkg installer\n";

    my (@CMD);
    if ($force) {
        @CMD = ( '/scripts/installpkg', '--force', $pkg );
    }
    else {
        @CMD = ( '/scripts/installpkg', '--keepnew', $pkg );
    }

    open( RNULL, '<', '/dev/null' );
    IPC::Open3::open3( '<&RNULL', \*OP, '>&STDERR', @CMD );
    while (<OP>) {
        $result .= $_;
    }
    close(RNULL);

    if ( $pkg eq 'proftpd' ) {
        if ( -e "/etc/proftpd" ) {
            chmod( 0751, "/etc/proftpd" );
        }
        else {
            mkdir( '/etc/proftpd', 0751 );
        }
    }
    else {

        # Replacement for installcpbsdpkg pure-ftpd

        # Install pureauth
        my $pureauth     = '/usr/local/sbin/pureauth';
        my $pureauth_src = '/usr/local/cpanel/bin/pureauth';

        unless ( -e $pureauth && ( stat($pureauth) )[7] == ( stat($pureauth_src) )[7] && ( stat($pureauth) )[9] >= ( stat($pureauth_src) )[9] ) {
            print "Updating pureauth.\n";
            system( 'cp', '-fv', $pureauth_src, $pureauth );
            chmod( 0700, $pureauth );
        }

        # Install pureauth init script
        print "Updating purauth init script.\n";
        my $init = Cpanel::Init->new() || $logger->die('Could not create Init object');
        $init->run_command_for_one( 'install', 'pure-authd' );
    }

    # Check SSL cert
    print "Checking SSL certs...";
    my $valid_certs = 1;
  CERT_CHECK:
    foreach my $dir ( '/etc/', '/etc/ssl/private/' ) {
        foreach my $file ( 'pure-ftpd.pem', 'ftpd-rsa-key.pem', 'ftpd-rsa.pem' ) {
            unless ( -e $dir . $file ) {
                $valid_certs = 0;
                last CERT_CHECK;
            }
        }
    }
    if ($valid_certs) {
        print "done\n";
    }
    else {
        print "missing\n";
        print "Generating default certs...";
        open OLDSTDERR, '>&STDERR';
        open STDERR, '>', '/dev/null';
        Cpanel::SSLCerts::createDefaultSSLFiles( 'service' => 'ftp' );
        open STDERR, '>&OLDSTDERR';
        print "done\n";
    }

    if ( !$force && $result !~ /reinstall/im && ( $result =~ /(^|(?<!Checking if)\s)\s*\S*${pkg}.*\salready\s+installed/m || $result =~ /${pkg}.*\sis\s+installed/m || $result =~ /${pkg}.*\sis\s+newer/m ) ) {
        print $result;
        check_proftpd_conf();
        exit();
    }

    Cpanel::Proc::doom($kill);
    print "Removing old ftp server ($kill)\n";
    system( "pkg_delete", "-x", $kill );
    resetbsdpkgcache();

    setupftpconf();
    resftp();
    exit;
}

my $arch = 'i386';

if ( -e "/etc/trustix-release" ) {
    $distro = 'trustix';
    ($version) = Cpanel::Sys::OS::getversionfromfile('/etc/trustix-release');
    $arch = 'i586';
}
elsif ( -e "/etc/caos-release" ) {
    $distro = 'caos';
    ($version) = Cpanel::Sys::OS::getversionfromfile('/etc/caos-release');
}
elsif ( -e "/etc/SuSE-release" ) {
    $distro = 'suse';
    ($version) = Cpanel::Sys::OS::getversionfromfile('/etc/SuSE-release');
    if ( $version >= 9 ) { $arch = 'i586'; }
}
elsif ( -e "/etc/fedora-release" ) {
    $distro = 'fedora';
    ($version) = Cpanel::Sys::OS::getversionfromfile('/etc/fedora-release');
}
elsif ( -e "/etc/mandrake-release" ) {
    $distro = 'mandrake';
    ($version) = Cpanel::Sys::OS::getversionfromfile('/etc/mandrake-release');
    $arch = 'i586';
}
elsif ( -e "/etc/whitebox-release" ) {
    $distro = 'whitebox';
    ($version) = Cpanel::Sys::OS::getversionfromfile('/etc/whitebox-release');
}
elsif ( -e "/etc/redhat-release" ) {
    $distro = 'redhat';
    ( $version, $ises ) = Cpanel::Sys::OS::getversionfromfile('/etc/redhat-release');
}

if ( $ises == 1 ) {
    $version = "AS-${version}";
}
if ( $ises == 2 ) {
    $distro = "centos";
}
if ( $ises == 3 ) {
    $distro = "whitebox";
}

my $xdir = '';

if ( $machine =~ /64/ ) {
    $arch = 'x86_64';
    $xdir .= "/64";
}

my $basedir = $pkg;

my ( $buildnum, $eximver, $bsv );

my %VINFO = cPpkgversions::getpkgversioninfo('ftp');

if ( $pkg eq "proftpd" ) {
    $buildnum = $VINFO{'proftpd'}{'release'};
    $ftpver   = $VINFO{'proftpd'}{'version'};
    $bsv      = $VINFO{'proftpd'}{'flags'};
}
elsif ( $pkg eq "pure-ftpd" ) {
    $buildnum = $VINFO{'pure-ftpd'}{'release'};
    $ftpver   = $VINFO{'pure-ftpd'}{'version'};
    $bsv      = $VINFO{'pure-ftpd'}{'flags'};
}
if ( $bsv ne "" ) { $bsv = "_" . $bsv; }

my $cver = `rpm -q $pkg 2>/dev/null`;
chomp($cver);

if ( -e "/etc/proftpd" ) { chmod( 0751, "/etc/proftpd" ); }
else                     { mkdir( '/etc/proftpd', 0751 ); }

print "This is the $pkg $ftpver installer release number ${buildnum} for platform ${distro} ${version}\n";
if ( $cver eq "${pkg}-${ftpver}-${buildnum}${bsv}" && !$force ) {
    print "${pkg} is up to date.  Use ftpup --force to force a reinstall\n";
    check_proftpd_conf();
    exit();
}

if ( -x '/scripts/preftpup' ) {
    system '/scripts/preftpup';
}

if ( -e '/home/ftpup-install' ) {
    system 'rm', '-rf', '/home/ftpup-install';
}
mkdir '/home/ftpup-install', 0700;
chdir '/home/ftpup-install';

@pkgs = qw( libdb3.3-devel db4-devel pam-devel openssl openssl-devel gcc glibc-devel compat-db zlib-devel rpm-build tcp_wrap tcpd tcp_wrap-devel tcpd-devel );
$syspkgobj->install( 'pkglist' => \@pkgs );

system("/scripts/checklibssl");

print "Resetting $pkg to cPanel Defaults and Installing the Latest Version\n";

my $url  = "http://diff.cpanel.net/ftpinstall/${basedir}/${xdir}/${distro}/${version}/${pkg}-${ftpver}-${buildnum}${bsv}.${arch}.rpm";
my @SLA  = split( /\//, $url );
my $file = $SLA[$#SLA];

die "File $file is not valid" if ( $file eq "" );

if ( !$src ) {
    $httpClient->download( $url, $file );

    if ( ( stat("$file") )[7] <= 0 ) {
        print "Failed to download $url .. using source instead\n";
        $latest = 1;
        $src    = 1;
    }
}

if ($src) {
    $file = buildrpm();
    if ( !$file ) {
        die "Rpm failed to build!";
    }
}

if ( ( stat("$file") )[7] <= 0 ) {
    die "Failed to download/build $url";
}

if ( !Cpanel::RpmUtils::checkrpm($file) ) {
    die "${file} is not a valid rpm file";
}

if ( $pkg eq "proftpd" ) {
    Cpanel::Proc::doom("pure-ftpd");
    nooutputsystem( "rpm", "-e", "pure-ftpd" );
}
else {
    Cpanel::Proc::doom("proftpd");
    nooutputsystem( "rpm", "-e", "proftpd" );
}

$ENV{'RPMINSTALL'} = 1;
Cpanel::RpmUtils::rpmpreinstall($file);

my @ftp_cert_files = 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 );
foreach my $cert_file (@ftp_cert_files) {

    # Remove any lingering "preinstall" certs
    if ( -e $cert_file . '.preinstall' ) {
        unlink $cert_file . '.preinstall';
    }

    # Rename existing certs
    if ( -e $cert_file ) {
        rename $cert_file, $cert_file . '.preinstall';
    }
}

# Install new RPM
system 'rpm', '-Uvh', '--nodeps', '--force', $file;

# Restore certs
foreach my $cert_file (@ftp_cert_files) {
    if ( -e $cert_file . '.preinstall' ) {
        rename $cert_file . '.preinstall', $cert_file;
    }
}

if ( $pkg ne 'proftpd' ) {
    if ( !-e '/usr/local/cpanel/bin/pureauth' ) {
        warn '/usr/local/cpanel/bin/pureauth IS MISSING';
    }
    system( 'cp', '-fv', '/usr/local/cpanel/bin/pureauth', '/usr/sbin/pureauth' );
    system( 'cp', '-fv', '/usr/local/cpanel/bin/pureauth', '/usr/local/sbin/pureauth' );
    chmod( 0700, '/usr/sbin/pureauth' );
    chmod( 0700, '/usr/local/sbin/pureauth' );
}

$ENV{'RPMINSTALL'} = 0;
chdir '/';
system 'rm', '-rf', '/home/ftpup-install';

if ( !-d '/etc/proftpd' ) {
    if ( -e '/etc/proftpd' ) {
        rename '/etc/proftpd', '/etc/proftpd.ftpup.back';
    }
    mkdir '/etc/proftpd', 0751;
}
else {
    chmod 0751, '/etc/proftpd';
}

if ( -x '/scripts/postftpup' ) {
    system '/scripts/postftpup';
}

if ( -x '/scripts/postftpinstall' ) {
    system '/scripts/postftpinstall';
}

setupftpconf();

resftp();

print "Install Complete\n";

sub buildrpm {
    my $syspkgobj = Cpanel::SysPkgs->new();
    if ( !$syspkgobj ) {
        die "Unable to create system package object. Fatal error.";
    }
    my @pkgs = ( "rpm", "rpm-build", "db-devel", "gdbm-devel", "db1-devel", "compat-db", "ndbm-devel" );
    $syspkgobj->install( 'pkglist' => \@pkgs );

    my $rpm = 'rpm';
    if ( -e "/usr/bin/rpmbuild" ) { $rpm = '/usr/bin/rpmbuild'; }

    $url = "http://diff.cpanel.net/ftpinstall/${basedir}/src/${pkg}-${ftpver}-${buildnum}${bsv}.src.rpm";

    $httpClient->download( $url, "${pkg}.src.rpm" );

    open( RNULL, "<", "/dev/null" );
    print "Building RPM...";
    open( RPM, ">", "rpmbuildlog" );
    $pid = IPC::Open3::open3( "<&RNULL", ">&RPM", ">&RPM", "$rpm", "--rebuild", "${pkg}.src.rpm" );
    while ( waitpid( $pid, 1 ) <= 0 ) {
        print ".";
        sleep(1);
    }
    close(RPM);
    close(RNULL);
    print "Done\n";

    open( RPM, "<", "rpmbuildlog" );
    while (<RPM>) {
        if (/^Wrote: (\S+)/) {
            $file = $1;
            if ( $file =~ /.(64|86)\.rpm/ ) {
                Cpanel::RpmStor::rpmstor($file);

                return ($file);
            }
        }
    }
    close(RPM);

    open( RPM, "<", "rpmbuildlog" );
    seek( RPM, -2048, &Fcntl::SEEK_END );
    while (<RPM>) {
        print "\t" . $_;
    }
    close(RPM);

    die "Failed to build rpm";

}

sub setupftpconf {
    if (   ( -f "/var/log/xferlog" || !-e "/var/log/xferlog" )
        && !-l "/var/log/xferlog"
        && -e "/usr/local/apache/domlogs/ftpxferlog" ) {
        open( OLDX, "<",  "/var/log/xferlog" );
        open( NEWX, ">>", "/usr/local/apache/domlogs/ftpxferlog" );
        while (<OLDX>) {
            print NEWX;
        }
        close(OLDX);
        close(NEWX);
        unlink("/var/log/xferlog");
        symlink( "../../usr/local/apache/domlogs/ftpxferlog", "/var/log/xferlog" );
        print "Ftp Log Relocated!\n";
    }

    if ( $pkg eq "proftpd" ) {
        my $conf = '/etc/proftpd.conf';
        if ( $system =~ /freebsd/i ) {
            $conf = '/usr/local/etc/proftpd.conf';
        }
        system("/scripts/fixproftpdconf");
        system("/usr/local/cpanel/bin/proftpdvhosts");
        system("/scripts/rebuildproftpd >> $conf");
        system("/usr/local/cpanel/bin/proftpdtls");
    }

    my $conf_obj = Cpanel::FtpUtils::Config->new();
    my $conf_hr  = $conf_obj->get_config(1);
    $conf_obj->save_datastore($conf_hr);
    $conf_obj->update_config($conf_hr);
}

sub resftp {
    system( "/scripts/restartsrv", $pkg );
}

sub resetbsdpkgcache {
    my ( undef, undef, undef, $mday, $mon, $year, undef, undef, undef ) = localtime($now);
    $year += 1900;
    $mon++;
    unlink("/root/.cpbsdpkgs/${mon}-${mday}-${year}.PKGDATE");
    unlink("/root/.cpbsdpkgs/${mon}-${mday}-${year}.PKGINFO");
    unlink('/root/.cpbsdpkgs/pkg_version');
}

# One time fixup?
sub check_proftpd_conf {
    if ( $pkg eq "proftpd" ) {
        my $conf = '/etc/proftpd.conf';
        if ( $system =~ /freebsd/i ) {
            $conf = '/usr/local/etc/proftpd.conf';
        }
        my $size = ( stat($conf) )[7];
        if ( $size < 30 ) {
            setupftpconf();
            resftp();
        }
    }
}