File: //proc/self/root/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();
}
}
}