#!/bin/bash echo "==========================================" echo " Gitea Runner Management Tool " echo "==========================================" echo "" # 函数:列出所有 runners list_runners() { echo "Registered Runners:" echo "-------------------------------------------" if [ ! -d "/data/runners" ] || [ -z "$(ls -A /data/runners 2>/dev/null)" ]; then echo "No runners registered yet." return fi printf "%-20s %-15s %-30s\n" "Name" "Status" "Log File" echo "-------------------------------------------" for runner_dir in /data/runners/*/; do if [ -d "$runner_dir" ]; then runner_name=$(basename "$runner_dir") if [ -f "$runner_dir/.runner" ]; then # 获取状态 status=$(supervisorctl status "runner-${runner_name}" 2>/dev/null | awk '{print $2}') [ -z "$status" ] && status="NOT_LOADED" log_file="/var/log/supervisor/runner-${runner_name}.out.log" printf "%-20s %-15s %-30s\n" "$runner_name" "$status" "$log_file" fi fi done echo "" } # 函数:查看 runner 详细信息 show_runner() { local runner_name=$1 local runner_dir="/data/runners/${runner_name}" if [ ! -d "$runner_dir" ]; then echo "✗ Runner '$runner_name' not found!" return 1 fi echo "Runner Details: $runner_name" echo "-------------------------------------------" echo "Directory: $runner_dir" if [ -f "$runner_dir/config.yaml" ]; then echo "" echo "Configuration:" cat "$runner_dir/config.yaml" fi echo "" echo "Status:" supervisorctl status "runner-${runner_name}" 2>/dev/null | awk '{print $2}' echo "" } # 函数:删除 runner delete_runner() { local runner_name=$1 local runner_dir="/data/runners/${runner_name}" if [ ! -d "$runner_dir" ]; then echo "✗ Runner '$runner_name' not found!" return 1 fi echo "⚠ Warning: This will permanently delete runner '$runner_name'" read -p "Are you sure? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo "Deletion cancelled." return 0 fi echo "Stopping runner..." supervisorctl stop "runner-${runner_name}" 2>/dev/null || true echo "Removing configuration..." rm -f "/etc/supervisor/conf.d/runner-${runner_name}.conf" echo "Deleting runner directory..." rm -rf "$runner_dir" echo "Updating supervisor..." supervisorctl reread supervisorctl update echo "" echo "✓ Runner '$runner_name' deleted successfully!" } # 函数:查看 runner 日志 logs_runner() { local runner_name=$1 local lines=${2:-50} local log_file="/var/log/supervisor/runner-${runner_name}.out.log" if [ ! -f "$log_file" ]; then echo "✗ Log file not found for runner '$runner_name'" return 1 fi echo "Showing last $lines lines of '$runner_name' logs:" echo "-------------------------------------------" tail -n "$lines" "$log_file" } # 函数:实时查看日志 follow_logs() { local runner_name=$1 local log_file="/var/log/supervisor/runner-${runner_name}.out.log" if [ ! -f "$log_file" ]; then echo "✗ Log file not found for runner '$runner_name'" return 1 fi echo "Following logs for '$runner_name' (Press Ctrl+C to exit):" echo "-------------------------------------------" tail -f "$log_file" } # 函数:启动/停止/重启 runner control_runner() { local action=$1 local runner_name=$2 case $action in start|stop|restart) echo "${action^}ing runner '$runner_name'..." supervisorctl "$action" "runner-${runner_name}" ;; *) echo "✗ Invalid action: $action" return 1 ;; esac } # 函数:显示所有 runner 状态 status_all() { echo "All Runners Status:" echo "-------------------------------------------" supervisorctl status | grep "^runner-" || echo "No runners running." echo "" } # 主菜单 show_menu() { echo "Choose an action:" echo " 1) List all runners" echo " 2) Show runner details" echo " 3) Add new runner" echo " 4) Delete runner" echo " 5) Start runner" echo " 6) Stop runner" echo " 7) Restart runner" echo " 8) View runner logs" echo " 9) Follow runner logs (real-time)" echo " 10) Show all runners status" echo " 0) Exit" echo "" } # 主程序 if [ $# -eq 0 ]; then # 交互模式 while true; do show_menu read -p "Enter your choice: " choice echo "" case $choice in 1) list_runners ;; 2) read -p "Enter runner name: " runner_name show_runner "$runner_name" ;; 3) echo "Starting registration process..." /data/register.sh ;; 4) read -p "Enter runner name to delete: " runner_name delete_runner "$runner_name" ;; 5) read -p "Enter runner name to start: " runner_name control_runner start "$runner_name" ;; 6) read -p "Enter runner name to stop: " runner_name control_runner stop "$runner_name" ;; 7) read -p "Enter runner name to restart: " runner_name control_runner restart "$runner_name" ;; 8) read -p "Enter runner name: " runner_name read -p "Number of lines (default 50): " lines logs_runner "$runner_name" "${lines:-50}" ;; 9) read -p "Enter runner name: " runner_name follow_logs "$runner_name" ;; 10) status_all ;; 0) echo "Goodbye!" exit 0 ;; *) echo "Invalid choice!" ;; esac echo "" read -p "Press Enter to continue..." clear done else # 命令行模式 case $1 in list|ls) list_runners ;; show|info) show_runner "$2" ;; add|register) /data/register.sh ;; delete|rm|remove) delete_runner "$2" ;; start) control_runner start "$2" ;; stop) control_runner stop "$2" ;; restart) control_runner restart "$2" ;; logs) logs_runner "$2" "${3:-50}" ;; follow) follow_logs "$2" ;; status) status_all ;; *) echo "Usage: $0 [command] [runner_name]" echo "" echo "Commands:" echo " list - List all runners" echo " show - Show runner details" echo " add - Add new runner" echo " delete - Delete a runner" echo " start - Start a runner" echo " stop - Stop a runner" echo " restart - Restart a runner" echo " logs [lines] - View runner logs" echo " follow - Follow runner logs (real-time)" echo " status - Show all runners status" echo "" echo "Or run without arguments for interactive mode." exit 1 ;; esac fi