guanghulab/exe-engine/gatekeeper/gatekeeper-client.py
Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

121 lines
3.9 KiB
Python

#!/usr/bin/env python3
"""
gatekeeper-client — 成员服务器接入铸渊算力调度池
用法:
python3 gatekeeper-client.py --register --name YOUR_NAME --master 43.139.217.141:3910
python3 gatekeeper-client.py --status
"""
import json, os, sys, time, socket, uuid, hashlib, subprocess
from datetime import datetime
CONFIG_DIR = os.path.expanduser('~/.gatekeeper')
CONFIG_FILE = os.path.join(CONFIG_DIR, 'config.json')
def log(m):
print(f'[{datetime.now().strftime("%H:%M:%S")}] {m}', flush=True)
def ensure_dir():
os.makedirs(CONFIG_DIR, exist_ok=True)
def load_config():
try:
with open(CONFIG_FILE) as f:
return json.load(f)
except:
return {}
def save_config(cfg):
ensure_dir()
with open(CONFIG_FILE, 'w') as f:
json.dump(cfg, f, indent=2)
def register(name, master):
"""向主控闸门注册"""
log(f'注册到 {master}')
host, port = master.split(':')
port = int(port)
# 生成本机身份
node_id = str(uuid.uuid4())[:8]
key = hashlib.sha256((node_id + name + str(time.time())).encode()).hexdigest()[:32]
# 通过 socket 发送注册请求
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10)
s.connect((host, port))
req = json.dumps({
'action': 'register',
'name': name,
'node_id': node_id,
'key': key
})
s.sendall((req + '\n').encode())
resp = s.recv(4096).decode()
s.close()
data = json.loads(resp)
if data.get('status') == 'ok':
save_config({'name': name, 'node_id': node_id, 'key': key, 'master': master, 'status': 'registered'})
log('注册成功!身份密钥已保存在本地')
log(f'名称: {name}')
log(f'节点ID: {node_id}')
return True
else:
log(f'注册失败: {data.get("message", "?")}')
return False
except Exception as e:
log(f'连接失败: {e}')
log('请检查服务器是否能访问 ' + master)
return False
def show_status():
"""显示当前连接状态"""
cfg = load_config()
if not cfg:
log('未注册。请先运行: python3 gatekeeper-client.py --register --name YOUR_NAME --master IP:PORT')
return
log(f'名称: {cfg.get("name", "?")}')
log(f'节点ID: {cfg.get("node_id", "?")}')
log(f'主控闸门: {cfg.get("master", "?")}')
log(f'状态: {cfg.get("status", "?")}')
# 测试连接
master = cfg.get('master', '')
if master:
try:
host, port = master.split(':')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
s.connect((host, int(port)))
s.sendall(json.dumps({'action': 'ping', 'node_id': cfg.get('node_id')})['\n'].encode())
resp = s.recv(4096).decode()
s.close()
data = json.loads(resp)
if data.get('status') == 'ok':
log('连接: ✅ connected')
else:
log('连接: ❌ connection error')
except Exception as e:
log(f'连接: ❌ {e}')
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description='gatekeeper-client: 接入铸渊算力调度池')
parser.add_argument('--register', action='store_true', help='注册到主控闸门')
parser.add_argument('--name', help='你的名称 (如 awen)')
parser.add_argument('--master', default='43.139.217.141:3910', help='主控闸门地址')
parser.add_argument('--status', action='store_true', help='查看连接状态')
args = parser.parse_args()
if args.status:
show_status()
elif args.register:
if not args.name:
print('请提供 --name 参数')
sys.exit(1)
register(args.name, args.master)
else:
parser.print_help()