243 lines
9.6 KiB
Python
243 lines
9.6 KiB
Python
#!/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("ℹ️ Проверьте ошибки выше и попробуйте снова")
|