Major migration to Deno runtime following the nupst project pattern: Core Changes: - Created deno.json configuration with tasks, imports, and settings - Created mod.ts as main entry point with Deno permissions - Updated all TypeScript imports from .js to .ts extensions - Replaced Node.js APIs (process.exit) with Deno equivalents (Deno.exit) - Updated path imports to use @std/path from JSR Dependencies: - Migrated all npm dependencies to use npm: prefix in import map - Added Deno standard library imports (@std/path, @std/assert) - Configured import aliases for all @push.rocks and @serve.zone packages Build & Distribution: - Created install.sh for downloading pre-compiled binaries - Created uninstall.sh for clean system removal - Created scripts/compile-all.sh for multi-platform compilation - Supports Linux (x64, ARM64), macOS (x64, ARM64), Windows (x64) Testing: - Migrated tests to Deno test framework using @std/assert - Created test.simple.ts for basic verification - Updated test structure to use Deno.test instead of tap CI/CD: - Created .gitea/workflows/ci.yml for type checking, linting, and builds - Created .gitea/workflows/release.yml for automated releases - Created .gitea/release-template.md for release documentation Cleanup: - Removed package.json, pnpm-lock.yaml, tsconfig.json - Removed Node.js CLI files (cli.js, cli.child.ts, cli.ts.js) - Removed dist_ts/ compiled output directory - Removed npmextra.json configuration This migration enables standalone binary distribution without Node.js runtime dependency while maintaining all existing functionality.
292 lines
7.5 KiB
Bash
Executable File
292 lines
7.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# SPARK Installer Script
|
|
# Downloads and installs pre-compiled SPARK binary from releases
|
|
#
|
|
# Usage:
|
|
# Direct piped installation (recommended):
|
|
# curl -sSL https://code.foss.global/serve.zone/spark/raw/branch/main/install.sh | sudo bash
|
|
#
|
|
# With version specification:
|
|
# curl -sSL https://code.foss.global/serve.zone/spark/raw/branch/main/install.sh | sudo bash -s -- --version v1.2.2
|
|
#
|
|
# Options:
|
|
# -h, --help Show this help message
|
|
# --version VERSION Install specific version (e.g., v1.2.2)
|
|
# --install-dir DIR Installation directory (default: /opt/spark)
|
|
|
|
set -e
|
|
|
|
# Default values
|
|
SHOW_HELP=0
|
|
SPECIFIED_VERSION=""
|
|
INSTALL_DIR="/opt/spark"
|
|
GITEA_BASE_URL="https://code.foss.global"
|
|
GITEA_REPO="serve.zone/spark"
|
|
|
|
# Parse command line arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
-h|--help)
|
|
SHOW_HELP=1
|
|
shift
|
|
;;
|
|
--version)
|
|
SPECIFIED_VERSION="$2"
|
|
shift 2
|
|
;;
|
|
--install-dir)
|
|
INSTALL_DIR="$2"
|
|
shift 2
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
echo "Use -h or --help for usage information"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ $SHOW_HELP -eq 1 ]; then
|
|
echo "SPARK Installer Script"
|
|
echo "Downloads and installs pre-compiled SPARK binary"
|
|
echo ""
|
|
echo "Usage: $0 [options]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " -h, --help Show this help message"
|
|
echo " --version VERSION Install specific version (e.g., v1.2.2)"
|
|
echo " --install-dir DIR Installation directory (default: /opt/spark)"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " # Install latest version"
|
|
echo " curl -sSL https://code.foss.global/serve.zone/spark/raw/branch/main/install.sh | sudo bash"
|
|
echo ""
|
|
echo " # Install specific version"
|
|
echo " curl -sSL https://code.foss.global/serve.zone/spark/raw/branch/main/install.sh | sudo bash -s -- --version v1.2.2"
|
|
exit 0
|
|
fi
|
|
|
|
# Check if running as root
|
|
if [ "$EUID" -ne 0 ]; then
|
|
echo "Please run as root (sudo bash install.sh or pipe to sudo bash)"
|
|
exit 1
|
|
fi
|
|
|
|
# Helper function to detect OS and architecture
|
|
detect_platform() {
|
|
local os=$(uname -s)
|
|
local arch=$(uname -m)
|
|
|
|
# Map OS
|
|
case "$os" in
|
|
Linux)
|
|
os_name="linux"
|
|
;;
|
|
Darwin)
|
|
os_name="macos"
|
|
;;
|
|
MINGW*|MSYS*|CYGWIN*)
|
|
os_name="windows"
|
|
;;
|
|
*)
|
|
echo "Error: Unsupported operating system: $os"
|
|
echo "Supported: Linux, macOS, Windows"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Map architecture
|
|
case "$arch" in
|
|
x86_64|amd64)
|
|
arch_name="x64"
|
|
;;
|
|
aarch64|arm64)
|
|
arch_name="arm64"
|
|
;;
|
|
*)
|
|
echo "Error: Unsupported architecture: $arch"
|
|
echo "Supported: x86_64/amd64 (x64), aarch64/arm64 (arm64)"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Construct binary name
|
|
if [ "$os_name" = "windows" ]; then
|
|
echo "spark-${os_name}-${arch_name}.exe"
|
|
else
|
|
echo "spark-${os_name}-${arch_name}"
|
|
fi
|
|
}
|
|
|
|
# Get latest release version from Gitea API
|
|
get_latest_version() {
|
|
echo "Fetching latest release version from Gitea..." >&2
|
|
|
|
local api_url="${GITEA_BASE_URL}/api/v1/repos/${GITEA_REPO}/releases/latest"
|
|
local response=$(curl -sSL "$api_url" 2>/dev/null)
|
|
|
|
if [ $? -ne 0 ] || [ -z "$response" ]; then
|
|
echo "Error: Failed to fetch latest release information from Gitea API" >&2
|
|
echo "URL: $api_url" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Extract tag_name from JSON response
|
|
local version=$(echo "$response" | grep -o '"tag_name":"[^"]*"' | cut -d'"' -f4)
|
|
|
|
if [ -z "$version" ]; then
|
|
echo "Error: Could not determine latest version from API response" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "$version"
|
|
}
|
|
|
|
# Main installation process
|
|
echo "================================================"
|
|
echo " SPARK Installation Script"
|
|
echo "================================================"
|
|
echo ""
|
|
|
|
# Detect platform
|
|
BINARY_NAME=$(detect_platform)
|
|
echo "Detected platform: $BINARY_NAME"
|
|
echo ""
|
|
|
|
# Determine version to install
|
|
if [ -n "$SPECIFIED_VERSION" ]; then
|
|
VERSION="$SPECIFIED_VERSION"
|
|
echo "Installing specified version: $VERSION"
|
|
else
|
|
VERSION=$(get_latest_version)
|
|
echo "Installing latest version: $VERSION"
|
|
fi
|
|
echo ""
|
|
|
|
# Construct download URL
|
|
DOWNLOAD_URL="${GITEA_BASE_URL}/${GITEA_REPO}/releases/download/${VERSION}/${BINARY_NAME}"
|
|
echo "Download URL: $DOWNLOAD_URL"
|
|
echo ""
|
|
|
|
# Check if service is running and stop it
|
|
SERVICE_WAS_RUNNING=0
|
|
if systemctl is-enabled --quiet spark 2>/dev/null || systemctl is-active --quiet spark 2>/dev/null; then
|
|
SERVICE_WAS_RUNNING=1
|
|
if systemctl is-active --quiet spark 2>/dev/null; then
|
|
echo "Stopping SPARK service..."
|
|
systemctl stop spark
|
|
fi
|
|
fi
|
|
|
|
# Also check for smartdaemon_spark service (legacy)
|
|
if systemctl is-enabled --quiet smartdaemon_spark 2>/dev/null || systemctl is-active --quiet smartdaemon_spark 2>/dev/null; then
|
|
if systemctl is-active --quiet smartdaemon_spark 2>/dev/null; then
|
|
echo "Stopping legacy smartdaemon_spark service..."
|
|
systemctl stop smartdaemon_spark
|
|
systemctl disable smartdaemon_spark 2>/dev/null
|
|
fi
|
|
fi
|
|
|
|
# Clean installation directory - ensure only binary exists
|
|
if [ -d "$INSTALL_DIR" ]; then
|
|
echo "Cleaning installation directory: $INSTALL_DIR"
|
|
rm -rf "$INSTALL_DIR"
|
|
fi
|
|
|
|
# Create fresh installation directory
|
|
echo "Creating installation directory: $INSTALL_DIR"
|
|
mkdir -p "$INSTALL_DIR"
|
|
|
|
# Download binary
|
|
echo "Downloading SPARK binary..."
|
|
TEMP_FILE="$INSTALL_DIR/spark.download"
|
|
curl -sSL "$DOWNLOAD_URL" -o "$TEMP_FILE"
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo "Error: Failed to download binary from $DOWNLOAD_URL"
|
|
echo ""
|
|
echo "Please check:"
|
|
echo " 1. Your internet connection"
|
|
echo " 2. The specified version exists: ${GITEA_BASE_URL}/${GITEA_REPO}/releases"
|
|
echo " 3. The platform binary is available for this release"
|
|
rm -f "$TEMP_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if download was successful (file exists and not empty)
|
|
if [ ! -s "$TEMP_FILE" ]; then
|
|
echo "Error: Downloaded file is empty or does not exist"
|
|
rm -f "$TEMP_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
# Move to final location
|
|
BINARY_PATH="$INSTALL_DIR/spark"
|
|
mv "$TEMP_FILE" "$BINARY_PATH"
|
|
|
|
if [ $? -ne 0 ] || [ ! -f "$BINARY_PATH" ]; then
|
|
echo "Error: Failed to move binary to $BINARY_PATH"
|
|
rm -f "$TEMP_FILE" 2>/dev/null
|
|
exit 1
|
|
fi
|
|
|
|
# Make executable
|
|
chmod +x "$BINARY_PATH"
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo "Error: Failed to make binary executable"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Binary installed successfully to: $BINARY_PATH"
|
|
echo ""
|
|
|
|
# Check if /usr/local/bin is in PATH
|
|
if [[ ":$PATH:" == *":/usr/local/bin:"* ]]; then
|
|
BIN_DIR="/usr/local/bin"
|
|
else
|
|
BIN_DIR="/usr/bin"
|
|
fi
|
|
|
|
# Create symlink for global access
|
|
ln -sf "$BINARY_PATH" "$BIN_DIR/spark"
|
|
echo "Symlink created: $BIN_DIR/spark -> $BINARY_PATH"
|
|
|
|
echo ""
|
|
|
|
# Restart service if it was running before update
|
|
if [ $SERVICE_WAS_RUNNING -eq 1 ]; then
|
|
echo "Restarting SPARK service..."
|
|
systemctl start spark
|
|
echo "Service restarted successfully."
|
|
echo ""
|
|
fi
|
|
|
|
echo "================================================"
|
|
echo " SPARK Installation Complete!"
|
|
echo "================================================"
|
|
echo ""
|
|
echo "Installation details:"
|
|
echo " Binary location: $BINARY_PATH"
|
|
echo " Symlink location: $BIN_DIR/spark"
|
|
echo " Version: $VERSION"
|
|
echo ""
|
|
|
|
# Check if configuration exists
|
|
if [ -f "/etc/spark/config.json" ]; then
|
|
echo "Configuration: /etc/spark/config.json (preserved)"
|
|
echo ""
|
|
echo "Your existing configuration has been preserved."
|
|
if [ $SERVICE_WAS_RUNNING -eq 1 ]; then
|
|
echo "The service has been restarted with your current settings."
|
|
else
|
|
echo "Start the service with: sudo spark installdaemon"
|
|
fi
|
|
else
|
|
echo "Get started:"
|
|
echo " spark --version"
|
|
echo " spark help"
|
|
echo " spark installdaemon # Install as system daemon"
|
|
fi
|
|
echo "" |