#!/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
