#!/bin/bash #CyberPanel installer script for CentOS 7.X, CentOS 8.X, CloudLinux 7.X, Ubuntu 18.04 and Ubuntu 20.04 SUDO_TEST=$(set) DEV="OFF" POSTFIX_VARIABLE="ON" POWERDNS_VARIABLE="ON" PUREFTPD_VARIABLE="ON" ### Remote MySQL Variables REMOTE_MYSQL='OFF' MYSQL_HOST='' MYSQL_DB='' MYSQL_USER='' MYSQL_PASSWORD='' MYSQL_PORT='' PROVIDER="undefined" SERIAL_NO="" DIR=$(pwd) TEMP=$(curl --silent https://cyberpanel.net/version.txt) CP_VER1=${TEMP:12:3} CP_VER2=${TEMP:25:1} SERVER_OS="CentOS" VERSION="OLS" LICENSE_KEY="" KEY_SIZE="" ADMIN_PASS="1234567" CUSTOM_PASS="False" MEMCACHED="ON" REDIS="ON" TOTAL_RAM=$(free -m | awk '/Mem:/ { print $2 }') CENTOS_8="False" UBUNTU_20="False" WATCHDOG="OFF" VIRT_TYPE="" MASTER_GIT_URL="github.com/usmannasir/cyberpanel" set_git_repos_and_branch() { echo 'Setting up Branches,1' >/var/log/installLogs.txt local GIT_DIR local GIT_USER local GIT_REPO if [ -z ${GIT_URL+x} ]; then GIT_URL=$MASTER_GIT_URL else printf "Found custom provided GIT URL...\n" fi if [ -z ${BRANCH_NAME+x} ]; then BRANCH_NAME="v${TEMP:12:3}.${TEMP:25:1}" else printf "Found custom provided branch...\n" fi ### To be removed when branch is merged BRANCH_NAME="v2.0.4-dev" ### GIT_DIR=$(dirname "$GIT_URL") GIT_USER=$(basename "$GIT_DIR") GIT_REPO=$(basename "$GIT_URL") GIT_CONTENT_URL="raw.githubusercontent.com/$GIT_USER/$GIT_REPO" printf "\n~~~~~~~~~~\n" printf "Github URL: %s\n" "$GIT_URL" printf "Github Content URL: %s\n" "$GIT_CONTENT_URL" printf "Github Branch: %s\n" "$BRANCH_NAME" printf "~~~~~~~~~~\n" echo 'Setting up Branches,1' >/var/log/installLogs.txt } disable_repos() { if [[ $SERVER_OS == "CentOS" ]]; then sed -i 's|enabled=1|enabled=0|g' /etc/yum.repos.d/CentOS-Base.repo sed -i 's|enabled=1|enabled=0|g' /etc/yum.repos.d/CentOS-Debuginfo.repo sed -i 's|enabled=1|enabled=0|g' /etc/yum.repos.d/CentOS-Media.repo sed -i 's|enabled=1|enabled=0|g' /etc/yum.repos.d/CentOS-Vault.repo sed -i 's|enabled=1|enabled=0|g' /etc/yum.repos.d/CentOS-CR.repo sed -i 's|enabled=1|enabled=0|g' /etc/yum.repos.d/CentOS-fasttrack.repo sed -i 's|enabled=1|enabled=0|g' /etc/yum.repos.d/CentOS-Sources.repo fi } check_return() { #check previous command result , 0 = ok , non-0 = something wrong. if [[ $? -eq "0" ]]; then : else echo -e "\ncommand failed, exiting..." echo 'command failed, exiting. For more information read /var/log/installLogs.txt [404]' >>/var/log/installLogs.txt exit fi } install_utility() { if [[ ! -f /usr/bin/cyberpanel_utility ]]; then wget -q -O /usr/bin/cyberpanel_utility https://cyberpanel.sh/misc/cyberpanel_utility.sh chmod 700 /usr/bin/cyberpanel_utility fi } watchdog_setup() { if [[ $WATCHDOG == "ON" ]]; then wget -O /etc/cyberpanel/watchdog.sh https://$GIT_CONTENT_URL/stable/CPScripts/watchdog.sh chmod 700 /etc/cyberpanel/watchdog.sh ln -s /etc/cyberpanel/watchdog.sh /usr/local/bin/watchdog pid=$(ps aux | grep "watchdog lsws" | grep -v grep | awk '{print $2}') if [[ $pid == "" ]]; then nohup watchdog lsws >/dev/null 2>&1 & fi echo -e "Checking MariaDB ..." pid=$(ps aux | grep "watchdog mariadb" | grep -v grep | awk '{print $2}') if [[ $pid == "" ]]; then nohup watchdog mariadb >/dev/null 2>&1 & fi if [[ $SERVER_OS == "CentOS" ]]; then echo "nohup watchdog lsws > /dev/null 2>&1 & nohup watchdog mariadb > /dev/null 2>&1 &" >>/etc/rc.d/rc.local else echo "nohup watchdog lsws > /dev/null 2>&1 & nohup watchdog mariadb > /dev/null 2>&1 &" >>/etc/rc.local fi echo -e "\n Setting up WatchDog..." fi } webadmin_passwd() { if [[ $VERSION == "OLS" ]]; then php_command="admin_php" else php_command="admin_php5" fi WEBADMIN_PASS=$( head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16 echo '' ) TEMP=$(/usr/local/lsws/admin/fcgi-bin/${php_command} /usr/local/lsws/admin/misc/htpasswd.php ${WEBADMIN_PASS}) echo "" >/usr/local/lsws/admin/conf/htpasswd echo "admin:$TEMP" >/usr/local/lsws/admin/conf/htpasswd echo ${WEBADMIN_PASS} >/etc/cyberpanel/webadmin_passwd chmod 600 /etc/cyberpanel/webadmin_passwd } openvz_change() { if [[ $VIRT_TYPE == "OpenVZ" ]]; then if [[ ! -d /etc/systemd/system/pure-ftpd.service.d ]]; then mkdir /etc/systemd/system/pure-ftpd.service.d echo "[Service] PIDFile=/run/pure-ftpd.pid" >/etc/systemd/system/pure-ftpd.service.d/override.conf echo -e "PureFTPd service file modified for OpenVZ..." fi if [[ ! -d /etc/systemd/system/lshttpd.service.d ]]; then mkdir /etc/systemd/system/lshttpd.service.d echo "[Service] PIDFile=/tmp/lshttpd/lshttpd.pid" >/etc/systemd/system/lshttpd.service.d/override.conf echo -e "LiteSPeed service file modified for OpenVZ..." fi if [[ ! -d /etc/systemd/system/spamassassin.service.d ]]; then mkdir /etc/systemd/system/spamassassin.service.d echo "[Service] PIDFile=/run/spamassassin.pid" >/etc/systemd/system/spamassassin.service.d/override.conf echo -e "SpamAssassin service file modified for OpenVZ..." fi fi } check_virtualization() { echo -e "Checking virtualization type..." if hostnamectl | grep -q "Virtualization: lxc"; then echo -e "\nLXC detected..." echo -e "CyberPanel does not support LXC" echo -e "Exiting..." echo 'CyberPanel does not support LXC.. [404]' >>/var/log/installLogs.txt exit fi if hostnamectl | grep -q "Virtualization: openvz"; then echo -e "\nOpenVZ detected..." VIRT_TYPE="OpenVZ" openvz_change fi } license_validation() { CURRENT_DIR=$(pwd) if [ -f /root/cyberpanel-tmp ]; then rm -rf /root/cyberpanel-tmp fi mkdir /root/cyberpanel-tmp cd /root/cyberpanel-tmp wget -q https://$DOWNLOAD_SERVER/litespeed/lsws-$LSWS_STABLE_VER-ent-x86_64-linux.tar.gz tar xzvf lsws-$LSWS_STABLE_VER-ent-x86_64-linux.tar.gz >/dev/null cd /root/cyberpanel-tmp/lsws-$LSWS_STABLE_VER/conf if [[ $LICENSE_KEY == "TRIAL" ]]; then wget -q http://license.litespeedtech.com/reseller/trial.key sed -i "s|writeSerial = open('lsws-5.4.2/serial.no', 'w')|command = 'wget -q --output-document=./lsws-$LSWS_STABLE_VER/trial.key http://license.litespeedtech.com/reseller/trial.key'|g" $CURRENT_DIR/installCyberPanel.py sed -i 's|writeSerial.writelines(self.serial)|subprocess.call(command, shell=True)|g' $CURRENT_DIR/installCyberPanel.py sed -i 's|writeSerial.close()||g' $CURRENT_DIR/installCyberPanel.py else echo $LICENSE_KEY >serial.no fi cd /root/cyberpanel-tmp/lsws-$LSWS_STABLE_VER/bin if [[ $LICENSE_KEY == "TRIAL" ]]; then if ./lshttpd -V |& grep "ERROR"; then echo -e "\n\nIt apeears to have some issue with license , please check above result..." echo 'It appears to have some issue with LiteSpeed License, make sure you are using correct serial key. [404]' >>/var/log/installLogs.txt exit fi LICENSE_KEY="1111-2222-3333-4444" else if ./lshttpd -r |& grep "ERROR"; then ./lshttpd -r echo -e "\n\nIt apeears to have some issue with license , please check above result..." echo 'It appears to have some issue with LiteSpeed License, make sure you are using correct serial key. [404]' >>/var/log/installLogs.txt exit fi fi echo -e "License seems valid..." cd /root/cyberpanel-tmp rm -rf lsws-$LSWS_STABLE_VER* cd $CURRENT_DIR rm -rf /root/cyberpanel-tmp } special_change() { sed -i 's|cyberpanel.sh|'$DOWNLOAD_SERVER'|g' install.py sed -i 's|mirror.cyberpanel.net|'$DOWNLOAD_SERVER'|g' install.py sed -i 's|git clone https://github.com/usmannasir/cyberpanel|echo downloaded|g' install.py #change to CDN first, regardless country #sed -i 's|http://|https://|g' install.py if [[ $PROVIDER == "Alibaba Cloud" ]]; then if ! grep -q "100.100.2.136" /etc/resolv.conf; then echo -e "\nnameserver 100.100.2.136" >>/etc/resolv.conf fi if ! grep -q "100.100.2.138" /etc/resolv.conf; then echo -e "\nnameserver 100.100.2.138" >>/etc/resolv.conf fi else if ! grep -q "1.1.1.1" /etc/resolv.conf; then echo -e "\nnameserver 1.1.1.1" >>/etc/resolv.conf fi if ! grep -q "8.8.8.8" /etc/resolv.conf; then echo -e "\nnameserver 8.8.8.8" >>/etc/resolv.conf fi fi cp /etc/resolv.conf /etc/resolv.conf-tmp line1="$(grep -n "f.write('nameserver 8.8.8.8')" installCyberPanel.py | head -n 1 | cut -d: -f1)" sed -i "${line1}i\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ subprocess.call(command, shell=True)" installCyberPanel.py sed -i "${line1}i\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ command = 'cat /etc/resolv.conf-tmp > /etc/resolv.conf'" installCyberPanel.py LATEST_URL="https://update.litespeedtech.com/ws/latest.php" #LATEST_URL="https://cyberpanel.sh/latest.php" curl --silent -o /tmp/lsws_latest $LATEST_URL 2>/dev/null LSWS_STABLE_LINE=$(cat /tmp/lsws_latest | grep LSWS_STABLE) LSWS_STABLE_VER=$(expr "$LSWS_STABLE_LINE" : '.*LSWS_STABLE=\(.*\) BUILD .*') if [[ $PROVIDER == "Alibaba Cloud" ]] && [[ $SERVER_OS == "Ubuntu" ]]; then mkdir /root/.config mkdir /root/.config/pip cat </root/.config/pip/pip.conf [global] index-url = https://pypi.python.org/simple/ [install] trusted-host=pypi.python.org EOF echo -e "\nSet pip repo..." fi #seems Alibaba cloud , other than CN , also requires change on ubuntu. if [[ $SERVER_COUNTRY == "CN" ]]; then #line1="$(grep -n "github.com/usmannasir/cyberpanel" install.py | head -n 1 | cut -d: -f1)" #line2=$((line1 - 1)) #sed -i "${line2}i\ \ \ \ \ \ \ \ subprocess.call(command, shell=True)" install.py #sed -i "${line2}i\ \ \ \ \ \ \ \ command = 'tar xzvf cyberpanel-git.tar.gz'" install.py #sed -i "${line2}i\ \ \ \ \ \ \ \ subprocess.call(command, shell=True)" install.py #sed -i "${line2}i\ \ \ \ \ \ \ \ command = 'wget cyberpanel.sh/cyberpanel-git.tar.gz'" install.py sed -i 's|wget http://rpms.litespeedtech.com/debian/|wget --no-check-certificate https://rpms.litespeedtech.com/debian/|g' install.py sed -i 's|https://repo.powerdns.com/repo-files/centos-auth-42.repo|https://'$DOWNLOAD_SERVER'/powerdns/powerdns.repo|g' installCyberPanel.py sed -i 's|https://www.rainloop.net/repository/webmail/rainloop-community-latest.zip|https://'$DOWNLOAD_SERVER'/misc/rainloop-community-latest.zip|g' install.py sed -i 's|rpm -ivh http://rpms.litespeedtech.com/centos/litespeed-repo-1.2-1.el7.noarch.rpm|curl -o /etc/yum.repos.d/litespeed.repo https://'$DOWNLOAD_SERVER'/litespeed/litespeed.repo|g' install.py sed -i 's|https://copr.fedorainfracloud.org/coprs/copart/restic/repo/epel-7/copart-restic-epel-7.repo|https://'$DOWNLOAD_SERVER'/restic/restic.repo|g' install.py sed -i 's|yum -y install http://cyberpanel.sh/gf-release-latest.gf.el7.noarch.rpm|wget -O /etc/yum.repos.d/gf.repo https://'$DOWNLOAD_SERVER'/gf-plus/gf.repo|g' install.py sed -i 's|dovecot-2.3-latest|dovecot-2.3-latest-mirror|g' install.py sed -i 's|git clone https://github.com/usmannasir/cyberpanel|wget https://cyberpanel.sh/cyberpanel-git.tar.gz \&\& tar xzvf cyberpanel-git.tar.gz|g' install.py sed -i 's|http://repo.dovecot.org/ce-2.3-latest/centos/$releasever/RPMS/$basearch|https://'$DOWNLOAD_SERVER'/dovecot/|g' install.py sed -i 's|'$DOWNLOAD_SERVER'|cyberpanel.sh|g' install.py sed -i 's|https://www.litespeedtech.com/packages/5.0/lsws-5.4.2-ent-x86_64-linux.tar.gz|https://'$DOWNLOAD_SERVER'/litespeed/lsws-'$LSWS_STABLE_VER'-ent-x86_64-linux.tar.gz|g' installCyberPanel.py sed -i 's|wget -O - https://get.acme.sh \| sh|git clone https://gitee.com/qtwrk/acme.sh.git ; cd acme.sh ; ./acme.sh --install ; cd - ; rm -rf acme.sh|g' install.py sed -i 's|composer.sh|composer_cn.sh|g' install.py sed -i 's|yum -y install http://repo.iotti.biz/CentOS/7/noarch/lux-release-7-1.noarch.rpm|wget -O /etc/yum.repos.d/lux.repo https://'$DOWNLOAD_SERVER'/lux/lux.repo|g' install.py # global change for CN , regardless provider and system if [[ $SERVER_OS == "CentOS" ]]; then sed -i 's|https://www.litespeedtech.com/packages/5.0/lsws-5.3.5-ent-x86_64-linux.tar.gz|https://cyberpanel.sh/packages/5.0/lsws-5.3.5-ent-x86_64-linux.tar.gz|g' installCyberPanel.py fi if [[ $SERVER_OS == "Ubuntu" ]]; then echo $'\n89.208.248.38 rpms.litespeedtech.com\n' >>/etc/hosts echo -e "Mirror server set..." if [[ $PROVIDER == "Tencent Cloud" ]]; then #tencent cloud and ubuntu system echo -e "\n Tencent Cloud detected ... bypass default repository" cp /etc/apt/sources.list /etc/apt/sources.list-backup #backup original sources list cat <<'EOF' >/etc/apt/sources.list deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse EOF DEBIAN_FRONTEND=noninteractive apt update -y fi fi fi } system_tweak() { number=$(grep -n "127.0.0.1" /etc/hosts | cut -d: -f 1) my_hostname=$(hostname) if [[ -n $number ]]; then for number2 in $number; do string=$(sed "${number2}q;d" /etc/hosts) if [[ $string == *"$my_hostname"* ]]; then : else new_string="$string $my_hostname" sed -i "${number2}s/.*/${new_string}/" /etc/hosts fi done else echo "127.0.0.1 $my_hostname " >>/etc/hosts fi #this should address on "sudo: unable to resolve host ..." on Ubuntu , it's not issue but annoying. if [[ $SERVER_OS == "CentOS" ]]; then setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config fi if ! grep -q "pid_max" /etc/rc.local; then if [[ $SERVER_OS == "CentOS" ]]; then echo "echo 1000000 > /proc/sys/kernel/pid_max echo 1 > /sys/kernel/mm/ksm/run" >>/etc/rc.d/rc.local chmod +x /etc/rc.d/rc.local else echo "echo 1000000 > /proc/sys/kernel/pid_max echo 1 > /sys/kernel/mm/ksm/run" >>/etc/rc.local chmod +x /etc/rc.local fi echo "fs.file-max = 65535" >>/etc/sysctl.conf sysctl -p >/dev/null echo "* soft nofile 65535 * hard nofile 65535 root soft nofile 65535 root hard nofile 65535 * soft nproc 65535 * hard nproc 65535 root soft nproc 65535 root hard nproc 65535" >>/etc/security/limits.conf fi #sed -i 's|#DefaultLimitNOFILE=|DefaultLimitNOFILE=65535|g' /etc/systemd/system.conf TOTAL_SWAP=$(free -m | awk '/^Swap:/ { print $2 }') SET_SWAP=$((TOTAL_RAM - TOTAL_SWAP)) SWAP_FILE=/cyberpanel.swap if [ ! -f $SWAP_FILE ]; then if [[ $TOTAL_SWAP -gt $TOTAL_RAM ]] || [[ $TOTAL_SWAP -eq $TOTAL_RAM ]]; then echo "SWAP check..." else if [[ $SET_SWAP -gt "2049" ]]; then SET_SWAP="2048" else echo "Checking SWAP..." fi fallocate --length ${SET_SWAP}MiB $SWAP_FILE chmod 600 $SWAP_FILE mkswap $SWAP_FILE swapon $SWAP_FILE echo "${SWAP_FILE} swap swap sw 0 0" | sudo tee -a /etc/fstab sysctl vm.swappiness=10 echo "vm.swappiness = 10" >>/etc/sysctl.conf echo "SWAP set..." fi fi } install_required() { echo 'Installing necessary components..,3' >/var/log/installLogs.txt if [[ -d /etc/yum.repos.d ]]; then yum clean all yum update -y yum autoremove epel-release -y rm -f /etc/yum.repos.d/epel.repo rm -f /etc/yum.repos.d/epel.repo.rpmsave yum install epel-release -y if [[ $CENTOS_8 == "True" ]]; then dnf install zip -y elif [[ $CENTOS_8 == "False" ]]; then ###### Setup Required Repos ## Start with PDNS yum install yum-plugin-priorities -y curl -o /etc/yum.repos.d/powerdns-auth-43.repo https://repo.powerdns.com/repo-files/centos-auth-43.repo ## MariaDB cat </etc/yum.repos.d/MariaDB.repo # MariaDB 10.5 CentOS repository list - created 2020-09-08 14:54 UTC # http://downloads.mariadb.org/mariadb/repositories/ [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.5/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 EOF ## Ghetoo Repo for Postfix/Dovecot yum --nogpg install https://mirror.ghettoforge.org/distributions/gf/gf-release-latest.gf.el7.noarch.rpm -y ## Copr for restic yum install yum-plugin-copr -y yum copr enable copart/restic -y ## Lux for git 2.17 or more yum install http://repo.iotti.biz/CentOS/7/noarch/lux-release-7-1.noarch.rpm -y ## IUS Repo for python 3 yum install https://repo.ius.io/ius-release-el7.rpm -y fi fi echo -e "\nInstalling necessary components..." if [[ $SERVER_OS == "CentOS" ]]; then yum clean all yum update -y if [[ $CENTOS_8 == "False" ]]; then yum install -y wget strace net-tools curl which bc telnet htop libevent-devel gcc libattr-devel xz-devel gpgme-devel curl-devel git socat openssl-devel MariaDB-shared mariadb-devel yum-utils python36u python36u-pip python36u-devel check_return yum -y groupinstall development check_return fi if [[ $CENTOS_8 == "True" ]]; then dnf install -y wget strace net-tools curl which bc telnet htop libevent-devel gcc libattr-devel xz-devel mariadb-devel curl-devel git platform-python-devel tar socat python3 check_return dnf --enablerepo=PowerTools install gpgme-devel -y dnf --enablerepo=powertools install gpgme-devel -y #check_return fi ln -s /usr/bin/pip3 /usr/bin/pip pip install virtualenv==16.7.9 #pip install virtualenv check_return fi if [[ $SERVER_OS == "Ubuntu" ]]; then apt update -y #DEBIAN_FRONTEND=noninteractive apt upgrade -y DEBIAN_FRONTEND=noninteracitve apt install -y htop telnet libcurl4-gnutls-dev libgnutls28-dev libgcrypt20-dev libattr1 libattr1-dev liblzma-dev libgpgme-dev libmariadbclient-dev libcurl4-gnutls-dev libssl-dev nghttp2 libnghttp2-dev idn2 libidn2-dev libidn2-0-dev librtmp-dev libpsl-dev nettle-dev libgnutls28-dev libldap2-dev libgssapi-krb5-2 libk5crypto3 libkrb5-dev libcomerr2 libldap2-dev virtualenv git socat vim unzip zip check_return DEBIAN_FRONTEND=noninteractive apt install -y python3-pip check_return ln -s /usr/bin/pip3 /usr/bin/pip3.6 ln -s /usr/bin/pip3.6 /usr/bin/pip DEBIAN_FRONTEND=noninteractive apt install -y build-essential libssl-dev libffi-dev python3-dev check_return DEBIAN_FRONTEND=noninteractive apt install -y python3-venv check_return pip install virtualenv==16.7.9 #pip install virtualenv check_return fi echo 'Necessary components installed..,5' >/var/log/installLogs.txt } memcached_installation() { if [[ $SERVER_OS == "CentOS" ]]; then yum install -y lsphp74-memcached lsphp73-memcached lsphp72-memcached lsphp71-memcached lsphp70-memcached lsphp56-pecl-memcached lsphp55-pecl-memcached lsphp54-pecl-memcached if [[ $TOTAL_RAM -eq "2048" ]] || [[ $TOTAL_RAM -gt "2048" ]]; then yum groupinstall "Development Tools" -y yum install autoconf automake zlib-devel openssl-devel expat-devel pcre-devel libmemcached-devel cyrus-sasl* -y wget https://$DOWNLOAD_SERVER/litespeed/lsmcd.tar.gz tar xzvf lsmcd.tar.gz DIR=$(pwd) cd $DIR/lsmcd ./fixtimestamp.sh ./configure CFLAGS=" -O3" CXXFLAGS=" -O3" make make install systemctl enable lsmcd systemctl start lsmcd cd $DIR else yum install -y memcached sed -i 's|OPTIONS=""|OPTIONS="-l 127.0.0.1 -U 0"|g' /etc/sysconfig/memcached systemctl enable memcached systemctl start memcached fi fi if [[ $SERVER_OS == "Ubuntu" ]]; then DEBIAN_FRONTEND=noninteractive apt install -y lsphp74-memcached DEBIAN_FRONTEND=noninteractive apt install -y lsphp73-memcached DEBIAN_FRONTEND=noninteractive apt install -y lsphp72-memcached DEBIAN_FRONTEND=noninteractive apt install -y lsphp71-memcached DEBIAN_FRONTEND=noninteractive apt install -y lsphp70-memcached if [[ $TOTAL_RAM -eq "2048" ]] || [[ $TOTAL_RAM -gt "2048" ]]; then DEBIAN_FRONTEND=noninteractive apt install build-essential zlib1g-dev libexpat1-dev openssl libssl-dev libsasl2-dev libpcre3-dev git -y wget https://$DOWNLOAD/litespeed/lsmcd.tar.gz tar xzvf lsmcd.tar.gz DIR=$(pwd) cd $DIR/lsmcd ./fixtimestamp.sh ./configure CFLAGS=" -O3" CXXFLAGS=" -O3" make make install cd $DIR systemctl enable lsmcd systemctl start lsmcd else DEBIAN_FRONTEND=noninteractive apt install -y memcached systemctl enable memcached systemctl start memcached fi fi if ps -aux | grep "lsmcd" | grep -v grep; then echo -e "\n\nLiteSpeed Memcached installed and running..." fi if ps -aux | grep "memcached" | grep -v grep; then echo -e "\n\nMemcached installed and running..." fi } redis_installation() { if [[ $SERVER_OS == "CentOS" ]]; then if [[ CENTOS_8 == "True" ]]; then yum install -y lsphp74-redis lsphp73-redis lsphp72-redis lsphp71-redis lsphp70-redis lsphp56-redis lsphp55-redis lsphp54-redis redis else yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm yum-config-manager --disable remi yum-config-manager --disable remi-safe yum -y --enablerepo=remi install redis fi fi if [[ $SERVER_OS == "Ubuntu" ]]; then DEBIAN_FRONTEND=noninteractive apt install -y lsphp74-redis DEBIAN_FRONTEND=noninteractive apt install -y lsphp73-redis DEBIAN_FRONTEND=noninteractive apt install -y lsphp72-redis DEBIAN_FRONTEND=noninteractive apt install -y lsphp71-redis DEBIAN_FRONTEND=noninteractive apt install -y lsphp70-redis DEBIAN_FRONTEND=noninteractive apt install -y redis fi if ifconfig -a | grep inet6; then echo -e "\n IPv6 detected..." else sed -i 's|bind 127.0.0.1 ::1|bind 127.0.0.1|g' /etc/redis/redis.conf echo -e "\n no IPv6 detected..." fi if [[ $SERVER_OS == "CentOS" ]]; then systemctl enable redis systemctl start redis fi if [[ $SERVER_OS == "Ubuntu" ]]; then systemctl stop redis-server rm -f /var/run/redis/redis-server.pid systemctl enable redis-server systemctl start redis-server fi if ps -aux | grep "redis" | grep -v grep; then echo -e "\n\nRedis installed and running..." fi } check_provider() { if hash dmidecode >/dev/null 2>&1; then if [ "$(dmidecode -s bios-vendor)" = 'Google' ]; then PROVIDER='Google Cloud Platform' elif [ "$(dmidecode -s bios-vendor)" = 'DigitalOcean' ]; then PROVIDER='Digital Ocean' elif [ "$(dmidecode -s system-product-name | cut -c 1-7)" = 'Alibaba' ]; then PROVIDER='Alibaba Cloud' elif [ "$(dmidecode -s system-manufacturer)" = 'Microsoft Corporation' ]; then PROVIDER='Microsoft Azure' elif [ -d /usr/local/qcloud ]; then PROVIDER='Tencent Cloud' else PROVIDER='undefined' fi else PROVIDER='undefined' fi if [[ -f /sys/devices/virtual/dmi/id/product_uuid ]]; then if [ "$(cat /sys/devices/virtual/dmi/id/product_uuid | cut -c 1-3)" = 'EC2' ] && [ -d /home/ubuntu ]; then PROVIDER='Amazon Web Service' fi fi } check_OS() { echo -e "\nChecking OS..." OUTPUT=$(cat /etc/*release) if echo $OUTPUT | grep -q "CentOS Linux 7"; then echo -e "\nDetecting CentOS 7.X...\n" SERVER_OS="CentOS" elif echo $OUTPUT | grep -q "CloudLinux 7"; then echo -e "\nDetecting CloudLinux 7.X...\n" SERVER_OS="CentOS" elif echo $OUTPUT | grep -q "CentOS Linux 8"; then echo -e "\nDetecting CentOS 8.X...\n" SERVER_OS="CentOS" CENTOS_8="True" elif echo $OUTPUT | grep -q "Ubuntu 18.04"; then if uname -m | grep -q 64; then echo -e "\nDetecting Ubuntu 18.04...\n" SERVER_OS="Ubuntu" else echo -e "\nUbuntu 18.04 x32 detected...ths only works on x64 system." echo 'Ubuntu 18.04 x32 detected...ths only works on x64 system. [404]' >>/var/log/installLogs.txt exit fi elif echo $OUTPUT | grep -q "Ubuntu 20.04"; then if uname -m | grep -q 64; then echo -e "\nDetecting Ubuntu 20.04 ...\n" SERVER_OS="Ubuntu" UBUNTU_20="True" else echo -e "\nUbuntu 20 x32 detected...ths only works on x64 system." echo 'Ubuntu 20 x32 detected...ths only works on x64 system. [404]' >>/var/log/installLogs.txt exit fi else cat /etc/*release echo -e "\nUnable to detect your OS...\n" echo -e "\nCyberPanel is supported on Ubuntu 18.04 x86_64, Ubuntu 20.04 x86_64, CentOS 7.x, CentOS 8.x and CloudLinux 7.x...\n" echo 'CyberPanel is supported on Ubuntu 18.04 x86_64, Ubuntu 20.04 x86_64, CentOS 7.x, CentOS 8.x and CloudLinux 7.x... [404]' >>/var/log/installLogs.txt exit 1 fi } check_root() { echo -e "\nChecking root privileges...\n" if echo $SUDO_TEST | grep SUDO >/dev/null; then echo -e "\nYou are using SUDO , please run as root user...\n" echo -e "\nIf you don't have direct access to root user, please run \e[31msudo su -\e[39m command (do NOT miss the \e[31m-\e[39m at end or it will fail) and then run installation command again." exit fi if [[ $(id -u) != 0 ]] >/dev/null; then echo -e "\nYou must use root user to install CyberPanel...\n" # echo -e "or run following command: (do NOT miss the quotes)" # echo -e "\e[31msudo su -c \"sh <(curl https://cyberpanel.sh || wget -O - https://cyberpanel.sh)\"\e[39m" exit 1 else echo -e "\nYou are runing as root...\n" fi } check_panel() { if [ -d /usr/local/cpanel ]; then echo -e "\ncPanel detected...exit...\n" echo 'cPanel detected...exit... [404]' >>/var/log/installLogs.txt exit 1 fi if [ -d /opt/plesk ]; then echo -e "\nPlesk detected...exit...\n" echo 'Plesk detected...exit... [404]' >>/var/log/installLogs.txt exit 1 fi } check_process() { if systemctl is-active --quiet httpd; then systemctl disable httpd systemctl stop httpd systemctl mask httpd echo -e "\nhttpd process detected, disabling...\n" fi if systemctl is-active --quiet apache2; then systemctl disable apache2 systemctl stop apache2 systemctl mask apache2 echo -e "\napache2 process detected, disabling...\n" fi if systemctl is-active --quiet named; then systemctl stop named systemctl disable named systemctl mask named echo -e "\nnamed process detected, disabling...\n" fi if systemctl is-active --quiet exim; then systemctl stop exim systemctl disable exim systemctl mask exim echo -e "\nexim process detected, disabling...\n" fi } show_help() { echo -e "\nCyberPanel Installer Script Help\n" echo -e "\nUsage: sh <(curl cyberpanel.sh) --argument" echo -e "\n -v or --version: choose to install CyberPanel OpenLiteSpeed or CyberPanel Enterprise, available options are \e[31mols\e[39m and \e[31mSERIAL_NUMBER\e[39m, default ols" echo -e "\n Please be aware, this serial number must be obtained from LiteSpeed Store." echo -e "\n And if this serial number has been used before, it must be released/migrated in Store first, otherwise it will fail to start." echo -e "\n -a or --addons: install addons: memcached, redis, PHP extension for memcached and redis" echo -e "\n -p or --password: set password of new installation, empty for default 1234567, [r] or [random] for randomly generated 16 digital password, any other value besides [d] and [r(andom)] will be accept as password, default use 1234567." echo -e "\n -m: set to minimal mode which will not install PowerDNS, Pure-FTPd and Postfix" echo -e "\n Example:" echo -e "\n sh <(curl cyberpanel.sh) -v ols -p r or ./cyberpanel.sh --version ols --password random" echo -e "\n This will install CyberPanel OpenLiteSpeed and randomly generate the password." echo -e "\n sh <(curl cyberpanel.sh) -v LICENSE_KEY -a -p my_pass_word" echo -e "\n This will install LiteSpeed Enterise , replace LICENSE_KEY to actual license key and set password to my_pass_word\n" } license_input() { VERSION="ENT" echo -e "\nPlease note that your server has \e[31m$TOTAL_RAM MB\e[39m RAM" echo -e "If you are using \e[31mFree Start\e[39m license, It will not start due to \e[31m2GB RAM limit\e[39m.\n" echo -e "If you do not have any license, you can also use trial license (if server has not used trial license before), type \e[31mTRIAL\e[39m\n" printf "%s" "Please input your serial number for LiteSpeed WebServer Enterprise:" read LICENSE_KEY if [ -z "$LICENSE_KEY" ]; then echo -e "\nPlease provide license key\n" exit fi echo -e "The serial number you input is: \e[31m$LICENSE_KEY\e[39m" printf "%s" "Please verify it is correct. [y/N]" read TMP_YN if [ -z "$TMP_YN" ]; then echo -e "\nPlease type \e[31my\e[39m\n" exit fi KEY_SIZE=${#LICENSE_KEY} TMP=$(echo $LICENSE_KEY | cut -c5) TMP2=$(echo $LICENSE_KEY | cut -c10) TMP3=$(echo $LICENSE_KEY | cut -c15) if [[ $TMP == "-" ]] && [[ $TMP2 == "-" ]] && [[ $TMP3 == "-" ]] && [[ $KEY_SIZE == "19" ]]; then echo -e "\nLicense key set..." elif [[ $LICENSE_KEY == "trial" ]] || [[ $LICENSE_KEY == "TRIAL" ]] || [[ $LICENSE_KEY == "Trial" ]]; then echo -e "\nTrial license set..." LICENSE_KEY="TRIAL" else echo -e "\nLicense key seems incorrect, please verify\n" echo -e "\nIf you are copying/pasting, please make sure you didn't paste blank space...\n" exit fi echo -e "\nWould you like use Redis Mass Hosting?" echo -e "Please type Yes or No (with capital \e[31mY\e[39m, default No):" printf "%s" read REDIS_HOSTING } interactive_mode() { echo -e " CyberPanel Installer v$CP_VER1$CP_VER2 1. Install CyberPanel. 2. Addons and Miscellaneous 3. Exit. " read -p " Please enter the number[1-3]: " num echo "" case "$num" in 1) interactive_install ;; 2) interactive_others ;; 3) exit ;; *) echo -e " Please enter the right number [1-3]\n" exit ;; esac } interactive_others() { if [ ! -e "/etc/cyberpanel/machineIP" ]; then echo -e "\nYou don't have CyberPanel installed...\n" exit fi echo -e " CyberPanel Addons v$CP_VER1$CP_VER2 1. Install Memcached extension and backend 2. Install Redis extension and backend 3. Return to main page. 4. Exit " echo && read -p "Please enter the number[1-4]: " num case "$num" in 1) memcached_installation exit ;; 2) redis_installation exit ;; 3) interactive_mode ;; 4) exit ;; *) echo -e "${Error} please enter the right number [1-4]" ;; esac } interactive_install() { RAM=$(free -m | awk 'NR==2{printf "%s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }') DISK=$(df -h | awk '$NF=="/"{printf "%d/%dGB (%s)\n", $3,$2,$5}') #clear echo -e " CyberPanel Installer v$CP_VER1$CP_VER2 RAM check : $RAM Disk check : $DISK (Minimal \e[31m10GB\e[39m free space) 1. Install CyberPanel with \e[31mOpenLiteSpeed\e[39m. 2. Install Cyberpanel with \e[31mLiteSpeed Enterprise\e[39m. 3. Exit. " read -p " Please enter the number[1-3]: " num echo "" case "$num" in 1) VERSION="OLS" ;; 2) license_input ;; 3) exit ;; *) echo -e " Please enter the right number [1-3]\n" exit ;; esac echo -e "\nInstall Full service for CyberPanel? This will include PowerDNS, Postfix and Pure-FTPd." echo -e "" printf "%s" "Full installation [Y/n]: " read TMP_YN if [[ $(expr "x$TMP_YN" : 'x[Yy]') -gt 1 ]] || [[ $TMP_YN == "" ]]; then echo -e "\nFull installation selected..." POSTFIX_VARIABLE="ON" POWERDNS_VARIABLE="ON" PUREFTPD_VARIABLE="ON" else echo -e "" printf "%s" "Install Postfix? [Y/n]: " read TMP_YN if [[ $TMP_YN =~ ^(no|n|N) ]]; then POSTFIX_VARIABLE="OFF" else POSTFIX_VARIABLE="ON" fi echo -e "" printf "%s" "Install PowerDNS? [Y/n]: " read TMP_YN if [[ $TMP_YN =~ ^(no|n|N) ]]; then POWERDNS_VARIABLE="OFF" else POWERDNS_VARIABLE="ON" fi echo -e "" printf "%s" "Install PureFTPd? [Y/n]: " read TMP_YN if [[ $TMP_YN =~ ^(no|n|N) ]]; then PUREFTPD_VARIABLE="OFF" else PUREFTPD_VARIABLE="ON" fi fi ### Ask if you want to set up this CyberPanel with remote MySQL echo -e "\nDo you want to setup Remote MySQL? (This will skip installation of local MySQL)" echo -e "" printf "%s" "(Default = No) Remote MySQL [y/N]: " read TMP_YN if [[ $(expr "x$TMP_YN" : 'x[Yy]') -gt 1 ]]; then echo -e "\nRemote MySQL selected..." REMOTE_MYSQL='ON' echo -e "" printf "%s" "Remote MySQL Hostname: " read MYSQL_HOST echo -e "" printf "%s" "Remote MySQL Database that contains meta information regarding MYSQL. (usually mysql): " read MYSQL_DB echo -e "" printf "%s" "Remote MySQL Username: " read MYSQL_USER echo -e "" printf "%s" "Remote MySQL Password: " read -r -s -p "Password: " MYSQL_PASSWORD echo -e "" printf "%s" "Remote MySQL Port: " read MYSQL_PORT else echo -e "" printf "%s" "Local MySQL selected.." echo -e "" fi ### #above comment for future use #if [[ $DEV_ARG == "ON" ]] ; then #echo -e "Press \e[31mEnter\e[39m to continue with stable version of CyberPanel, or" #echo -e "\nPlease enter \e[31mbeta\e[39m and then press \e[31mEnter\e[39m to install CyberPanel with Python 3." #echo -e "\nCentOS 8 will autoamtically proceed with Python 3 branch." #printf "%s" "" #read TMP_YN echo -e "\nPress \e[31mEnter\e[39m key to continue with latest version or Enter specific version such as: \e[31m1.9.4\e[39m , \e[31m2.0.1\e[39m , \e[31m2.0.2\e[39m ...etc" printf "%s" "" read TMP_YN DEV="ON" if [[ $TMP_YN == "" ]]; then BRANCH_NAME="v${TEMP:12:3}.${TEMP:25:1}" echo -e "\nBranch name set to $BRANCH_NAME" else base_number="1.9.3" if [[ $TMP_YN == *.*.* ]]; then #check input if it's valid format as X.Y.Z output=$(awk -v num1="$base_number" -v num2="$TMP_YN" ' BEGIN { print "num1", (num1 < num2 ? "<" : ">="), "num2" } ') if [[ $output == *">="* ]]; then echo -e "\nYou must use version number higher than 1.9.4" exit else BRANCH_NAME="v$TMP_YN" echo "set branch name to $BRANCH_NAME" fi else echo -e "\nPlease input a valid format version number." exit fi fi #if [[ $TMP_YN == "beta" ]] ; then # DEV="ON" ## echo -e "\nPlease specify branch name" ## printf "%s" "" ## read TMP_YN # BRANCH_NAME="p3" # echo -e "Branch name set to $BRANCH_NAME" #else # DEV="OFF" # # if [[ $CENTOS_8 == "True" ]] ; then # DEV="ON" # BRANCH_NAME="p3" # fi #fi #fi echo -e "\nPlease choose to use default admin password \e[31m1234567\e[39m, randomly generate one \e[31m(recommended)\e[39m or specify the admin password?" printf "%s" "Choose [d]fault, [r]andom or [s]et password: [d/r/s] " read TMP_YN if [[ $TMP_YN =~ ^(d|D| ) ]] || [[ -z $TMP_YN ]]; then ADMIN_PASS="1234567" echo -e "\nAdmin password will be set to $ADMIN_PASS\n" elif [[ $TMP_YN =~ ^(r|R) ]]; then ADMIN_PASS=$( head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16 echo '' ) echo -e "\nAdmin password will be provided once installation is completed...\n" elif [[ $TMP_YN =~ ^(s|S) ]]; then CUSTOM_PASS="True" echo -e "\nPlease enter your password:" printf "%s" "" read -r -s -p "Password: " TMP_YN if [ -z "$TMP_YN" ]; then echo -e "\nPlease do not use empty string...\n" exit fi if [ ${#TMP_YN} -lt 8 ]; then echo -e "\nPassword lenth less than 8 digital, please choose a more complicated password.\n" exit fi TMP_YN1=$TMP_YN printf "%s\n" "" read -r -s -p "Confirm Password:" TMP_YN if [ -z "$TMP_YN" ]; then echo -e "\nPlease do not use empty string...\n" exit fi TMP_YN2=$TMP_YN if [ $TMP_YN1 = $TMP_YN2 ]; then ADMIN_PASS=$TMP_YN1 else echo -e "\nRepeated password didn't match , please check...\n" exit fi else ADMIN_PASS="1234567" echo -e "\nAdmin password will be set to $ADMIN_PASS\n" fi echo -e "\nDo you wish to install Memcached extension and backend?" printf "%s" "Please select [Y/n]: " read TMP_YN if [[ $TMP_YN =~ ^(no|n|N) ]]; then MEMCACHED="OFF" else MEMCACHED="ON" fi echo -e "\nDo you wish to install Redis extension and backend?" printf "%s" "Please select [Y/n]: " read TMP_YN if [[ $TMP_YN =~ ^(no|n|N) ]]; then REDIS="OFF" else REDIS="ON" fi echo -e "\nWould you like to set up a WatchDog \e[31m(beta)\e[39m for Web service and Database service ?" echo -e "The watchdog script will be automatically started up after installation and server reboot" echo -e "If you want to kill the watchdog , run \e[31mwatchdog kill\e[39m" echo -e "Please type Yes or no (with capital \e[31mY\e[39m, default Yes):" printf "%s" read TMP_YN if [[ $TMP_YN == "Yes" ]] || [[ $TMP_YN == "" ]]; then WATCHDOG="ON" else WATCHDOG="OFF" fi } main_install() { if [[ -e /usr/local/CyberCP ]]; then echo -e "\n CyberPanel already installed, exiting..." echo 'CyberPanel already installed, exiting... [404]' >>/var/log/installLogs.txt exit fi special_change if [[ $VERSION == "ENT" ]]; then echo -e "\nValidating the license..." echo -e "\nThis may take a minute..." echo -e "\nplease be patient...\n\n" license_validation SERIAL_NO="--ent ent --serial " fi sed -i 's|lsws-5.4.2|lsws-'$LSWS_STABLE_VER'|g' installCyberPanel.py sed -i 's|lsws-5.3.5|lsws-'$LSWS_STABLE_VER'|g' installCyberPanel.py #this sed must be done after license validation echo -e "Preparing..." echo -e "Installation will start in 10 seconds, if you wish to stop please press CTRL + C" sleep 10 debug="1" if [[ $debug == "0" ]]; then echo "/usr/local/CyberPanel/bin/python install.py $SERVER_IP $SERIAL_NO $LICENSE_KEY --postfix $POSTFIX_VARIABLE --powerdns $POWERDNS_VARIABLE --ftp $PUREFTPD_VARIABLE" exit fi if [[ $debug == "1" ]]; then if [[ $REDIS_HOSTING == "Yes" ]]; then if [[ $REMOTE_MYSQL == "ON" ]]; then /usr/local/CyberPanel/bin/python install.py $SERVER_IP $SERIAL_NO $LICENSE_KEY --postfix $POSTFIX_VARIABLE --powerdns $POWERDNS_VARIABLE --ftp $PUREFTPD_VARIABLE --redis enable --remotemysql $REMOTE_MYSQL --mysqlhost $MYSQL_HOST --mysqldb $MYSQL_DB --mysqluser $MYSQL_USER --mysqlpassword $MYSQL_PASSWORD --mysqlport $MYSQL_PORT else /usr/local/CyberPanel/bin/python install.py $SERVER_IP $SERIAL_NO $LICENSE_KEY --postfix $POSTFIX_VARIABLE --powerdns $POWERDNS_VARIABLE --ftp $PUREFTPD_VARIABLE --redis enable --remotemysql $REMOTE_MYSQL fi else if [[ $REMOTE_MYSQL == "ON" ]]; then echo "/usr/local/CyberPanel/bin/python install.py $SERVER_IP $SERIAL_NO $LICENSE_KEY --postfix $POSTFIX_VARIABLE --powerdns $POWERDNS_VARIABLE --ftp $PUREFTPD_VARIABLE --remotemysql $REMOTE_MYSQL --mysqlhost $MYSQL_HOST --mysqluser $MYSQL_USER --mysqlpassword $MYSQL_PASSWORD --mysqlport $MYSQL_PORT" /usr/local/CyberPanel/bin/python install.py $SERVER_IP $SERIAL_NO $LICENSE_KEY --postfix $POSTFIX_VARIABLE --powerdns $POWERDNS_VARIABLE --ftp $PUREFTPD_VARIABLE --remotemysql $REMOTE_MYSQL --mysqlhost $MYSQL_HOST --mysqldb $MYSQL_DB --mysqluser $MYSQL_USER --mysqlpassword $MYSQL_PASSWORD --mysqlport $MYSQL_PORT else /usr/local/CyberPanel/bin/python install.py $SERVER_IP $SERIAL_NO $LICENSE_KEY --postfix $POSTFIX_VARIABLE --powerdns $POWERDNS_VARIABLE --ftp $PUREFTPD_VARIABLE --remotemysql $REMOTE_MYSQL fi fi if grep "CyberPanel installation successfully completed" /var/log/installLogs.txt >/dev/null; then echo -e "\nCyberPanel installation sucessfully completed..." else echo -e "Oops, something went wrong..." echo 'Oops, something went wrong... [404]' >>/var/log/installLogs.txt exit fi if [[ $MEMCACHED == "ON" ]]; then memcached_installation fi if [[ $REDIS == "ON" ]]; then redis_installation fi after_install fi } pip_virtualenv() { if [[ $SERVER_OS == "Ubuntu" ]]; then DEBIAN_FRONTEND=noninteractive apt install -y locales locale-gen "en_US.UTF-8" update-locale LC_ALL="en_US.UTF-8" fi export LC_CTYPE=en_US.UTF-8 export LC_ALL=en_US.UTF-8 #need to set lang to address some pip module installation issue. if [[ $DEV == "ON" ]]; then #install dev branch wget https://raw.githubusercontent.com/usmannasir/cyberpanel/$BRANCH_NAME/requirments.txt -O /usr/local/requirments.txt virtualenv -p /usr/bin/python3 /usr/local/CyberPanel if [[ $UBUNTU_20 == "False" ]]; then source /usr/local/CyberPanel/bin/activate pip install -r /usr/local/requirments.txt check_return else . /usr/local/CyberPanel/bin/activate pip install -r /usr/local/requirments.txt check_return fi fi if [ -f requirements.txt ] && [ -d cyberpanel ]; then rm -rf cyberpanel rm -f requirements.txt fi git clone https://${GIT_URL} cd cyberpanel git checkout $BRANCH_NAME check_return cd - cp -r cyberpanel /usr/local/cyberpanel cd cyberpanel/install curl https://cyberpanel.sh/?version } regenerate_cert() { cat </root/cyberpanel/cert_conf [req] prompt=no distinguished_name=cyberpanel [cyberpanel] commonName = www.example.com countryName = CP localityName = CyberPanel organizationName = CyberPanel organizationalUnitName = CyberPanel stateOrProvinceName = CP emailAddress = mail@example.com name = CyberPanel surname = CyberPanel givenName = CyberPanel initials = CP dnQualifier = CyberPanel [server_exts] extendedKeyUsage = 1.3.6.1.5.5.7.3.1 EOF openssl req -x509 -config /root/cyberpanel/cert_conf -extensions 'server_exts' -nodes -days 820 -newkey rsa:2048 -keyout /usr/local/lscp/conf/key.pem -out /usr/local/lscp/conf/cert.pem if [[ $VERSION == "OLS" ]]; then key_path="/usr/local/lsws/admin/conf/webadmin.key" cert_path="/usr/local/lsws/admin/conf/webadmin.crt" else key_path="/usr/local/lsws/admin/conf/cert/admin.key" cert_path="/usr/local/lsws/admin/conf/cert/admin.crt" fi openssl req -x509 -config /root/cyberpanel/cert_conf -extensions 'server_exts' -nodes -days 820 -newkey rsa:2048 -keyout $key_path -out $cert_path rm -f /root/cyberpanel/cert_conf } after_install() { echo 'Finalization..,80' >>/var/log/installLogs.txt if [ ! -d "/var/lib/php" ]; then mkdir /var/lib/php fi if [ ! -d "/var/lib/php/session" ]; then mkdir /var/lib/php/session fi chmod 1733 /var/lib/php/session if grep "\[ERROR\] We are not able to run ./install.sh return code: 1. Fatal error, see /var/log/installLogs.txt for full details" /var/log/installLogs.txt >/dev/null; then cd ${DIR}/cyberpanel/install/lsws-* ./install.sh echo -e "\n\n\nIt seems LiteSpeed Enterprise has failed to install, please check your license key is valid" echo -e "\nIf this license key has been used before, you may need to go to store to release it first." echo 'It seems LiteSpeed Enterprise has failed to install, please check your license key is valid. If this license key has been used before, you may need to go to store to release it first. [404]' >>/var/log/installLogs.txt exit fi if grep "CyberPanel installation successfully completed" /var/log/installLogs.txt >/dev/null; then if [[ $DEV == "ON" ]]; then if [[ $PROVIDER == "Alibaba Cloud" ]] && [[ $SERVER_OS == "Ubuntu" ]]; then cat </root/.config/pip/pip.conf [global] index-url = https://pypi.python.org/simple/ [install] trusted-host=pypi.python.org EOF fi fi virtualenv -p /usr/bin/python3 /usr/local/CyberCP if [[ $UBUNTU_20 == "False" ]]; then source /usr/local/CyberCP/bin/activate check_return pip install -r /usr/local/requirments.txt check_return else . /usr/local/CyberCP/bin/activate check_return pip install -r /usr/local/requirments.txt check_return fi ## Some permissions on libs chown -R cyberpanel:cyberpanel /usr/local/CyberCP/lib chown -R cyberpanel:cyberpanel /usr/local/CyberCP/lib64 systemctl restart lscpd for version in $(ls /usr/local/lsws | grep lsphp); do php_ini=$(find /usr/local/lsws/$version/ -name php.ini) version2=${version:5:2} version2=$(awk "BEGIN { print "${version2}/10" }") if [[ $version2 == "7" ]]; then version2="7.0" fi if [[ $SERVER_OS == "CentOS" ]]; then yum remove -y $version-mysql yum install -y $version-mysqlnd yum install -y $version-devel make gcc glibc-devel libmemcached-devel zlib-devel if [[ ! -d /usr/local/lsws/$version/tmp ]]; then mkdir /usr/local/lsws/$version/tmp fi /usr/local/lsws/${version}/bin/pecl channel-update pecl.php.net /usr/local/lsws/${version}/bin/pear config-set temp_dir /usr/local/lsws/${version}/tmp /usr/local/lsws/${version}/bin/pecl install timezonedb echo "extension=timezonedb.so" >/usr/local/lsws/${version}/etc/php.d/20-timezone.ini chmod 755 /usr/local/lsws/${version}/lib64/php/modules/timezonedb.so sed -i 's|expose_php = On|expose_php = Off|g' $php_ini sed -i 's|mail.add_x_header = On|mail.add_x_header = Off|g' $php_ini sed -i 's|;session.save_path = "/tmp"|session.save_path = "/var/lib/php/session"|g' $php_ini fi if [[ $SERVER_OS == "Ubuntu" ]]; then if [[ ! -d /usr/local/lsws/cyberpanel-tmp ]]; then if [[ -d /etc/pure-ftpd/conf ]]; then echo "yes" >/etc/pure-ftpd/conf/ChrootEveryone systemctl restart pure-ftpd-mysql fi DEBIAN_FRONTEND=noninteractive apt install libmagickwand-dev pkg-config build-essential -y mkdir /usr/local/lsws/cyberpanel-tmp cd /usr/local/lsws/cyberpanel-tmp wget -O timezonedb.tgz https://pecl.php.net/get/timezonedb tar xzvf timezonedb.tgz cd timezonedb-* fi /usr/local/lsws/${version}/bin/phpize ./configure --with-php-config=/usr/local/lsws/${version}/bin/php-config${version2} make make install echo "extension=timezonedb.so" >/usr/local/lsws/${version}/etc/php/${version2}/mods-available/20-timezone.ini make clean fi done rm -rf /etc/profile.d/cyberpanel* curl --silent -o /etc/profile.d/cyberpanel.sh https://cyberpanel.sh/?banner 2>/dev/null chmod +x /etc/profile.d/cyberpanel.sh RAM2=$(free -m | awk 'NR==2{printf "%s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }') DISK2=$(df -h | awk '$NF=="/"{printf "%d/%dGB (%s)\n", $3,$2,$5}') ELAPSED="$((SECONDS / 3600)) hrs $(((SECONDS / 60) % 60)) min $((SECONDS % 60)) sec" MYSQLPASSWD=$(cat /etc/cyberpanel/mysqlPassword) echo "$ADMIN_PASS" >/etc/cyberpanel/adminPass /usr/local/CyberPanel/bin/python /usr/local/CyberCP/plogical/adminPass.py --password $ADMIN_PASS mkdir -p /etc/opendkim regenerate_cert systemctl restart lscpd systemctl restart lsws echo '/usr/local/CyberPanel/bin/python /usr/local/CyberCP/plogical/adminPass.py --password $@' >/usr/bin/adminPass echo "systemctl restart lscpd" >>/usr/bin/adminPass chmod 700 /usr/bin/adminPass if [[ $VERSION == "OLS" ]]; then WORD="OpenLiteSpeed" # sed -i 's|maxConnections 10000|maxConnections 100000|g' /usr/local/lsws/conf/httpd_config.conf # OLS_LATEST=$(curl https://openlitespeed.org/packages/release) # wget https://openlitespeed.org/packages/openlitespeed-$OLS_LATEST.tgz # tar xzvf openlitespeed-$OLS_LATEST.tgz # cd openlitespeed # ./install.sh systemctl stop lsws systemctl start lsws # rm -f openlitespeed-$OLS_LATEST.tgz # rm -rf openlitespeed # cd .. fi if [[ $VERSION == "ENT" ]]; then WORD="LiteSpeed Enterprise" if [[ $SERVER_COUNTRY != "CN" ]]; then /usr/local/lsws/admin/misc/lsup.sh -f -v $LSWS_STABLE_VER fi fi systemctl status lsws >/dev/null 2>&1 if [[ $? == "0" ]]; then echo "LSWS service is running..." else systemctl stop lsws systemctl start lsws fi webadmin_passwd watchdog_setup install_utility if [[ ! -f /usr/sbin/ipset ]] && [[ $SERVER_OS == "Ubuntu" ]]; then ln -s /sbin/ipset /usr/sbin/ipset fi if [[ ! -f /usr/local/lsws/lsphp74/lib64/php/modules/zip.so ]] && [[ $SERVER_OS == "CentOS" ]] && [[ $CENTOS_8 == "False" ]]; then yum list installed libzip-devel if [[ $? == "0" ]]; then yum remove -y libzip-devel fi yum install -y https://$DOWNLOAD_SERVER/misc/libzip-0.11.2-6.el7.psychotic.x86_64.rpm yum install -y https://$DOWNLOAD_SERVER/misc/libzip-devel-0.11.2-6.el7.psychotic.x86_64.rpm /usr/local/lsws/lsphp74/bin/pecl install zip echo "extension=zip.so" >/usr/local/lsws/lsphp74/etc/php.d/20-zip.ini chmod 755 /usr/local/lsws/lsphp74/lib64/php/modules/zip.so fi #fix the lsphp74-zip missing issue. if [[ $SERVER_OS == "CentOS" ]]; then sed -i 's|error_reporting = E_ALL \& ~E_DEPRECATED \& ~E_STRICT|error_reporting = E_ALL \& ~E_DEPRECATED \& ~E_STRICT|g' /usr/local/lsws/{lsphp72,lsphp73}/etc/php.ini fi #fix php.ini & issue if [[ $UBUNTU_20 == "True" ]]; then cp /usr/local/lsws/lsphp73/bin/php /usr/bin fi #clear echo "###################################################################" echo " CyberPanel Successfully Installed " echo " " echo " Current Disk usage : $DISK2 " echo " " echo " Current RAM usage : $RAM2 " echo " " echo " Installation time : $ELAPSED " echo " " echo " Visit: https://$SERVER_IP:8090 " echo " Panel username: admin " if [[ $CUSTOM_PASS == "True" ]]; then echo " Panel password: ***** " elif [[ $CUSTOM_PASS == "False" ]]; then echo " Panel password: $ADMIN_PASS " fi echo " WebAdmin console username: admin " echo " WebAdmin console password: $WEBADMIN_PASS " echo " " echo -e " Run \e[31mcyberpanel help\e[39m to get FAQ info" echo -e " Run \e[31mcyberpanel upgrade\e[39m to upgrade it to latest version." echo -e " Run \e[31mcyberpanel utility\e[39m to access some handy tools ." echo " " echo " Website : https://www.cyberpanel.net " echo " Forums : https://forums.cyberpanel.net " echo " Wikipage: https://docs.cyberpanel.net " echo " " echo -e " Enjoy your accelerated Internet by " echo -e " CyberPanel & $WORD " echo "###################################################################" if [[ $PROVIDER != "undefined" ]]; then echo -e "\033[0;32m$PROVIDER\033[39m detected..." echo -e "This provider has a \e[31mnetwork-level firewall\033[39m" else echo -e "If your provider has a \e[31mnetwork-level firewall\033[39m" fi echo -e "Please make sure you have opened following port for both in/out:" echo -e "\033[0;32mTCP: 8090\033[39m for CyberPanel" echo -e "\033[0;32mTCP: 80\033[39m, \033[0;32mTCP: 443\033[39m and \033[0;32mUDP: 443\033[39m for webserver" echo -e "\033[0;32mTCP: 21\033[39m and \033[0;32mTCP: 40110-40210\033[39m for FTP" echo -e "\033[0;32mTCP: 25\033[39m, \033[0;32mTCP: 587\033[39m, \033[0;32mTCP: 465\033[39m, \033[0;32mTCP: 110\033[39m, \033[0;32mTCP: 143\033[39m and \033[0;32mTCP: 993\033[39m for mail service" echo -e "\033[0;32mTCP: 53\033[39m and \033[0;32mUDP: 53\033[39m for DNS service" if ! timeout 3 telnet mx.zoho.com 25 | grep "Escape" >/dev/null 2>&1; then echo -e "Your provider seems \e[31mblocked\033[39m port 25 , E-mail sending may \e[31mnot\033[39m work properly." fi if [[ $SERVER_COUNTRY == CN ]]; then if [[ $PROVIDER == "Tencent Cloud" ]]; then if [[ $SERVER_OS == "Ubuntu" ]]; then rm -f /etc/apt/sources.list mv /etc/apt/sources.list-backup /etc/apt/sources.list echo >"nameserver 127.0.0.53 options edns0" /run/systemd/resolve/stub-resolv.conf echo >"nameserver 127.0.0.53 options edns0" /etc/resolv.conf apt update #revert the previous change on tencent cloud repo. fi fi if [[ $VERSION == "ENT" ]]; then sed -i 's|https://www.litespeedtech.com/packages/5.0/lsws-5.3.5-ent-x86_64-linux.tar.gz|https://cyberpanel.sh/packages/5.0/lsws-5.3.5-ent-x86_64-linux.tar.gz|g' /usr/local/CyberCP/install/installCyberPanel.py sed -i 's|https://www.litespeedtech.com/packages/5.0/lsws-5.3.8-ent-x86_64-linux.tar.gz|https://cyberpanel.sh/packages/5.0/lsws-5.3.8-ent-x86_64-linux.tar.gz|g' /usr/local/CyberCP/serverStatus/serverStatusUtil.py sed -i 's|https://www.litespeedtech.com/packages/5.0/lsws-5.3.8-ent-x86_64-linux.tar.gz|https://'$DOWNLOAD_SERVER'/litespeed/lsws-'$LSWS_STABLE_VER'-ent-x86_64-linux.tar.gz|g' /usr/local/CyberCP/serverStatus/serverStatusUtil.py echo -e "If you have install LiteSpeed Enterprise, please run \e[31m/usr/local/lsws/admin/misc/lsup.sh\033[39m to update it to latest." fi fi sed -i 's|lsws-5.3.8|lsws-'$LSWS_STABLE_VER'|g' /usr/local/CyberCP/serverStatus/serverStatusUtil.py sed -i 's|lsws-5.4.2|lsws-'$LSWS_STABLE_VER'|g' /usr/local/CyberCP/serverStatus/serverStatusUtil.py sed -i 's|lsws-5.3.5|lsws-'$LSWS_STABLE_VER'|g' /usr/local/CyberCP/serverStatus/serverStatusUtil.py if [[ -f /etc/pure-ftpd/pure-ftpd.conf ]]; then sed -i 's|NoAnonymous no|NoAnonymous yes|g' /etc/pure-ftpd/pure-ftpd.conf fi if [[ $SILENT != "ON" ]]; then printf "%s" "Would you like to restart your server now? [y/N]: " read TMP_YN if [[ $TMP_YN == "N" ]] || [[ $TMP_YN == "n" ]] || [[ -z $TMP_YN ]]; then : else reboot exit fi exit fi #replace URL for CN else echo "something went wrong..." echo 'something went wrong... [404]' >>/var/log/installLogs.txt exit fi } argument_mode() { DEV="ON" #default to python3 branch. KEY_SIZE=${#VERSION} TMP=$(echo $VERSION | cut -c5) TMP2=$(echo $VERSION | cut -c10) TMP3=$(echo $VERSION | cut -c15) if [[ $VERSION == "OLS" || $VERSION == "ols" ]]; then VERSION="OLS" echo -e "\nSet to OpenLiteSpeed..." elif [[ $VERSION == "Trial" ]] || [[ $VERSION == "TRIAL" ]] || [[ $VERSION == "trial" ]]; then VERSION="ENT" LICENSE_KEY="TRIAL" echo -e "\nLiteSpeed Enterprise trial license set..." elif [[ $TMP == "-" ]] && [[ $TMP2 == "-" ]] && [[ $TMP3 == "-" ]] && [[ $KEY_SIZE == "19" ]]; then LICENSE_KEY=$VERSION VERSION="ENT" echo -e "\nLiteSpeed Enterprise license key set..." else echo -e "\nCan not recognize the input value \e[31m$VERSION\e[39m " echo -e "\nPlease verify the input value..." echo -e "\nPlease run with \e[31m-h\e[39m or \e[31m--help\e[39m for more detail." exit fi if [[ $ADMIN_PASS == "d" ]]; then ADMIN_PASS="1234567" echo -e "\nSet to default password..." echo -e "\nAdmin password will be set to \e[31m$ADMIN_PASS\e[39m" elif [[ $ADMIN_PASS == "r" ]]; then ADMIN_PASS=$( head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16 echo '' ) echo -e "\nSet to random-generated password..." echo -e "\nAdmin password will be set to \e[31m$ADMIN_PASS\e[39m" echo $ADMIN_PASS else echo -e "\nAdmin password will be set to \e[31m$ADMIN_PASS\e[39m" fi } initialize() { if [ $# -eq 0 ]; then echo -e "\nInitializing...\n" else if [[ $1 == "help" ]]; then show_help exit elif [[ $1 == "dev" ]]; then DEV="ON" DEV_ARG="ON" SILENT="OFF" elif [[ $1 == "default" ]]; then echo -e "\nThis will start default installation...\n" SILENT="ON" POSTFIX_VARIABLE="ON" POWERDNS_VARIABLE="ON" PUREFTPD_VARIABLE="ON" VERSION="OLS" ADMIN_PASS="1234567" MEMCACHED="ON" REDIS="ON" else while [ ! -z "${1}" ]; do case $1 in -v | --version) shift if [ "${1}" = '' ]; then show_help exit else VERSION="${1}" SILENT="ON" fi ;; -p | --password) shift if [[ ${1} == '' ]]; then ADMIN_PASS="1234567" elif [[ ${1} == 'r' ]] || [[ $1 == 'random' ]]; then ADMIN_PASS=$( head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16 echo '' ) elif [[ ${1} == "d" ]]; then ADMIN_PASS="1234567" else if [ ${#1} -lt 8 ]; then echo -e "\nPassword lenth less than 8 digital, please choose a more complicated password.\n" exit fi ADMIN_PASS="${1}" fi ;; -a | --addons) MEMCACHED="ON" REDIS="ON" ;; -m | --minimal) POSTFIX_VARIABLE="OFF" POWERDNS_VARIABLE="OFF" PUREFTPD_VARIABLE="OFF" ;; -h | --help) show_help exit ;; *) echo "unknown argument..." show_help exit ;; esac shift done fi fi SERVER_IP=$(curl --silent --max-time 10 -4 https://cyberpanel.sh/?ip) if [[ $SERVER_IP =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo -e "Valid IP detected..." else echo -e "Can not detect IP, exit..." exit fi SERVER_COUNTRY="unknow" SERVER_COUNTRY=$(curl --silent --max-time 5 https://cyberpanel.sh/?country) if [[ ${#SERVER_COUNTRY} == "2" ]] || [[ ${#SERVER_COUNTRY} == "6" ]]; then echo -e "\nChecking server..." else echo -e "\nChecking server..." SERVER_COUNTRY="unknow" fi #SERVER_COUNTRY="CN" #test string if [[ $SERVER_COUNTRY == "CN" ]]; then DOWNLOAD_SERVER="cyberpanel.sh" GIT_URL="gitee.com/qtwrk/cyberpanel" GIT_CONTENT_URL="gitee.com/qtwrk/cyberpanel/raw" else DOWNLOAD_SERVER="cdn.cyberpanel.sh" fi echo 'Initialization completed..,2' >/var/log/installLogs.txt } begin_install() { set_git_repos_and_branch initialize "$@" check_OS check_virtualization check_root check_panel check_process check_provider if [[ $SILENT == "ON" ]]; then argument_mode else interactive_mode fi SECONDS=0 install_required openvz_change pip_virtualenv system_tweak main_install disable_repos } begin_install "$@" echo 'Completed [200]' >>/var/log/installLogs.txt