From ed9df35b3ae398e0fc7b0b0d0e1d738825dec354 Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 29 Mar 2026 19:06:11 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?BOT=5FFAZANA=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOT_FAZANA/on.sh | 19 +++++++ BOT_FAZANA/rollback.sh | 123 +++++++++++++++++++++++++++++++++++++++++ BOT_FAZANA/start.sh | 3 + BOT_FAZANA/test.py | 116 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 261 insertions(+) create mode 100644 BOT_FAZANA/on.sh create mode 100644 BOT_FAZANA/rollback.sh create mode 100644 BOT_FAZANA/start.sh create mode 100644 BOT_FAZANA/test.py diff --git a/BOT_FAZANA/on.sh b/BOT_FAZANA/on.sh new file mode 100644 index 0000000..e5f4302 --- /dev/null +++ b/BOT_FAZANA/on.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# CONFIG +USERNAME="root" +PASSWD="Porolonka330" # Удалите эту строку, если используете SSH-ключи +HOSTS=("10.0.9.236" "10.0.8.93" "10.0.14.39" "10.0.7.32" "10.0.15.83" "10.0.13.170" "10.0.13.226" "10.0.7.47" "10.0.3.166" "10.0.15.139" "10.0.8.30" "10.0.2.143" "10.0.10.105" "10.0.5.178" "10.0.17.221" "10.0.11.77" "10.0.17.134" "10.0.18.12") +USER="m1" # RLNAME для всех хостов +remote_command="pveum usermod m1@pve -enable 1" + +for i in ""${!HOSTS[@]}""; do + host=""${HOSTS[$i]}"" + sshpass -p "$PASSWD" ssh -o StrictHostKeyChecking=no "$USERNAME@$host" "$remote_command" + #ssh -o StrictHostKeyChecking=no "$USERNAME@$host" "$remote_command" + + echo "Выполнено: ssh $USERNAME@$host \"$remote_command\"" +done + +echo "Скрипт завершен." + diff --git a/BOT_FAZANA/rollback.sh b/BOT_FAZANA/rollback.sh new file mode 100644 index 0000000..8025a98 --- /dev/null +++ b/BOT_FAZANA/rollback.sh @@ -0,0 +1,123 @@ +#!/bin/bash + +# Список серверов для сканирования +SERVER_IPS=("10.0.1.1" "10.0.1.2" "10.0.1.3" "10.0.1.4") + +# Пароль для sshpass +SSH_PASS="Gladious123" + +# Функция для проверки наличия VMID на сервере +check_vmid_on_server() { + local server_ip="$1" + local target_vmid="$2" + + if sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no root@"$server_ip" "qm list | awk 'NR>1 {print \$1}'" | grep -q "^${target_vmid}$"; then + echo "VMID $target_vmid найден на сервере $server_ip." + return 0 # Успех + else + echo "VMID $target_vmid не найден на сервере $server_ip." + return 1 # Неудача + fi +} + +# Функция для отката VM до snapshot DEFAULT и запуска VM на сервере +rollback_and_start_vmid_on_server() { + local server_ip="$1" + local target_vmid="$2" + + echo "Выполняется откат VMID $target_vmid до snapshot DEFAULT на сервере $server_ip..." + sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no root@"$server_ip" "qm rollback $target_vmid DEFAULT" + local rollback_ret=$? + if [ $rollback_ret -eq 0 ]; then + echo "Откат VMID $target_vmid на сервере $server_ip выполнен успешно." + + # Ожидание завершения отката + sleep 5 + + # Проверка, что VM не запущена перед попыткой запуска + VM_STATUS=$(sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no root@"$server_ip" "qm status $target_vmid | grep 'status:' | awk '{print \$2}'") + + if [ "$VM_STATUS" == "running" ]; then + echo "VMID $target_vmid уже запущена на сервере $server_ip." + else + echo "Запуск VMID $target_vmid на сервере $server_ip..." + sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no root@"$server_ip" "qm start $target_vmid" + local start_ret=$? + if [ $start_ret -eq 0 ]; then + echo "VMID $target_vmid запущена на сервере $server_ip успешно." + else + echo "Ошибка при запуске VMID $target_vmid на сервере $server_ip." + return $start_ret + fi + fi + else + echo "Ошибка при откате VMID $target_vmid на сервере $server_ip." + return $rollback_ret + fi + return 0 +} + +# Обработка аргументов командной строки +while getopts "t:" opt; do + case "$opt" in + t) + # Сохраняем первый аргумент + VMIDS=("$OPTARG") + # Добавляем оставшиеся аргументы + while [ "$#" -gt 1 ]; do + shift + if [[ "$1" != -* ]]; then + VMIDS+=("$1") + else + break + fi + done + ;; + \?) + echo "Неверный параметр: -$OPTARG" >&2 + echo "Использование: $0 -t [ ...]" + exit 1 + ;; + :) + echo "Параметр -$OPTARG требует аргумент." >&2 + echo "Использование: $0 -t [ ...]" + exit 1 + ;; + esac +done + +# Проверка наличия хотя бы одного VMID +if [ ${#VMIDS[@]} -eq 0 ]; then + echo "Ошибка: Не указан VMID. Используйте -t [ ...]" >&2 + echo "Использование: $0 -t [ ...]" + exit 1 +fi + +# Обрабатываем каждый VMID по очереди +for TARGET_VMID in "${VMIDS[@]}"; do + echo "Обработка VMID: $TARGET_VMID" + + # Массив для хранения найденных экземпляров текущего VMID + found_vmid_servers=() + + # Сканирование серверов + for server_ip in "${SERVER_IPS[@]}"; do + if check_vmid_on_server "$server_ip" "$TARGET_VMID"; then + # Если нашли VMID, добавляем IP в массив + found_vmid_servers+=("$server_ip") + fi + done + + # Выполняем откат и запуск только на серверах, где VMID был найден + if [ ${#found_vmid_servers[@]} -gt 0 ]; then + for server_ip in "${found_vmid_servers[@]}"; do + rollback_and_start_vmid_on_server "$server_ip" "$TARGET_VMID" + done + else + echo "VMID $TARGET_VMID не найден ни на одном сервере." + fi + echo "Завершена обработка VMID: $TARGET_VMID" + echo "-----------------------------------------" +done + +exit 0 diff --git a/BOT_FAZANA/start.sh b/BOT_FAZANA/start.sh new file mode 100644 index 0000000..384c06c --- /dev/null +++ b/BOT_FAZANA/start.sh @@ -0,0 +1,3 @@ +#!/bin/bash +source /root/bot/venv/bin/activate +python3 /root/bot/test.py diff --git a/BOT_FAZANA/test.py b/BOT_FAZANA/test.py new file mode 100644 index 0000000..9bd64a3 --- /dev/null +++ b/BOT_FAZANA/test.py @@ -0,0 +1,116 @@ +import asyncio +from telebot.async_telebot import AsyncTeleBot +import os + +api_key = '7901893687:AAGKRhisrTwKIX8oLIsDsZ5T7HPbyXV9FMY' +# Список разрешенных пользователей (добавьте свои ID) +ALLOWED_USERS = [1199424310, 1798467387, 1905354346] # Замените на реальные ID пользователей +bot = AsyncTeleBot(api_key) + +helpa = ('\n/start - запуск бота\n/info - вывод данной справки\n/rollback - сброс стендов до снапшота DEFAULT\n/on - включить учетки m1 для демо\n/off - выключить учетки m1 для демо\n/demo - сброс стендов зоны DEMO до DEFAULT\n/fuf - сброс зоны FUF до DEFAULT\n/polka - сброс зоны POLKA до DEFAULT') + +def is_user_allowed(user_id): + """Проверяет, есть ли пользователь в списке разрешенных""" + return user_id in ALLOWED_USERS + +@bot.message_handler(commands=['start']) +async def start_command(message): + if not is_user_allowed(message.from_user.id): + await bot.reply_to(message, "⛔ Доступ запрещен") + return + await bot.reply_to(message, f'Бот работает!\nСписок комманд:{helpa}') + +async def run_script(args_str): + """Асинхронное выполнение bash скрипта""" + process = await asyncio.create_subprocess_shell( + f'bash /root/bot/rollback.sh -t {args_str}', + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE + ) + # Ожидаем завершение процесса и получаем результат + stdout, stderr = await process.communicate() + return stdout.decode().strip(), stderr.decode().strip(), process.returncode + +@bot.message_handler(commands=['on']) +async def on_user(message): + if not is_user_allowed(message.from_user.id): + await bot.reply_to(message, "⛔ Доступ запрещен") + return + os.system('bash /root/bot/on.sh') + await bot.reply_to('Учетки m1 активированны') + +@bot.message_handler(commands=['off']) +async def off_user(message): + if not is_user_allowed(message.from_user.id): + await bot.reply_to(message, "⛔ Доступ запрещен") + return + else: + os.system('bash /root/bot/off.sh') + await bot.reply_to('Учетки m1 отключенны') + +@bot.message_handler(commands=['demo']) +async def off_user(message): + if not is_user_allowed(message.from_user.id): + await bot.reply_to(message, "⛔ Доступ запрещен") + return + else: + os.system('bash /root/bot/ROLLBACKS/rollback_demo.sh') + await bot.reply_to('Зона DEMO сброшенна!') + +@bot.message_handler(commands=['polka']) +async def off_user(message): + if not is_user_allowed(message.from_user.id): + await bot.reply_to(message, "⛔ Доступ запрещен") + return + else: + os.system('bash /root/bot/ROLLBACKS/rollback_polka.sh') + await bot.reply_to('Зона POLKA сброшенна!') + +@bot.message_handler(commands=['fuf']) +async def off_user(message): + if not is_user_allowed(message.from_user.id): + await bot.reply_to(message, "⛔ Доступ запрещен") + return + else: + os.system('bash /root/bot/ROLLBACKS/rollback_fuf.sh') + await bot.reply_to('Зона FUF сброшенна!') + +@bot.message_handler(commands=['info']) +async def info_command(message): + if not is_user_allowed(message.from_user.id): + await bot.reply_to(message, "⛔ Доступ запрещен") + return + await bot.reply_to(message, helpa) + +@bot.message_handler(commands=['rollback']) +async def rollback_command(message): + # Проверка доступа + if not is_user_allowed(message.from_user.id): + await bot.reply_to(message, "⛔ У вас нет прав на выполнение этой команды") + return + + parts = message.text.split() + if len(parts) > 1: + arguments = parts[1:] + args_str = ' '.join(arguments) + + try: + # Запускаем скрипт асинхронно + stdout, stderr, returncode = await run_script(args_str) + + if returncode == 0: + await bot.reply_to(message, f"✅ Команда выполнена:стенды {args_str} были сброшены!") + else: + await bot.reply_to(message, f"❌ Ошибка выполнения ({returncode}):\n{stderr}") + + except Exception as e: + await bot.reply_to(message, f"⚠️ Критическая ошибка: {str(e)}") + else: + await bot.reply_to(message, "ℹ️ Использование: /rollback [ ...]") + +async def main(): + await bot.infinity_polling() + +if __name__ == '__main__': + print("Бот запущен...") + asyncio.run(main())