feat: SAC 0.6.0 user edit UI, login to dashboard, daily report timer sync
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -15,6 +15,10 @@ sudo chmod 755 /opt/sac-deploy.sh
|
||||
sudo /opt/sac-deploy.sh
|
||||
```
|
||||
|
||||
Суточные отчёты: `sac-daily-report.service` + timer. Файл `sac-daily-report.timer` в git — шаблон;
|
||||
на сервере timer **генерируется** из `SAC_DAILY_REPORT_HOUR` / `SAC_DAILY_REPORT_TIMEZONE`
|
||||
(`deploy/systemd/render-sac-daily-report-timer.sh`, вызывается из `sac-deploy.sh`).
|
||||
|
||||
## Альтернатива: Docker
|
||||
|
||||
Только для стенда. См. [docs/install-ubuntu-24.04-docker.md](../docs/install-ubuntu-24.04-docker.md).
|
||||
|
||||
@@ -122,10 +122,28 @@ else
|
||||
die "${SERVICE_NAME} запущен, но /health не ответил — journalctl -u ${SERVICE_NAME} -n 80 --no-pager"
|
||||
fi
|
||||
|
||||
RENDER_DAILY_TIMER="${APP_ROOT}/deploy/systemd/render-sac-daily-report-timer.sh"
|
||||
if [ -f "${RENDER_DAILY_TIMER}" ]; then
|
||||
chmod +x "${RENDER_DAILY_TIMER}" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
for aux in sac-retention sac-daily-report; do
|
||||
for suffix in service timer; do
|
||||
src="${APP_ROOT}/deploy/systemd/${aux}.${suffix}"
|
||||
dst="/etc/systemd/system/${aux}.${suffix}"
|
||||
if [ "${aux}" = "sac-daily-report" ] && [ "${suffix}" = "timer" ]; then
|
||||
if [ -x "${RENDER_DAILY_TIMER}" ]; then
|
||||
log "Генерация ${dst} из ${CONFIG_FILE} (SAC_DAILY_REPORT_HOUR/TIMEZONE)"
|
||||
bash "${RENDER_DAILY_TIMER}" "${CONFIG_FILE}" "${dst}"
|
||||
systemctl daemon-reload
|
||||
systemctl restart "${aux}.timer" 2>/dev/null || systemctl start "${aux}.timer" 2>/dev/null || true
|
||||
elif [ -f "${src}" ]; then
|
||||
log "WARN: ${RENDER_DAILY_TIMER} не найден — копируем статический timer"
|
||||
cp "${src}" "${dst}"
|
||||
systemctl daemon-reload
|
||||
fi
|
||||
continue
|
||||
fi
|
||||
if [ -f "${src}" ]; then
|
||||
if [ ! -f "${dst}" ] || ! cmp -s "${src}" "${dst}"; then
|
||||
log "Обновление ${dst}"
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
# Генерирует sac-daily-report.timer из SAC_DAILY_REPORT_HOUR и SAC_DAILY_REPORT_TIMEZONE.
|
||||
# Usage: sudo deploy/systemd/render-sac-daily-report-timer.sh [config.env] [output.timer]
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
CONFIG_FILE="${1:-/opt/security-alert-center/config/sac-api.env}"
|
||||
OUTPUT="${2:-/etc/systemd/system/sac-daily-report.timer}"
|
||||
|
||||
HOUR=9
|
||||
TZ_NAME="Europe/Moscow"
|
||||
|
||||
if [ -f "${CONFIG_FILE}" ]; then
|
||||
set -a
|
||||
# shellcheck source=/dev/null
|
||||
source "${CONFIG_FILE}"
|
||||
set +a
|
||||
fi
|
||||
|
||||
HOUR="${SAC_DAILY_REPORT_HOUR:-9}"
|
||||
TZ_NAME="${SAC_DAILY_REPORT_TIMEZONE:-Europe/Moscow}"
|
||||
|
||||
if ! [[ "${HOUR}" =~ ^[0-9]+$ ]] || [ "${HOUR}" -lt 0 ] || [ "${HOUR}" -gt 23 ]; then
|
||||
printf 'render-sac-daily-report-timer: invalid SAC_DAILY_REPORT_HOUR=%s\n' "${HOUR}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
HOUR_PADDED="$(printf '%02d' "${HOUR}")"
|
||||
|
||||
cat >"${OUTPUT}" <<EOF
|
||||
[Unit]
|
||||
Description=Daily SAC report aggregation and notify
|
||||
|
||||
[Timer]
|
||||
OnCalendar=*-*-* ${HOUR_PADDED}:00:00
|
||||
Timezone=${TZ_NAME}
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
EOF
|
||||
|
||||
printf 'render-sac-daily-report-timer: wrote %s (OnCalendar=%s:00:00 Timezone=%s)\n' \
|
||||
"${OUTPUT}" "${HOUR_PADDED}" "${TZ_NAME}"
|
||||
@@ -2,8 +2,10 @@
|
||||
Description=Daily SAC report aggregation and notify
|
||||
|
||||
[Timer]
|
||||
OnCalendar=*-*-* 09:15:00
|
||||
RandomizedDelaySec=300
|
||||
# Шаблон по умолчанию (hour=9, Europe/Moscow). На prod timer перегенерируется
|
||||
# из config/sac-api.env: deploy/systemd/render-sac-daily-report-timer.sh или sac-deploy.sh
|
||||
OnCalendar=*-*-* 09:00:00
|
||||
Timezone=Europe/Moscow
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
|
||||
Reference in New Issue
Block a user