Files
NeveTimePanel/backend/migrate_users.py

243 lines
9.6 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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(" Проверьте ошибки выше и попробуйте снова")