#!/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..." if 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" 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}" log_success "Komari-agent installation completed!" log_config "Service: ${GREEN}$service_name${NC}" log_config "Arguments: ${GREEN}$komari_args${NC}" echo -e "${WHITE}===========================================${NC}"