#!/bin/sh
# ============================================================
#  Mac mini 服务器化 · 一键配置（幂等，可重复运行）
#  用法：Finder 里双击本文件 → 终端中先输 y 回车 → 再输登录密码（仅一次）
#  适用：macOS 13 及以上（已在 macOS 27 / Mac mini M6 实测）
# ------------------------------------------------------------
#   1) 清理孤儿数据（移入废纸篓）      2) 清空废纸篓
#   3) 开启 SSH                       4) 禁止休眠 / 断电恢复
#   5) 关闭 Siri                      6) 关闭 Spotlight 索引
#   7) 更新策略                       8) 开启屏幕共享（VNC 5900）
#   9) 开启防火墙并放行远程服务       10) 精简程序坞
#  11) 结果汇总与全部回滚命令
# ------------------------------------------------------------
#  幂等说明：每一步都先判断当前状态，已完成的项目会显示「已…」并跳过，
#            重复运行不会出错，也不会重复备份。
#  安全说明：所有删除动作都是 mv（移到废纸篓）；唯一的真删除是第 2 步
#            清空废纸篓，且失败时只提示你手动操作，不会用 rm -rf 动你的文件。
# ============================================================

export PATH="/usr/bin:/bin:/usr/sbin:/sbin:$PATH"

U="$(whoami)"
HOME_DIR="$HOME"
TRASH="$HOME_DIR/.Trash"
BACKUP_DIR="$HOME_DIR"                      # 程序坞备份落在主目录，可自行改
STAMP=$(date +%Y%m%d-%H%M%S)
DOCK_BACKUP="$BACKUP_DIR/dock-backup-$STAMP.plist"

FW=/usr/libexec/ApplicationFirewall/socketfilterfw
VNC_BIN="/System/Library/CoreServices/RemoteManagement/AppleVNCServer.bundle/Contents/MacOS/AppleVNCServer"

# 程序坞第 4 个图标：换成你自己想常驻的程序，不存在会自动跳过
DOCK_EXTRA="/Applications/WorkBuddy.app"

echo ""
echo "################################################################"
echo "#  Mac mini 服务器化配置"
echo "################################################################"
echo ""
echo "  【1】孤儿数据 → 废纸篓（已清理过会自动跳过）"
echo "        /Library/Audio/Apple Loops、Impulse Responses"
echo "        /Library/Application Support/iLifeMediaBrowser"
echo "  【2】清空废纸篓（不可逆！先确认没有要留的东西）"
echo "  【3】开启 SSH（远程登录）"
echo "  【4】禁止休眠 + 断电后自动开机"
echo "  【5】关闭 Siri"
echo "  【6】关闭 Spotlight 索引（副作用：mdfind 全盘搜索会失效）"
echo "  【7】更新策略：留安全响应，禁自动装系统大版本"
echo "  【8】开启屏幕共享（VNC 5900，局域网可远程控制图形界面）"
echo "  【9】开启防火墙，并放行 sshd / 屏幕共享"
echo "  【10】精简程序坞（自动备份，可还原）"
echo ""
echo "  注意：第 9 步开了防火墙之后，如果你的 SSH 端口不是默认 22，"
echo "        或后面还要用别的远程端口，请先改成对应端口再加放行规则。"
echo ""
printf "  确认执行？输入 y 回车："
read -r ans
case "$ans" in
  y|Y|yes|YES) ;;
  *) echo "  已取消，未做任何改动。"; echo ""; exit 0 ;;
esac

echo ""
echo "  正在申请管理员权限（请输入 Mac 登录密码，输入时不显示）..."
sudo -v || { echo "  授权失败，已退出。"; exit 1; }

BEFORE=$(df -k /System/Volumes/Data | tail -1 | awk '{print $4}')

# ===============================================================
echo ""
echo "############### 1. 清理孤儿数据 ###############"
for p in "/Library/Audio/Apple Loops" \
         "/Library/Audio/Impulse Responses" \
         "/Library/Application Support/iLifeMediaBrowser"; do
  if [ ! -e "$p" ]; then echo "  已清理 $p"; continue; fi
  base=$(basename "$p"); dest="$TRASH/$base"; n=1
  while [ -e "$dest" ]; do dest="$TRASH/$base.$n"; n=$((n+1)); done
  if sudo mv "$p" "$dest"; then
    echo "  完成   $p"; sudo chown -R "$U:staff" "$dest" 2>/dev/null
  else
    echo "  失败   $p"
  fi
done

# ===============================================================
echo ""
echo "############### 2. 清空废纸篓 ###############"
if osascript -e 'tell application "Finder" to empty the trash' >/dev/null 2>&1; then
  echo "  完成   废纸篓已清空"
