Bypass 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.
Sign upBranch:master
To run the cPanel License Key update script (perhaps if you've upgraded from a trial license, or switched IP addresses), simply run the following at the command.
Bypass Cpanel License Check
| #!/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
Hi Everyone,
I need latest cPanel&WHM crack or bypass license.

Thanks.
2 freelancers are bidding on average $131 for this job
We are experienced in software development, Linux, Java, Python, advanced numerical computations, data analysis, crawler development etc. Please contact on skype: solverio Or by email solver (at) [login to view URL]
Hello i have good experience in writing crackers or bots you can check my profile too i hope you would be glad from my workthanks
Cpanel License Check
Need to hire a freelancer for a job?
It's free to sign up, type in what you need & receive free quotes in seconds