4/6/2019»»Saturday

Bypass Cpanel License Check

4/6/2019
    41 - Comments
  1. Cpanel License Cost
  2. Update Cpanel License

Buy cPanel is the largest cPanel license provider including addons and WHMCS plugins. Get INSTANT license activation & FREE installation.

  1. Sep 03, 2015  This feature is not available right now. Please try again later.
  2. CPanel license activation issue. Discussion in 'General Discussion' started by sabarishks, Oct 30, 2008.
PermalinkBypass Cpanel License Check

Join GitHub today

GitHub is home to over 36 million developers working together to host and review code, manage projects, and build software together.

Registered users can also use our to download files directly from all file hosts where it was found on. Just paste the urls you'll find below and we'll download file for you! Liz phair exile in guyville. If no files were found or matches are not what you expected just use our request file feature. If file you want to download is multipart you can use our to check whether multiple download links are still active before you start download.

Sign up
Branch:master

Cpanel License Cost

Find file Copy path
Cannot retrieve contributors at this time

Update Cpanel License

#!/usr/local/cpanel/3rdparty/bin/perl
# vm_setup.pl
packageVMS;
use strict;
use warnings;
use Getopt::Long;
use Fcntl;
use IO::Handle;
use IO::Select;
use String::Random;
use IPC::Open3;
use Term::ANSIColor qw(:constants);
# reset colors to default when done
$Term::ANSIColor::AUTORESET = 1;
# VMS should only be ran as root
if ( $< != 0 ) {
die'VMS must be run as rootn';
}
my$VERSION = '2.0.4';
# declare variables for script options and handle them
my@bashurl;
my%opts = ( 'bashurl'=>@bashurl );
GetOptions( %opts, 'help', 'verbose', 'full', 'fast', 'force', 'skipyum', 'skiphostname', 'hostname=s', 'tier=s', 'skip', 'clam', 'munin', 'solr', 'quota', 'pdns', 'bashurl=s' )
ordie($!);
# --skip should be a shortcut for --fast --skipyum and --skiphostname
# if it is setup, then it is like passing the following options
if ( exists$opts{skip} ) {
$opts{fast} = 1;
$opts{skipyum} = 1;
$opts{skiphostname} = 1;
}
# do not allow the script to run if mutually exclusive arguments are passed
if ( exists$opts{skiphostname} && exists$opts{hostname} ) {
die'script usage: skiphostname and hostname arguments are mutually exclusiven';
}
# --fast and --full should be mutually exclusive arguments
if ( exists$opts{full} && exists$opts{fast} ) {
die'script usage: fast and full arguments are mutually exclusiven';
}
# declare global variables for script
# both of these variables are used during the CL install portion
# of script and their necessity should be reviewed during TECH-407
my$VMS_LOG = '/var/log/vm_setup.log';
__PACKAGE__->run(@ARGV) unlesscaller();
# Every below this should be a subroutine
1;
subrun {
# print header
print'n';
print_vms('VM Server Setup Script');
print_vms('Version: $VERSIONn');
# help option should be processed first to ensure that nothing is erroneously executed if this option is passed
# converted this to a function to make main less clunky and it may be of use if we add more script arguments in the future
# ex: or die print_help_and_exit();
if ( exists$opts{help} ) {
print_help_and_exit();
}
# vm_setup depends on multiple cPanel api calls
# if the license is invalid, we should immediately die
check_license();
# we should check for the lock file and exit if force argument not passed right after checking for help
# to ensure that no work is performed in this scenario
handle_lock_file();
create_vms_log_file();
setup_resolv_conf();
install_packages();
set_screen_perms();
configure_etc_cpupdate_conf() if ( exists$opts{tier} );
# '/vat/cpanel/cpnat' is sometimes populated with incorrect IP information
# on new openstack builds
# build cpnat to ensure that '/var/cpanel/cpnat' has the correct IPs in it
print_vms('Building cpnat');
system_formatted('/usr/local/cpanel/scripts/build_cpnat');
# use a hash for system information
my%sysinfo = (
'ostype'=>undef,
'osversion'=>undef,
'tier'=>undef,
'hostname'=>undef,
'ip'=>undef,
'natip'=>undef,
);
# hostname is in the format of 'os.cptier.tld'
get_sysinfo( %sysinfo );
my$natip = $sysinfo{'natip'};
my$ip = $sysinfo{'ip'};
# set_hostname() will return the value of the new hostname for the server
# and the value may not be the same as what is in %sysinfo
my$hostname = set_hostname( $sysinfo{'hostname'} );
# edit files with the new hostname
configure_99_hostname_cfg($hostname);
configure_sysconfig_network($hostname);
configure_wwwacct_conf( $hostname, $natip );
configure_mainip($natip);
configure_whostmgrft(); # this is really just touching the file in order to skip initial WHM setup
disable_feature_showcase();
accept_eula();
configure_etc_hosts( $hostname, $ip );
append_history_options_to_bashrc();
add_custom_bashrc_to_bash_profile();
# set env variable
# I am not entirely sure what we need this for or if it is even needed
# leaving for now but will need to be reevaluated in later on
local$ENV{'REMOTE_USER'} = 'root';
# ensure mysql is running and accessible before creating account
set_local_mysql_root_password();
# header message for '/etc/motd' placed here to ensure it is added before anything else
add_motd('nnVM Setup Script created the following test accounts:n');
create_api_token();
# create cptest account along with a test email account and database
create_primary_account();
# create a reseller account and an account owned by the reseller account
if ( not create_account( 'reseller', 1, 'root' ) ) {
create_account( 'owned', 0, 'reseller' );
}
update_tweak_settings();
disable_cphulkd();
# user has the option to make install additional components such as clamav
# this takes user input if necessary and executes these two processes if desired
handle_additional_options();
# restart cpsrvd
restart_cpsrvd();
final_words();
# since this is now a modulino, return instead of exit
return;
}
############## END OF MAIN ##########################
#
# list of subroutines for the script
#
# system_formatted() - takes a system call as an argument and uses open3() to make the syscall
# add_motd() - appends all arguments to '/etc/motd'
# get_sysinfo() - populates %sysinfo hash with data
# install_packages() - installs some useful yum packages
# set_hostname() - returns the new hostname of the server after potentially setting it
# set_local_mysql_root_password() - sets the local root password for mysql which ensures that mysql is running and we have access to it
# create_api_token() - make API call to create an API token with the 'all' acl and add the token to '/etc/motd'
# create_primary_account() - create 'cptest' cPanel acct w/ email address, db, and dbuser - then add info to '/etc/motd'
# create_account() - create a cPanel account based on the arguments passed. arg 1 is the name of the account, arg 2 is whether it is a reseller account, and arg 3 is the owner of the account
# update_tweak_settings() - update tweak settings to allow remote domains and unregisteredomains
# disable_cphulkd() - stop and disable cphulkd
# restart_cpsrvd() - restarts cpsrvd
#
# print_help_and_exit() - ran if --help is passed - prints script usage/info and exits
# check_license() - perform a cPanel license check and die if it does not succeed
# handle_lock_file() - exit if lock file exists and --force is not passed, otherwise, create lock file
# handle_additional_options() - the script user has the option to install additional software such as clam, this script handles those options
# clam_and_munin_options() - offer to install clamav and munin and install them if the user desires
# solr_option() - offer to install solr and install it if the user desires
# quotas_option() - offer to enable quotas and run fixquotas if the user desires
# pdns_option() - offer to switch to use PowerDNS and switch the nameserver to PowerDNS if the user desires
# final_words() - print some helpful output for the user before exiting
#
# setup_resolv_conf() - sets '/etc/resolv.conf' to use cPanel resolvers
# configure_99_hostname_cfg() - ensure '/etc/cloud/cloud.cfg.d/99_hostname.cfg' has proper contents
# configure_sysconfig_network() - ensure '/etc/sysconfig/network' has proper contents
# configure_mainip() - ensure '/var/cpanel/mainip' has proper contents
# configure_whostmgrft() - touch '/etc/.whostmgrft' to skip initial WHM setup
# disable_feature_showcase() - touch '/var/cpanel/activate/features/disable_feature_showcase' to disable the feature showcase
# accept_eula() - new API call allows for accepting the EULA, use this to accept it: https://documentation.cpanel.net/display/DD/WHM+API+1+Functions+-+accept_eula
# configure_wwwacct_conf() - ensure '/etc/wwwacct.conf' has proper contents
# configure_etc_hosts() - ensure '/etc/hosts' has proper contents
# add_custom_bashrc_to_bash_profile() - append command to '/etc/.bash_profile' that changes source to https://ssp.cpanel.net/aliases/aliases.txt upon login
# append_history_options_to_bashrc() - append options to '/root/.bashrc' so that we have unlimited bash history
# create_vms_log_file() - creates the scripts log file
# append_vms_log() - appends a line (given as argument) to the scripts log file
# disable_ea4_experimental() - disables the ea4-experimental repository if yum succeeds in install_packages()
#
#
# process_output() - processes the output of syscalls passed to system_formatted()
# print_formatted() - listens to read filehandle from syscall, and prints the output to STDOUT if verbose flag is used
# set_screen_perms() - ensure 'screen' binary has proper ownership/permissions
# ensure_working_rpmdb() - make sure that rpmdb is in working order before making yum syscall
# get_answer() - determines answer from user regarding additional options. This subroutine takes a prompt string for STDOUT to the user and returns 'y' or 'n' depending on their answer
#
# print_vms() - color formatted output to make script output look better
# print_warn() - color formatted output to make script output look better
# print_info() - color formatted output to make script output look better
# print_question() - color formatted output to make script output look better
# print_command() - color formatted output to make script output look better
# print_header() - color formatted output to make print_help_and_exit() look better
# print_status() - color formatted output to make print_help_and_exit() look better
#
# _gen_pw() - returns a 25 char rand pw
# _stdin() - returns a string taken from STDIN
# _create_touch_file - take file name as argument and works similar to 'touch' command in bash
# _get_ip_and_natip() - called by get_sysinfo() to populate %sysinfo hash with system IP and NATIP
# _get_cpanel_tier - called by get_sysinfo() to populate %sysinfo hash with the cPanel tier
# _get_ostype_and_version() - called by get_sysinfo() to populate %sysinfo hash with the ostype and osversion
# _cpanel_getsysinfo() - called by get_sysinfo() to ensure that '/var/cpanel/sysinfo.config' is up to date
# _check_license() - works much like system_formatted() but is only intended for the license check
# _check_for_failure() - looks at output of the license check and dies if it fails
# _process_whmapi_output() - called by process_output() and processes the output of whmapi1 calls to ensure the call completed successfully and to check for token output
# _process_uapi_output() - called by process_output() and processes the output of UAPI calls to ensure the call copmleted successfully
#
############## BEGIN SUBROUTINES ####################
# called by process_output() and processes the output of whmapi1 calls to ensure the call completed successfully and to check for token output
# takes the output of a whmapi1 call as an argument (array)
# returns 0 if the call succeeded
# otherwise, it returns a string that contains the reason that the call failed
sub_process_whmapi_output {
my@output = @_;
my$key;
my$value;
my$reason;
foreachmy$line (@output) {
if ( $line =~ /reason:/ ) {
( $key, $value ) = split /:/, $line;
$reason = $value;
}
if ( $line =~ /result:/ ) {
( $key, $value ) = split /:/, $line;
if ( $value 0 ) {
return'whmapi call failed: $reason';
}
}
if ( $line =~ /^s*token:/ ) {
( $key, $value ) = split /:/, $line;
add_motd( 'Token name - all_access: ' . $value . 'n' );
}
}
return 0;
}
# called by process_output() and processes the output of UAPI calls to ensure the call completed successfully
# takes the output of a UAPI call as an argument (array)
# returns 0 if the call succeeds
# otherwise, it returns a string that contains the reason that the call failed
sub_process_uapi_output {
my@output = @_;
my$key;
my$value;
my$error;
my$i = 0;
foreachmy$line (@output) {
if ($i) {
$error = $line;
chomp($error);
$i = 0;
}
if ( $line =~ /errors:/ ) {
$i = 1;
}
if ( $line =~ /status:/ ) {
( $key, $value ) = split /:/, $line;
if ( $value 0 ) {
return'uapi call failed: $error';
}
}
}
return 0;
}
# deterines if the command is a whmapi1 or UAPI call and calls the appropriate subroutine to handle it
# takes two arguments
# arg[0] = the command that was called
# arg 2 = an array contianing the output of the call
# return 0 if the command was an API call and it failed
# otherwise, return 1
subprocess_output {
my@output = @_;
my$cmd = shift@output;
my$result;
if ( $cmd =~ /whmapi1/ ) {
$result = _process_whmapi_output(@output);
if ( $resultne'0' ) {
print_command($cmd);
print_warn($result);
return 0;
}
}
elsif ( $cmd =~ /uapi/ ) {
$result = _process_uapi_output(@output);
if ( $resultne'0' ) {
print_command($cmd);
print_warn($result);
return 0;
}
}
return 1;
}
# logs the output of the system call
# and prints the output to STDOUT if --verbose was passed
# takes 3 arguments
# argument 1 is the command that was passed to system_formatted()
# arguments 2 and 3 are file handles for where the system call was made
# return 0 if the system call was an API call that failed
# otherwise, return 1
subprint_formatted {
my$cmd = shift;
my$r_fh = shift;
my$e_fh = shift;
my@output = $cmd;
my$sel = IO::Select->new(); # notify us of reads on on our FHs
$sel->add($r_fh); # add the STDOUT FH
$sel->add($e_fh); # add the STDERR FH
while ( my@ready = $sel->can_read ) {
foreachmy$fh (@ready) {
my$line = <$fh>;
if ( notdefined$line ) { # EOF for FH
$sel->remove($fh);
next;
}
else {
push@output, $line;
}
append_vms_log($line);
if ( exists$opts{verbose} ) {
print$line;
}
}
}
return 0 ifnot process_output(@output);
return 1;
}
# takes a command to make a system call with as an argument
# uses open3() to make the system call
# if the call is a call to yum, check the return value of the call and warn if yum fails
# return 0 if the command is an API call that fails
# otherwise, return 1
subsystem_formatted {
my$cmd = shift;
my ( $pid, $r_fh, $e_fh );
my$retval = 1;
append_vms_log('nCommand: $cmdn');
if ( exists$opts{verbose} ) {
print_command($cmd);
}
eval { $pid = open3( undef, $r_fh, $e_fh, $cmd ); };
die'open3: $@n'if$@;
if ( not print_formatted( $cmd, $r_fh, $e_fh ) ) {
$retval = 0;
}
# wait on child to finish before proceeding
waitpid( $pid, 0 );
# process output for yum
if ( $cmd =~ /yum/ ) {
my$exit_status = $? >> 8;
if ( $exit_status && $exit_status != 0 ) {
print_command($cmd);
print_warn('Some yum modules may have failed to install, check log for detail');
}
# yum completed successfully
else {
disable_ea4_experimental();
}
}
if ( not$retval ) {
return 0;
}
else {
return 1;
}
}
# use String::Random to generate 25 digit password
# only use alphanumeric chars in pw
# return the pw
sub_genpw {
my$gen = String::Random->new();
return$gen->randregex('w{25}');
}
# appends argument(s) to the end of /etc/motd
subadd_motd {
open( my$etc_motd, '>>', '/etc/motd' ) ordie$!;
print$etc_motd'@_n';
close$etc_motd;
return;
}
# get stdin from user and return it
sub_stdin {
my$string = q{};
chomp( $string = <> );
return$string;
}
# used to make print_help_and_exit() more presentable
subprint_header {
my$text = shift // '';
returnif ( $texteq'' );
print BOLD CYAN '$textn';
return;
}
# used to make print_help_and_exit() more presentable
subprint_status {
my$text = shift // '';
returnif ( $texteq'' );
print YELLOW '$textn';
return;
}
# print script usage information and exit
subprint_help_and_exit {
print_info('Usage: /usr/local/cpanel/3rdparty/bin/perl vm_setup.pl [options]');
print'n';
print'Description: Performs a number of functions to prepare VMs (on service.cpanel.ninja) for immediate use. nn';
print_header('Options:');
print'-------------- n';
print_status('--force: Ignores previous run check');
print_status('--fast: Skips all optional setup functions');
print_status('--verbose: pretty self explanatory');
print_status('--full: Passes yes to all optional setup functions');
print_status('--skipyum: Skips installing yum packages');
print_status('--skiphostname: Skips setting the hostname');
print_status('--hostname=$hostname: allows user to provide a hostname for the system');
print_status('--tier=$cpanel_tier: allows user to provide a cPanel update tier for the server to be set to and enables daily updates');
print_status('--bashurl=$URL_to_bash_file: allows user to provide the URL to their own bashrc file rather than using the script's default one located at https://ssp.cpanel.net/aliases/aliases.txt');
print_status(' this option can be passed multiple times for more than one bashrc file and/or accept a ',' separated list as well.');
print_status('--skip: shortcut to passing --fast --skipyum --skiphostname');
print_status('--clam: install ClamAV regardless of --fast/--skip option being passed');
print_status('--munin: install Munin regardless of --fast/--skip option being passed');
print_status('--solr: install Solr regardless of --fast/--skip option being passed');
print_status('--quota: enable quotas regardless of --fast/--skip option being passed');
print_status('--pdns: switch nameserver to PowerDNS regardless of --fast/--skip option being passed');
print'n';
print_info('--skiphostname and --hostname=$hostname are mutually exclusive');
print_info('--fast and --full arguments are mutually exclusive');
print'n';
print_header('Full list of things this does:');
print'-------------- n';
print_status('- Installs common/useful packages');
print_status('- Install the ea4-experimental repository and disables it');
print_status('- Sets hostname');
print_status('- Updates /var/cpanel/cpanel.config (Tweak Settings)');
print_status('- Performs basic setup wizard');
print_status('- Disables feature showcase');
print_status('- Fixes /etc/hosts');
print_status('- Fixes screen permissions');
print_status('- Sets local mysql password to ensure mysql access');
print_status('- Creates test account (with email and database)');
print_status('- Disables cphulkd');
print_status('- Creates api key');
print_status('- Updates motd');
print_status('- Sets unlimited bash history');
print_status('- Creates /root/.bash_profile with helpful aliases');
print_status('- This includes a script that will allow for git auto-completion');
print_status('- Installs ClamAV, Munin, and Solr (optional)');
print_status('- Switches the nameserver to PowerDNS (optional)');
exit;
}
# script should only be run once without force
# exit if it has been ran and force not passed
# do nothing if force passed
# create lock file otherwise
subhandle_lock_file {
if ( -e'/root/vmsetup.lock' ) {
if ( exists$opts{force} ) {
print_info('/root/vmsetup.lock exists. --force passed. Ignoring..');
}
else {
print_warn('/root/vmsetup.lock exists. This script may have already been run. Use --force to bypass. Exiting..');
exit;
}
}
else {
# create lock file
print_vms('creating lock file');
_create_touch_file('/root/vmsetup.lock');
}
return;
}
# mimic bash touch command
sub_create_touch_file {
my$fn = shift;
open( my$touch_file, '>', $fn ) ordie$!;
close$touch_file;
return;
}
# recreate resolv.conf using cPanel resolvers
subsetup_resolv_conf {
print_vms('Adding resolvers');
open( my$etc_resolv_conf, '>', '/etc/resolv.conf' )
orreturn print_warn('Unable to add resolvers: $!');
print$etc_resolv_conf'search cpanel.netn' . 'nameserver 208.74.121.50n' . 'nameserver 208.74.125.59n';
close($etc_resolv_conf);
return;
}
###### accepts a reference to a hash
## original declaration
##my %sysinfo = (
## 'ostype' => undef,
## 'osversion' => undef,
## 'tier' => undef,
## 'hostname' => undef,
## 'ip' => undef,
## 'natip' => undef,
## );
subget_sysinfo {
# populate '/var/cpanel/sysinfo.config'
_cpanel_gensysinfo();
my$ref = shift;
# get value for keys 'ostype' and 'osversion'
_get_ostype_and_version($ref);
# get value for key 'tier'
_get_cpanel_tier($ref);
# concatanate it all together
# get value for key 'hostname'
$ref->{'hostname'} = $ref->{'ostype'} . $ref->{'osversion'} . '.' . $ref->{'tier'} . '.tld';
# get value for keys 'ip' and 'natip'
_get_ip_and_natip($ref);
return;
}
###### accepts a reference to a hash
### original declaration
###my %sysinfo = (
### 'ostype' => undef,
### 'osversion' => undef,
### 'tier' => undef,
### 'hostname' => undef,
### 'ip' => undef,
### 'natip' => undef,
### );
sub_get_ip_and_natip {
my$ref = shift;
open( my$fh, '<', '/var/cpanel/cpnat' )
ordie$!;
while (<$fh>) {
if ( $_ =~ /^[1-9]/ ) {
( $ref->{'natip'}, $ref->{'ip'} ) = split / /, $_;
chomp( $ref->{'ip'} );
}
}
close$fh;
return;
}
###### accepts a reference to a hash
### original declaration
###my %sysinfo = (
### 'ostype' => undef,
### 'osversion' => undef,
### 'tier' => undef,
### 'hostname' => undef,
### 'ip' => undef,
### 'natip' => undef,
### );
sub_get_cpanel_tier {
my$ref = shift;
my$key;
open( my$fh, '<', '/etc/cpupdate.conf' )
ordie$!;
while (<$fh>) {
chomp($_);
if ( $_ =~ /^CPANEL/ ) {
( $key, $ref->{'tier'} ) = split /=/, $_;
}
}
close$fh;
# replace . with - for hostname purposes
$ref->{'tier'} =~ s/./-/g;
return;
}
###### accepts a reference to a hash
### original declaration
###my %sysinfo = (
### 'ostype' => undef,
### 'osversion' => undef,
### 'tier' => undef,
### 'hostname' => undef,
### 'ip' => undef,
### 'natip' => undef,
### );
sub_get_ostype_and_version {
my$ref = shift;
my$key;
open( my$fh, '<', '/var/cpanel/sysinfo.config' )
ordie$!;
while (<$fh>) {
chomp($_);
if ( $_ =~ /^rpm_dist_ver/ ) {
( $key, $ref->{'osversion'} ) = split /=/, $_;
}
elsif ( $_ =~ /^rpm_dist/ ) {
( $key, $ref->{'ostype'} ) = split /=/, $_;
}
}
close$fh;
return;
}
# we need a function to process the output from system_formatted in order to catch and throw exceptions
# in particular, the 'gensysinfo' will throw an exception that needs to be caught if the rpmdb is broken
sub_cpanel_gensysinfo {
unlink'/var/cpanel/sysinfo.config';
_create_touch_file('/var/cpanel/sysinfo.config');
system_formatted('/usr/local/cpanel/scripts/gensysinfo');
return;
}
# verifies the integrity of the rpmdb and install some useful yum packages
subinstall_packages {
# do not install packages if skipyum option is passed
if ( exists$opts{skipyum} ) {
print_info('skipyum option passed, no packages were installed');
return;
}
# install useful yum packages
# added perl-CDB_FILE to be installed through yum instead of cpanm
# per request, enabling the ea4-experimental repo
# adding git-extras to help automate some git tasks: https://github.com/tj/git-extras
print_vms('Installing utilities via yum [ mtr nmap telnet nc vim s3cmd bind-utils pwgen jwhois git moreutils tmux rpmrebuild rpm-build gdb perl-CDB_File perl-JSON ea4-experimental git-extras perl-Net-DNS ] (this may take a couple minutes)');
ensure_working_rpmdb();
system_formatted('/usr/bin/yum -y install mtr nmap telnet nc vim s3cmd bind-utils pwgen jwhois git moreutils tmux rpmrebuild rpm-build gdb perl-CDB_File perl-JSON ea4-experimental git-extras perl-Net-DNS');
return;
}
# takes a hostname as an argument
subconfigure_99_hostname_cfg {
my$hn = shift;
if ( -e'/etc/cloud/cloud.cfg.d/'and-d'/etc/cloud/cloud.cfg.d/' ) {
# Now create a file in /etc/cloud/cloud.cfg.d/ called 99_hostname.cfg
open( my$cloud_cfg, '>', '/etc/cloud/cloud.cfg.d/99_hostname.cfg' )
orreturn print_warn('Unable to modify /etc/cloud/cloud.cfg.d/99_hostname.cfg: $!');
print$cloud_cfg'#cloud-confign' . 'hostname: $hnn';
close($cloud_cfg);
}
return;
}
# takes a hostname as an argument
subconfigure_sysconfig_network {
my$hn = shift;
# set /etc/sysconfig/network
print_vms('Updating /etc/sysconfig/network');
open( my$etc_network, '>', '/etc/sysconfig/network' )
orreturn print_warn('Unable to modify /etc/sysconfig/network: $!');
print$etc_network'NETWORKING=yesn' . 'NOZEROCONF=yesn' . 'HOSTNAME=$hnn';
close($etc_network);
return;
}
# takes the systems natip as an argument
subconfigure_mainip {
my$nat = shift;
print_vms('Updating /var/cpanel/mainip');
open( my$fh, '>', '/var/cpanel/mainip' )
orreturn print_warn('Unable to modify /var/cpanel/mainip: $!');
print$fh'$nat';
close($fh);
return;
}
# touches '/var/cpanel/activate/features/disable_feature_showcase'
subdisable_feature_showcase {
print_vms('Disabling feature showcase');
_create_touch_file('/var/cpanel/activate/features/disable_feature_showcase');
return;
}
# touches '/etc/.whostmgrft'
subconfigure_whostmgrft {
_create_touch_file('/etc/.whostmgrft');
return;
}
# takes two arguments
# arg1 = hostname
# arg2 = natip
subconfigure_wwwacct_conf {
my$hn = shift;
my$nat = shift;
# correct wwwacct.conf
print_vms('Correcting /etc/wwwacct.conf');
open( my$fh, '>', '/etc/wwwacct.conf' )
orreturn print_warn('Unable to modify /etc/wwwacct.conf: $!');
print$fh'HOST $hnn';
print$fh'ADDR $natn';
print$fh'HOMEDIR /homen';
print$fh'ETHDEV eth0n';
print$fh'NS ns1.os.cpanel.vmn';
print$fh'NS2 ns2.os.cpanel.vmn';
print$fh'NS3n';
print$fh'NS4n';
print$fh'HOMEMATCH homen';
print$fh'NSTTL 86400n';
print$fh'TTL 14400n';
print$fh'DEFMOD paper_lanternn';
print$fh'SCRIPTALIAS yn';
print$fh'CONTACTPAGERn';
print$fh'CONTACTEMAILn';
print$fh'LOGSTYLE combinedn';
print$fh'DEFWEBMAILTHEME paper_lanternn';
close($fh);
return;
}
# takes two arguments
# # arg1 = hostname
# # arg2 = ip
subconfigure_etc_hosts {
my$hn = shift;
my$local_ip = shift;
( my$short_hn, undef, undef ) = split /./, $hn;
# corrent /etc/hosts
print_vms('Correcting /etc/hosts');
open( my$fh, '>', '/etc/hosts' )
orreturn print_warn('Unable to modify /etc/hosts: $!');
print$fh'127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4n';
print$fh'::1 localhost localhost.localdomain localhost6 localhost6.localdomain6n';
print$fh'$local_ip$short_hn$hnn';
close($fh);
return;
}
# ensure proper screen ownership/permissions
subset_screen_perms {
print_vms('Fixing screen perms');
system_formatted('/bin/rpm --setugids screen && /bin/rpm --setperms screen');
return;
}
# fixes common issues with rpmdb if they exist
subensure_working_rpmdb {
system_formatted('/usr/local/cpanel/scripts/find_and_fix_rpm_issues');
return;
}
# this creates an api token and adds it to '/etc/motd'
subcreate_api_token {
print_vms('Creating api token');
system_formatted('/usr/local/cpanel/bin/whmapi1 api_token_create token_name=all_access acl-1=all');
return;
}
# creates account using whmapi1
# https://documentation.cpanel.net/display/DD/WHM+API+1+Functions+-+createacct
# three arguments
# user, is a reseller account, owner of account
subcreate_account {
my$user = shift;
my$is_reseller = shift;
my$owner = shift;
my$rndpass;
print_vms('Create test account - $user');
$rndpass = _genpw();
if ( not system_formatted('/usr/local/cpanel/bin/whmapi1 createacct username=$user domain=$user.tld password=$rndpass maxpark=unlimited maxaddon=unlimited hasshell=1 reseller=$is_reseller owner=$owner') andnotexists$opts{force} ) {
print_warn('Failed to create account: $user.tld');
return;
}
return 0;
}
# create the primary test account
# and add one-liners to motd for access
# if the whmapi1 call to create the primary account fails, and force is not passed
# then we print a warning and fail since the rest of UAPI calls depend on this call to pass and should fail as well
subcreate_primary_account {
my$rndpass;
add_motd( 'one-liner for access to WHM root access:n', q(USER=root; IP=$(awk '{print$2}' /var/cpanel/cpnat); URL=$(whmapi1 create_user_session user=$USER service=whostmgrd awk '/url:/ {match($2,'/cpsess.*',URL)}END{print URL[0]}'); echo 'https://$IP:2087$URL'), 'n' );
# create test account
print_vms('Creating test account - cptest');
$rndpass = _genpw();
if ( not system_formatted( '/usr/local/cpanel/bin/whmapi1 createacct username=cptest domain=cptest.tld password=' . $rndpass . ' maxpark=unlimited maxaddon=unlimited hasshell=1' ) andnotexists$opts{force} ) {
print_warn(q[Failed to create primary account (cptest.tld), skipping additional configurations for the account]);
return;
}
add_motd( 'one-liner for access to cPanel user: cptestn', q(USER=cptest; IP=$(awk '{print$2}' /var/cpanel/cpnat); URL=$(whmapi1 create_user_session user=$USER service=cpaneld awk '/url:/ {match($2,'/cpsess.*',URL)}END{print URL[0]}'); echo 'https://$IP:2083$URL'), 'n' );
print_vms('Creating test email - testing@cptest.tld');
$rndpass = _genpw();
system_formatted( '/usr/local/cpanel/bin/uapi --user=cptest Email add_pop email=testing@cptest.tld password=' . $rndpass );
add_motd( 'one-liner for access to test email account: testing@cptest.tldn', q(USER='testing@cptest.tld'; IP=$(awk '{print$2}' /var/cpanel/cpnat); URL=$(whmapi1 create_user_session user=$USER service=webmaild awk '/url:/ {match($2,'/cpsess.*',URL)}END{print URL[0]}'); echo 'https://$IP:2096$URL'), 'n' );
print_vms('Creating test database - cptest_testdb');
system_formatted('/usr/local/cpanel/bin/uapi --user=cptest Mysql create_database name=cptest_testdb');
print_vms('Creating test db user - cptest_testuser');
$rndpass = _genpw();
system_formatted( '/usr/local/cpanel/bin/uapi --user=cptest Mysql create_user name=cptest_testuser password=' . $rndpass );
add_motd('mysql test user: username: cptest_testuser');
add_motd(' password: $rndpassn');
print_vms('Adding all privs for cptest_testuser to cptest_testdb');
system_formatted('/usr/local/cpanel/bin/uapi --user=cptest Mysql set_privileges_on_database user=cptest_testuser database=cptest_testdb privileges='ALL PRIVILEGES'');
return;
}
# update tweak settings to allow creation of nonexistent addon domains
subupdate_tweak_settings {
print_vms('Updating tweak settings (cpanel.config)');
system_formatted('/usr/local/cpanel/bin/whmapi1 set_tweaksetting key=allowremotedomains value=1');
system_formatted('/usr/local/cpanel/bin/whmapi1 set_tweaksetting key=allowunregistereddomains value=1');
return;
}
# append aliases directly into STDIN upon login
subadd_custom_bashrc_to_bash_profile {
my$txt;
print_vms('Updating '/root/.bash_profile with help aliases');
open( my$fh, '>>', '/root/.bash_profile' )
orreturn print_warn('Unable to modify /root/.bash_profile: $!');
# returns -1 if the user did not define this argument
if ( $#bashurl != -1 ) {
# allows for the user to only issue --bashurl and provide a comma separated list as well
@bashurl = split( /,/, join( ',', @bashurl ) );
# iterate through the list of URLs and append them to '/root/.bash_profile'
foreachmy$url (@bashurl) {
$txt = q[ source /dev/stdin <<< '$(curl -s ] . $url . q[ )' ];
print$fh'$txtn';
}
}
else {
$txt = q[ source /dev/stdin <<< '$(curl -s https://ssp.cpanel.net/aliases/aliases.txt)' ];
print$fh'$txtn';
}
# add script to provide git auto-completion
$txt = q[ source /dev/stdin <<< '$(curl -s https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash)' ];
print$fh'$txtn';
close$fh;
return;
}
# stop and disable cphulkd
subdisable_cphulkd {
print_vms('Disabling cphulkd');
system_formatted('/usr/local/cpanel/bin/whmapi1 disable_cphulk');
return;
}
# RPM versions system documentation
# https://documentation.cpanel.net/display/68Docs/RPM+Targets
# https://documentation.cpanel.net/display/68Docs/The+update_local_rpm_versions+Script
# offer to install clamav and munin
subclam_and_munin_options {
my$answer = 0;
my$check_rpms = 0;
if ( exists$opts{clam} ) {
$answer = 'y';
}
else {
$answer = get_answer('would you like to install ClamAV? [n]: ');
}
if ( $answereq'y' ) {
$check_rpms = 1;
print_vms('Setting ClamAV to installed');
system_formatted('/usr/local/cpanel/scripts/update_local_rpm_versions --edit target_settings.clamav installed');
}
if ( exists$opts{munin} ) {
$answer = 'y';
}
else {
$answer = get_answer('would you like to install Munin? [n]: ');
}
if ( $answereq'y' ) {
$check_rpms = 1;
print_vms('Setting Munin to installed');
system_formatted('/usr/local/cpanel/scripts/update_local_rpm_versions --edit target_settings.munin installed');
}
if ($check_rpms) {
print_vms('running check_cpanel_rpms to install additional packages (This may take a few minutes)');
system_formatted('/usr/local/cpanel/scripts/check_cpanel_rpms --fix');
}
return;
}
# offer to install solr
subsolr_option {
my$answer = 0;
if ( exists$opts{solr} ) {
$answer = 'y';
}
else {
$answer = get_answer('would you like to install cPanel Solr? [n]: ');
}
if ( $answereq'y' ) {
print_vms('Installing cPanel Solr (This may take a few minutes)');
system_formatted('/usr/local/cpanel/scripts/install_dovecot_fts');
}
return;
}
subquotas_option {
my$answer = 0;
if ( exists$opts{quota} ) {
$answer = 'y';
}
else {
$answer = get_answer('would you like to enable quotas? [n]: ');
}
if ( $answereq'y' ) {
$opts{quota} = 1; # so that final_words() knows that quotas were enabled
print_vms('Enabling quotas (This may take a few minutes)');
system_formatted('/usr/local/cpanel/scripts/fixquotas');
}
return;
}
subpdns_option {
my$answer = 0;
if ( exists$opts{pdns} ) {
$answer = 'y';
}
else {
$answer = get_answer('would you like to switch your nameserver to use PowerDNS? [n]: ');
}
if ( $answereq'y' ) {
print_vms('Switching nameserver to use PowerDNS (This may take a few minutes)');
system_formatted('/usr/local/cpanel/scripts/setupnameserver powerdns');
}
return;
}
# user has the option to install additional software such as clamav
# this takes user input if necessary and performs necessary tasks
subhandle_additional_options {
clam_and_munin_options();
solr_option();
quotas_option();
pdns_option();
return;
}
# takes 1 argument - a string to print to obtain user input if necessary
# return y or n
subget_answer {
my$question = shift;
if ( exists$opts{fast} ) {
return'n';
}
elsif ( exists$opts{full} ) {
return'y';
}
else {
print_question($question);
return _stdin();
}
# this should not be possible to reach
return;
}
subrestart_cpsrvd {
print_vms('Restarting cpsvrd');
system_formatted('/usr/local/cpanel/scripts/restartsrv_cpsrvd');
return;
}
# advise whether a reboot is required or if the user just needs to re-login
subfinal_words {
print'n';
print_vms('Setup completen');
print'n';
if ( exists$opts{quota} ) {
print_info('A reboot is required for all the changes performed by this script to take affect!!!n');
}
else {
print_info('You should log out and back in.n');
}
return;
}
# perform a license check to ensure valid cPanel license
subcheck_license {
_check_license('/usr/local/cpanel/cpkeyclt');
return;
}
# works just like system_formatted(), but I split this out specifically for the license check
sub_check_license {
my$cmd = shift;
my ( $pid, $r_fh );
eval { $pid = open3( undef, $r_fh, '>&STDERR', $cmd ); };
die'open3: $@n'if$@;
my$sel = IO::Select->new(); # notify us of reads on on our FHs
$sel->add($r_fh); # add the FH we are interested in
while ( my@ready = $sel->can_read ) {
foreachmy$fh (@ready) {
my$line = <$fh>;
if ( notdefined$line ) { # EOF for FH
$sel->remove($fh);
next;
}
else {
_check_for_failure($line);
}
}
}
# wait on child to finish before proceeding
waitpid( $pid, 0 );
return;
}
# takes a line of output as an argument
sub_check_for_failure {
my$line = shift // '';
# die if the license is not valid
die('cPanel license is not currently valid.n') if ( $line =~ /Update Failed!/ );
return;
}
# no arguments needed since $VMS_LOG is a global var
# creates the file as a new file
subcreate_vms_log_file {
print_info('vm_setup logs to '$VMS_LOG'');
unlink$VMS_LOG;
_create_touch_file($VMS_LOG);
return;
}
# append a line to the log file
# takes a line to append to the file as an argument
subappend_vms_log {
my$line = shift;
open( my$fh, '>>', $VMS_LOG ) ordie$!;
print$fh$line;
close$fh;
return;
}
subprint_vms {
my$text = shift // '';
returnif$texteq'';
print BOLD BRIGHT_BLUE ON_BLACK '[VMS] * ';
print BOLD WHITE ON_BLACK '$textn';
return;
}
subprint_warn {
my$text = shift // '';
returnif$texteq'';
print BOLD RED ON_BLACK '[WARN] * ';
print BOLD WHITE ON_BLACK '$textn';
return;
}
subprint_info {
my$text = shift // '';
returnif$texteq'';
print BOLD GREEN ON_BLACK '[INFO] * ';
print BOLD WHITE ON_BLACK '$textn';
return;
}
subprint_question {
my$text = shift // '';
returnif$texteq'';
print BOLD CYAN ON_BLACK '[QUESTION] * ';
print BOLD WHITE ON_BLACK '$text';
return;
}
subprint_command {
my$text = shift // '';
returnif$texteq'';
print BOLD BRIGHT_YELLOW ON_BLACK '[COMMAND] * ';
print BOLD WHITE ON_BLACK '$textn';
return;
}
# adds two options to '/root/.bashrc' to allow for unlimited bash history
subappend_history_options_to_bashrc {
open( my$fh, '>>', '/root/.bashrc' )
orreturn print_warn('Unable to modify /root/.bashrc: $!');
print$fh'export HISTFILESIZE= n';
print$fh'export HISTSIZE=n';
close$fh;
return;
}
# resets the mysql root password to a random password
# this also ensure that mysql is running and that we have access to it
subset_local_mysql_root_password {
print_vms('Setting new password for mysql');
my$pw = _genpw();
system_formatted('/usr/local/cpanel/bin/whmapi1 set_local_mysql_root_password password=$pw');
return;
}
# takes a hostname to set the system to as an argument and potentially updates the hostname
# returns the new hostname
subset_hostname {
my$hn = shift;
if ( exists$opts{hostname} ) {
$hn = $opts{hostname};
}
if ( notexists$opts{skiphostname} ) {
print_vms('Setting hostname to $hn');
# use whmapi1 to set hostname so that we get a return value
# this will be important when we start processing output to ensure these calls succeed
# https://documentation.cpanel.net/display/SDK/WHM+API+1+Functions+-+sethostname
system_formatted('/usr/local/cpanel/bin/whmapi1 sethostname hostname=$hn');
}
else {
print_info('skiphostname passed, using current hostname to update configuration files');
# system_formatted will not work here since it returns 1 or 0 depending on whether or not it succeeds
# using qx[] instead to get the output of the command
$hn = qx[/bin/hostname];
}
return$hn;
}
# only runs if the --tier option is passed
# overwrites '/etc/cpupdate.conf' with the new tier and enables daily updates if it is
subconfigure_etc_cpupdate_conf {
print_vms('Updating /etc/cpupdate.conf');
open( my$fh, '>', '/etc/cpupdate.conf' )
or print_warn('Unable to modify /etc/cpupdate.conf: $!');
print$fh'CPANEL=$opts{tier}n';
print$fh'RPMUP=dailyn';
print$fh'SARULESUP=dailyn';
print$fh'STAGING_DIR=/usr/local/cpaneln';
print$fh'UPDATES=dailyn';
close($fh);
return;
}
# disable the ea4-experimental repository
# only should be ran if yum install succeeds
subdisable_ea4_experimental {
if ( -e'/etc/yum.repos.d/EA4-experimental.repo' ) {
print_vms('Installed and disabled EA4-experimental repository');
open( my$read, '<', '/etc/yum.repos.d/EA4-experimental.repo' ) ordie$!;
open( my$write, '>', '/etc/yum.repos.d/EA4-experimental.repo.vmstmp' ) ordie$!;
while (<$read>) {
if ( $_ =~ /^enabled/ ) {
print$write'enabled=0n';
}
else {
print$write$_;
}
}
close$read;
close$write;
rename( '/etc/yum.repos.d/EA4-experimental.repo.vmstmp', '/etc/yum.repos.d/EA4-experimental.repo' ) ordie$!;
}
return;
}
# makes a whmapi1 call in order to accept the EULA
# introduced in v76
# https://documentation.cpanel.net/display/DD/WHM+API+1+Functions+-+accept_eula
subaccept_eula {
print_vms('Accepting EULA');
system_formatted('/usr/local/cpanel/bin/whmapi1 accept_eula');
return;
}
  • Copy lines
  • Copy permalink
 high-powerbrown © 2019