else
  echo "  Finder 方式失败。请手动：右键「废纸篓」→「清倒废纸篓」。"
  echo "  本脚本不会用 rm -rf 替你删除个人文件。"
fi

# ===============================================================
echo ""
echo "############### 3. 开启 SSH ###############"
sudo launchctl enable system/com.openssh.sshd 2>/dev/null
sudo launchctl bootstrap system /System/Library/LaunchDaemons/ssh.plist 2>/dev/null
sudo systemsetup -setremotelogin on >/dev/null 2>&1
# 验证端口必须用 nc：不带 sudo 的 lsof 看不到 root 进程的监听端口
if nc -z -G 2 127.0.0.1 22 2>/dev/null; then
  echo "  验证   ✓ 端口 22 在监听"
  echo "         $(echo '' | nc -w 2 127.0.0.1 22 2>/dev/null | head -1)"
else
  echo "  验证   ✗ 端口 22 未监听 → 请到「系统设置 → 通用 → 共享 → 远程登录」手动打开"
fi

# ===============================================================
echo ""
echo "############### 4. 禁止休眠 / 断电恢复 ###############"
sudo pmset -a sleep 0 disksleep 0 powernap 0 womp 1 autorestart 1 tcpkeepalive 1
pmset -g | grep -E "(sleep|disksleep|autorestart|womp|powernap|tcpkeepalive)" | sed 's/^/    /'
echo "  提示   若这里显示 sleep prevented by <某程序>，说明有程序持有电源断言，"
echo "         去 pmset -g assertions 看「Listed by owning process」才是真相。"

# ===============================================================
echo ""
echo "############### 5. 关闭 Siri ###############"
sudo -u "$U" defaults write com.apple.assistant.support "Assistant Enabled" -bool false 2>/dev/null
sudo -u "$U" defaults write com.apple.Siri "Siri Data Sharing Opt-In Status" -int 2 2>/dev/null
sudo -u "$U" defaults write com.apple.Siri "VoiceTriggerUserEnabled" -bool false 2>/dev/null
sudo -u "$U" killall Siri 2>/dev/null
echo "  完成   已写入关闭键值（可在「系统设置 → Apple 智能与 Siri」确认显示为关闭）"

# ===============================================================
echo ""
echo "############### 6. 关闭 Spotlight 索引 ###############"
sudo mdutil -a -i off 2>&1 | sed 's/^/    /'
echo "  副作用 关索引后 mdfind 会返回空（不是文件不存在），改用 find"

# ===============================================================
echo ""
echo "############### 7. 自动更新策略 ###############"
sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate AutomaticCheckEnabled -bool true
sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate AutomaticDownload -bool false
sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate AutomaticallyInstallMacOSUpdates -bool false
sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate CriticalUpdateInstall -bool true
sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate ConfigDataInstall -bool true
sudo defaults write /Library/Preferences/com.apple.commerce AutoUpdate -bool false
echo "  完成   保留安全响应(CRS/Critical)，禁止自动安装系统大版本升级"

# ===============================================================
echo ""
echo "############### 8. 开启屏幕共享（远程桌面）###############"
sudo launchctl enable system/com.apple.screensharing 2>/dev/null
sudo launchctl bootstrap system /System/Library/LaunchDaemons/com.apple.screensharing.plist 2>/dev/null
if ! nc -z -G 2 127.0.0.1 5900 2>/dev/null; then
  echo "  首次未起效，尝试 kickstart 唤醒..."
  sudo launchctl kickstart -k system/com.apple.screensharing 2>/dev/null
fi

# 允许本机所有账户连接（仍必须输入该账户的登录密码）
sudo defaults write /Library/Preferences/com.apple.RemoteManagement ScreenSharingReqPerm -bool false
sudo defaults write /Library/Preferences/com.apple.RemoteManagement ARD_AllLocalUsers -bool true

IP=$(ipconfig getifaddr en0 2>/dev/null)
if nc -z -G 2 127.0.0.1 5900 2>/dev/null; then
  echo "  验证   ✓ 端口 5900 在监听，屏幕共享已可用"
  [ -n "$IP" ] && echo "         连接方式：访达 → 前往 → 连接服务器 → vnc://$IP"
  [ -n "$IP" ] && echo "         或另一台 Mac 打开「屏幕共享」App 输入 $IP"
else
  echo "  验证   ✗ 端口 5900 未监听 → 请到「系统设置 → 通用 → 共享 → 屏幕共享」手动打开"
fi
echo "  安全提醒：当前允许本机所有账户连接（仍需知道该账户密码）。"
echo "            想收紧就改成只允许指定用户；这类远程入口请务必保持更新。"

