You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
390 lines
12 KiB
390 lines
12 KiB
#!/bin/bash
|
|
# info: Install update from Git repository
|
|
# options: REPOSITORY BRANCH INSTALL
|
|
#
|
|
# example: v-update-sys-hestia-git hestiacp staging/beta install
|
|
# # Will download from the hestiacp repository
|
|
# # Pulls code from staging/beta branch
|
|
# # install: installs package immediately
|
|
# # install-auto: installs package and schedules automatic updates from Git
|
|
#
|
|
# Downloads and compiles/installs packages from GitHub repositories
|
|
|
|
#----------------------------------------------------------#
|
|
# Variables & Functions #
|
|
#----------------------------------------------------------#
|
|
|
|
# shellcheck source=/etc/hestiacp/hestia.conf
|
|
source /etc/hestiacp/hestia.conf
|
|
# shellcheck source=/usr/local/hestia/func/main.sh
|
|
source $HESTIA/func/main.sh
|
|
# load config file
|
|
source_conf "$HESTIA/conf/hestia.conf"
|
|
# define NodeJS version for download (required for building JS/CSS)
|
|
nodejs_ver="20"
|
|
|
|
# Perform verification if read-only mode is enabled
|
|
check_hestia_demo_mode
|
|
|
|
if [ -f /etc/redhat-release ]; then
|
|
exit 0
|
|
fi
|
|
|
|
# Detect and install NodeJS if necessary
|
|
if [ -z $(which "node") ]; then
|
|
read -p "NodeJS not found. Install now to proceed? [Y/n] " answer
|
|
if [ "$answer" = 'y' ] || [ "$answer" = 'Y' ]; then
|
|
curl -fsSL "https://deb.nodesource.com/setup_$nodejs_ver.x" | bash - &&\
|
|
sudo apt-get install -y nodejs
|
|
else
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# Define download function
|
|
download_file() {
|
|
local url=$1
|
|
local destination=$2
|
|
local force=$3
|
|
|
|
# Default destination is the current 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
|
|
echo >&2 "[!] 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
|
|
echo >&2 "[!] Archive $ARCHIVE_DIR/$filename is corrupted, redownloading"
|
|
rm -f $ARCHIVE_DIR/$filename
|
|
fi
|
|
fi
|
|
|
|
if [ ! -f "$ARCHIVE_DIR/$filename" ]; then
|
|
[ "$HESTIA_DEBUG" ] && echo >&2 DEBUG: wget $url -q $dstopt --show-progress --progress=bar:force --limit-rate=3m
|
|
wget $url -q $dstopt --show-progress --progress=bar:force --limit-rate=3m
|
|
if [ $? -ne 0 ]; then
|
|
echo >&2 "[!] Archive $ARCHIVE_DIR/$filename is corrupted and exit script"
|
|
rm -f $ARCHIVE_DIR/$filename
|
|
exit 1
|
|
fi
|
|
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
|
|
}
|
|
|
|
get_branch_file() {
|
|
local filename=$1
|
|
local destination=$2
|
|
[ "$HESTIA_DEBUG" ] && echo >&2 DEBUG: Get branch file "$filename" to "$destination"
|
|
if [ "$use_src_folder" == 'true' ]; then
|
|
if [ -z "$destination" ]; then
|
|
[ "$HESTIA_DEBUG" ] && echo >&2 DEBUG: cp -f "$SRC_DIR/$filename" ./
|
|
cp -f "$SRC_DIR/$filename" ./
|
|
else
|
|
[ "$HESTIA_DEBUG" ] && echo >&2 DEBUG: cp -f "$SRC_DIR/$filename" "$destination"
|
|
cp -f "$SRC_DIR/$filename" "$destination"
|
|
fi
|
|
else
|
|
download_file "https://raw.githubusercontent.com/$REPO/$branch/$filename" "$destination" $3
|
|
fi
|
|
}
|
|
|
|
# Set compiling directory
|
|
BUILD_DIR='/tmp/hestiacp-src'
|
|
INSTALL_DIR='/tmp/hestia-src'
|
|
SRC_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
ARCHIVE_DIR="/tmp/hestia-src/archive/"
|
|
architecture="$(arch)"
|
|
if [ $architecture == 'aarch64' ]; then
|
|
BUILD_ARCH='arm64'
|
|
else
|
|
BUILD_ARCH='amd64'
|
|
fi
|
|
RPM_DIR="$BUILD_DIR/rpm/"
|
|
DEB_DIR="$BUILD_DIR/deb/"
|
|
if [ -f '/etc/redhat-release' ]; then
|
|
BUILD_RPM=true
|
|
BUILD_DEB=false
|
|
OSTYPE='rhel'
|
|
else
|
|
BUILD_RPM=false
|
|
BUILD_DEB=true
|
|
OSTYPE='debian'
|
|
fi
|
|
|
|
# Set command variables
|
|
fork=$1
|
|
branch=$2
|
|
install=$3
|
|
|
|
# Allow the use of username:branch instead of username branch
|
|
# Both fork and branch names can't contain a : anyway
|
|
if [ -z "$branch" ]; then
|
|
branch=$(echo "$fork" | cut -d ":" -f2)
|
|
fork=$(echo "$fork" | cut -d ":" -f1)
|
|
fi
|
|
|
|
# Set Version for compiling
|
|
BUILD_VER=$(curl -s https://raw.githubusercontent.com/$fork/hestiacp/$branch/src/deb/hestia/control | grep "Version:" | cut -d' ' -f2)
|
|
HESTIA_V="${BUILD_VER}_${BUILD_ARCH}"
|
|
|
|
# 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
|
|
}
|
|
|
|
# Warning prompt to be used if auto-install flag is not specified
|
|
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 ""
|
|
}
|
|
|
|
# Build installation
|
|
install_build() {
|
|
# Install all available packages
|
|
echo "Installing packages..."
|
|
if [ "$OSTYPE" = 'rhel' ]; then
|
|
for i in $RPM_DIR/*.rpm; do
|
|
dnf -y install $i
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
done
|
|
else
|
|
for i in $DEB_DIR/*.deb; do
|
|
dpkg -i $i
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
done
|
|
fi
|
|
unset $answer
|
|
# Remove temporary files
|
|
rm -rf $BUILD_DIR
|
|
}
|
|
|
|
# Set install flags
|
|
if [ -n "$fork" ]; then
|
|
fork_check=$(curl -s --head -w %{http_code} https://raw.githubusercontent.com/$fork/hestiacp/main/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"
|
|
fi
|
|
else
|
|
fork="hestiacp"
|
|
fi
|
|
|
|
if [ -n "$branch" ]; then
|
|
echo https://raw.githubusercontent.com/$fork/hestiacp/$branch/src/deb/hestia/control
|
|
branch_check=$(curl -s --head -w %{http_code} https://raw.githubusercontent.com/$fork/hestiacp/$branch/src/deb/hestia/control -o /dev/null)
|
|
if [ $branch_check -ne "200" ]; then
|
|
echo "ERROR: invalid branch name specified."
|
|
exit 1
|
|
else
|
|
$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
|
|
branch_check=$(curl -s --head -w %{http_code} https://raw.githubusercontent.com/$fork/hestiacp/$branch/src/deb/hestia/control -o /dev/null)
|
|
if [ "$branch_check" -ne "200" ]; then
|
|
echo "ERROR: invalid branch name specified."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$branch" ]; then
|
|
echo "ERROR: No branch detected."
|
|
exit
|
|
fi
|
|
REPO="$fork/hestiacp"
|
|
# Forward slashes in branchname are replaced with dashes to match foldername in github archive.
|
|
branch_dash=$(echo "$branch" | sed 's/\//-/g')
|
|
|
|
#----------------------------------------------------------#
|
|
# Action #
|
|
#----------------------------------------------------------#
|
|
|
|
# Install needed software
|
|
if [ "$OSTYPE" = 'rhel' ]; then
|
|
# Set package dependencies for compiling
|
|
SOFTWARE=' rpm-build wget tar git curl unzip'
|
|
|
|
echo "Updating system DNF repositories..."
|
|
dnf install -y -q 'dnf-command(config-manager)'
|
|
dnf install -y -q dnf-plugins-core
|
|
dnf config-manager --set-enabled powertools > /dev/null 2>&1
|
|
dnf config-manager --set-enabled PowerTools > /dev/null 2>&1
|
|
dnf upgrade -y -q
|
|
echo "Installing dependencies for compilation..."
|
|
dnf install -y -q $SOFTWARE
|
|
else
|
|
# Set package dependencies for compiling
|
|
SOFTWARE='build-essential wget tar git curl unzip'
|
|
|
|
echo "Updating system APT repositories..."
|
|
apt-get -qq update > /dev/null 2>&1
|
|
echo "Installing dependencies for compilation..."
|
|
apt-get -qq install -y $SOFTWARE > /dev/null 2>&1
|
|
|
|
# Fix for Debian PHP Envroiment
|
|
if [ $BUILD_ARCH == "amd64" ]; then
|
|
if [ ! -L /usr/local/include/curl ]; then
|
|
ln -s /usr/include/x86_64-linux-gnu/curl /usr/local/include/curl
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Set git repository raw path
|
|
GIT_REP='https://raw.githubusercontent.com/'$REPO'/'$branch'/src/deb'
|
|
|
|
# Generate Links for sourcecode
|
|
HESTIA_ARCHIVE_LINK='https://github.com/'$REPO'/archive/'$branch'.tar.gz'
|
|
echo $HESTIA_ARCHIVE_LINK
|
|
|
|
echo "Building Hestia Control Panel package..."
|
|
|
|
BUILD_DIR_HESTIA=$BUILD_DIR/hestia_$HESTIA_V
|
|
|
|
# Change to build directory
|
|
cd $BUILD_DIR
|
|
|
|
if [ "$KEEPBUILD" != 'true' ] || [ ! -d "$BUILD_DIR_HESTIA" ]; then
|
|
# Check if target directory exist
|
|
if [ -d $BUILD_DIR_HESTIA ]; then
|
|
rm -r $BUILD_DIR_HESTIA
|
|
fi
|
|
|
|
# Create directory
|
|
mkdir -p $BUILD_DIR_HESTIA
|
|
fi
|
|
|
|
cd $BUILD_DIR
|
|
rm -rf $BUILD_DIR/hestiacp-$branch_dash
|
|
# Download and unpack source files
|
|
if [ "$use_src_folder" == 'true' ]; then
|
|
[ "$HESTIA_DEBUG" ] && echo DEBUG: cp -rf "$SRC_DIR/" $BUILD_DIR/hestiacp-$branch_dash
|
|
cp -rf "$SRC_DIR/" $BUILD_DIR/hestiacp-$branch_dash
|
|
elif [ -d $SRC_DIR ]; then
|
|
download_file $HESTIA_ARCHIVE_LINK '-' 'fresh' | tar xz
|
|
fi
|
|
|
|
mkdir -p $BUILD_DIR_HESTIA/usr/local/hestia
|
|
|
|
# Move needed directories
|
|
cd $BUILD_DIR/hestiacp-$branch_dash
|
|
|
|
npm install
|
|
npm run build
|
|
|
|
cp -rf bin func install web $BUILD_DIR_HESTIA/usr/local/hestia/
|
|
|
|
# Set permissions
|
|
find $BUILD_DIR_HESTIA/usr/local/hestia/ -type f -exec chmod -x {} \;
|
|
|
|
# Allow send email via /usr/local/hestia/web/inc/mail-wrapper.php via cli
|
|
chmod +x $BUILD_DIR_HESTIA/usr/local/hestia/web/inc/mail-wrapper.php
|
|
# Allow the executable to be executed
|
|
chmod +x $BUILD_DIR_HESTIA/usr/local/hestia/bin/*
|
|
find $BUILD_DIR_HESTIA/usr/local/hestia/install/ \( -name '*.sh' \) -exec chmod +x {} \;
|
|
chmod -x $BUILD_DIR_HESTIA/usr/local/hestia/install/*.sh
|
|
chown -R root:root $BUILD_DIR_HESTIA
|
|
|
|
if [ "$BUILD_DEB" = true ]; then
|
|
# Get Debian package files
|
|
mkdir -p $BUILD_DIR_HESTIA/DEBIAN
|
|
get_branch_file 'src/deb/hestia/control' "$BUILD_DIR_HESTIA/DEBIAN/control"
|
|
if [ "$BUILD_ARCH" != "amd64" ]; then
|
|
sed -i "s/amd64/${BUILD_ARCH}/g" "$BUILD_DIR_HESTIA/DEBIAN/control"
|
|
fi
|
|
get_branch_file 'src/deb/hestia/copyright' "$BUILD_DIR_HESTIA/DEBIAN/copyright"
|
|
get_branch_file 'src/deb/hestia/preinst' "$BUILD_DIR_HESTIA/DEBIAN/preinst"
|
|
get_branch_file 'src/deb/hestia/postinst' "$BUILD_DIR_HESTIA/DEBIAN/postinst"
|
|
chmod +x $BUILD_DIR_HESTIA/DEBIAN/postinst
|
|
chmod +x $BUILD_DIR_HESTIA/DEBIAN/preinst
|
|
|
|
echo Building Hestia DEB
|
|
dpkg-deb -Zxz --build $BUILD_DIR_HESTIA $DEB_DIR
|
|
fi
|
|
|
|
if [ "$BUILD_RPM" = true ]; then
|
|
# Get RHEL package files
|
|
get_branch_file 'src/rpm/hestia/hestia.spec' "${BUILD_DIR_HESTIA}/hestia.spec"
|
|
sed -i "s/%HESTIA-VERSION%/${HESTIA_V}/g" "${BUILD_DIR_HESTIA}/hestia.spec"
|
|
get_branch_file 'src/rpm/hestia/hestia.service' "${BUILD_DIR_HESTIA}/hestia.service"
|
|
|
|
# Build RPM package
|
|
mkdir -p $BUILD_DIR/rpmbuild
|
|
echo Building Hestia RPM
|
|
rpmbuild -bb --define "sourcedir $BUILD_DIR_HESTIA" --buildroot=$BUILD_DIR/rpmbuild/ ${BUILD_DIR_HESTIA}/hestia.spec > ${BUILD_DIR_HESTIA}.rpm.log
|
|
cp ~/rpmbuild/RPMS/$(arch)/hestia-*.rpm $RPM_DIR
|
|
rm ~/rpmbuild/RPMS/$(arch)/hestia-*.rpm
|
|
rm -rf $BUILD_DIR/rpmbuild
|
|
fi
|
|
|
|
# clear up the source folder
|
|
if [ "$KEEPBUILD" != 'true' ]; then
|
|
rm -r $BUILD_DIR_HESTIA
|
|
rm -rf hestiacp-$branch_dash
|
|
fi
|
|
cd $BUILD_DIR/hestiacp-$branch_dash
|
|
|
|
# Installation steps
|
|
if [ "$install" = "install" ] || [ "$install" = "yes" ] || [ "$install" = "install-auto" ]; then
|
|
install_build
|
|
if [ "$install" = "install-auto" ]; then
|
|
$BIN/v-add-cron-hestia-autoupdate git
|
|
fi
|
|
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
|