#!/bin/bash
# POS-172：开机挂载现状的只读探测，由设备命令 FSTAB_PROBE 以 aaden 跑（不 sudo、不接受参数）。
# 给 TSE 挂载补 nofail 之前，先摸清全网 /etc/fstab 和 TSE 盘是怎么挂的。只读文件、只跑查询命令，不改任何东西。
#
# fstab 里的口令类选项（password= / pass= / credentials= / username= 等）在设备上就打码，不回传；
# 其余内容（含网络盘地址）照原样回传，云端出报告时再打码。
# 输出分段，每段以「== 段名」开头，云端按段解析；每段都限长，整份远小于命令输出上限 60KB。
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
export LC_ALL=C

section() { echo "== $1"; }
# 口令类选项打码：key=value 里的 value 换成 ***（逗号、空白为界）
mask() { sed -E 's/((^|[ ,])(password|passwd|pass|credentials|cred|username|user|domain|sec|secret)=)[^ ,]*/\1***/Ig'; }
cap() { head -c "${1:-8000}"; }

section version
echo "probe=1"

section os_release
grep -E '^(PRETTY_NAME|NAME|VERSION_ID|ID)=' /etc/os-release 2>/dev/null
section aadenos
# AadenOS 是用 Cubic 定制的 Ubuntu：有的在 os-release 里，有的只在 /etc/lsb-release 或 issue 里
grep -i -h 'aaden\|cubic' /etc/lsb-release /etc/issue /etc/os-release 2>/dev/null | cap 600
section proc_version
cap 400 </proc/version
section wsl
if grep -qi microsoft /proc/version 2>/dev/null; then echo "wsl=1"; else echo "wsl=0"; fi
[ -f /etc/wsl.conf ] && { echo "--- /etc/wsl.conf"; mask </etc/wsl.conf | cap 1500; }
section uptime
cut -d. -f1 /proc/uptime
section systemd
# systemd 不是 1 号进程（老 WSL）时 fstab 走的是另一套
echo "pid1=$(cat /proc/1/comm 2>/dev/null)"

section fstab
if [ -r /etc/fstab ]; then
  ls -l --time-style=+%F /etc/fstab 2>/dev/null
  echo "--- 非注释行"
  grep -v -E '^[[:space:]]*(#|$)' /etc/fstab | mask | cap 8000
  echo "--- 行数 total=$(wc -l </etc/fstab) active=$(grep -c -v -E '^[[:space:]]*(#|$)' /etc/fstab)"
else
  echo "unreadable"
fi
section fstab_backups
ls -l --time-style=+%F /etc/fstab* 2>/dev/null | cap 1500
# 最早的备份和现在的差异（mountTSE.sh 每次都写 /etc/fstab.backup；v1.0.130 曾整个覆盖 fstab）
if [ -r /etc/fstab.backup ]; then
  echo "--- diff fstab.backup fstab"
  diff <(grep -v -E '^[[:space:]]*(#|$)' /etc/fstab.backup | mask) <(grep -v -E '^[[:space:]]*(#|$)' /etc/fstab | mask) | cap 3000
fi

section lsblk
lsblk -e 7 -P -o NAME,SIZE,TYPE,FSTYPE,UUID,LABEL,MOUNTPOINT,RM,TRAN,MODEL 2>&1 | cap 6000
section blkid
# 非 root 时 blkid 读的是缓存，可能不全；lsblk 走 udev，一般能拿到 UUID
blkid 2>&1 | cap 4000
section by_uuid
ls -l /dev/disk/by-uuid/ 2>/dev/null | awk 'NR>1{print $9, $11}' | cap 3000
section swissbit_mount
findmnt -n -o SOURCE,TARGET,FSTYPE,OPTIONS /media/aaden/SWISSBIT 2>&1 | cap 600
ls -ld /media/aaden/SWISSBIT 2>&1
grep -i -h 'swissbit\|/media/aaden' /proc/mounts 2>/dev/null | cap 1000

section mount_units
systemctl list-units --type=mount --all --no-legend --no-pager 2>/dev/null | grep -i -E 'swiss|media|tse' | cap 2000
echo "--- 自定义 mount / automount unit"
ls -1 /etc/systemd/system/*.mount /etc/systemd/system/*.automount 2>/dev/null | cap 2000
for f in /etc/systemd/system/*.mount; do
  [ -f "$f" ] || continue
  grep -qi 'swissbit\|/media/aaden' "$f" && { echo "--- $f"; mask <"$f" | cap 1500; }
done
section udev_rules
ls -1 /etc/udev/rules.d/ 2>/dev/null | cap 2000
grep -l -i 'swissbit\|tse\|/media/aaden' /etc/udev/rules.d/* 2>/dev/null | while read -r f; do
  echo "--- $f"; mask <"$f" | cap 1500
done
section failed_units
systemctl --failed --no-legend --no-pager 2>/dev/null | cap 2000
section swap
swapon --show --noheadings 2>/dev/null | cap 1000
ls -l /swapfile /swap.img 2>/dev/null
section end
exit 0
