File: //scripts.20110531.215904.25158/setupftpserver
#!/usr/bin/perl
# cpanel - setupftpserver 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'; }
use strict;
use Cpanel::Config ();
use Cpanel::Chkservd ();
use Cpanel::Services ();
use Cpanel::Usage ();
use Cpanel::PID ();
use Cpanel::Init ();
use Cpanel::Update ();
my $force = 0;
my $current = 0;
$| = 1;
delete $ENV{'cp_security_token'};
delete $ENV{'HTTP_REFERER'};
# Argument processing
my %opts = (
'force' => \$force,
'current' => \$current,
);
Cpanel::Usage::wrap_options( \@ARGV, \&usage, \%opts );
@ARGV = ( grep( !/^--/, @ARGV ) );
my $selected_ftpserver = shift;
usage() unless ( $selected_ftpserver || $current );
my $cpconf_ref = Cpanel::Config::loadcpconf();
my $current_ftpserver = Cpanel::Services::is_enabled('ftpd') ? $cpconf_ref->{'ftpserver'} : 'disabled';
if ($current) {
print "Current FTP server type: ${current_ftpserver}\n";
exit 0;
}
if ( !$force && $current_ftpserver eq $selected_ftpserver ) {
print "Already configured.\n";
exit 0;
}
unless ( $selected_ftpserver eq 'pure-ftpd' || $selected_ftpserver eq 'proftpd' || $selected_ftpserver eq 'disabled' ) {
print "Unknown FTP server specified.\nTry $0 --help\n";
exit 1;
}
if ( $> != 0 ) {
die "Conversion process must be performed as root";
}
my $pid_obj = Cpanel::PID->new( { 'pid_file' => '/var/run/setupftpserver.pid' } );
unless ( $pid_obj->create_pid_file() > 0 ) {
print "Setupftpserver appears to be running already.\n";
print "Please wait for the conversion to finish before attempting another.\n";
exit 1;
}
$cpconf_ref->{'ftpserver'} = $selected_ftpserver if ( $selected_ftpserver ne 'disabled' );
Cpanel::Config::savecpconf($cpconf_ref);
my $init = Cpanel::Init->new();
#branch to uninsall/install functions
disable_chksrvd_monitoring();
if ( $selected_ftpserver eq 'pure-ftpd' || $selected_ftpserver eq 'proftpd' ) {
enable_ftpserver( $selected_ftpserver, $current_ftpserver );
enable_chksrvd_monitoring();
}
else {
disable_ftpserver($current_ftpserver);
}
$pid_obj->remove_pid_file();
print "\nFTP server conversion complete\n";
exit 0;
sub disable_ftpserver {
my $running_ftpserver = shift;
system( 'touch', '/etc/ftpddisable' );
print "\nHalting $running_ftpserver\n";
my $output = $init->run_command( $running_ftpserver, 'stop' );
print "\nDisabling $running_ftpserver in init system\n";
$output = $init->run_command_for_one( 'disable', $running_ftpserver );
print "\nDisabling FTP server updates\n";
my $updateconf = Cpanel::Update::loadupdateconfig();
$updateconf->{'FTPUP'} = 'never';
Cpanel::Update::saveupdateconfig($updateconf);
}
sub enable_ftpserver {
my ( $new_ftpserver, $current_ftpserver ) = @_;
foreach my $disable_file (qw(ftpd ftpserver pure-ftpd proftpd)) {
unlink '/etc/' . $disable_file . 'disable' if ( -e '/etc/' . $disable_file . 'disable' );
}
# This will be recreated if appropriate when configuration is done
unlink '/var/cpanel/ftpd_service_auth_check_disabled' if ( -e '/var/cpanel/ftpd_service_auth_check_disabled' );
print "\nSwitching FTP server to $new_ftpserver\n";
my $updateconf = Cpanel::Update::loadupdateconfig();
my %orig_updateconf = %{$updateconf};
$updateconf->{'FTPUP'} = 'daily';
$updateconf->{'SYSUP'} = 'daily';
Cpanel::Update::saveupdateconfig($updateconf);
my @ftpup = ('/scripts/ftpup');
push @ftpup, '--force' if ( $force || ( $current_ftpserver && $current_ftpserver ne $new_ftpserver ) );
system(@ftpup);
print "\nEnabling $new_ftpserver in init system\n";
my $output = $init->run_command_for_one( 'enable', $new_ftpserver );
print "\nEnabling FTP server updates\n";
$orig_updateconf{'FTPUP'} = 'inherit';
Cpanel::Update::saveupdateconfig( \%orig_updateconf );
}
sub disable_chksrvd_monitoring {
my %monitored_services = Cpanel::Chkservd::getmonitored();
if ( !$monitored_services{'ftpd'} ) {
print "\nChksrvd monitoring is disabled\n";
}
else {
print "\nDisabling Chksrvd monitoring\n";
Cpanel::Chkservd::disable('ftpd');
system('/scripts/restartsrv_chksrvd');
}
}
sub enable_chksrvd_monitoring {
my %monitored_services = Cpanel::Chkservd::getmonitored();
if ( $monitored_services{'ftpd'} ) {
print "\nChksrvd monitoring is enabled\n";
}
else {
print "\nEnabling chksrvd monitoring\n";
Cpanel::Chkservd::enable('ftpd');
system('/scripts/restartsrv_chksrvd');
}
}
sub usage {
print "Usage: setupftpserver [options] <ftpserver>\n\n";
print "Options:\n";
print " --force Perform conversion even if server is already configured\n";
print " --current Display the currently configured FTP server\n";
print "\n";
print "FTP Servers:\n";
print " pure-ftpd Recommended FTP server on cPanel systems\n";
print " proftpd Alternate FTP server\n";
print " disabled Disable local FTP functionality\n";
print "\n";
exit 0;
}