#!/bin/bash # ============================================ # NAS 全自动部署脚本 # 作者:姜维 伯约 # 日期:2026年3月27日 # ============================================ set -e # 配置信息 NAS_IP="192.168.2.154" NAS_USER="cfdaily" NAS_PASS="Ccf7561523" NAS_SHARE="stock" MOUNT_POINT="/Users/chufeng/nas/stock" LAUNCH_DAEMON_LABEL="com.user.nasmount" LAUNCH_DAEMON_PATH="/Library/LaunchDaemons/${LAUNCH_DAEMON_LABEL}.plist" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查是否以 root 权限运行 check_root() { if [ "$EUID" -ne 0 ]; then log_error "请使用 sudo 运行此脚本" echo "使用方法: sudo $0" exit 1 fi } # 检查网络连接 check_network() { log_info "检查网络连接..." for i in {1..30}; do if ping -c 1 -W 2 "$NAS_IP" &> /dev/null; then log_info "网络连接正常: $NAS_IP" return 0 fi log_warn "等待网络连接... ($i/30)" sleep 2 done log_error "无法连接到 NAS: $NAS_IP" return 1 } # 创建挂载点 create_mount_point() { log_info "创建挂载点..." mkdir -p "$MOUNT_POINT" chown chufeng:staff "$MOUNT_POINT" chmod 755 "$MOUNT_POINT" log_info "挂载点已创建: $MOUNT_POINT" } # 测试挂载 test_mount() { log_info "测试挂载 NAS..." # 先卸载(如果已挂载) if mount | grep -q "$MOUNT_POINT"; then log_warn "卸载已挂载的卷..." umount -f "$MOUNT_POINT" 2>/dev/null || true sleep 2 fi # 尝试挂载 NAS_URL="smb://${NAS_USER}:${NAS_PASS}@${NAS_IP}/${NAS_SHARE}" if /sbin/mount_smbfs "$NAS_URL" "$MOUNT_POINT"; then log_info "NAS 挂载测试成功!" sleep 2 umount "$MOUNT_POINT" log_info "测试完成,已卸载" return 0 else log_error "NAS 挂载测试失败" return 1 fi } # 创建 Launch Daemon plist 文件 create_launch_daemon() { log_info "创建 Launch Daemon..." cat > "$LAUNCH_DAEMON_PATH" < Label ${LAUNCH_DAEMON_LABEL} ProgramArguments /bin/bash /Users/chufeng/.openclaw/workspace-jiangwei/nas_mounter.sh RunAtLoad StartInterval 60 KeepAlive PathState ${MOUNT_POINT}/.mounted StandardOutPath /Users/chufeng/.openclaw/workspace-jiangwei/logs/nas_mount.log StandardErrorPath /Users/chufeng/.openclaw/workspace-jiangwei/logs/nas_mount_error.log EOF # 设置权限 chown root:wheel "$LAUNCH_DAEMON_PATH" chmod 644 "$LAUNCH_DAEMON_PATH" log_info "Launch Daemon 已创建: $LAUNCH_DAEMON_PATH" } # 创建挂载脚本 create_mounter_script() { log_info "创建挂载脚本..." cat > "/Users/chufeng/.openclaw/workspace-jiangwei/nas_mounter.sh" <<'EOF' #!/bin/bash # NAS 自动挂载守护脚本 # 由 Launch Daemon 调用 NAS_IP="192.168.2.154" NAS_USER="cfdaily" NAS_PASS="Ccf7561523" NAS_SHARE="stock" MOUNT_POINT="/Users/chufeng/nas/stock" MOUNT_MARKER="${MOUNT_POINT}/.mounted" LOG_FILE="/Users/chufeng/.openclaw/workspace-jiangwei/logs/nas_mount.log" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" } # 检查是否已挂载 check_mounted() { if mount | grep -q "$MOUNT_POINT"; then # 更新挂载标记 touch "$MOUNT_MARKER" 2>/dev/null || true return 0 fi return 1 } # 检查网络 check_network() { ping -c 1 -W 2 "$NAS_IP" &> /dev/null } # 执行挂载 do_mount() { log "开始挂载 NAS..." # 创建挂载点 mkdir -p "$MOUNT_POINT" # 尝试挂载 NAS_URL="smb://${NAS_USER}:${NAS_PASS}@${NAS_IP}/${NAS_SHARE}" if /sbin/mount_smbfs "$NAS_URL" "$MOUNT_POINT"; then log "NAS 挂载成功: $MOUNT_POINT" # 创建挂载标记 touch "$MOUNT_MARKER" chown chufeng:staff "$MOUNT_MARKER" 2>/dev/null || true # 创建目录结构 create_dir_structure return 0 else log "NAS 挂载失败" return 1 fi } # 创建目录结构 create_dir_structure() { log "创建目录结构..." cd "$MOUNT_POINT" || return mkdir -p "A股数据/日线数据" "A股数据/分钟线数据" "A股数据/财务数据" mkdir -p "回测结果/策略回测" "回测结果/性能报告" mkdir -p "代码库/策略代码" "代码库/工具脚本" mkdir -p "临时文件/下载缓存" "临时文件/临时数据" # 设置权限 chown -R chufeng:staff "$MOUNT_POINT" 2>/dev/null || true log "目录结构创建完成" } # 主逻辑 main() { # 确保日志目录存在 mkdir -p "$(dirname "$LOG_FILE")" if check_mounted; then log "NAS 已挂载,无需操作" return 0 fi if ! check_network; then log "网络不可用,等待下次检查" return 1 fi do_mount } main EOF chmod +x "/Users/chufeng/.openclaw/workspace-jiangwei/nas_mounter.sh" chown chufeng:staff "/Users/chufeng/.openclaw/workspace-jiangwei/nas_mounter.sh" log_info "挂载脚本已创建" } # 创建 SMB 优化配置 create_smb_config() { log_info "优化 SMB 配置..." SMB_CONF="/etc/nsmb.conf" if [ -f "$SMB_CONF" ]; then log_warn "SMB 配置文件已存在,备份为 ${SMB_CONF}.backup" cp "$SMB_CONF" "${SMB_CONF}.backup" fi cat > "$SMB_CONF" </dev/null || true sleep 2 fi } # 加载 Launch Daemon load_launch_daemon() { log_info "加载 Launch Daemon..." launchctl load -w "$LAUNCH_DAEMON_PATH" log_info "Launch Daemon 已加载" } # 验证部署 verify_deployment() { log_info "验证部署..." # 等待几秒让脚本执行 sleep 10 # 检查挂载状态 if mount | grep -q "$MOUNT_POINT"; then log_info "✅ NAS 已成功挂载!" ls -la "$MOUNT_POINT" else log_warn "⚠️ NAS 尚未挂载,Launch Daemon 将在后台重试" log_info "查看日志: tail -f /Users/chufeng/.openclaw/workspace-jiangwei/logs/nas_mount.log" fi echo "" log_info "部署完成!" log_info "Launch Daemon 将每分钟检查一次挂载状态" } # 主函数 main() { echo "============================================" echo " NAS 全自动部署脚本" echo "============================================" echo "" check_root check_network create_mount_point test_mount unload_old_daemon create_mounter_script create_launch_daemon create_smb_config load_launch_daemon verify_deployment echo "" log_info "🎉 全自动部署完成!" log_info "📝 常用命令:" log_info " 查看日志: tail -f /Users/chufeng/.openclaw/workspace-jiangwei/logs/nas_mount.log" log_info " 查看挂载: ls -la /Users/chufeng/nas/stock" log_info " 重启守护: sudo launchctl stop ${LAUNCH_DAEMON_LABEL} && sudo launchctl start ${LAUNCH_DAEMON_LABEL}" } main