feat(install): enhance install-agent.sh with China mirror support

- Add `-c` flag to use GitHub mirror (ghp.ci) for mainland China users
- Implement checksum verification for downloaded files
- Add progress bar for file downloads

This change improves installation reliability and user experience,
especially for users in regions (China mainland etc.) with limited GitHub access.
This commit is contained in:
al1cE
2024-11-19 12:56:35 +09:00
committed by GitHub
parent 4e64d9efad
commit 7b5ac23a4b

View File

@@ -4,22 +4,32 @@ version=0.0.1
# Define default values # Define default values
PORT=45876 PORT=45876
UNINSTALL=false UNINSTALL=false
CHINA_MAINLAND=false
GITHUB_URL="https://github.com"
GITHUB_API_URL="https://api.github.com"
# Read command line options # Read command line options
while getopts "k:p:uh" opt; do while getopts "k:p:uhc" opt; do
case $opt in case $opt in
k) KEY="$OPTARG";; k) KEY="$OPTARG" ;;
p) PORT="$OPTARG";; p) PORT="$OPTARG" ;;
u) UNINSTALL=true;; u) UNINSTALL=true ;;
h) printf "Beszel Agent installation script\n\n" c) CHINA_MAINLAND=true ;;
h)
printf "Beszel Agent installation script\n\n"
printf "Usage: ./install-agent.sh [options]\n\n" printf "Usage: ./install-agent.sh [options]\n\n"
printf "Options: \n" printf "Options: \n"
printf " -k : SSH key (required, or interactive if not provided)\n" printf " -k : SSH key (required, or interactive if not provided)\n"
printf " -p : Port (default: $PORT)\n" printf " -p : Port (default: $PORT)\n"
printf " -u : Uninstall Beszel Agent\n" printf " -u : Uninstall Beszel Agent\n"
printf " -c : Using GitHub mirror sources to resolve network timeout issues in mainland China\n"
printf " -h : Display this help message\n" printf " -h : Display this help message\n"
exit 0;; exit 0
?) echo "Invalid option: -$OPTARG"; exit 1;; ;;
?)
echo "Invalid option: -$OPTARG"
exit 1
;;
esac esac
done done
@@ -64,6 +74,20 @@ if [ "$UNINSTALL" = true ]; then
exit 0 exit 0
fi fi
if [ "$CHINA_MAINLAND" = true ]; then
printf "\nConfirmed to use GitHub mirrors (ghp.ci) for download beszel-agent?\nThis helps to install Agent properly in mainland China. (Y/n): "
read USE_MIRROR
USE_MIRROR=${USE_MIRROR:-Y}
if [ "$USE_MIRROR" = "Y" ] || [ "$USE_MIRROR" = "y" ]; then
GITHUB_URL="https://ghp.ci/https://github.com"
# In China, only github.com is blocked, while api.github.com is not (for now).
# GITHUB_API_URL="https://api.github.com"
echo "Using GitHub Mirror for downloads..."
else
echo "GitHub mirrors will not be used for installation."
fi
fi
# Function to check if a package is installed # Function to check if a package is installed
package_installed() { package_installed() {
command -v "$1" >/dev/null 2>&1 command -v "$1" >/dev/null 2>&1
@@ -71,20 +95,20 @@ package_installed() {
# Check for package manager and install necessary packages if not installed # Check for package manager and install necessary packages if not installed
if package_installed apt-get; then if package_installed apt-get; then
if ! package_installed tar || ! package_installed curl; then if ! package_installed tar || ! package_installed curl || ! package_installed sha256sum; then
apt-get update apt-get update
apt-get install -y tar curl apt-get install -y tar curl coreutils
fi fi
elif package_installed yum; then elif package_installed yum; then
if ! package_installed tar || ! package_installed curl; then if ! package_installed tar || ! package_installed curl || ! package_installed sha256sum; then
yum install -y tar curl yum install -y tar curl coreutils
fi fi
elif package_installed pacman; then elif package_installed pacman; then
if ! package_installed tar || ! package_installed curl; then if ! package_installed tar || ! package_installed curl || ! package_installed sha256sum; then
pacman -Sy --noconfirm tar curl pacman -Sy --noconfirm tar curl coreutils
fi fi
else else
echo "Warning: Please ensure 'tar' and 'curl' are installed." echo "Warning: Please ensure 'tar' and 'curl' and 'sha256sum (coreutils)' are installed."
fi fi
# If no SSH key is provided, ask for the SSH key interactively # If no SSH key is provided, ask for the SSH key interactively
@@ -93,6 +117,16 @@ if [ -z "$KEY" ]; then
read KEY read KEY
fi fi
# Verify checksum
if command -v sha256sum >/dev/null; then
CHECK_CMD="sha256sum"
elif command -v md5 >/dev/null; then
CHECK_CMD="md5 -q"
else
echo "No MD5 checksum utility found"
exit 1
fi
# Create a dedicated user for the service if it doesn't exist # Create a dedicated user for the service if it doesn't exist
if ! id -u beszel > /dev/null 2>&1; then if ! id -u beszel > /dev/null 2>&1; then
echo "Creating a dedicated user for the Beszel Agent service..." echo "Creating a dedicated user for the Beszel Agent service..."
@@ -111,12 +145,52 @@ fi
# Download and install the Beszel Agent # Download and install the Beszel Agent
echo "Downloading and installing the agent..." echo "Downloading and installing the agent..."
curl -sL "https://github.com/henrygd/beszel/releases/latest/download/beszel-agent_$(uname -s)_$(uname -m | sed 's/x86_64/amd64/' | sed 's/armv7l/arm/' | sed 's/aarch64/arm64/').tar.gz" \
| tar -xz -O beszel-agent | tee ./beszel-agent >/dev/null OS=$(uname -s | tr '[:upper:]' '[:lower:]')
mv ./beszel-agent /opt/beszel-agent/beszel-agent ARCH=$(uname -m | sed 's/x86_64/amd64/' | sed 's/armv7l/arm/' | sed 's/aarch64/arm64/')
FILE_NAME="beszel-agent_${OS}_${ARCH}.tar.gz"
LATEST_VERSION=$(curl -s "$GITHUB_API_URL""/repos/henrygd/beszel/releases/latest" | grep -o '"tag_name": "v[^"]*"' | cut -d'"' -f4 | tr -d 'v')
if [ -z "$LATEST_VERSION" ]; then
echo "Failed to get latest version"
exit 1
fi
echo "Downloading and installing agent version ${LATEST_VERSION} from ${GITHUB_URL} ..."
# Download checksums file
TEMP_DIR=$(mktemp -d)
cd "$TEMP_DIR" || exit 1
CHECKSUM=$(curl -sL "$GITHUB_URL/henrygd/beszel/releases/download/v${LATEST_VERSION}/beszel_${LATEST_VERSION}_checksums.txt" | grep "$FILE_NAME" | cut -d' ' -f1)
if [ -z "$CHECKSUM" ] || ! echo "$CHECKSUM" | grep -qE "^[a-fA-F0-9]{64}$"; then
echo "Failed to get checksum or invalid checksum format"
exit 1
fi
if ! curl -#L "$GITHUB_URL/henrygd/beszel/releases/download/v${LATEST_VERSION}/$FILE_NAME" -o "$FILE_NAME"; then
echo "Failed to download the agent from ""$GITHUB_URL/henrygd/beszel/releases/download/v${LATEST_VERSION}/$FILE_NAME"
rm -rf "$TEMP_DIR"
exit 1
fi
if [ "$($CHECK_CMD "$FILE_NAME" | cut -d' ' -f1)" != "$CHECKSUM" ]; then
echo "Checksum verification failed: $($CHECK_CMD "$FILE_NAME" | cut -d' ' -f1) & $CHECKSUM"
rm -rf "$TEMP_DIR"
exit 1
fi
if ! tar -xzf "$FILE_NAME" beszel-agent; then
echo "Failed to extract the agent"
rm -rf "$TEMP_DIR"
exit 1
fi
mv beszel-agent /opt/beszel-agent/beszel-agent
chown beszel:beszel /opt/beszel-agent/beszel-agent chown beszel:beszel /opt/beszel-agent/beszel-agent
chmod 755 /opt/beszel-agent/beszel-agent chmod 755 /opt/beszel-agent/beszel-agent
# Cleanup
rm -rf "$TEMP_DIR"
# Create the systemd service # Create the systemd service
echo "Creating the systemd service for the agent..." echo "Creating the systemd service for the agent..."
cat > /etc/systemd/system/beszel-agent.service << EOF cat > /etc/systemd/system/beszel-agent.service << EOF