- pre-op-guard.py: 前置操作守门人,人格体登录时锁定服务器,必须完成导航地图验证 - module-registry.hdlp: 模块编码体系 + 注册协议 - module-register.sh: 一键注册模块到服务器 - OPERATION-MANUAL.hdlp v1.1: 新增第八节 服务器操作前导航挑战 - INDEX.hdlp: 注册新文件 设计: 人格体登录 → 服务器自我审计 → 锁定 → 挑战:找出所有模块编码 人格体探索 → 收集编码 → 提交 → 服务器比对 一致 → 解锁 · 人格体知道全局地图 · 不会再改A坏B [SEC-CLEAN] · pre-op-guard 已就绪
123 lines
3.5 KiB
Bash
123 lines
3.5 KiB
Bash
#!/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}"
|
||
}
|