#!/bin/sh
#
# S89meow_svcd - MeowOS 服务管理器协同启动 + 主机名应用 + 板载服务预置
#
# 位置：S70meow_sysui 之后、S90meow_bootmenu 之前（S70 < S84 < S89 < S90）。
#   * rcS 顺序执行 /etc/init.d/S??*，而 S90meow_bootmenu 里 `exec /usr/bin/meow_bootmenu
#     --fork` 会阻塞 rcS（选单后 exec meow_launcherd 或 fork 播放器监督），故任何 S90
#     之后的 init.d（如 S91/S92）**都不会执行**——svcd 必须排在 S90 之前。
#   * 本脚本只装「稳定框架/KB级设置」：主机名 + 板载服务配置
#     （/usr/data/meow/services.d/，Data 区，首启预置 mdnsd.conf）。
#   * **svcd 拉起权**：若 meow_sysui（系统进程总监）已运行 → svcd 由 sysui 监管拉起
#     （sysui.d/svcd.conf），本脚本仅在其已运行时 `meow_svcd reload` 让 svcd 补载 mdnsd.conf，
#     不重复拉起、不重挂（避免与 sysui 双重监护 svcd）。仅当 **sysui 未运行**时才回退到
#     现网的「重挂循环」自监护（旧固件/无 sysui 场景，向后兼容）。
#
# 红线：不 killall、不碰播放器信号、不刷机。svcd 以 -f 前台被 sysui（或重挂循环）拉起；
# 服务本身（mdnsd）由 svcd 按 restart=on-fail 托管。
#
case "$1" in
  start)
    echo -n "Starting meow_svcd (S89): "

    # 1) 应用主机名：读板载设置 system.hostname（settings.conf），缺省 meowos。
    #    须早于 meow_mdns 启动（mdnsd 默认用 gethostname() 公布 <host>.local）。
    host="meowos"
    if [ -f /usr/data/meow/settings.conf ]; then
        v=$(awk -F= '$1 ~ /^[[:space:]]*system\.hostname[[:space:]]*$/ {gsub(/[[:space:]]/,"",$2); print $2; exit}' /usr/data/meow/settings.conf)
        [ -n "$v" ] && host="$v"
    fi
    # 仅允许 RFC1035 首标签字符（A-Za-z0-9 和 '-'/'.'/'_'），否则回退 meowos
    case "$host" in
      ''|*[!A-Za-z0-9_.-]*) host="meowos" ;;
    esac
    sethostname "$host" 2>/dev/null || hostname "$host" 2>/dev/null
    echo -n "host=$host "

    # 2) 首启预置板载 mdnsd.conf（Data 区可写才建；已存在不覆盖）
    if [ -d /usr/data/meow ] && [ -w /usr/data/meow ]; then
        mkdir -p /usr/data/meow/services.d
        if [ -f /usr/data/meow/services.d/mdnsd.conf ]; then
            echo -n "mdnsd.conf exists "
        else
            cat > /usr/data/meow/services.d/mdnsd.conf <<'EOF'
exec=/usr/bin/meow_mdns
args=
enabled=1
restart=on-fail
backoff_ms=2000
max_restart=5
trigger=boot
cap=
EOF
            chmod 644 /usr/data/meow/services.d/mdnsd.conf
            echo -n "provisioned mdnsd.conf "
        fi
    else
        echo -n "skip mdnsd.conf (/usr/data/meow not writable) "
    fi

    # 3) svcd 拉起权判归：sysui 运行 → 交给 sysui 监管；否则回退重挂循环。
    rm -f /tmp/meow_svcd.stop
    sysui_alive=0
    if [ -x /usr/bin/meow_sysui ] && ps | grep -q "[m]eow_sysui"; then
        sysui_alive=1
    fi
    if [ "$sysui_alive" = "1" ]; then
        # svcd 由 meow_sysui 监管拉起；此处仅补载刚预置的 mdnsd.conf（若 svcd 已在跑）
        if [ -x /usr/bin/meow_svcd ]; then
            if [ -f /tmp/meow_svcd.pid ] && kill -0 "$(cat /tmp/meow_svcd.pid 2>/dev/null)" 2>/dev/null; then
                /usr/bin/meow_svcd reload 2>/dev/null
                echo -n "supervised by sysui (svcd running, reload) "
            else
                # svcd 未在跑：交给 sysui 按兜底（有限次重试）拉起，此处不干预，防双重拉起
                echo -n "defer to meow_sysui (svcd down) "
            fi
        else
            echo -n "MISSING /usr/bin/meow_svcd "
        fi
    elif [ -x /usr/bin/meow_svcd ]; then
        if [ -f /tmp/meow_svcd.pid ] && kill -0 "$(cat /tmp/meow_svcd.pid 2>/dev/null)" 2>/dev/null; then
            echo "already running"
        else
            ( while [ ! -f /tmp/meow_svcd.stop ]; do /usr/bin/meow_svcd -f; sleep 1; done ) &
            echo "started (supervisor pid $!)"
        fi
    else
        echo "MISSING /usr/bin/meow_svcd"
    fi
    ;;
  stop)
    echo -n "Stopping meow_svcd: "
    touch /tmp/meow_svcd.stop
    for p in $(ps | grep "[m]eow_svcd" | awk '{print $1}'); do kill "$p" 2>/dev/null; done
    echo "OK"
    ;;
  restart|reload)
    ;;
  *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac

exit 0
