adding admin manager script since admin dashboard in server itself cannot do same shit that manager does
This commit is contained in:
278
admin_manager.py
Normal file
278
admin_manager.py
Normal file
@@ -0,0 +1,278 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Скрипт для управления административными учетными записями OldMarket
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import sqlite3
|
||||||
|
from getpass import getpass
|
||||||
|
import hashlib
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
# Добавляем путь к текущей директории для импорта моделей
|
||||||
|
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
|
||||||
|
def hash_password(password: str) -> str:
|
||||||
|
"""Хеширование пароля"""
|
||||||
|
return hashlib.sha256(password.encode()).hexdigest()
|
||||||
|
|
||||||
|
def get_db_connection():
|
||||||
|
"""Подключение к базе данных"""
|
||||||
|
db_path = "oldmarket.db"
|
||||||
|
if not os.path.exists(db_path):
|
||||||
|
print(f"❌ База данных {db_path} не найдена!")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
return sqlite3.connect(db_path)
|
||||||
|
|
||||||
|
def list_admins():
|
||||||
|
"""Показать список всех администраторов"""
|
||||||
|
conn = get_db_connection()
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
cursor.execute("SELECT id, username, created_at FROM admin_users ORDER BY id")
|
||||||
|
admins = cursor.fetchall()
|
||||||
|
|
||||||
|
if not admins:
|
||||||
|
print("📭 В системе нет администраторов")
|
||||||
|
return
|
||||||
|
|
||||||
|
print("\n📋 Список администраторов:")
|
||||||
|
print("-" * 50)
|
||||||
|
print(f"{'ID':<3} {'Имя пользователя':<20} {'Дата создания'}")
|
||||||
|
print("-" * 50)
|
||||||
|
|
||||||
|
for admin in admins:
|
||||||
|
admin_id, username, created_at = admin
|
||||||
|
print(f"{admin_id:<3} {username:<20} {created_at}")
|
||||||
|
|
||||||
|
def create_admin():
|
||||||
|
"""Создать нового администратора"""
|
||||||
|
print("\n👤 Создание нового администратора")
|
||||||
|
|
||||||
|
username = input("Введите имя пользователя: ").strip()
|
||||||
|
if not username:
|
||||||
|
print("❌ Имя пользователя не может быть пустым!")
|
||||||
|
return
|
||||||
|
|
||||||
|
password = getpass("Введите пароль: ")
|
||||||
|
if not password:
|
||||||
|
print("❌ Пароль не может быть пустым!")
|
||||||
|
return
|
||||||
|
|
||||||
|
confirm_password = getpass("Подтвердите пароль: ")
|
||||||
|
if password != confirm_password:
|
||||||
|
print("❌ Пароли не совпадают!")
|
||||||
|
return
|
||||||
|
|
||||||
|
conn = get_db_connection()
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
# Проверяем, существует ли пользователь
|
||||||
|
cursor.execute("SELECT id FROM admin_users WHERE username = ?", (username,))
|
||||||
|
if cursor.fetchone():
|
||||||
|
print(f"❌ Пользователь '{username}' уже существует!")
|
||||||
|
conn.close()
|
||||||
|
return
|
||||||
|
|
||||||
|
# Создаем нового администратора
|
||||||
|
password_hash = hash_password(password)
|
||||||
|
created_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
|
cursor.execute(
|
||||||
|
"INSERT INTO admin_users (username, password_hash, created_at) VALUES (?, ?, ?)",
|
||||||
|
(username, password_hash, created_at)
|
||||||
|
)
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
print(f"✅ Администратор '{username}' успешно создан!")
|
||||||
|
|
||||||
|
def delete_admin():
|
||||||
|
"""Удалить администратора"""
|
||||||
|
list_admins()
|
||||||
|
|
||||||
|
admin_id = input("\nВведите ID администратора для удаления: ").strip()
|
||||||
|
if not admin_id.isdigit():
|
||||||
|
print("❌ ID должен быть числом!")
|
||||||
|
return
|
||||||
|
|
||||||
|
conn = get_db_connection()
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
# Получаем информацию об администраторе
|
||||||
|
cursor.execute("SELECT username FROM admin_users WHERE id = ?", (admin_id,))
|
||||||
|
admin = cursor.fetchone()
|
||||||
|
|
||||||
|
if not admin:
|
||||||
|
print(f"❌ Администратор с ID {admin_id} не найден!")
|
||||||
|
conn.close()
|
||||||
|
return
|
||||||
|
|
||||||
|
username = admin[0]
|
||||||
|
|
||||||
|
# Проверяем, не пытаемся ли удалить последнего администратора
|
||||||
|
cursor.execute("SELECT COUNT(*) FROM admin_users")
|
||||||
|
admin_count = cursor.fetchone()[0]
|
||||||
|
|
||||||
|
if admin_count <= 1:
|
||||||
|
print("❌ Нельзя удалить последнего администратора!")
|
||||||
|
conn.close()
|
||||||
|
return
|
||||||
|
|
||||||
|
# Подтверждение удаления
|
||||||
|
confirm = input(f"⚠️ Вы уверены, что хотите удалить администратора '{username}' (ID: {admin_id})? (y/N): ")
|
||||||
|
if confirm.lower() != 'y':
|
||||||
|
print("❌ Удаление отменено")
|
||||||
|
conn.close()
|
||||||
|
return
|
||||||
|
|
||||||
|
# Удаляем администратора
|
||||||
|
cursor.execute("DELETE FROM admin_users WHERE id = ?", (admin_id,))
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
print(f"✅ Администратор '{username}' успешно удален!")
|
||||||
|
|
||||||
|
def change_password():
|
||||||
|
"""Изменить пароль администратора"""
|
||||||
|
list_admins()
|
||||||
|
|
||||||
|
admin_id = input("\nВведите ID администратора для смены пароля: ").strip()
|
||||||
|
if not admin_id.isdigit():
|
||||||
|
print("❌ ID должен быть числом!")
|
||||||
|
return
|
||||||
|
|
||||||
|
conn = get_db_connection()
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
# Проверяем существование администратора
|
||||||
|
cursor.execute("SELECT username FROM admin_users WHERE id = ?", (admin_id,))
|
||||||
|
admin = cursor.fetchone()
|
||||||
|
|
||||||
|
if not admin:
|
||||||
|
print(f"❌ Администратор с ID {admin_id} не найден!")
|
||||||
|
conn.close()
|
||||||
|
return
|
||||||
|
|
||||||
|
username = admin[0]
|
||||||
|
|
||||||
|
# Запрашиваем новый пароль
|
||||||
|
new_password = getpass(f"Введите новый пароль для '{username}': ")
|
||||||
|
if not new_password:
|
||||||
|
print("❌ Пароль не может быть пустым!")
|
||||||
|
conn.close()
|
||||||
|
return
|
||||||
|
|
||||||
|
confirm_password = getpass("Подтвердите новый пароль: ")
|
||||||
|
if new_password != confirm_password:
|
||||||
|
print("❌ Пароли не совпадают!")
|
||||||
|
conn.close()
|
||||||
|
return
|
||||||
|
|
||||||
|
# Обновляем пароль
|
||||||
|
new_password_hash = hash_password(new_password)
|
||||||
|
cursor.execute(
|
||||||
|
"UPDATE admin_users SET password_hash = ? WHERE id = ?",
|
||||||
|
(new_password_hash, admin_id)
|
||||||
|
)
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
print(f"✅ Пароль для администратора '{username}' успешно изменен!")
|
||||||
|
|
||||||
|
def reset_default_admin():
|
||||||
|
"""Сбросить пароль дефолтного администратора"""
|
||||||
|
print("\n🔄 Сброс пароля дефолтного администратора")
|
||||||
|
|
||||||
|
conn = get_db_connection()
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
# Проверяем существование администратора 'admin'
|
||||||
|
cursor.execute("SELECT id FROM admin_users WHERE username = 'admin'")
|
||||||
|
admin = cursor.fetchone()
|
||||||
|
|
||||||
|
if not admin:
|
||||||
|
# Создаем дефолтного администратора
|
||||||
|
password_hash = hash_password("admin123")
|
||||||
|
created_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
|
cursor.execute(
|
||||||
|
"INSERT INTO admin_users (username, password_hash, created_at) VALUES (?, ?, ?)",
|
||||||
|
("admin", password_hash, created_at)
|
||||||
|
)
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
print("✅ Дефолтный администратор 'admin' создан!")
|
||||||
|
print("🔑 Логин: admin")
|
||||||
|
print("🔑 Пароль: admin123")
|
||||||
|
print("⚠️ Смените пароль после первого входа!")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Сбрасываем пароль
|
||||||
|
new_password = "admin123"
|
||||||
|
new_password_hash = hash_password(new_password)
|
||||||
|
|
||||||
|
cursor.execute(
|
||||||
|
"UPDATE admin_users SET password_hash = ? WHERE username = 'admin'",
|
||||||
|
(new_password_hash,)
|
||||||
|
)
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
print("✅ Пароль дефолтного администратора сброшен!")
|
||||||
|
print("🔑 Логин: admin")
|
||||||
|
print("🔑 Пароль: admin123")
|
||||||
|
print("⚠️ Смените пароль после входа!")
|
||||||
|
|
||||||
|
def show_menu():
|
||||||
|
"""Показать меню управления"""
|
||||||
|
print("\n" + "="*50)
|
||||||
|
print("👑 УПРАВЛЕНИЕ АДМИНИСТРАТОРАМИ OLDMARKET")
|
||||||
|
print("="*50)
|
||||||
|
print("1. 📋 Список администраторов")
|
||||||
|
print("2. 👤 Создать администратора")
|
||||||
|
print("3. 🗑️ Удалить администратора")
|
||||||
|
print("4. 🔑 Изменить пароль")
|
||||||
|
print("5. 🔄 Сбросить дефолтного администратора")
|
||||||
|
print("6. ❌ Выход")
|
||||||
|
print("="*50)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Главная функция"""
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
show_menu()
|
||||||
|
choice = input("\nВыберите действие (1-6): ").strip()
|
||||||
|
|
||||||
|
if choice == '1':
|
||||||
|
list_admins()
|
||||||
|
elif choice == '2':
|
||||||
|
create_admin()
|
||||||
|
elif choice == '3':
|
||||||
|
delete_admin()
|
||||||
|
elif choice == '4':
|
||||||
|
change_password()
|
||||||
|
elif choice == '5':
|
||||||
|
reset_default_admin()
|
||||||
|
elif choice == '6':
|
||||||
|
print("\n👋 До свидания!")
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print("❌ Неверный выбор! Попробуйте снова.")
|
||||||
|
|
||||||
|
input("\nНажмите Enter для продолжения...")
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("\n\n👋 Программа прервана пользователем!")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"\n❌ Произошла ошибка: {e}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user