Add error handling to package and archive operations
Some checks failed
Bump build.func Revision / bump-revision (push) Has been cancelled
Some checks failed
Bump build.func Revision / bump-revision (push) Has been cancelled
This commit adds error checking and user-friendly error messages to various package installation, archive extraction, and build steps throughout the script. It ensures that failures in commands such as apt, curl, tar, unzip, make, and others are detected, appropriate cleanup is performed, and informative error messages are displayed, improving robustness and debuggability.
This commit is contained in:
parent
03c9654140
commit
6a74c6d51c
266
misc/tools.func
266
misc/tools.func
@ -616,7 +616,10 @@ setup_deb822_repo() {
|
||||
mkdir -p /etc/apt/keyrings
|
||||
|
||||
# Download GPG key (with --yes to avoid interactive prompts)
|
||||
curl -fsSL "$gpg_url" | gpg --dearmor --yes -o "/etc/apt/keyrings/${name}.gpg"
|
||||
curl -fsSL "$gpg_url" | gpg --dearmor --yes -o "/etc/apt/keyrings/${name}.gpg" || {
|
||||
msg_error "Failed to download or import GPG key for ${name}"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Create deb822 sources file
|
||||
cat <<EOF >/etc/apt/sources.list.d/${name}.sources
|
||||
@ -936,14 +939,23 @@ create_self_signed_cert() {
|
||||
return 0
|
||||
fi
|
||||
|
||||
$STD apt update
|
||||
$STD apt install -y openssl
|
||||
$STD apt update || {
|
||||
msg_error "Failed to update package list"
|
||||
return 1
|
||||
}
|
||||
$STD apt install -y openssl || {
|
||||
msg_error "Failed to install OpenSSL"
|
||||
return 1
|
||||
}
|
||||
|
||||
mkdir -p "$CERT_DIR"
|
||||
$STD openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 \
|
||||
-subj "/C=US/ST=State/L=City/O=Organization/CN=${APP_NAME}" \
|
||||
-keyout "$CERT_KEY" \
|
||||
-out "$CERT_CRT"
|
||||
-out "$CERT_CRT" || {
|
||||
msg_error "Failed to create self-signed certificate"
|
||||
return 1
|
||||
}
|
||||
|
||||
chmod 600 "$CERT_KEY"
|
||||
chmod 644 "$CERT_CRT"
|
||||
@ -1129,7 +1141,11 @@ function fetch_and_deploy_gh_release() {
|
||||
rm -rf "${target:?}/"*
|
||||
fi
|
||||
|
||||
tar -xzf "$tmpdir/$filename" -C "$tmpdir"
|
||||
tar -xzf "$tmpdir/$filename" -C "$tmpdir" || {
|
||||
msg_error "Failed to extract tarball"
|
||||
rm -rf "$tmpdir"
|
||||
return 1
|
||||
}
|
||||
local unpack_dir
|
||||
unpack_dir=$(find "$tmpdir" -mindepth 1 -maxdepth 1 -type d | head -n1)
|
||||
|
||||
@ -1241,9 +1257,17 @@ function fetch_and_deploy_gh_release() {
|
||||
|
||||
if [[ "$filename" == *.zip ]]; then
|
||||
ensure_dependencies unzip
|
||||
unzip -q "$tmpdir/$filename" -d "$unpack_tmp"
|
||||
unzip -q "$tmpdir/$filename" -d "$unpack_tmp" || {
|
||||
msg_error "Failed to extract ZIP archive"
|
||||
rm -rf "$tmpdir" "$unpack_tmp"
|
||||
return 1
|
||||
}
|
||||
elif [[ "$filename" == *.tar.* || "$filename" == *.tgz ]]; then
|
||||
tar -xf "$tmpdir/$filename" -C "$unpack_tmp"
|
||||
tar -xf "$tmpdir/$filename" -C "$unpack_tmp" || {
|
||||
msg_error "Failed to extract TAR archive"
|
||||
rm -rf "$tmpdir" "$unpack_tmp"
|
||||
return 1
|
||||
}
|
||||
else
|
||||
msg_error "Unsupported archive format: $filename"
|
||||
rm -rf "$tmpdir" "$unpack_tmp"
|
||||
@ -1411,8 +1435,14 @@ function setup_adminer() {
|
||||
else
|
||||
msg_info "Setup Adminer (Debian/Ubuntu)"
|
||||
ensure_dependencies adminer
|
||||
$STD a2enconf adminer
|
||||
$STD systemctl reload apache2
|
||||
$STD a2enconf adminer || {
|
||||
msg_error "Failed to enable Adminer Apache config"
|
||||
return 1
|
||||
}
|
||||
$STD systemctl reload apache2 || {
|
||||
msg_error "Failed to reload Apache"
|
||||
return 1
|
||||
}
|
||||
local VERSION
|
||||
VERSION=$(dpkg -s adminer 2>/dev/null | grep '^Version:' | awk '{print $2}')
|
||||
cache_installed_version "adminer" "${VERSION:-unknown}"
|
||||
@ -1448,7 +1478,11 @@ function setup_composer() {
|
||||
return 1
|
||||
}
|
||||
|
||||
$STD php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
|
||||
$STD php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer || {
|
||||
msg_error "Failed to install Composer"
|
||||
rm -f /tmp/composer-setup.php
|
||||
return 1
|
||||
}
|
||||
rm -f /tmp/composer-setup.php
|
||||
|
||||
if [[ ! -x "$COMPOSER_BIN" ]]; then
|
||||
@ -1501,7 +1535,11 @@ function setup_ffmpeg() {
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
tar -xf "$TMP_DIR/ffmpeg.tar.xz" -C "$TMP_DIR"
|
||||
tar -xf "$TMP_DIR/ffmpeg.tar.xz" -C "$TMP_DIR" || {
|
||||
msg_error "Failed to extract FFmpeg binary"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
local EXTRACTED_DIR
|
||||
EXTRACTED_DIR=$(find "$TMP_DIR" -maxdepth 1 -type d -name "ffmpeg-*")
|
||||
cp "$EXTRACTED_DIR/ffmpeg" "$BIN_PATH"
|
||||
@ -1600,9 +1638,21 @@ function setup_ffmpeg() {
|
||||
return 1
|
||||
fi
|
||||
|
||||
$STD ./configure "${args[@]}"
|
||||
$STD make -j"$(nproc)"
|
||||
$STD make install
|
||||
$STD ./configure "${args[@]}" || {
|
||||
msg_error "FFmpeg configure failed"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
$STD make -j"$(nproc)" || {
|
||||
msg_error "FFmpeg compilation failed"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
$STD make install || {
|
||||
msg_error "FFmpeg installation failed"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
echo "/usr/local/lib" >/etc/ld.so.conf.d/ffmpeg.conf
|
||||
$STD ldconfig
|
||||
|
||||
@ -1688,7 +1738,11 @@ function setup_go() {
|
||||
return 1
|
||||
}
|
||||
|
||||
$STD tar -C /usr/local -xzf "$TMP_TAR"
|
||||
$STD tar -C /usr/local -xzf "$TMP_TAR" || {
|
||||
msg_error "Failed to extract Go tarball"
|
||||
rm -f "$TMP_TAR"
|
||||
return 1
|
||||
}
|
||||
ln -sf /usr/local/go/bin/go /usr/local/bin/go
|
||||
ln -sf /usr/local/go/bin/gofmt /usr/local/bin/gofmt
|
||||
rm -f "$TMP_TAR"
|
||||
@ -1759,9 +1813,21 @@ function setup_gs() {
|
||||
|
||||
ensure_dependencies build-essential libpng-dev zlib1g-dev
|
||||
|
||||
$STD ./configure
|
||||
$STD make -j"$(nproc)"
|
||||
$STD make install
|
||||
$STD ./configure || {
|
||||
msg_error "Ghostscript configure failed"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
$STD make -j"$(nproc)" || {
|
||||
msg_error "Ghostscript compilation failed"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
$STD make install || {
|
||||
msg_error "Ghostscript installation failed"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
|
||||
hash -r
|
||||
if [[ ! -x "$(command -v gs)" ]]; then
|
||||
@ -1791,8 +1857,14 @@ function setup_hwaccel() {
|
||||
msg_info "Setup Hardware Acceleration"
|
||||
|
||||
if ! command -v lspci &>/dev/null; then
|
||||
$STD apt -y update
|
||||
$STD apt -y install pciutils
|
||||
$STD apt -y update || {
|
||||
msg_error "Failed to update package list"
|
||||
return 1
|
||||
}
|
||||
$STD apt -y install pciutils || {
|
||||
msg_error "Failed to install pciutils"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
|
||||
# Detect GPU vendor (Intel, AMD, NVIDIA)
|
||||
@ -1931,9 +2003,21 @@ function setup_imagemagick() {
|
||||
return 1
|
||||
}
|
||||
|
||||
$STD ./configure --disable-static
|
||||
$STD make -j"$(nproc)"
|
||||
$STD make install
|
||||
$STD ./configure --disable-static || {
|
||||
msg_error "ImageMagick configure failed"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
$STD make -j"$(nproc)" || {
|
||||
msg_error "ImageMagick compilation failed"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
$STD make install || {
|
||||
msg_error "ImageMagick installation failed"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
$STD ldconfig /usr/local/lib
|
||||
|
||||
if [[ ! -x "$BINARY_PATH" ]]; then
|
||||
@ -2010,7 +2094,10 @@ function setup_java() {
|
||||
$STD apt purge -y "temurin-${INSTALLED_VERSION}-jdk"
|
||||
fi
|
||||
|
||||
$STD apt install -y "$DESIRED_PACKAGE"
|
||||
$STD apt install -y "$DESIRED_PACKAGE" || {
|
||||
msg_error "Failed to install Temurin JDK $JAVA_VERSION"
|
||||
return 1
|
||||
}
|
||||
cache_installed_version "temurin-jdk" "$JAVA_VERSION"
|
||||
msg_ok "Setup Temurin JDK $JAVA_VERSION"
|
||||
fi
|
||||
@ -2034,8 +2121,14 @@ function setup_local_ip_helper() {
|
||||
|
||||
# Install networkd-dispatcher if not present
|
||||
if ! dpkg -s networkd-dispatcher >/dev/null 2>&1; then
|
||||
$STD apt update
|
||||
$STD apt install -y networkd-dispatcher
|
||||
$STD apt update || {
|
||||
msg_error "Failed to update package list"
|
||||
return 1
|
||||
}
|
||||
$STD apt install -y networkd-dispatcher || {
|
||||
msg_error "Failed to install networkd-dispatcher"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
|
||||
# Write update_local_ip.sh
|
||||
@ -2143,8 +2236,14 @@ setup_mariadb() {
|
||||
upgrade_package mariadb-server
|
||||
upgrade_package mariadb-client
|
||||
else
|
||||
$STD apt update
|
||||
$STD apt install --only-upgrade -y mariadb-server mariadb-client
|
||||
$STD apt update || {
|
||||
msg_error "Failed to update package list"
|
||||
return 1
|
||||
}
|
||||
$STD apt install --only-upgrade -y mariadb-server mariadb-client || {
|
||||
msg_error "Failed to upgrade MariaDB"
|
||||
return 1
|
||||
}
|
||||
cache_installed_version "mariadb" "$MARIADB_VERSION"
|
||||
fi
|
||||
return 0
|
||||
@ -2197,7 +2296,10 @@ setup_mariadb() {
|
||||
DEBIAN_FRONTEND=noninteractive $STD apt install -y mariadb-server mariadb-client || {
|
||||
cleanup_old_repo_files "mariadb"
|
||||
$STD apt update
|
||||
DEBIAN_FRONTEND=noninteractive $STD apt install -y mariadb-server mariadb-client
|
||||
DEBIAN_FRONTEND=noninteractive $STD apt install -y mariadb-server mariadb-client || {
|
||||
msg_error "Failed to install MariaDB packages"
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
cache_installed_version "mariadb" "$MARIADB_VERSION"
|
||||
@ -2257,8 +2359,14 @@ function setup_mongodb() {
|
||||
if [[ "$CACHED_VERSION" == "$MONGO_VERSION" ]]; then
|
||||
upgrade_package mongodb-org
|
||||
else
|
||||
$STD apt update
|
||||
$STD apt install --only-upgrade -y mongodb-org
|
||||
$STD apt update || {
|
||||
msg_error "Failed to update package list"
|
||||
return 1
|
||||
}
|
||||
$STD apt install --only-upgrade -y mongodb-org || {
|
||||
msg_error "Failed to upgrade MongoDB"
|
||||
return 1
|
||||
}
|
||||
cache_installed_version "mongodb" "$MONGO_VERSION"
|
||||
fi
|
||||
return 0
|
||||
@ -2283,7 +2391,10 @@ function setup_mongodb() {
|
||||
|
||||
# Use standardized repo setup
|
||||
mkdir -p /etc/apt/keyrings
|
||||
curl -fsSL "https://pgp.mongodb.com/server-${MONGO_VERSION}.asc" | gpg --dearmor --yes -o "/etc/apt/keyrings/mongodb-${MONGO_VERSION}.gpg"
|
||||
curl -fsSL "https://pgp.mongodb.com/server-${MONGO_VERSION}.asc" | gpg --dearmor --yes -o "/etc/apt/keyrings/mongodb-${MONGO_VERSION}.gpg" || {
|
||||
msg_error "Failed to download or import MongoDB GPG key"
|
||||
return 1
|
||||
}
|
||||
|
||||
cat <<EOF >/etc/apt/sources.list.d/mongodb-org-${MONGO_VERSION}.sources
|
||||
Types: deb
|
||||
@ -2299,7 +2410,10 @@ EOF
|
||||
return 1
|
||||
}
|
||||
|
||||
$STD apt install -y mongodb-org
|
||||
$STD apt install -y mongodb-org || {
|
||||
msg_error "Failed to install MongoDB packages"
|
||||
return 1
|
||||
}
|
||||
|
||||
mkdir -p /var/lib/mongodb
|
||||
chown -R mongodb:mongodb /var/lib/mongodb
|
||||
@ -2337,8 +2451,14 @@ function setup_mysql() {
|
||||
NEED_INSTALL=true
|
||||
else
|
||||
if apt list --upgradable 2>/dev/null | grep -q '^mysql-server/'; then
|
||||
$STD apt update
|
||||
$STD apt install --only-upgrade -y mysql-server
|
||||
$STD apt update || {
|
||||
msg_error "Failed to update package list"
|
||||
return 1
|
||||
}
|
||||
$STD apt install --only-upgrade -y mysql-server || {
|
||||
msg_error "Failed to upgrade MySQL"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
return
|
||||
fi
|
||||
@ -2383,8 +2503,14 @@ function setup_mysql() {
|
||||
if [[ "$DISTRO_ID" == "debian" ]] && [[ "$DISTRO_CODENAME" =~ ^(trixie|forky|sid)$ ]]; then
|
||||
# Install libaio1t64 if not present
|
||||
if ! dpkg -l libaio1t64 2>/dev/null | grep -q "^ii"; then
|
||||
$STD apt update
|
||||
$STD apt install -y libaio1t64
|
||||
$STD apt update || {
|
||||
msg_error "Failed to update package list"
|
||||
return 1
|
||||
}
|
||||
$STD apt install -y libaio1t64 || {
|
||||
msg_error "Failed to install libaio1t64"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
|
||||
# Create dummy libaio1 package for dependency satisfaction
|
||||
@ -2394,7 +2520,7 @@ function setup_mysql() {
|
||||
|
||||
# Create control file
|
||||
mkdir -p DEBIAN
|
||||
cat > DEBIAN/control <<EOF
|
||||
cat >DEBIAN/control <<EOF
|
||||
Package: libaio1
|
||||
Version: 0.3.113-99~compat
|
||||
Architecture: amd64
|
||||
@ -2643,8 +2769,15 @@ function setup_php() {
|
||||
# Cleanup old repository files
|
||||
cleanup_old_repo_files "php"
|
||||
|
||||
$STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
|
||||
$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb
|
||||
$STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb || {
|
||||
msg_error "Failed to download PHP repository keyring"
|
||||
return 1
|
||||
}
|
||||
$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb || {
|
||||
msg_error "Failed to install PHP repository keyring"
|
||||
rm -f /tmp/debsuryorg-archive-keyring.deb
|
||||
return 1
|
||||
}
|
||||
|
||||
# Use helper function to get fallback suite
|
||||
local SUITE
|
||||
@ -2658,7 +2791,10 @@ Components: main
|
||||
Architectures: amd64 arm64
|
||||
Signed-By: /usr/share/keyrings/deb.sury.org-php.gpg
|
||||
EOF
|
||||
$STD apt update
|
||||
$STD apt update || {
|
||||
msg_error "APT update failed for PHP repository"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
|
||||
# Build module list
|
||||
@ -2676,12 +2812,18 @@ EOF
|
||||
# install apache2 with PHP support if requested
|
||||
if [[ "$PHP_APACHE" == "YES" ]]; then
|
||||
if ! dpkg -l | grep -q "libapache2-mod-php${PHP_VERSION}"; then
|
||||
$STD apt install -y apache2 libapache2-mod-php${PHP_VERSION}
|
||||
$STD apt install -y apache2 libapache2-mod-php${PHP_VERSION} || {
|
||||
msg_error "Failed to install Apache with PHP module"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
fi
|
||||
|
||||
# setup / update PHP modules
|
||||
$STD apt install -y $MODULE_LIST
|
||||
$STD apt install -y $MODULE_LIST || {
|
||||
msg_error "Failed to install PHP packages"
|
||||
return 1
|
||||
}
|
||||
cache_installed_version "php" "$PHP_VERSION"
|
||||
|
||||
# optional stop old PHP-FPM service
|
||||
@ -2956,7 +3098,11 @@ function setup_ruby() {
|
||||
|
||||
mkdir -p "$RBENV_DIR"
|
||||
cp -r "$TMP_DIR/rbenv-${RBENV_RELEASE}/." "$RBENV_DIR/"
|
||||
cd "$RBENV_DIR" && src/configure && $STD make -C src
|
||||
cd "$RBENV_DIR" && src/configure && $STD make -C src || {
|
||||
msg_error "Failed to build rbenv"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
|
||||
local RUBY_BUILD_RELEASE
|
||||
RUBY_BUILD_RELEASE=$(curl -fsSL https://api.github.com/repos/rbenv/ruby-build/releases/latest | jq -r '.tag_name' | sed 's/^v//')
|
||||
@ -2991,14 +3137,22 @@ function setup_ruby() {
|
||||
eval "$("$RBENV_BIN" init - bash)"
|
||||
|
||||
if ! "$RBENV_BIN" versions --bare | grep -qx "$RUBY_VERSION"; then
|
||||
$STD "$RBENV_BIN" install "$RUBY_VERSION"
|
||||
$STD "$RBENV_BIN" install "$RUBY_VERSION" || {
|
||||
msg_error "Failed to install Ruby $RUBY_VERSION"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
|
||||
"$RBENV_BIN" global "$RUBY_VERSION"
|
||||
hash -r
|
||||
|
||||
if [[ "$RUBY_INSTALL_RAILS" == "true" ]]; then
|
||||
$STD gem install rails
|
||||
$STD gem install rails || {
|
||||
msg_error "Failed to install Rails"
|
||||
rm -rf "$TMP_DIR"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
|
||||
rm -rf "$TMP_DIR"
|
||||
@ -3069,8 +3223,14 @@ function setup_clickhouse() {
|
||||
upgrade_package clickhouse-client
|
||||
else
|
||||
msg_info "Setup ClickHouse $CLICKHOUSE_VERSION"
|
||||
$STD apt update
|
||||
$STD apt install --only-upgrade -y clickhouse-server clickhouse-client
|
||||
$STD apt update || {
|
||||
msg_error "Failed to update package list"
|
||||
return 1
|
||||
}
|
||||
$STD apt install --only-upgrade -y clickhouse-server clickhouse-client || {
|
||||
msg_error "Failed to upgrade ClickHouse"
|
||||
return 1
|
||||
}
|
||||
cache_installed_version "clickhouse" "$CLICKHOUSE_VERSION"
|
||||
msg_ok "Setup ClickHouse $CLICKHOUSE_VERSION"
|
||||
fi
|
||||
@ -3173,8 +3333,14 @@ function setup_rust() {
|
||||
msg_ok "Setup Rust $RUST_VERSION"
|
||||
else
|
||||
msg_info "Setup Rust"
|
||||
$STD rustup install "$RUST_TOOLCHAIN"
|
||||
$STD rustup default "$RUST_TOOLCHAIN"
|
||||
$STD rustup install "$RUST_TOOLCHAIN" || {
|
||||
msg_error "Failed to install Rust toolchain"
|
||||
return 1
|
||||
}
|
||||
$STD rustup default "$RUST_TOOLCHAIN" || {
|
||||
msg_error "Failed to set default Rust toolchain"
|
||||
return 1
|
||||
}
|
||||
$STD rustup update "$RUST_TOOLCHAIN"
|
||||
local RUST_VERSION=$(rustc --version 2>/dev/null | awk '{print $2}')
|
||||
cache_installed_version "rust" "$RUST_VERSION"
|
||||
|
Loading…
x
Reference in New Issue
Block a user