From 2a8796c38dd69effb1e4c164adc2d0cc17ff1240 Mon Sep 17 00:00:00 2001 From: henrygd Date: Tue, 9 Dec 2025 15:08:59 -0500 Subject: [PATCH] update hub install script to support freebsd --- supplemental/scripts/install-hub.sh | 400 ++++++++++++++++++++++------ 1 file changed, 317 insertions(+), 83 deletions(-) diff --git a/supplemental/scripts/install-hub.sh b/supplemental/scripts/install-hub.sh index b6990322..86c8515a 100755 --- a/supplemental/scripts/install-hub.sh +++ b/supplemental/scripts/install-hub.sh @@ -1,22 +1,8 @@ -#!/bin/bash +#!/bin/sh -# Check if running as root -if [ "$(id -u)" != "0" ]; then - if command -v sudo >/dev/null 2>&1; then - exec sudo "$0" "$@" - else - echo "This script must be run as root. Please either:" - echo "1. Run this script as root (su root)" - echo "2. Install sudo and run with sudo" - exit 1 - fi -fi - -# Define default values -version=0.0.1 -PORT=8090 # Default port -GITHUB_PROXY_URL="https://ghfast.top/" # Default proxy URL -AUTO_UPDATE_FLAG="false" # default to no auto-updates, "true" means enable +is_freebsd() { + [ "$(uname -s)" = "FreeBSD" ] +} # Function to ensure the proxy URL ends with a / ensure_trailing_slash() { @@ -30,14 +16,155 @@ ensure_trailing_slash() { fi } -# Ensure the proxy URL ends with a / -GITHUB_PROXY_URL=$(ensure_trailing_slash "$GITHUB_PROXY_URL") +# Generate FreeBSD rc service content +generate_freebsd_rc_service() { + cat <<'EOF' +#!/bin/sh + +# PROVIDE: beszel_hub +# REQUIRE: DAEMON NETWORKING +# BEFORE: LOGIN +# KEYWORD: shutdown + +# Add the following lines to /etc/rc.conf to configure Beszel Hub: +# +# beszel_hub_enable (bool): Set to YES to enable Beszel Hub +# Default: YES +# beszel_hub_port (str): Port to listen on +# Default: 8090 +# beszel_hub_user (str): Beszel Hub daemon user +# Default: beszel +# beszel_hub_bin (str): Path to the beszel binary +# Default: /usr/local/sbin/beszel +# beszel_hub_data (str): Path to the beszel data directory +# Default: /usr/local/etc/beszel/beszel_data +# beszel_hub_flags (str): Extra flags passed to beszel command invocation +# Default: + +. /etc/rc.subr + +name="beszel_hub" +rcvar=beszel_hub_enable + +load_rc_config $name +: ${beszel_hub_enable:="YES"} +: ${beszel_hub_port:="8090"} +: ${beszel_hub_user:="beszel"} +: ${beszel_hub_flags:=""} +: ${beszel_hub_bin:="/usr/local/sbin/beszel"} +: ${beszel_hub_data:="/usr/local/etc/beszel/beszel_data"} + +logfile="/var/log/${name}.log" +pidfile="/var/run/${name}.pid" + +procname="/usr/sbin/daemon" +start_precmd="${name}_prestart" +start_cmd="${name}_start" +stop_cmd="${name}_stop" + +extra_commands="upgrade" +upgrade_cmd="beszel_hub_upgrade" + +beszel_hub_prestart() +{ + if [ ! -d "${beszel_hub_data}" ]; then + echo "Creating data directory ${beszel_hub_data}" + mkdir -p "${beszel_hub_data}" + chown "${beszel_hub_user}:${beszel_hub_user}" "${beszel_hub_data}" + fi +} + +beszel_hub_start() +{ + echo "Starting ${name}" + cd "$(dirname "${beszel_hub_data}")" || exit 1 + /usr/sbin/daemon -f \ + -P "${pidfile}" \ + -o "${logfile}" \ + -u "${beszel_hub_user}" \ + "${beszel_hub_bin}" serve --http "0.0.0.0:${beszel_hub_port}" ${beszel_hub_flags} +} + +beszel_hub_stop() +{ + pid="$(check_pidfile "${pidfile}" "${procname}")" + if [ -n "${pid}" ]; then + echo "Stopping ${name} (pid=${pid})" + kill -- "-${pid}" + wait_for_pids "${pid}" + else + echo "${name} isn't running" + fi +} + +beszel_hub_upgrade() +{ + echo "Upgrading ${name}" + if command -v sudo >/dev/null; then + sudo -u "${beszel_hub_user}" -- "${beszel_hub_bin}" update + else + su -m "${beszel_hub_user}" -c "${beszel_hub_bin} update" + fi +} + +run_rc_command "$1" +EOF +} + +# Detect system architecture +detect_architecture() { + arch=$(uname -m) + case "$arch" in + x86_64) + arch="amd64" + ;; + armv7l) + arch="arm" + ;; + aarch64) + arch="arm64" + ;; + esac + echo "$arch" +} + +# Build sudo args by properly quoting everything +build_sudo_args() { + QUOTED_ARGS="" + while [ $# -gt 0 ]; do + if [ -n "$QUOTED_ARGS" ]; then + QUOTED_ARGS="$QUOTED_ARGS " + fi + QUOTED_ARGS="$QUOTED_ARGS'$(echo "$1" | sed "s/'/'\\\\''/g")'" + shift + done + echo "$QUOTED_ARGS" +} + +# Check if running as root and re-execute with sudo if needed +if [ "$(id -u)" != "0" ]; then + if command -v sudo >/dev/null 2>&1; then + SUDO_ARGS=$(build_sudo_args "$@") + eval "exec sudo $0 $SUDO_ARGS" + else + echo "This script must be run as root. Please either:" + echo "1. Run this script as root (su root)" + echo "2. Install sudo and run with sudo" + exit 1 + fi +fi + +# Define default values +PORT=8090 +GITHUB_PROXY_URL="https://ghfast.top/" +AUTO_UPDATE_FLAG="false" +UNINSTALL=false # Parse command line arguments while [ $# -gt 0 ]; do case "$1" in -u) - UNINSTALL="true" + UNINSTALL=true shift ;; -h|--help) @@ -72,37 +199,75 @@ while [ $# -gt 0 ]; do esac done -if [ "$UNINSTALL" = "true" ]; then - # Stop and disable the Beszel Hub service - echo "Stopping and disabling the Beszel Hub service..." - systemctl stop beszel-hub.service - systemctl disable beszel-hub.service +# Ensure the proxy URL ends with a / +GITHUB_PROXY_URL=$(ensure_trailing_slash "$GITHUB_PROXY_URL") - # Remove the systemd service file - echo "Removing the systemd service file..." - rm -f /etc/systemd/system/beszel-hub.service +# Set paths based on operating system +if is_freebsd; then + HUB_DIR="/usr/local/etc/beszel" + BIN_PATH="/usr/local/sbin/beszel" +else + HUB_DIR="/opt/beszel" + BIN_PATH="/opt/beszel/beszel" +fi - # Remove the update timer and service if they exist - echo "Removing the daily update service and timer..." - systemctl stop beszel-hub-update.timer 2>/dev/null - systemctl disable beszel-hub-update.timer 2>/dev/null - rm -f /etc/systemd/system/beszel-hub-update.service - rm -f /etc/systemd/system/beszel-hub-update.timer +# Uninstall process +if [ "$UNINSTALL" = true ]; then + if is_freebsd; then + echo "Stopping and disabling the Beszel Hub service..." + service beszel-hub stop 2>/dev/null + sysrc beszel_hub_enable="NO" 2>/dev/null - # Reload the systemd daemon - echo "Reloading the systemd daemon..." - systemctl daemon-reload + echo "Removing the FreeBSD service files..." + rm -f /usr/local/etc/rc.d/beszel-hub - # Remove the Beszel Hub binary and data - echo "Removing the Beszel Hub binary and data..." - rm -rf /opt/beszel + echo "Removing the daily update cron job..." + rm -f /etc/cron.d/beszel-hub - # Remove the dedicated user - echo "Removing the dedicated user..." - userdel beszel 2>/dev/null + echo "Removing log files..." + rm -f /var/log/beszel_hub.log - echo "The Beszel Hub has been uninstalled successfully!" - exit 0 + echo "Removing the Beszel Hub binary and data..." + rm -f "$BIN_PATH" + rm -rf "$HUB_DIR" + + echo "Removing the dedicated user..." + pw user del beszel 2>/dev/null + + echo "The Beszel Hub has been uninstalled successfully!" + exit 0 + else + # Stop and disable the Beszel Hub service + echo "Stopping and disabling the Beszel Hub service..." + systemctl stop beszel-hub.service + systemctl disable beszel-hub.service + + # Remove the systemd service file + echo "Removing the systemd service file..." + rm -f /etc/systemd/system/beszel-hub.service + + # Remove the update timer and service if they exist + echo "Removing the daily update service and timer..." + systemctl stop beszel-hub-update.timer 2>/dev/null + systemctl disable beszel-hub-update.timer 2>/dev/null + rm -f /etc/systemd/system/beszel-hub-update.service + rm -f /etc/systemd/system/beszel-hub-update.timer + + # Reload the systemd daemon + echo "Reloading the systemd daemon..." + systemctl daemon-reload + + # Remove the Beszel Hub binary and data + echo "Removing the Beszel Hub binary and data..." + rm -rf "$HUB_DIR" + + # Remove the dedicated user + echo "Removing the dedicated user..." + userdel beszel 2>/dev/null + + echo "The Beszel Hub has been uninstalled successfully!" + exit 0 + fi fi # Function to check if a package is installed @@ -111,7 +276,12 @@ package_installed() { } # Check for package manager and install necessary packages if not installed -if package_installed apt-get; then +if package_installed pkg && is_freebsd; then + if ! package_installed tar || ! package_installed curl; then + pkg update + pkg install -y gtar curl + fi +elif package_installed apt-get; then if ! package_installed tar || ! package_installed curl; then apt-get update apt-get install -y tar curl @@ -129,28 +299,91 @@ else fi # Create a dedicated user for the service if it doesn't exist -if ! id -u beszel >/dev/null 2>&1; then - echo "Creating a dedicated user for the Beszel Hub service..." - useradd -M -s /bin/false beszel +echo "Creating a dedicated user for the Beszel Hub service..." +if is_freebsd; then + if ! id -u beszel >/dev/null 2>&1; then + pw user add beszel -d /nonexistent -s /usr/sbin/nologin -c "beszel user" + fi +else + if ! id -u beszel >/dev/null 2>&1; then + useradd -M -s /bin/false beszel + fi fi +# Create the directory for the Beszel Hub +echo "Creating the directory for the Beszel Hub..." +mkdir -p "$HUB_DIR/beszel_data" +chown -R beszel:beszel "$HUB_DIR" +chmod 755 "$HUB_DIR" + # Download and install the Beszel Hub echo "Downloading and installing the Beszel Hub..." -curl -sL "${GITHUB_PROXY_URL}https://github.com/henrygd/beszel/releases/latest/download/beszel_$(uname -s)_$(uname -m | sed 's/x86_64/amd64/' | sed 's/armv7l/arm/' | sed 's/aarch64/arm64/').tar.gz" | tar -xz -O beszel | tee ./beszel >/dev/null && chmod +x beszel -mkdir -p /opt/beszel/beszel_data -mv ./beszel /opt/beszel/beszel -chown -R beszel:beszel /opt/beszel -# Create the systemd service -printf "Creating the systemd service for the Beszel Hub...\n\n" -tee /etc/systemd/system/beszel-hub.service </dev/null +chmod +x ./beszel +mv ./beszel "$BIN_PATH" +chown beszel:beszel "$BIN_PATH" + +if is_freebsd; then + echo "Creating FreeBSD rc service..." + + # Create the rc service file + generate_freebsd_rc_service > /usr/local/etc/rc.d/beszel-hub + + # Set proper permissions for the rc script + chmod 755 /usr/local/etc/rc.d/beszel-hub + + # Configure the port + sysrc beszel_hub_port="$PORT" + + # Enable and start the service + echo "Enabling and starting the Beszel Hub service..." + sysrc beszel_hub_enable="YES" + service beszel-hub restart + + # Check if service started successfully + sleep 2 + if ! service beszel-hub status | grep -q "is running"; then + echo "Error: The Beszel Hub service failed to start. Checking logs..." + tail -n 20 /var/log/beszel_hub.log + exit 1 + fi + + # Auto-update service for FreeBSD + if [ "$AUTO_UPDATE_FLAG" = "true" ]; then + echo "Setting up daily automatic updates for beszel-hub..." + + # Create cron job in /etc/cron.d + cat >/etc/cron.d/beszel-hub </dev/null 2>&1 +EOF + chmod 644 /etc/cron.d/beszel-hub + printf "\nDaily updates have been enabled via /etc/cron.d.\n" + fi + + # Check service status + if ! service beszel-hub status >/dev/null 2>&1; then + echo "Error: The Beszel Hub service is not running." + service beszel-hub status + exit 1 + fi + +else + # Original systemd service installation code + printf "Creating the systemd service for the Beszel Hub...\n\n" + tee /etc/systemd/system/beszel-hub.service </etc/systemd/system/beszel-hub-update.service </etc/systemd/system/beszel-hub-update.service </etc/systemd/system/beszel-hub-update.timer </etc/systemd/system/beszel-hub-update.timer <