#!/usr/bin/env python3 """ Скрипт миграции пользователей для MC Panel v1.1.0 Добавляет роль владельца и систему прав """ import json from pathlib import Path from datetime import datetime def migrate_users(): """Миграция пользователей на новую систему прав""" users_file = Path("users.json") # Проверка существования файла if not users_file.exists(): print("❌ Файл users.json не найден") print("ℹ️ Создайте файл users.json или запустите панель для автоматического создания") return False # Создание backup backup_file = Path(f"users_backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json") try: with open(users_file, "r", encoding="utf-8") as f: backup_data = f.read() with open(backup_file, "w", encoding="utf-8") as f: f.write(backup_data) print(f"✅ Backup создан: {backup_file}") except Exception as e: print(f"❌ Ошибка создания backup: {e}") return False # Загрузка пользователей try: with open(users_file, "r", encoding="utf-8") as f: users_data = json.load(f) except json.JSONDecodeError: print("❌ Ошибка чтения users.json - неверный формат JSON") return False except Exception as e: print(f"❌ Ошибка чтения файла: {e}") return False # Проверка формата (объект или список) if isinstance(users_data, dict): # Формат: {"username": {...}} users_list = list(users_data.values()) is_dict_format = True print("ℹ️ Обнаружен формат: объект (словарь)") elif isinstance(users_data, list): # Формат: [{...}, {...}] users_list = users_data is_dict_format = False print("ℹ️ Обнаружен формат: список") else: print("❌ Неизвестный формат users.json") return False if not users_list: print("ℹ️ Нет пользователей для миграции") return True print(f"\n📊 Найдено пользователей: {len(users_list)}") print("=" * 50) # Миграция первого пользователя (владелец) if users_list: first_user = users_list[0] print(f"\n👑 Назначение владельца: {first_user.get('username', 'Unknown')}") first_user["role"] = "owner" first_user["permissions"] = { "manage_users": True, "manage_roles": True, "manage_servers": True, "manage_tickets": True, "manage_files": True, "delete_users": True, "view_all_resources": True } if "resource_access" not in first_user: first_user["resource_access"] = { "servers": first_user.get("servers", []), "tickets": [], "files": [] } # Миграция остальных пользователей for i, user in enumerate(users_list[1:], start=2): username = user.get("username", f"User{i}") current_role = user.get("role", "user") print(f"\n👤 Пользователь {i}: {username}") print(f" Текущая роль: {current_role}") # Установка роли по умолчанию if "role" not in user or user["role"] not in ["admin", "support", "user", "banned"]: user["role"] = "user" print(f" ➜ Установлена роль: user") # Добавление прав if "permissions" not in user: if user["role"] == "admin": user["permissions"] = { "manage_users": True, "manage_roles": False, "manage_servers": True, "manage_tickets": True, "manage_files": True, "delete_users": False, "view_all_resources": True } print(" ➜ Добавлены права администратора") elif user["role"] == "support": user["permissions"] = { "manage_users": False, "manage_roles": False, "manage_servers": False, "manage_tickets": True, "manage_files": False, "delete_users": False, "view_all_resources": False } print(" ➜ Добавлены права поддержки") elif user["role"] == "banned": user["permissions"] = { "manage_users": False, "manage_roles": False, "manage_servers": False, "manage_tickets": False, "manage_files": False, "delete_users": False, "view_all_resources": False } print(" ➜ Пользователь заблокирован") else: # user user["permissions"] = { "manage_users": False, "manage_roles": False, "manage_servers": True, "manage_tickets": True, "manage_files": True, "delete_users": False, "view_all_resources": False } print(" ➜ Добавлены права пользователя") # Добавление доступа к ресурсам if "resource_access" not in user: user["resource_access"] = { "servers": user.get("servers", []), "tickets": [], "files": [] } print(" ➜ Добавлен доступ к ресурсам") # Сохранение в правильном формате try: if is_dict_format: # Сохраняем обратно как объект users_dict = {user["username"]: user for user in users_list} with open(users_file, "w", encoding="utf-8") as f: json.dump(users_dict, f, indent=2, ensure_ascii=False) else: # Сохраняем как список with open(users_file, "w", encoding="utf-8") as f: json.dump(users_list, f, indent=2, ensure_ascii=False) print("\n" + "=" * 50) print("✅ Миграция успешно завершена!") print(f"✅ Обновлено пользователей: {len(users_list)}") print(f"👑 Владелец: {users_list[0]['username']}") print(f"📁 Backup: {backup_file}") return True except Exception as e: print(f"\n❌ Ошибка сохранения: {e}") print(f"ℹ️ Восстановите из backup: {backup_file}") return False def show_users(): """Показать список пользователей после миграции""" users_file = Path("users.json") if not users_file.exists(): print("❌ Файл users.json не найден") return try: with open(users_file, "r", encoding="utf-8") as f: users_data = json.load(f) except Exception as e: print(f"❌ Ошибка чтения файла: {e}") return # Преобразуем в список если это объект if isinstance(users_data, dict): users_list = list(users_data.values()) else: users_list = users_data print("\n" + "=" * 50) print("📋 СПИСОК ПОЛЬЗОВАТЕЛЕЙ") print("=" * 50) for i, user in enumerate(users_list, start=1): print(f"\n{i}. {user.get('username', 'Unknown')}") print(f" Роль: {user.get('role', 'unknown')}") print(f" Права:") for perm, value in user.get('permissions', {}).items(): status = "✅" if value else "❌" print(f" {status} {perm}") # Показать доступ к ресурсам resource_access = user.get('resource_access', {}) if resource_access: servers = resource_access.get('servers', []) if servers: print(f" Серверы: {', '.join(servers)}") if __name__ == "__main__": print("=" * 50) print("MC Panel - Миграция пользователей v1.1.0") print("=" * 50) # Запуск миграции success = migrate_users() if success: # Показать результат show_users() print("\n" + "=" * 50) print("📝 СЛЕДУЮЩИЕ ШАГИ:") print("=" * 50) print("1. Перезапустите панель") print("2. Войдите как владелец") print("3. Проверьте права пользователей") print("4. Настройте доступ к ресурсам") print("\n✨ Готово!") else: print("\n❌ Миграция не выполнена") print("ℹ️ Проверьте ошибки выше и попробуйте снова")