import hashlib import json import os import sys from pathlib import Path sys.path.insert(0, '/www/server/xingyu-im/ops') from baota_publish_test_users import BT, WEB, database, digest, env_values, query backup = Path('/www/backup/xingyu-application-20260831-121140') state = json.loads((backup / 'result.json').read_text()) expected = state['backendSha256'] assert digest(BT / 'xingyu-api') == expected assert str((WEB / 'admin').resolve()) == state['admin'] assert str((WEB / 'app').resolve()) == state['h5'] running = [] for proc in Path('/proc').iterdir(): if not proc.name.isdigit(): continue try: if os.readlink(str(proc / 'exe')) == str(BT / 'xingyu-api'): assert digest(proc / 'exe') == expected running.append(int(proc.name)) except (FileNotFoundError, PermissionError): pass assert len(running) == 1, 'expected one process running the released executable' conn, _ = database(env_values()) try: migrations = dict(query(conn, 'SELECT version,checksum FROM schema_migrations')) for name in state['migrationsApplied']: assert migrations[name] == digest(BT / 'migrations' / name) counts = {} for table in ['users', 'admin_users', 'user_sessions', 'orders', 'posts']: counts[table] = query(conn, 'SELECT COUNT(*) FROM ' + table)[0][0] cos_count = query(conn, "SELECT COUNT(*) FROM users u JOIN user_profiles p ON p.user_id=u.id WHERE u.is_test=1 AND p.avatar_url LIKE 'https://gz-1349751149.cos.ap-guangzhou.myqcloud.com/media/test-users/cn-adults-20260831-v1/%%'")[0][0] assert cos_count == 100 permission_count = query(conn, "SELECT COUNT(*) FROM admin_role_permissions rp JOIN admin_roles r ON r.id=rp.role_id WHERE r.role_code='super_admin' AND rp.permission_code='users:create'")[0][0] assert permission_count == 1 assert backup.stat().st_mode & 0o777 == 0o700 assert (backup / 'im.sql.gz').stat().st_size > 0 assert (backup / 'im.sql.gz').stat().st_mode & 0o777 == 0o600 print(json.dumps({'release': state, 'runningPids': running, 'migrationsRecorded': len(migrations), 'recordCounts': counts, 'testCosAvatars': cos_count, 'superAdminCreateUserPermission': True, 'backupProtected': True})) finally: conn.close()