feat: first deploy via update_ssh_monitor.sh --deploy
Add first_deploy.sh wrapper and --deploy mode: git clone, install ssh-monitor and sac-client, optional config/systemd/updater copy, console summary and config variable checklist.
This commit is contained in:
@@ -165,12 +165,24 @@ make dist
|
|||||||
|
|
||||||
## Установка скрипта, конфигурации и systemd
|
## Установка скрипта, конфигурации и systemd
|
||||||
|
|
||||||
|
### Автоматическая установка (рекомендуется)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./first_deploy.sh
|
||||||
|
# или: sudo ./update_ssh_monitor.sh --deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
См. [docs/auto-update.ru.md](docs/auto-update.ru.md) — клон из git, копирование в `/usr/local/bin/`, `sac-client.sh`, пример `/etc/ssh-monitor.conf`, unit systemd.
|
||||||
|
|
||||||
|
### Ручная установка
|
||||||
|
|
||||||
1. Скопируйте скрипт в постоянное место:
|
1. Скопируйте скрипт в постоянное место:
|
||||||
- `sudo install -m 750 ./ssh-monitor /usr/local/bin/ssh-monitor`
|
- `sudo install -m 750 ./ssh-monitor /usr/local/bin/ssh-monitor`
|
||||||
|
- `sudo install -m 644 ./sac-client.sh /usr/local/bin/sac-client.sh`
|
||||||
2. Убедитесь, что конфиг создан (см. раздел **«Конфигурация»** выше):
|
2. Убедитесь, что конфиг создан (см. раздел **«Конфигурация»** выше):
|
||||||
- `sudo cp ./ssh-monitor.conf.example /etc/ssh-monitor.conf`
|
- `sudo cp ./ssh-monitor.conf.example /etc/ssh-monitor.conf`
|
||||||
- `sudo chmod 600 /etc/ssh-monitor.conf`
|
- `sudo chmod 600 /etc/ssh-monitor.conf`
|
||||||
3. Создайте unit-файл `/etc/systemd/system/ssh-monitor.service`:
|
3. Создайте unit-файл `/etc/systemd/system/ssh-monitor.service` (или `sudo cp ssh-monitor.service.example ...`):
|
||||||
|
|
||||||
```ini
|
```ini
|
||||||
[Unit]
|
[Unit]
|
||||||
|
|||||||
+23
-1
@@ -52,7 +52,29 @@ flowchart LR
|
|||||||
- **git** и сетевой доступ к репозиторию (SSH-ключ или HTTPS);
|
- **git** и сетевой доступ к репозиторию (SSH-ключ или HTTPS);
|
||||||
- ветка в скрипте жёстко **`main`** — при другой ветке измените `git pull` в файле.
|
- ветка в скрипте жёстко **`main`** — при другой ветке измените `git pull` в файле.
|
||||||
|
|
||||||
## Установка
|
## Первичная установка (--deploy)
|
||||||
|
|
||||||
|
Один сценарий для нового сервера (клон git, `ssh-monitor`, `sac-client.sh`, пример конфига, systemd unit):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /path/to/ssh-monitor # или curl/clone репозитория
|
||||||
|
sudo ./first_deploy.sh
|
||||||
|
# то же самое:
|
||||||
|
sudo ./update_ssh_monitor.sh --deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
Скрипт выводит в консоль, **куда что скопировано**, и список переменных для **`/etc/ssh-monitor.conf`**. Существующий конфиг **не перезаписывается**.
|
||||||
|
|
||||||
|
После установки отредактируйте конфиг и проверьте:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/ssh-monitor.conf
|
||||||
|
sudo /usr/local/bin/ssh-monitor --check-config
|
||||||
|
sudo /usr/local/bin/ssh-monitor --check-sac
|
||||||
|
sudo systemctl restart ssh-monitor.service
|
||||||
|
```
|
||||||
|
|
||||||
|
## Установка updater (для последующих обновлений)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo mkdir -p /opt/scripts
|
sudo mkdir -p /opt/scripts
|
||||||
|
|||||||
Executable
+5
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Первичная установка ssh-monitor — обёртка над update_ssh_monitor.sh --deploy
|
||||||
|
set -euo pipefail
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
exec "$SCRIPT_DIR/update_ssh_monitor.sh" --deploy "$@"
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=SSH Monitor with Telegram alerts and SAC integration
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/local/bin/ssh-monitor
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
User=root
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
Regular → Executable
+272
-83
@@ -9,12 +9,89 @@ LOG_FILE="/var/log/update_script.log"
|
|||||||
|
|
||||||
# Режим отладки: 1 = включён, 0 = выключен
|
# Режим отладки: 1 = включён, 0 = выключен
|
||||||
DEBUG=0
|
DEBUG=0
|
||||||
|
DEPLOY_MODE=0
|
||||||
|
|
||||||
|
CONFIG_FILE="/etc/ssh-monitor.conf"
|
||||||
|
DEPLOY_INSTALL_PATH="/opt/scripts/update_ssh_monitor.sh"
|
||||||
|
SAC_SPOOL_DIR_DEFAULT="/var/lib/ssh-monitor/sac-spool"
|
||||||
|
SYSTEMD_UNIT_PATH="/etc/systemd/system/ssh-monitor.service"
|
||||||
|
|
||||||
# === Список переменных, объявленных в скрипте (для логирования при DEBUG=1) ===
|
# === Список переменных, объявленных в скрипте (для логирования при DEBUG=1) ===
|
||||||
SCRIPT_VARS=("UPDATE_DIR" "SCRIPT_NAME" "REPO_URL" "LOCAL_SCRIPT_PATH" "LOG_FILE" "DEBUG" "REMOTE_SCRIPT_PATH" "LOCAL_CHECKSUM" "REMOTE_CHECKSUM")
|
SCRIPT_VARS=("UPDATE_DIR" "SCRIPT_NAME" "REPO_URL" "LOCAL_SCRIPT_PATH" "LOG_FILE" "DEBUG" "REMOTE_SCRIPT_PATH" "LOCAL_CHECKSUM" "REMOTE_CHECKSUM")
|
||||||
|
|
||||||
# === Функции ===
|
# === Функции ===
|
||||||
|
|
||||||
|
say_step() {
|
||||||
|
printf '\n==> %s\n' "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
say_ok() {
|
||||||
|
printf '[OK] %s\n' "$1"
|
||||||
|
log_message "INFO" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
say_warn() {
|
||||||
|
printf '[WARN] %s\n' "$1"
|
||||||
|
log_message "INFO" "WARNING: $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
say_info() {
|
||||||
|
printf ' %s\n' "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
show_help() {
|
||||||
|
cat <<'EOF'
|
||||||
|
update_ssh_monitor.sh — обновление или первичная установка ssh-monitor
|
||||||
|
|
||||||
|
Использование:
|
||||||
|
sudo ./update_ssh_monitor.sh обновление (git pull + checksum)
|
||||||
|
sudo ./update_ssh_monitor.sh --deploy первичная установка / полный deploy
|
||||||
|
sudo ./first_deploy.sh то же, что --deploy
|
||||||
|
|
||||||
|
Опции:
|
||||||
|
--deploy установить ssh-monitor, sac-client, пример конфига, systemd unit
|
||||||
|
--debug подробный лог в /var/log/update_script.log
|
||||||
|
-h, --help эта справка
|
||||||
|
|
||||||
|
После --deploy отредактируйте /etc/ssh-monitor.conf (Telegram и/или SAC).
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_command_line() {
|
||||||
|
DEPLOY_MODE=0
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
--deploy)
|
||||||
|
DEPLOY_MODE=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--debug)
|
||||||
|
DEBUG=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-h | --help)
|
||||||
|
show_help
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf 'Неизвестная опция: %s\n' "$1" >&2
|
||||||
|
show_help >&2
|
||||||
|
exit 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
deploy_require_root() {
|
||||||
|
if [ "$DEPLOY_MODE" -ne 1 ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if [ "$(id -u)" -ne 0 ]; then
|
||||||
|
printf 'ERROR: режим --deploy нужно запускать от root (sudo)\n' >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# Основная функция логирования
|
# Основная функция логирования
|
||||||
log_message() {
|
log_message() {
|
||||||
local level="$1"
|
local level="$1"
|
||||||
@@ -228,14 +305,14 @@ sync_sac_client() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -f "$local_dst" ]; then
|
if [ "$DEPLOY_MODE" -ne 1 ] && [ -f "$local_dst" ]; then
|
||||||
local_sum=$(sha256sum "$local_dst" 2>/dev/null | awk '{print $1}')
|
local_sum=$(sha256sum "$local_dst" 2>/dev/null | awk '{print $1}')
|
||||||
if [ "$local_sum" = "$remote_sum" ]; then
|
if [ "$local_sum" = "$remote_sum" ]; then
|
||||||
log_message "INFO" "sac-client.sh checksums match. No update needed."
|
log_message "INFO" "sac-client.sh checksums match. No update needed."
|
||||||
debug_step "sac-client.sh без изменений"
|
debug_step "sac-client.sh без изменений"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
else
|
elif [ ! -f "$local_dst" ]; then
|
||||||
log_message "INFO" "Local sac-client.sh not found. Will install."
|
log_message "INFO" "Local sac-client.sh not found. Will install."
|
||||||
debug_step "Локальный sac-client.sh отсутствует, будет установлен"
|
debug_step "Локальный sac-client.sh отсутствует, будет установлен"
|
||||||
fi
|
fi
|
||||||
@@ -248,9 +325,139 @@ sync_sac_client() {
|
|||||||
chmod 644 "$local_dst"
|
chmod 644 "$local_dst"
|
||||||
SAC_CLIENT_CHANGED=1
|
SAC_CLIENT_CHANGED=1
|
||||||
log_message "INFO" "sac-client.sh updated."
|
log_message "INFO" "sac-client.sh updated."
|
||||||
|
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
|
say_ok "sac-client.sh → $local_dst"
|
||||||
|
fi
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
find_remote_ssh_monitor_path() {
|
||||||
|
REMOTE_SCRIPT_PATH="$UPDATE_DIR/$SCRIPT_NAME/src/branch/main/$SCRIPT_NAME"
|
||||||
|
ALT_REMOTE_PATH="$UPDATE_DIR/$SCRIPT_NAME/$SCRIPT_NAME"
|
||||||
|
if [ -f "$REMOTE_SCRIPT_PATH" ]; then
|
||||||
|
printf '%s\n' "$REMOTE_SCRIPT_PATH"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if [ -f "$ALT_REMOTE_PATH" ]; then
|
||||||
|
log_message "INFO" "Script found at alternative path"
|
||||||
|
printf '%s\n' "$ALT_REMOTE_PATH"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
install_ssh_monitor_from() {
|
||||||
|
local actual_script_path="$1"
|
||||||
|
if [ -f "$LOCAL_SCRIPT_PATH" ]; then
|
||||||
|
cp "$LOCAL_SCRIPT_PATH" "${LOCAL_SCRIPT_PATH}.backup.$(date +%Y%m%d_%H%M%S)" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
if ! cp "$actual_script_path" "$LOCAL_SCRIPT_PATH"; then
|
||||||
|
log_message "INFO" "ERROR: Failed to copy script"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
chmod +x "$LOCAL_SCRIPT_PATH"
|
||||||
|
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
|
say_ok "ssh-monitor → $LOCAL_SCRIPT_PATH"
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
deploy_prepare_dirs() {
|
||||||
|
say_step "Каталоги"
|
||||||
|
mkdir -p "$UPDATE_DIR" /opt/scripts /var/log "$SAC_SPOOL_DIR_DEFAULT" /var/lib/ssh-monitor 2>/dev/null || true
|
||||||
|
say_ok "UPDATE_DIR=$UPDATE_DIR, spool=$SAC_SPOOL_DIR_DEFAULT"
|
||||||
|
}
|
||||||
|
|
||||||
|
deploy_install_config() {
|
||||||
|
local example="$UPDATE_DIR/$SCRIPT_NAME/ssh-monitor.conf.example"
|
||||||
|
say_step "Конфигурация"
|
||||||
|
if [ -f "$CONFIG_FILE" ]; then
|
||||||
|
say_info "Уже существует: $CONFIG_FILE (не перезаписываем)"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if [ ! -f "$example" ]; then
|
||||||
|
say_warn "Пример конфига не найден в клоне: $example"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
cp "$example" "$CONFIG_FILE"
|
||||||
|
chmod 600 "$CONFIG_FILE"
|
||||||
|
say_ok "Создан $CONFIG_FILE из ssh-monitor.conf.example"
|
||||||
|
}
|
||||||
|
|
||||||
|
deploy_install_systemd() {
|
||||||
|
local example="$UPDATE_DIR/$SCRIPT_NAME/ssh-monitor.service.example"
|
||||||
|
say_step "systemd"
|
||||||
|
if [ -f "$SYSTEMD_UNIT_PATH" ]; then
|
||||||
|
say_info "Уже существует: $SYSTEMD_UNIT_PATH"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if [ ! -f "$example" ]; then
|
||||||
|
say_warn "Unit example не найден: $example"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
cp "$example" "$SYSTEMD_UNIT_PATH"
|
||||||
|
if command -v systemctl &>/dev/null; then
|
||||||
|
systemctl daemon-reload 2>/dev/null || true
|
||||||
|
systemctl enable ssh-monitor.service 2>/dev/null || true
|
||||||
|
say_ok "Установлен $SYSTEMD_UNIT_PATH (enable ssh-monitor.service)"
|
||||||
|
else
|
||||||
|
say_ok "Скопирован $SYSTEMD_UNIT_PATH (systemctl не найден)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
deploy_install_self() {
|
||||||
|
local self_path
|
||||||
|
self_path="$(readlink -f "$0" 2>/dev/null || realpath "$0" 2>/dev/null || printf '%s' "$0")"
|
||||||
|
say_step "Скрипт автообновления"
|
||||||
|
if [ "$self_path" = "$DEPLOY_INSTALL_PATH" ]; then
|
||||||
|
say_info "Уже запущен из $DEPLOY_INSTALL_PATH"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
mkdir -p "$(dirname "$DEPLOY_INSTALL_PATH")"
|
||||||
|
cp "$self_path" "$DEPLOY_INSTALL_PATH"
|
||||||
|
chmod 750 "$DEPLOY_INSTALL_PATH"
|
||||||
|
say_ok "update_ssh_monitor.sh → $DEPLOY_INSTALL_PATH"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_config_variables_help() {
|
||||||
|
say_step "Заполните в $CONFIG_FILE"
|
||||||
|
cat <<'EOF'
|
||||||
|
Обязательно хотя бы один канал уведомлений ИЛИ SAC:
|
||||||
|
TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID
|
||||||
|
— или MAIL_SMTP_HOST, MAIL_FROM, MAIL_TO
|
||||||
|
|
||||||
|
Security Alert Center (рекомендуется dual на пилоте):
|
||||||
|
UseSAC=dual
|
||||||
|
SAC_URL=https://sac.kalinamall.ru
|
||||||
|
SAC_API_KEY=<ключ из SAC sac-api.env / bootstrap>
|
||||||
|
|
||||||
|
Проверка после правок:
|
||||||
|
/usr/local/bin/ssh-monitor --check-config
|
||||||
|
/usr/local/bin/ssh-monitor --check-sac
|
||||||
|
systemctl restart ssh-monitor.service
|
||||||
|
systemctl status ssh-monitor.service
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
print_deploy_summary() {
|
||||||
|
say_step "Итог установки"
|
||||||
|
say_info "Монитор: $LOCAL_SCRIPT_PATH"
|
||||||
|
say_info "SAC client: ${LOCAL_SCRIPT_PATH%/*}/sac-client.sh"
|
||||||
|
say_info "Конфиг: $CONFIG_FILE"
|
||||||
|
say_info "Git-клон: $UPDATE_DIR/$SCRIPT_NAME"
|
||||||
|
say_info "Updater: $DEPLOY_INSTALL_PATH"
|
||||||
|
say_info "Лог updater: $LOG_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
deploy_post_install() {
|
||||||
|
deploy_prepare_dirs
|
||||||
|
deploy_install_config
|
||||||
|
deploy_install_systemd
|
||||||
|
deploy_install_self
|
||||||
|
print_deploy_summary
|
||||||
|
print_config_variables_help
|
||||||
|
}
|
||||||
|
|
||||||
restart_ssh_monitor_service() {
|
restart_ssh_monitor_service() {
|
||||||
debug_step "Перезапускаем сервис ssh-monitor.service"
|
debug_step "Перезапускаем сервис ssh-monitor.service"
|
||||||
if command -v systemctl &>/dev/null; then
|
if command -v systemctl &>/dev/null; then
|
||||||
@@ -302,25 +509,10 @@ update_script() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Формируем путь к скрипту в репозитории (основной и альтернативный)
|
|
||||||
REMOTE_SCRIPT_PATH="$UPDATE_DIR/$SCRIPT_NAME/src/branch/main/$SCRIPT_NAME"
|
|
||||||
ALT_REMOTE_PATH="$UPDATE_DIR/$SCRIPT_NAME/$SCRIPT_NAME"
|
|
||||||
|
|
||||||
debug_step "Основной путь к скрипту: $REMOTE_SCRIPT_PATH"
|
|
||||||
debug_step "Альтернативный путь к скрипту: $ALT_REMOTE_PATH"
|
|
||||||
|
|
||||||
# Определяем реальный путь к скрипту
|
|
||||||
local actual_script_path=""
|
local actual_script_path=""
|
||||||
if [ -f "$REMOTE_SCRIPT_PATH" ]; then
|
actual_script_path="$(find_remote_ssh_monitor_path 2>/dev/null || true)"
|
||||||
actual_script_path="$REMOTE_SCRIPT_PATH"
|
debug_step "Путь к ssh-monitor в клоне: ${actual_script_path:-не найден}"
|
||||||
debug_step "Скрипт найден по основному пути"
|
|
||||||
elif [ -f "$ALT_REMOTE_PATH" ]; then
|
|
||||||
actual_script_path="$ALT_REMOTE_PATH"
|
|
||||||
log_message "INFO" "Script found at alternative path"
|
|
||||||
debug_step "Скрипт найден по альтернативному пути"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# sac-client.sh — отдельно от ssh-monitor: синхронизируем всегда (нужен для UseSAC/--check-sac)
|
|
||||||
SAC_CLIENT_CHANGED=0
|
SAC_CLIENT_CHANGED=0
|
||||||
if ! sync_sac_client; then
|
if ! sync_sac_client; then
|
||||||
return 1
|
return 1
|
||||||
@@ -328,68 +520,49 @@ update_script() {
|
|||||||
|
|
||||||
local script_changed=0
|
local script_changed=0
|
||||||
|
|
||||||
# Проверяем наличие файла скрипта в репозитории
|
|
||||||
if [ -n "$actual_script_path" ] && [ -f "$actual_script_path" ]; then
|
if [ -n "$actual_script_path" ] && [ -f "$actual_script_path" ]; then
|
||||||
log_message "INFO" "Remote script found. Comparing checksums..."
|
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
debug_step "Проверяем наличие файла скрипта в репозитории"
|
log_message "INFO" "Deploy: installing ssh-monitor to $LOCAL_SCRIPT_PATH"
|
||||||
|
if install_ssh_monitor_from "$actual_script_path"; then
|
||||||
# Проверяем существование локального скрипта
|
script_changed=1
|
||||||
if [ ! -f "$LOCAL_SCRIPT_PATH" ]; then
|
else
|
||||||
log_message "INFO" "Local script not found. Will install new one."
|
|
||||||
LOCAL_CHECKSUM=""
|
|
||||||
debug_step "Локальный скрипт отсутствует, будет установлен новый"
|
|
||||||
else
|
|
||||||
debug_step "Вычисляем контрольную сумму локального скрипта"
|
|
||||||
LOCAL_CHECKSUM=$(sha256sum "$LOCAL_SCRIPT_PATH" 2>/dev/null | awk '{print $1}')
|
|
||||||
fi
|
|
||||||
|
|
||||||
debug_step "Вычисляем контрольную сумму удалённого скрипта"
|
|
||||||
REMOTE_CHECKSUM=$(sha256sum "$actual_script_path" 2>/dev/null | awk '{print $1}')
|
|
||||||
|
|
||||||
# Сравниваем контрольные суммы
|
|
||||||
debug_step "Сравниваем контрольные суммы"
|
|
||||||
if [ "$LOCAL_CHECKSUM" != "$REMOTE_CHECKSUM" ]; then
|
|
||||||
log_message "INFO" "Checksums differ. Updating $LOCAL_SCRIPT_PATH..."
|
|
||||||
debug_step "Контрольные суммы различаются, начинаем обновление"
|
|
||||||
|
|
||||||
# Создаем бекап текущего скрипта если он существует
|
|
||||||
if [ -f "$LOCAL_SCRIPT_PATH" ]; then
|
|
||||||
debug_step "Создаем резервную копию текущего скрипта"
|
|
||||||
cp "$LOCAL_SCRIPT_PATH" "${LOCAL_SCRIPT_PATH}.backup.$(date +%Y%m%d_%H%M%S)" 2>/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
debug_step "Копируем новый скрипт в $LOCAL_SCRIPT_PATH"
|
|
||||||
if ! cp "$actual_script_path" "$LOCAL_SCRIPT_PATH"; then
|
|
||||||
log_message "INFO" "ERROR: Failed to copy script"
|
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
debug_step "Делаем скрипт исполняемым"
|
|
||||||
chmod +x "$LOCAL_SCRIPT_PATH"
|
|
||||||
|
|
||||||
script_changed=1
|
|
||||||
log_message "INFO" "Script updated successfully."
|
|
||||||
debug_step "Скрипт успешно обновлен"
|
|
||||||
else
|
else
|
||||||
log_message "INFO" "Checksums match. No update needed."
|
log_message "INFO" "Remote script found. Comparing checksums..."
|
||||||
debug_step "Контрольные суммы совпадают, обновление не требуется"
|
if [ ! -f "$LOCAL_SCRIPT_PATH" ]; then
|
||||||
|
LOCAL_CHECKSUM=""
|
||||||
|
else
|
||||||
|
LOCAL_CHECKSUM=$(sha256sum "$LOCAL_SCRIPT_PATH" 2>/dev/null | awk '{print $1}')
|
||||||
|
fi
|
||||||
|
REMOTE_CHECKSUM=$(sha256sum "$actual_script_path" 2>/dev/null | awk '{print $1}')
|
||||||
|
if [ "$LOCAL_CHECKSUM" != "$REMOTE_CHECKSUM" ]; then
|
||||||
|
log_message "INFO" "Checksums differ. Updating $LOCAL_SCRIPT_PATH..."
|
||||||
|
if install_ssh_monitor_from "$actual_script_path"; then
|
||||||
|
script_changed=1
|
||||||
|
log_message "INFO" "Script updated successfully."
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_message "INFO" "Checksums match. No update needed."
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
log_message "INFO" "No remote script found. No update needed."
|
log_message "INFO" "No remote script found. No update needed."
|
||||||
debug_step "Удаленный скрипт не найден ни по одному из путей"
|
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
|
say_warn "ssh-monitor не найден в клоне $UPDATE_DIR/$SCRIPT_NAME"
|
||||||
# Информация для отладки
|
fi
|
||||||
if [ "$DEBUG" -eq 1 ]; then
|
if [ "$DEBUG" -eq 1 ] && [ -d "$UPDATE_DIR/$SCRIPT_NAME" ]; then
|
||||||
debug_step "Содержимое директории репозитория:"
|
find "$UPDATE_DIR/$SCRIPT_NAME" -type f -name "$SCRIPT_NAME" 2>/dev/null | while read -r found_file; do
|
||||||
if [ -d "$UPDATE_DIR/$SCRIPT_NAME" ]; then
|
log_message "DEBUG" "Найден файл: $found_file"
|
||||||
find "$UPDATE_DIR/$SCRIPT_NAME" -type f -name "$SCRIPT_NAME" 2>/dev/null | while read -r found_file; do
|
done
|
||||||
log_message "DEBUG" "Найден файл: $found_file"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$script_changed" -eq 1 ] || [ "${SAC_CLIENT_CHANGED:-0}" -eq 1 ]; then
|
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
|
script_changed=1
|
||||||
|
elif [ "$script_changed" -eq 1 ] || [ "${SAC_CLIENT_CHANGED:-0}" -eq 1 ]; then
|
||||||
restart_ssh_monitor_service
|
restart_ssh_monitor_service
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -401,35 +574,51 @@ update_script() {
|
|||||||
|
|
||||||
# === Основной блок выполнения ===
|
# === Основной блок выполнения ===
|
||||||
|
|
||||||
log_message "INFO" "=== Script update started ==="
|
parse_command_line "$@"
|
||||||
|
deploy_require_root
|
||||||
|
|
||||||
|
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
|
printf '\n=== ssh-monitor: первичная установка (--deploy) ===\n'
|
||||||
|
say_step "Репозиторий и файлы"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_message "INFO" "=== Script update started (deploy=$DEPLOY_MODE) ==="
|
||||||
debug_step "Инициализация скрипта обновления"
|
debug_step "Инициализация скрипта обновления"
|
||||||
|
|
||||||
# 1. Гарантируем создание необходимых директорий
|
|
||||||
if ! ensure_directories; then
|
if ! ensure_directories; then
|
||||||
log_message "INFO" "ERROR: Failed to ensure directories. Exiting."
|
log_message "INFO" "ERROR: Failed to ensure directories. Exiting."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 2. КРИТИЧЕСКИ ВАЖНО: Проверяем и устанавливаем ipset
|
|
||||||
debug_step "Начинаем проверку и установку ipset (КРИТИЧЕСКИЙ ШАГ)"
|
debug_step "Начинаем проверку и установку ipset (КРИТИЧЕСКИЙ ШАГ)"
|
||||||
if ! ensure_ipset_installed; then
|
if ! ensure_ipset_installed; then
|
||||||
log_message "ERROR" "CRITICAL: ipset installation or verification failed"
|
log_message "ERROR" "CRITICAL: ipset installation or verification failed"
|
||||||
log_message "ERROR" "Работа обновленного скрипта невозможна без установленного ipset"
|
|
||||||
echo "ERROR: Работа обновленного скрипта невозможна без установленного ipset" >&2
|
echo "ERROR: Работа обновленного скрипта невозможна без установленного ipset" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 3. Выполняем функцию обновления
|
|
||||||
update_script
|
update_script
|
||||||
exit_code=$?
|
exit_code=$?
|
||||||
|
|
||||||
if [ $exit_code -eq 0 ]; then
|
if [ "$exit_code" -eq 0 ] && [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
log_message "INFO" "=== Script update completed successfully ==="
|
deploy_post_install
|
||||||
debug_step "Скрипт успешно завершил работу"
|
restart_ssh_monitor_service
|
||||||
else
|
if command -v systemctl &>/dev/null; then
|
||||||
log_message "INFO" "=== Script update completed with errors (exit code: $exit_code) ==="
|
if systemctl start ssh-monitor.service 2>/dev/null; then
|
||||||
debug_step "Скрипт завершил работу с ошибками"
|
say_ok "systemctl start ssh-monitor.service"
|
||||||
|
else
|
||||||
|
say_warn "systemctl start не выполнен (проверьте --check-config и конфиг)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $exit_code -eq 0 ]; then
|
||||||
|
log_message "INFO" "=== Script update completed successfully ==="
|
||||||
|
if [ "$DEPLOY_MODE" -eq 1 ]; then
|
||||||
|
printf '\n=== Установка завершена. Отредактируйте %s и перезапустите сервис. ===\n' "$CONFIG_FILE"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_message "INFO" "=== Script update completed with errors (exit code: $exit_code) ==="
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Выход с кодом завершения
|
|
||||||
exit $exit_code
|
exit $exit_code
|
||||||
|
|||||||
Reference in New Issue
Block a user