Загрузить файлы в «BOT_FAZANA»
This commit is contained in:
19
BOT_FAZANA/on.sh
Normal file
19
BOT_FAZANA/on.sh
Normal file
@@ -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 "Скрипт завершен."
|
||||||
|
|
||||||
123
BOT_FAZANA/rollback.sh
Normal file
123
BOT_FAZANA/rollback.sh
Normal file
@@ -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 <vmid1> [<vmid2> ...]"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
:)
|
||||||
|
echo "Параметр -$OPTARG требует аргумент." >&2
|
||||||
|
echo "Использование: $0 -t <vmid1> [<vmid2> ...]"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Проверка наличия хотя бы одного VMID
|
||||||
|
if [ ${#VMIDS[@]} -eq 0 ]; then
|
||||||
|
echo "Ошибка: Не указан VMID. Используйте -t <vmid1> [<vmid2> ...]" >&2
|
||||||
|
echo "Использование: $0 -t <vmid1> [<vmid2> ...]"
|
||||||
|
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
|
||||||
3
BOT_FAZANA/start.sh
Normal file
3
BOT_FAZANA/start.sh
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source /root/bot/venv/bin/activate
|
||||||
|
python3 /root/bot/test.py
|
||||||
116
BOT_FAZANA/test.py
Normal file
116
BOT_FAZANA/test.py
Normal file
@@ -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 <vmid1> [<vmid2> ...]")
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
await bot.infinity_polling()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print("Бот запущен...")
|
||||||
|
asyncio.run(main())
|
||||||
Reference in New Issue
Block a user