# ===============================================================
echo ""
echo "############### 9. 开启防火墙并放行远程服务 ###############"
echo "  先加放行规则，再开防火墙（顺序反了会把自己锁在外面）..."
$FW --add /usr/sbin/sshd >/dev/null 2>&1
$FW --unblockapp /usr/sbin/sshd >/dev/null 2>&1
echo "  放行   /usr/sbin/sshd"
if [ -e "$VNC_BIN" ]; then
  $FW --add "$VNC_BIN" >/dev/null 2>&1
  $FW --unblockapp "$VNC_BIN" >/dev/null 2>&1
  echo "  放行   AppleVNCServer（屏幕共享）"
fi
sudo $FW --setglobalstate on >/dev/null 2>&1
echo ""
$FW --getglobalstate 2>&1 | sed 's/^/    /'
echo "  当前放行列表："
$FW --listapps 2>&1 | grep -B1 "Allow incoming connections" | grep -E "^ *[0-9]+ :" | sed 's/^/    /'
echo ""
echo "  连通性验证（走局域网 IP，回环流量不经过防火墙，测了等于没测）："
if [ -n "$IP" ]; then
  for pr in 22 5900; do
    if nc -z -G 3 "$IP" $pr 2>/dev/null; then echo "    ✓ $IP:$pr 可连通"; else echo "    ✗ $IP:$pr 不通"; fi
  done
else
  echo "    未取到以太网 IP（en0），跳过"
fi

# ===============================================================
echo ""
echo "############### 10. 精简程序坞 ###############"
if defaults export com.apple.dock "$DOCK_BACKUP" 2>/dev/null; then
  echo "  备份   $DOCK_BACKUP"
  defaults write com.apple.dock persistent-apps -array
  add() {
    defaults write com.apple.dock persistent-apps -array-add \
"<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>file://$1/</string><key>_CFURLStringType</key><integer>15</integer></dict></dict><key>tile-type</key><string>file-tile</string></dict>" \
      && echo "  添加   $(basename "$1")"
  }
  # 访达不在 persistent-apps 里（系统硬编码第一位），重建时无需包含
  add "/System/Applications/Utilities/Terminal.app"
  add "/System/Applications/Utilities/Activity Monitor.app"
  add "/System/Applications/System Settings.app"
  if [ -e "$DOCK_EXTRA" ]; then
    add "$DOCK_EXTRA"
  else
    echo "  跳过   $DOCK_EXTRA （不存在，改脚本顶部的 DOCK_EXTRA 即可）"
  fi
  defaults write com.apple.dock show-recents -bool false
  killall Dock 2>/dev/null && echo "  完成   Dock 已重启生效"
else
  echo "  备份失败，已跳过程序坞精简"
fi

# ===============================================================
echo ""
echo "############### 汇总 ###############"
echo ""
echo "--- /Applications ---"; ls -1 /Applications | sed 's/^/    /'
echo ""
echo "--- 对外服务端口 ---"
for pr in 22 5900; do
  nc -z -G 2 127.0.0.1 $pr 2>/dev/null && echo "    ✓ $pr 监听中" || echo "    ✗ $pr 未监听"
done
echo ""
echo "--- 程序坞 ---"
defaults read com.apple.dock persistent-apps 2>/dev/null | grep -A1 '_CFURLString"' \
  | grep -o 'file://[^"]*' | sed 's|file://||; s|/$||' | sed 's/^/    /'
echo ""

AFTER=$(df -k /System/Volumes/Data | tail -1 | awk '{print $4}')
echo "  本次释放约 $(( (AFTER - BEFORE) / 1024 )) MB"
df -h /System/Volumes/Data | sed 's/^/  /'
echo ""

echo "################################################################"
echo "#  回滚命令（需要时逐条执行）"
echo "################################################################"
echo "  关闭屏幕共享   : sudo launchctl bootout system/com.apple.screensharing; sudo launchctl disable system/com.apple.screensharing"
echo "  关闭防火墙     : sudo $FW --setglobalstate off"
echo "  取消放行       : sudo $FW --remove /usr/sbin/sshd"
echo "  关闭 SSH       : sudo systemsetup -setremotelogin off"
echo "  恢复索引       : sudo mdutil -a -i on"
echo "  恢复休眠       : sudo pmset -a sleep 1 disksleep 10 powernap 1"
echo "  恢复自动升级   : sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate AutomaticallyInstallMacOSUpdates -bool true"
echo "  还原程序坞     : defaults import com.apple.dock \"$DOCK_BACKUP\" && killall Dock"
echo ""
echo "  SSH 连接：ssh $U@${IP:-<本机IP>}"
echo "  屏幕共享：vnc://${IP:-<本机IP>}"
echo "  主机名可用：scutil --get LocalHostName 查看（形如 xxx.local）"
echo "################################################################"
echo ""
