Централизованное обновление пакетов Прокуратора

Описание

Скрипт для централизованного обновления пакетов на нескольких серверах Procurator. Позволяет отправить пакет обновления на несколько серверов по списку IP-адресов с интерактивным подтверждением для каждого сервера.

Использование

./update.sh -p <путь_к_пакету> -b <первые_три_октета> -l <список_четвертых_октетов>

Пример

./update.sh -p /home/user/procurator.core.v2025.07.9.pkg -b 10.10.250 -l '116 117'

В этом примере скрипт отправит пакет на серверы:

  • http://10.10.250.116:57077/v1/packages
  • http://10.10.250.117:57077/v1/packages

Примечание: Замените IP-адреса в примере на актуальные адреса ваших серверов. {.is-info}

Параметры

ПараметрОписаниеПример
-pПуть к файлу пакета, который нужно отправить/home/user/procurator.core.v2025.07.9.pkg
-bПервые три октета IP-адресов (без точки в конце)10.10.250
-lСписок последних октетов IP-адресов через пробел'116 117' или '116 117 118'
-hПоказать справку и выйти-

Важно: IP-адреса формируются как {BASE_URL}.{IP_LIST_ITEM}, где BASE_URL — это значение параметра -b, а IP_LIST_ITEM — каждый элемент из списка -l. {.is-info}

Полный скрипт

#!/bin/bash

# Функция для вывода справки
usage() {
  echo "Использование: $0 -p <путь_к_пакету> -b <первые три октета без точки> -l <список четвертых октетов>"
  echo "Пример: $0 -p /home/user/procurator.core.v2025.07.9.pkg -b 10.10.250 -l '116 117'"
  echo
  echo "Опции:"
  echo "  -p    Путь к файлу пакета, который нужно отправить"
  echo "  -b    Первые три октета IP-адресов (без точки в конце)"
  echo "  -l    Список последних октетов IP-адресов через пробел, например '116 117'"
  echo "  -h    Показать эту справку и выйти"
  exit 0
}

# Парсинг аргументов командной строки
while getopts ":p:b:l:h" opt; do
  case $opt in
    p) PACKAGE_PATH="$OPTARG" ;;
    b) BASE_URL="$OPTARG" ;;
    l) IP_LIST="$OPTARG" ;;
    h) usage ;;
    *) echo "Ошибка: Некорректный параметр" && usage ;;
  esac
done

# Проверка, что все аргументы заданы
if [[ -z "$PACKAGE_PATH" || -z "$BASE_URL" || -z "$IP_LIST" ]]; then
  echo "Ошибка: Не все аргументы заданы."
  usage
fi

# Проверка существования файла
if [[ ! -f "$PACKAGE_PATH" ]]; then
  echo "Ошибка: Файл '$PACKAGE_PATH' не найден!"
  exit 1
fi

# Разделяем строку IP-адресов в массив
read -r -a IP_ARRAY <<< "$IP_LIST"

# Основной цикл по списку IP
for i in "${IP_ARRAY[@]}"; do
  FULL_URL="http://${BASE_URL}.${i}:57077/v1/packages"

  while true; do
    read -rp "Выполнить запрос к $FULL_URL? (y/n) " confirmation
    if [[ "$confirmation" =~ ^[yn]$ ]]; then
      break
    else
      echo "Пожалуйста, введите 'y' или 'n'."
    fi
  done

  if [[ "$confirmation" == "y" ]]; then
    # Выполнение запроса и получение HTTP-кода
    echo "Выполняю запрос к $FULL_URL с файлом $PACKAGE_PATH"
    response=$(curl -s -o /dev/null -w "%{http_code}" "$FULL_URL" --form "package=@$PACKAGE_PATH")

    # Проверка результата
    if [[ "$response" =~ ^2[0-9]{2}$ ]]; then
      echo "Запрос к $FULL_URL выполнен успешно (HTTP код: $response)."
    else
      echo "Ошибка при выполнении запроса к $FULL_URL (HTTP код: $response)."
    fi
  else
    echo "Запрос к $FULL_URL пропущен."
  fi
done

Как это работает

  1. Парсинг аргументов: Скрипт обрабатывает переданные параметры командной строки.
  2. Валидация: Проверяется наличие всех обязательных параметров и существование файла пакета.
  3. Формирование URL: Для каждого IP-адреса из списка формируется полный URL вида http://{BASE_URL}.{IP}:57077/v1/packages.
  4. Интерактивное подтверждение: Для каждого сервера запрашивается подтверждение перед отправкой.
  5. Отправка пакета: Используется curl для отправки файла через POST-запрос с формой.
  6. Проверка результата: Анализируется HTTP-код ответа (успешные коды — 2xx).

Примечание: Скрипт требует интерактивного ввода для каждого сервера. Для автоматизации без подтверждений потребуется модификация скрипта. {.is-warning}