122 lines
3.5 KiB
Shell
122 lines
3.5 KiB
Shell
|
|
#!/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}"
|
|||
|
|
}
|