Files
komari-agent/install.sh
2025-07-15 10:05:02 +08:00

371 lines
10 KiB
Bash

#!/bin/bash
# Color definitions for terminal output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color
# Logging functions
log_info() {
echo -e "${NC} $1"
}
log_success() {
echo -e "${GREEN}${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_step() {
echo -e "${NC} $1"
}
log_config() {
echo -e "${CYAN}[CONFIG]${NC} $1"
}
# Default values
service_name="komari-agent"
target_dir="/opt/komari"
github_proxy=""
install_version="" # New parameter for specifying version
# Parse install-specific arguments
komari_args=""
while [[ $# -gt 0 ]]; do
case $1 in
--install-dir)
target_dir="$2"
shift 2
;;
--install-service-name)
service_name="$2"
shift 2
;;
--install-ghproxy)
github_proxy="$2"
shift 2
;;
--install-version)
install_version="$2"
shift 2
;;
--install*)
log_warning "Unknown install parameter: $1"
shift
;;
*)
# Non-install arguments go to komari_args
komari_args="$komari_args $1"
shift
;;
esac
done
# Remove leading space from komari_args if present
komari_args="${komari_args# }"
komari_agent_path="${target_dir}/agent"
if [ "$EUID" -ne 0 ]; then
log_error "Please run as root"
exit 1
fi
echo -e "${WHITE}===========================================${NC}"
echo -e "${WHITE} Komari Agent Installation Script ${NC}"
echo -e "${WHITE}===========================================${NC}"
echo ""
log_config "Installation configuration:"
log_config " Service name: ${GREEN}$service_name${NC}"
log_config " Install directory: ${GREEN}$target_dir${NC}"
log_config " GitHub proxy: ${GREEN}${github_proxy:-"(direct)"}${NC}"
log_config " Binary arguments: ${GREEN}$komari_args${NC}"
if [ -n "$install_version" ]; then
log_config " Specified agent version: ${GREEN}$install_version${NC}"
else
log_config " Agent version: ${GREEN}Latest${NC}"
fi
echo ""
# Function to uninstall the previous installation
uninstall_previous() {
log_step "Checking for previous installation..."
# Stop and disable service if it exists
if command -v systemctl >/dev/null 2>&1 && systemctl list-unit-files | grep -q "${service_name}.service"; then
log_info "Stopping and disabling existing systemd service..."
systemctl stop ${service_name}.service
systemctl disable ${service_name}.service
rm -f "/etc/systemd/system/${service_name}.service"
systemctl daemon-reload
elif command -v rc-service >/dev/null 2>&1 && [ -f "/etc/init.d/${service_name}" ]; then
log_info "Stopping and disabling existing OpenRC service..."
rc-service ${service_name} stop
rc-update del ${service_name} default
rm -f "/etc/init.d/${service_name}"
elif command -v uci >/dev/null 2>&1 && [ -f "/etc/init.d/${service_name}" ]; then
log_info "Stopping and disabling existing procd service..."
/etc/init.d/${service_name} stop
/etc/init.d/${service_name} disable
rm -f "/etc/init.d/${service_name}"
fi
# Remove old binary if it exists
if [ -f "$komari_agent_path" ]; then
log_info "Removing old binary..."
rm -f "$komari_agent_path"
fi
}
# Uninstall previous installation
uninstall_previous
install_dependencies() {
log_step "Checking and installing dependencies..."
local deps="curl"
local missing_deps=""
for cmd in $deps; do
if ! command -v $cmd >/dev/null 2>&1; then
missing_deps="$missing_deps $cmd"
fi
done
if [ -n "$missing_deps" ]; then
# Check package manager and install dependencies
if command -v apt >/dev/null 2>&1; then
log_info "Using apt to install dependencies..."
apt update
apt install -y $missing_deps
elif command -v yum >/dev/null 2>&1; then
log_info "Using yum to install dependencies..."
yum install -y $missing_deps
elif command -v apk >/dev/null 2>&1; then
log_info "Using apk to install dependencies..."
apk add $missing_deps
else
log_error "No supported package manager found (apt/yum/apk)"
exit 1
fi
# Verify installation
for cmd in $missing_deps; do
if ! command -v $cmd >/dev/null 2>&1; then
log_error "Failed to install $cmd"
exit 1
fi
done
log_success "Dependencies installed successfully"
else
log_success "Dependencies already satisfied"
fi
}
# Install dependencies
install_dependencies
arch=$(uname -m)
case $arch in
x86_64)
arch="amd64"
;;
aarch64)
arch="arm64"
;;
*)
log_error "Unsupported architecture: $arch"
exit 1
;;
esac
log_info "Detected architecture: ${GREEN}$arch${NC}"
version_to_install="latest"
if [ -n "$install_version" ]; then
log_info "Attempting to install specified version: ${GREEN}$install_version${NC}"
version_to_install="$install_version"
else
log_info "No version specified, installing the latest version."
fi
# Construct download URL
file_name="komari-agent-linux-${arch}"
if [ "$version_to_install" = "latest" ]; then
download_path="latest/download"
else
download_path="download/${version_to_install}"
fi
if [ -n "$github_proxy" ]; then
# Use proxy for GitHub releases
download_url="${github_proxy}/https://github.com/komari-monitor/komari-agent/releases/${download_path}/${file_name}"
else
# Direct access to GitHub releases
download_url="https://github.com/komari-monitor/komari-agent/releases/${download_path}/${file_name}"
fi
log_step "Creating installation directory: ${GREEN}$target_dir${NC}"
mkdir -p "$target_dir"
# Download binary
if [ -n "$github_proxy" ]; then
log_step "Downloading $file_name via proxy..."
log_info "URL: ${CYAN}$download_url${NC}"
else
log_step "Downloading $file_name directly..."
log_info "URL: ${CYAN}$download_url${NC}"
fi
curl -L -o "$komari_agent_path" "$download_url"
if [ $? -ne 0 ]; then
log_error "Download failed"
exit 1
fi
# Set executable permissions
chmod +x "$komari_agent_path"
log_success "Komari-agent installed to ${GREEN}$komari_agent_path${NC}"
# Detect init system and configure service
log_step "Configuring system service..."
# Check if running on NixOS
if [ -f /etc/NIXOS ]; then
log_warning "NixOS detected. System services must be configured declaratively."
log_info "Please add the following to your NixOS configuration:"
echo ""
echo -e "${CYAN}systemd.services.${service_name} = {${NC}"
echo -e "${CYAN} description = \"Komari Agent Service\";${NC}"
echo -e "${CYAN} after = [ \"network.target\" ];${NC}"
echo -e "${CYAN} wantedBy = [ \"multi-user.target\" ];${NC}"
echo -e "${CYAN} serviceConfig = {${NC}"
echo -e "${CYAN} Type = \"simple\";${NC}"
echo -e "${CYAN} ExecStart = \"${komari_agent_path} ${komari_args}\";${NC}"
echo -e "${CYAN} WorkingDirectory = \"${target_dir}\";${NC}"
echo -e "${CYAN} Restart = \"always\";${NC}"
echo -e "${CYAN} User = \"root\";${NC}"
echo -e "${CYAN} };${NC}"
echo -e "${CYAN}};${NC}"
echo ""
log_info "Then run: sudo nixos-rebuild switch"
log_warning "Service not started automatically on NixOS. Please rebuild your configuration."
elif command -v systemctl >/dev/null 2>&1; then
# Systemd service configuration
log_info "Using systemd for service management"
service_file="/etc/systemd/system/${service_name}.service"
cat > "$service_file" << EOF
[Unit]
Description=Komari Agent Service
After=network.target
[Service]
Type=simple
ExecStart=${komari_agent_path} ${komari_args}
WorkingDirectory=${target_dir}
Restart=always
User=root
[Install]
WantedBy=multi-user.target
EOF
# Reload systemd and start service
systemctl daemon-reload
systemctl enable ${service_name}.service
systemctl start ${service_name}.service
log_success "Systemd service configured and started"
elif command -v rc-service >/dev/null 2>&1; then
# OpenRC service configuration
log_info "Using OpenRC for service management"
service_file="/etc/init.d/${service_name}"
cat > "$service_file" << EOF
#!/sbin/openrc-run
name="Komari Agent Service"
description="Komari monitoring agent"
command="${komari_agent_path}"
command_args="${komari_args}"
command_user="root"
directory="${target_dir}"
pidfile="/run/${service_name}.pid"
retry="SIGTERM/30"
supervisor=supervise-daemon
depend() {
need net
after network
}
EOF
# Set permissions and enable service
chmod +x "$service_file"
rc-update add ${service_name} default
rc-service ${service_name} start
log_success "OpenRC service configured and started"
elif command -v uci >/dev/null 2>&1; then
# procd service configuration (OpenWrt)
log_info "Using procd for service management"
service_file="/etc/init.d/${service_name}"
cat > "$service_file" << EOF
#!/bin/sh /etc/rc.common
START=99
STOP=10
USE_PROCD=1
PROG="${komari_agent_path}"
ARGS="${komari_args}"
start_service() {
procd_open_instance
procd_set_param command \$PROG \$ARGS
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param user root
procd_close_instance
}
stop_service() {
killall \$(basename \$PROG)
}
reload_service() {
stop
start
}
EOF
# Set permissions and enable service
chmod +x "$service_file"
/etc/init.d/${service_name} enable
/etc/init.d/${service_name} start
log_success "procd service configured and started"
else
log_error "Unsupported init system (systemd, openrc, or procd not found)"
exit 1
fi
echo ""
echo -e "${WHITE}===========================================${NC}"
if [ -f /etc/NIXOS ]; then
log_success "Komari-agent binary installed!"
log_warning "NixOS requires declarative service configuration."
log_info "Please add the service configuration to your NixOS config and rebuild."
else
log_success "Komari-agent installation completed!"
fi
log_config "Service: ${GREEN}$service_name${NC}"
log_config "Arguments: ${GREEN}$komari_args${NC}"
echo -e "${WHITE}===========================================${NC}"