92 lines
3.3 KiB
Bash
92 lines
3.3 KiB
Bash
#!/usr/bin/env bash
|
|||
|
|
set -Eeuo pipefail
|
||
|
|
|
||
|
|
# ================= КОНФИГУРАЦИЯ =================
|
||
|
|
BASE_DIR="/var/lib/depfile"
|
||
|
|
STATUS_DIR="${BASE_DIR}/status"
|
||
|
|
CHANGE_FILE="${STATUS_DIR}/change.me"
|
||
|
|
HASH_FILE="${STATUS_DIR}/sha256.hash"
|
||
|
|
|
||
|
|
DEPLOY_DIR="${BASE_DIR}/deployment"
|
||
|
|
SUCCESS_FILE="${DEPLOY_DIR}/success.me"
|
||
|
|
|
||
|
|
BACKUP_CFG="/etc/haproxy/backup/haproxy.cfg"
|
||
|
|
TARGET_CFG="/etc/haproxy/haproxy.cfg"
|
||
|
|
# ===============================================
|
||
|
|
|
||
|
|
log() {
|
||
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
|
||
|
|
}
|
||
|
|
|
||
|
|
err() {
|
||
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [ОШИБКА] $*" >&2
|
||
|
|
}
|
||
|
|
|
||
|
|
# 1. Проверяем наличие триггер-файла change.me
|
||
|
|
if [ ! -f "${CHANGE_FILE}" ]; then
|
||
|
|
exit 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
log "Обнаружен файл ${CHANGE_FILE}. Запуск процедуры развертывания..."
|
||
|
|
|
||
|
|
# 2. Проверяем наличие файла контрольной суммы
|
||
|
|
if [ ! -f "${HASH_FILE}" ]; then
|
||
|
|
err "Файл хеша ${HASH_FILE} не найден. Отмена операции."
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 3. Валидация целостности change.me по sha256.hash
|
||
|
|
log "Проверка контрольной суммы SHA-256..."
|
||
|
|
if ! (cd "${STATUS_DIR}" && sha256sum -c --status "sha256.hash"); then
|
||
|
|
err "Несовпадение контрольной суммы файла ${CHANGE_FILE}!"
|
||
|
|
exit 2
|
||
|
|
fi
|
||
|
|
log "Контрольная сумма подтверждена."
|
||
|
|
|
||
|
|
# 4. Проверяем наличие резервной конфигурации
|
||
|
|
if [ ! -f "${BACKUP_CFG}" ]; then
|
||
|
|
err "Резервная копия не найдена: ${BACKUP_CFG}"
|
||
|
|
exit 3
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 5. Тестирование синтаксиса бэкапа перед применением
|
||
|
|
log "Валидация синтаксиса конфигурации из бэкапа..."
|
||
|
|
if ! haproxy -c -f "${BACKUP_CFG}" > /dev/null 2>&1; then
|
||
|
|
err "Резервная конфигурация содержит ошибки синтаксиса. Отмена применения."
|
||
|
|
haproxy -c -f "${BACKUP_CFG}" || true
|
||
|
|
exit 4
|
||
|
|
fi
|
||
|
|
log "Синтаксис резервного конфига корректен."
|
||
|
|
|
||
|
|
# 6. Замена рабочей конфигурации
|
||
|
|
log "Копирование конфигурации в ${TARGET_CFG}..."
|
||
|
|
cp -f "${BACKUP_CFG}" "${TARGET_CFG}"
|
||
|
|
|
||
|
|
if ! haproxy -c -f "${TARGET_CFG}" > /dev/null 2>&1; then
|
||
|
|
err "Критическая ошибка: боевой файл не прошел повторную валидацию!"
|
||
|
|
exit 5
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 7. Перезапуск службы haproxy
|
||
|
|
log "Перезапуск службы haproxy..."
|
||
|
|
if ! systemctl restart haproxy; then
|
||
|
|
err "Не удалось перезапустить сервис haproxy!"
|
||
|
|
exit 6
|
||
|
|
fi
|
||
|
|
log "Сервис haproxy успешно перезапущен."
|
||
|
|
|
||
|
|
# 8. Очистка каталога status
|
||
|
|
log "Удаление директории ${STATUS_DIR}..."
|
||
|
|
rm -rf "${STATUS_DIR}"
|
||
|
|
|
||
|
|
# 9. Формирование отчета об успешном выполнении
|
||
|
|
mkdir -p "${DEPLOY_DIR}"
|
||
|
|
chown depfile:depfile "${DEPLOY_DIR}"
|
||
|
|
CURRENT_DATETIME=$(date '+%Y-%m-%d %H:%M:%S')
|
||
|
|
|
||
|
|
echo "deploment success {${CURRENT_DATETIME}}" > "${SUCCESS_FILE}"
|
||
|
|
chown depfile:depfile "${SUCCESS_FILE}"
|
||
|
|
log "Зафиксирован статус в ${SUCCESS_FILE}."
|
||
|
|
|
||
|
|
log "Процесс успешно завершен."
|
||
|
|
exit 0
|