#!/bin/bash # Syncthing 交互式管理脚本 set -e # 配置变量 SYNCTHING_VERSION="v1.27.7" INSTALL_DIR="/opt/syncthing" CONFIG_DIR="$HOME/.config/syncthing" SERVICE_FILE="/etc/systemd/system/syncthing.service" BIN_PATH="/usr/local/bin/syncthing" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # 输出函数 log_info() { echo -e "${BLUE}ℹ️ $1${NC}"; } log_success() { echo -e "${GREEN}✅ $1${NC}"; } log_warning() { echo -e "${YELLOW}⚠️ $1${NC}"; } log_error() { echo -e "${RED}❌ $1${NC}"; } log_menu() { echo -e "${PURPLE}✨ $1${NC}"; } log_step() { echo -e "${CYAN}📌 $1${NC}"; } # 显示炫酷标题 show_header() { clear echo -e "${PURPLE}" echo "╔══════════════════════════════════════════════╗" echo "║ Syncthing 交互式管理脚本 ║" echo "║ 直接安装 · 极简使用 ║" echo "╚══════════════════════════════════════════════╝" echo -e "${NC}" } # 显示状态信息 show_status() { log_step "系统状态检查..." # 检查安装状态 if [ -f "$BIN_PATH" ]; then log_success "Syncthing: 已安装" echo " 📁 安装路径: $INSTALL_DIR" echo " ⚙️ 配置路径: $CONFIG_DIR" else log_warning "Syncthing: 未安装" fi # 检查服务状态 if systemctl is-active --quiet syncthing 2>/dev/null; then log_success "服务状态: 运行中" LOCAL_IP=$(hostname -I | awk '{print $1}') echo " 🌐 访问地址: http://${LOCAL_IP}:8384" elif systemctl is-enabled syncthing 2>/dev/null; then log_warning "服务状态: 已停止" else log_warning "服务状态: 未配置" fi # 检查端口 if ss -tuln | grep -q ":8384 "; then log_success "网络端口: 8384 正在监听" else log_warning "网络端口: 8384 未监听" fi echo "" } # 等待用户按键 press_any_key() { echo -e "${YELLOW}" read -n 1 -s -r -p "🔸 按任意键继续..." echo -e "${NC}" echo "" } # 安装 Syncthing install_syncthing() { show_header log_menu "开始安装 Syncthing" # 检查是否已安装 if [ -f "$BIN_PATH" ]; then log_warning "检测到 Syncthing 已安装!" echo "" echo "请选择:" echo " 1) 重新安装(覆盖现有版本)" echo " 2) 返回主菜单" echo " 3) 查看当前状态" read -p "请输入选择 [1-3]: " choice case $choice in 1) log_info "开始重新安装..." ;; 2) return ;; 3) show_status press_any_key return ;; *) log_error "无效选择" press_any_key return ;; esac fi log_step "步骤 1/5 - 创建安装目录..." sudo mkdir -p $INSTALL_DIR sudo chown $USER:$USER $INSTALL_DIR log_step "步骤 2/5 - 下载 Syncthing $SYNCTHING_VERSION..." cd /tmp if wget -q --show-progress https://github.com/syncthing/syncthing/releases/download/$SYNCTHING_VERSION/syncthing-linux-amd64-$SYNCTHING_VERSION.tar.gz; then log_success "下载完成" else log_error "下载失败,请检查网络连接" press_any_key return fi log_step "步骤 3/5 - 解压和安装..." tar xzf syncthing-linux-amd64-$SYNCTHING_VERSION.tar.gz cd syncthing-linux-amd64-$SYNCTHING_VERSION sudo cp syncthing $INSTALL_DIR/ sudo chmod +x $INSTALL_DIR/syncthing sudo ln -sf $INSTALL_DIR/syncthing $BIN_PATH log_step "步骤 4/5 - 创建系统服务..." mkdir -p $CONFIG_DIR sudo tee $SERVICE_FILE > /dev/null </dev/null || true sudo systemctl disable syncthing 2>/dev/null || true log_step "删除服务文件..." sudo rm -f $SERVICE_FILE sudo systemctl daemon-reload log_step "删除程序文件..." sudo rm -rf $INSTALL_DIR sudo rm -f $BIN_PATH echo "" read -p "❓ 是否删除配置文件?[y/N]: " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then log_step "删除配置文件..." rm -rf $CONFIG_DIR log_success "配置已删除" else log_info "配置文件保留在: $CONFIG_DIR" fi log_success "卸载完成!" press_any_key } # 服务管理 manage_service() { show_header log_menu "服务管理" if [ ! -f "$BIN_PATH" ]; then log_error "Syncthing 未安装,请先安装" press_any_key return fi show_status echo "请选择操作:" echo " 1) 启动服务" echo " 2) 停止服务" echo " 3) 重启服务" echo " 4) 查看服务状态" echo " 5) 查看实时日志" echo " 6) 返回主菜单" read -p "请输入选择 [1-6]: " choice case $choice in 1) log_step "启动服务..." sudo systemctl start syncthing sleep 2 if systemctl is-active --quiet syncthing; then log_success "服务启动成功" else log_error "服务启动失败" fi ;; 2) log_step "停止服务..." sudo systemctl stop syncthing log_success "服务已停止" ;; 3) log_step "重启服务..." sudo systemctl restart syncthing sleep 2 if systemctl is-active --quiet syncthing; then log_success "服务重启成功" else log_error "服务重启失败" fi ;; 4) log_step "服务状态:" sudo systemctl status syncthing ;; 5) log_step "开始显示实时日志(Ctrl+C 退出)..." sudo journalctl -u syncthing -f ;; 6) return ;; *) log_error "无效选择" ;; esac press_any_key } # 快速访问 quick_access() { show_header log_menu "快速访问" if ! systemctl is-active --quiet syncthing 2>/dev/null; then log_error "服务未运行,请先启动服务" press_any_key return fi LOCAL_IP=$(hostname -I | awk '{print $1}') log_success "访问信息:" echo " 🌐 本地访问: http://127.0.0.1:8384" echo " 🌐 网络访问: http://${LOCAL_IP}:8384" echo " 📍 端口: 8384" echo "" echo "快捷操作:" echo " 1) 用默认浏览器打开" echo " 2) 复制访问地址到剪贴板" echo " 3) 显示二维码(如果有)" echo " 4) 返回主菜单" read -p "请输入选择 [1-4]: " choice case $choice in 1) if command -v xdg-open >/dev/null; then xdg-open "http://${LOCAL_IP}:8384" log_success "已尝试打开浏览器" else log_info "请在浏览器中访问: http://${LOCAL_IP}:8384" fi ;; 2) if command -v xclip >/dev/null; then echo "http://${LOCAL_IP}:8384" | xclip -selection clipboard log_success "地址已复制到剪贴板" else log_info "请手动复制: http://${LOCAL_IP}:8384" fi ;; 3) log_info "二维码功能需要额外工具支持" ;; 4) return ;; *) log_error "无效选择" ;; esac press_any_key } # 显示主菜单 show_main_menu() { show_header show_status log_menu "主菜单" echo "请选择操作:" echo " 1) 安装 Syncthing" echo " 2) 卸载 Syncthing" echo " 3) 服务管理(启动/停止/重启)" echo " 4) 快速访问" echo " 5) 查看详细状态" echo " 6) 退出脚本" echo "" } # 主循环 main() { while true; do show_main_menu read -p "请输入选择 [1-6]: " choice case $choice in 1) install_syncthing ;; 2) uninstall_syncthing ;; 3) manage_service ;; 4) quick_access ;; 5) show_header show_status press_any_key ;; 6) log_success "再见!" exit 0 ;; *) log_error "无效选择,请输入 1-6 之间的数字" sleep 2 ;; esac done } # 脚本启动 if [[ $1 == "-y" || $1 == "--auto" ]]; then # 非交互模式 if [ ! -f "$BIN_PATH" ]; then install_syncthing else show_status fi else # 交互模式 main fi