| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439 |
- #!/bin/bash
- # v-update-sys-hestia-git
- # Downloads and compiles/installs packages from GitHub repositories
- # Options: REPOSITORY BRANCH INSTALL [PACKAGES]
- # Example: v-update-sys-hestia-git hestiacp staging/beta install all
- # - Will download from the hestiacp repository
- # - Pulls code from staging/beta branch
- # - install: installs package immediately
- # - 'all': (optional) - compiles nginx and php alongside panel.
- # this option takes a long time, only use when needed
- # Define download function
- download_file() {
- local url=$1
- local destination=$2
- local force=$3
- # Default destination is the curent working directory
- local dstopt=""
- if [ ! -z "$(echo "$url" | grep -E "\.(gz|gzip|bz2|zip|xz)$")" ]; then
- # When an archive file is downloaded it will be first saved localy
- dstopt="--directory-prefix=$ARCHIVE_DIR"
- local is_archive="true"
- local filename="${url##*/}"
- if [ -z "$filename" ]; then
- >&2 echo "[!] No filename was found in url, exiting ($url)"
- exit 1
- fi
- if [ ! -z "$force" ] && [ -f "$ARCHIVE_DIR/$filename" ]; then
- rm -f $ARCHIVE_DIR/$filename
- fi
- elif [ ! -z "$destination" ]; then
- # Plain files will be written to specified location
- dstopt="-O $destination"
- fi
- # check for corrupted archive
- if [ -f "$ARCHIVE_DIR/$filename" ] && [ "$is_archive" = "true" ]; then
- tar -tzf "$ARCHIVE_DIR/$filename" > /dev/null 2>&1
- if [ $? -ne 0 ]; then
- >&2 echo "[!] Archive $ARCHIVE_DIR/$filename is corrupted, redownloading"
- rm -f $ARCHIVE_DIR/$filename
- fi
- fi
- if [ ! -f "$ARCHIVE_DIR/$filename" ]; then
- wget $url -q $dstopt --show-progress --progress=bar:force --limit-rate=3m
- fi
- if [ ! -z "$destination" ] && [ "$is_archive" = "true" ]; then
- if [ "$destination" = "-" ]; then
- cat "$ARCHIVE_DIR/$filename"
- elif [ -d "$(dirname $destination)" ]; then
- cp "$ARCHIVE_DIR/$filename" "$destination"
- fi
- fi
- }
- # Set compiling directory
- BUILD_DIR='/tmp/hestiacp-src'
- DEB_DIR="$BUILD_DIR/debs"
- INSTALL_DIR='/usr/local/hestia'
- ARCHIVE_DIR="${BUILD_DIR}/archive"
- # Set command variables
- fork=$1
- branch=$2
- install=$3
- flags=$4
- # Set Version for compiling
- BUILD_VER=$(curl -s https://raw.githubusercontent.com/$fork/hestiacp/$branch/src/deb/hestia/control | grep "Version:" | cut -d' ' -f2)
- BUILD_ARCH='amd64'
- HESTIA_V="${BUILD_VER}_${BUILD_ARCH}"
- NGINX_V=$(curl -s https://raw.githubusercontent.com/$fork/hestiacp/$branch/src/deb/nginx/control |grep "Version:" |cut -d' ' -f2)
- OPENSSL_V='1.1.1g'
- PCRE_V='8.43'
- ZLIB_V='1.2.11'
- PHP_V=$(curl -s https://raw.githubusercontent.com/$fork/hestiacp/$branch/src/deb/php/control |grep "Version:" |cut -d' ' -f2)
- # Create build directories
- rm -rf $BUILD_DIR
- mkdir -p $DEB_DIR
- mkdir -p $ARCHIVE_DIR
- # Set package dependencies for compiling
- SOFTWARE='build-essential libxml2-dev libz-dev libcurl4-gnutls-dev unzip openssl libssl-dev pkg-config setpriv'
- # Define a timestamp function
- timestamp() {
- date +%s
- }
- # Set install flags
- if [ ! -z "$1" ]; then
- fork_check=$(curl -s --head -w %{http_code} https://raw.githubusercontent.com/$fork/hestiacp/release/src/deb/hestia/control -o /dev/null)
- if [ $fork_check -ne "200" ]; then
- echo "ERROR: invalid repository name specified."
- exit 1
- else
- echo "[!] Download code from GitHub repository: $fork"
- fork="$1"
- fi
- else
- fork="hestiacp"
- fi
- if [ ! -z "$2" ]; then
- branch_check=$(curl -s --head -w %{http_code} https://raw.githubusercontent.com/hestiacp/hestiacp/$branch/src/deb/hestia/control -o /dev/null)
- if [ $branch_check -ne "200" ]; then
- echo "ERROR: invalid branch name specified."
- exit 1
- else
- /usr/local/hestia/bin/v-change-sys-config-value 'RELEASE_BRANCH' "$branch"
- echo "[!] Changed system release branch to: $branch."
- fi
- else
- source /usr/local/hestia/conf/hestia.conf
- branch=$RELEASE_BRANCH
- fi
- if [ -z "$branch" ]; then
- echo "ERROR: No branch detected."
- exit
- fi
- # Install needed software
- echo "[*] Updating APT package cache..."
- apt-get -qq update > /dev/null 2>&1
- echo "[*] Checking for missing dependencies and installing required libraries..."
- apt-get -qq install -y $SOFTWARE > /dev/null 2>&1
- # Fix for Debian PHP Envroiment
- ln -s /usr/include/x86_64-linux-gnu/curl /usr/local/include/curl > /dev/null 2>&1
- # Get system cpu cores
- NUM_CPUS=$(grep "^cpu cores" /proc/cpuinfo | uniq | awk '{print $4}')
- # Check for existence of flags argument and set packages to build
- if [ ! -z "$flags" ]; then
- if [ "$flags" = "all" ]; then
- HESTIA_B='true'
- NGINX_B='true'
- PHP_B='true'
- fi
- else
- HESTIA_B='true'
- fi
- # Set git repository raw path
- GIT_REP='https://raw.githubusercontent.com/'$fork'/hestiacp/'$branch'/src/deb'
- # Generate Links for sourcecode
- HESTIA_ARCHIVE_LINK='https://github.com/'$fork'/hestiacp/archive/'$branch'.tar.gz'
- NGINX='https://nginx.org/download/nginx-'$NGINX_V'.tar.gz'
- OPENSSL='https://www.openssl.org/source/openssl-'$OPENSSL_V'.tar.gz'
- PCRE='https://ftp.pcre.org/pub/pcre/pcre-'$PCRE_V'.tar.gz'
- ZLIB='https://www.zlib.net/zlib-'$ZLIB_V'.tar.gz'
- PHP='http://de2.php.net/distributions/php-'$PHP_V'.tar.gz'
- # Forward slashes in branchname are replaced with dashes to match foldername in github archive.
- branch=$(echo "$branch" |sed 's/\//-/g');
- #################################################################################
- #
- # Building hestia-nginx
- #
- #################################################################################
- if [ "$NGINX_B" = true ] ; then
- echo "[*] Building Package: hestia-nginx (backend web server)..."
- # Change to build directory
- cd $BUILD_DIR
- # Check if target directory exist
- if [ -d $BUILD_DIR/hestia-nginx_$NGINX_V ]; then
- #mv $BUILD_DIR/hestia-nginx_$NGINX_V $BUILD_DIR/hestia-nginx_$NGINX_V-$(timestamp)
- rm -r $BUILD_DIR/hestia-nginx_$NGINX_V
- fi
- # Create directory
- mkdir $BUILD_DIR/hestia-nginx_$NGINX_V
- # Download and unpack source files
- download_file $NGINX | tar xz
- download_file $OPENSSL | tar xz
- download_file $PCRE | tar xz
- download_file $ZLIB | tar xz
- # Change to nginx directory
- cd nginx-$NGINX_V
- # configure nginx
- ./configure --prefix=/usr/local/hestia/nginx \
- --with-http_ssl_module \
- --with-openssl=../openssl-$OPENSSL_V \
- --with-openssl-opt=enable-ec_nistp_64_gcc_128 \
- --with-openssl-opt=no-nextprotoneg \
- --with-openssl-opt=no-weak-ssl-ciphers \
- --with-openssl-opt=no-ssl3 \
- --with-pcre=../pcre-$PCRE_V \
- --with-pcre-jit \
- --with-zlib=../zlib-$ZLIB_V
- # Check install directory and remove if exists
- if [ -d "$BUILD_DIR$INSTALL_DIR" ]; then
- rm -r "$BUILD_DIR$INSTALL_DIR"
- fi
- # Create the files and install them
- make -j $NUM_CPUS && make DESTDIR=$BUILD_DIR install
- # Cleare up unused files
- cd $BUILD_DIR
- rm -r nginx-$NGINX_V openssl-$OPENSSL_V pcre-$PCRE_V zlib-$ZLIB_V
- # Prepare Deb Package Folder Structure
- cd hestia-nginx_$NGINX_V/
- mkdir -p usr/local/hestia etc/init.d DEBIAN
- # Download control, postinst and postrm files
- cd DEBIAN
- download_file $GIT_REP/nginx/control
- download_file $GIT_REP/nginx/copyright
- download_file $GIT_REP/nginx/postinst
- download_file $GIT_REP/nginx/postrm
- # Set permission
- chmod +x postinst postrm
- # Move nginx directory
- cd ..
- mv $BUILD_DIR/usr/local/hestia/nginx usr/local/hestia/
- # Get Service File
- cd etc/init.d
- download_file $GIT_REP/nginx/hestia
- chmod +x hestia
- # Get nginx.conf
- cd ../../
- rm usr/local/hestia/nginx/conf/nginx.conf
- download_file $GIT_REP/nginx/nginx.conf -O usr/local/hestia/nginx/conf/nginx.conf
- # copy binary
- cp usr/local/hestia/nginx/sbin/nginx usr/local/hestia/nginx/sbin/hestia-nginx
- # change permission and build the package
- cd $BUILD_DIR
- chown -R root:root hestia-nginx_$NGINX_V
- dpkg-deb --build hestia-nginx_$NGINX_V
- mv *.deb $DEB_DIR
- # clear up the source folder
- rm -r hestia-nginx_$NGINX_V
- fi
- #################################################################################
- #
- # Building hestia-php
- #
- #################################################################################
- if [ "$PHP_B" = true ] ; then
- echo "[*] Building Package: hestia-php (backend engine)..."
- # Change to build directory
- cd $BUILD_DIR
- # Check if target directory exist
- if [ -d $BUILD_DIR/hestia-php_$PHP_V ]; then
- #mv $BUILD_DIR/hestia-php_$PHP_V $BUILD_DIR/hestia-php_$PHP_V-$(timestamp)
- rm -r $BUILD_DIR/hestia-php_$PHP_V
- fi
- # Create directory
- mkdir ${BUILD_DIR}/hestia-php_$PHP_V
- # Download and unpack source files
- download_file $PHP | tar xz
- # Change to php directory
- cd php-$PHP_V
- # Configure PHP
- ./configure --prefix=/usr/local/hestia/php \
- --enable-fpm \
- --with-fpm-user=admin \
- --with-fpm-group=admin \
- --with-libdir=lib/x86_64-linux-gnu \
- --with-mysqli \
- --with-curl \
- --enable-mbstring
- # Create the files and install them
- make -j $NUM_CPUS && make INSTALL_ROOT=$BUILD_DIR install
- # Cleare up unused files
- cd $BUILD_DIR
- rm -r php-$PHP_V
- # Prepare Deb Package Folder Structure
- cd hestia-php_$PHP_V/
- mkdir -p usr/local/hestia DEBIAN
- # Download control, postinst and postrm files
- cd DEBIAN
- download_file $GIT_REP/php/control
- download_file $GIT_REP/php/copyright
- # Move php directory
- cd ..
- mv ${BUILD_DIR}/usr/local/hestia/php usr/local/hestia/
- # Get php-fpm.conf
- download_file $GIT_REP/php/php-fpm.conf -O usr/local/hestia/php/etc/php-fpm.conf
- # Get php.ini
- download_file $GIT_REP/php/php.ini -O usr/local/hestia/php/lib/php.ini
- # copy binary
- cp usr/local/hestia/php/sbin/php-fpm usr/local/hestia/php/sbin/hestia-php
- # change permission and build the package
- cd $BUILD_DIR
- chown -R root:root hestia-php_$PHP_V
- dpkg-deb --build hestia-php_$PHP_V
- mv *.deb $DEB_DIR
- # clear up the source folder
- rm -r hestia-php_$PHP_V
- fi
- #################################################################################
- #
- # Building hestia
- #
- #################################################################################
- if [ "$HESTIA_B" = true ] ; then
- echo "[*] Building Package: hestia (Control Panel)..."
- # Change to build directory
- cd $BUILD_DIR
- # Check if target directory exist
- if [ -d $BUILD_DIR/hestia_$HESTIA_V ]; then
- #mv $BUILD_DIR/hestia_$HESTIA_V $BUILD_DIR/hestia_$HESTIA_V-$(timestamp)
- rm -r $BUILD_DIR/hestia_$HESTIA_V
- fi
- # Create directory
- mkdir $BUILD_DIR/hestia_$HESTIA_V
- # Download and unpack source files
- download_file $HESTIA_ARCHIVE_LINK '-' 'fresh' | tar xz
- # Prepare Deb Package Folder Structure
- cd hestia_$HESTIA_V/
- mkdir -p usr/local/hestia DEBIAN
- # Download control, postinst and postrm files
- cd DEBIAN
- download_file $GIT_REP/hestia/control
- download_file $GIT_REP/hestia/copyright
- download_file $GIT_REP/hestia/postinst
- # Set permission
- chmod +x postinst
- # Move needed directories
- cd $BUILD_DIR/hestiacp-$branch
- mv bin func install web ../hestia_$HESTIA_V/usr/local/hestia/
- # Set permission
- cd ../hestia_$HESTIA_V/usr/local/hestia/bin
- chmod +x *
- # change permission and build the package
- cd $BUILD_DIR
- chown -R root:root hestia_$HESTIA_V
- dpkg-deb --build hestia_$HESTIA_V
- mv *.deb $DEB_DIR
- # clear up the source folder
- rm -r hestia_$HESTIA_V
- rm -r hestiacp-$branch
- fi
- #################################################################################
- #
- # Install Packages
- #
- #################################################################################
- # Define package installation functions
- warning_message() {
- echo ""
- echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
- echo "WARNING - Development builds should not be installed on"
- echo "systems with live production data without understanding"
- echo "the potential risks that are involved!"
- echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
- echo ""
- }
- install_build() {
- echo "Installing packages..."
- for i in $DEB_DIR/*.deb; do
- # Install all available packages
- dpkg -i $i
- done
- # Remove temporary files
- rm -rf $BUILD_DIR
- }
- # Define installation routine
- if [ "$install" = "install" ] || [ "$install" = "yes" ]; then
- install_build
- else
- warning_message
- read -p "Do you wish to proceed with the installation? [y/n] " answer
- if [ "$answer" = 'y' ] || [ "$answer" = 'Y' ]; then
- install_build
- unset $answer
- else
- echo "Installation of development build aborted."
- echo "Removing temporary files..."
- rm -rf $BUILD_DIR
- unset $answer
- echo ""
- fi
- fi
|