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

122 lines
3.5 KiB
Shell
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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}"
}