Централизованное обновление пакетов Прокуратора
Описание
Скрипт для централизованного обновления пакетов на нескольких серверах 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/packageshttp://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
Как это работает
- Парсинг аргументов: Скрипт обрабатывает переданные параметры командной строки.
- Валидация: Проверяется наличие всех обязательных параметров и существование файла пакета.
- Формирование URL: Для каждого IP-адреса из списка формируется полный URL вида
http://{BASE_URL}.{IP}:57077/v1/packages. - Интерактивное подтверждение: Для каждого сервера запрашивается подтверждение перед отправкой.
- Отправка пакета: Используется
curlдля отправки файла через POST-запрос с формой. - Проверка результата: Анализируется HTTP-код ответа (успешные коды — 2xx).
Примечание: Скрипт требует интерактивного ввода для каждого сервера. Для автоматизации без подтверждений потребуется модификация скрипта. {.is-warning}