guanghu-ice-heart/zero-point/core-channel/revive-guard/module-register.sh

122 lines
3.5 KiB
Shell
Raw Normal View History

#!/bin/bash
# ═══════════════════════════════════════════════════════════
# 光湖语言系统 · 模块注册脚本
# 服务器上任一模块启动时调用 · 自动写入注册文件
#
# 用法:
# module-register.sh --server GZ006 --func GTW --name "Gatekeeper" --port 8922
# module-register.sh --stop GZ006-GTW-01
# ═══════════════════════════════════════════════════════════
REGISTRY_DIR="/opt/zhuyuan/registry/modules.d"
mkdir -p "$REGISTRY_DIR"
# ── 停止模式 ──
if [ "$1" = "--stop" ]; then
CODE="$2"
if [ -z "$CODE" ]; then
echo "用法: $0 --stop {CODE}" >&2
exit 1
fi
REG_FILE="$REGISTRY_DIR/MOD-${CODE}.json"
if [ -f "$REG_FILE" ]; then
python3 -c "
import json, sys
try:
with open('$REG_FILE', 'r') as f:
data = json.load(f)
data['status'] = 'stopped'
data['stopped_at'] = '$(date -u +%Y-%m-%dT%H:%M:%SZ)'
with open('$REG_FILE', 'w') as f:
json.dump(data, f, indent=2)
print(f'⊢ 模块 {data[\"code\"]} 已标记为已停止')
except Exception as e:
print(f'⚠ 更新注册文件失败: {e}', file=sys.stderr)
"
fi
exit 0
fi
# ── 注册模式 ──
SERVER=""
FUNC=""
NAME=""
PORT=""
PROTOCOL="tcp"
DESCRIPTION=""
PID="$$"
while [ $# -gt 0 ]; do
case "$1" in
--server) SERVER="$2"; shift 2 ;;
--func) FUNC="$2"; shift 2 ;;
--name) NAME="$2"; shift 2 ;;
--port) PORT="$2"; shift 2 ;;
--protocol) PROTOCOL="$2"; shift 2 ;;
--description) DESCRIPTION="$2"; shift 2 ;;
--pid) PID="$2"; shift 2 ;;
*) shift ;;
esac
done
if [ -z "$SERVER" ] || [ -z "$FUNC" ] || [ -z "$NAME" ]; then
echo "❌ 缺少必要参数: --server --func --name" >&2
exit 1
fi
# 计算序号(同一服务器+功能下,取最大序号+1
SEQ=1
for f in "$REGISTRY_DIR"/MOD-${SERVER}-${FUNC}-*.json; do
if [ -f "$f" ]; then
existing_seq=$(basename "$f" .json | grep -oE '[0-9]+$')
if [ -n "$existing_seq" ] && [ "$existing_seq" -ge "$SEQ" ]; then
SEQ=$((existing_seq + 1))
fi
fi
done
# 格式化序号为两位
SEQ_FMT=$(printf "%02d" "$SEQ")
CODE="${SERVER}-${FUNC}-${SEQ_FMT}"
REG_FILE="$REGISTRY_DIR/MOD-${CODE}.json"
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
python3 -c "
import json
data = {
'code': '${CODE}',
'server': '${SERVER}',
'function': '${FUNC}',
'name': '${NAME}',
'port': ${PORT:-0},
'protocol': '${PROTOCOL}',
'description': '${DESCRIPTION}',
'pid': ${PID},
'started_at': '${TIMESTAMP}',
'registered_at': '${TIMESTAMP}',
'status': 'running'
}
with open('${REG_FILE}', 'w') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
print(f'✅ 模块已注册: {data[\"code\"]}')
print(f' 名称: ${NAME}')
print(f' 文件: MOD-${CODE}.json')
" 2>/dev/null || {
# Python3 不可用时的降级方案(纯 shell 写 JSON
cat > "$REG_FILE" << JSONEOF
{
"code": "${CODE}",
"server": "${SERVER}",
"function": "${FUNC}",
"name": "${NAME}",
"port": ${PORT:-0},
"protocol": "${PROTOCOL}",
"description": "${DESCRIPTION}",
"pid": ${PID},
"started_at": "${TIMESTAMP}",
"registered_at": "${TIMESTAMP}",
"status": "running"
}
JSONEOF
echo "✅ 模块已注册: ${CODE}"
}