База bj на своём PostgreSQL; «Не заполнено: …» для пустых полей; запись канала ИШ — в фоне, с ходом на странице

- шаг «База bj»: перенос на сервер PostgreSQL организации (проверка подключения, версии, прав, пустой базы;
  pg_dump → psql; сверка числа строк по таблицам; переключение и перезапуск); прежняя база — запасная копия;
  резервные копии: дамп внешней базы по её подключению, восстановление её не трогает
- все формы: пустые видимые обязательные поля называются по имени и подсвечиваются; DEPO — и на сервере
- «Обновить/Создать канал»: в фоне bj, ход по этапам с таймером (и после перезагрузки страницы), переходы
  заблокированы до конца, в конце проверка, что шлюз загрузил канал; состояние ИШ во время записи — без
  очереди к root-обработчику (страница больше не висит на «Проверяю…»)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-07 00:00:35 +03:00
parent 3a9bc5d7fa
commit 4adc1398f6
16 changed files with 832 additions and 50 deletions
+29 -3
View File
@@ -47,7 +47,33 @@ tarok() { tar "$@"; local rc=$?; [ $rc -le 1 ]; }
[ -n "$SHARE" ] || fail "не задано хранилище (Настройка → Резервное копирование)"
[ -r "$CRED" ] || fail "нет логина хранилища (Настройка → Резервное копирование)"
runuser -u postgres -- pg_dump -Fc bj > "$W/bj.pgdump" || fail "дамп базы bj"
# база bj: на этом сервере — от имени postgres; на сервере PostgreSQL организации (перенесена в мастере) — по её
# подключению из настроек bj. Сервер организации новее нашего pg_dump — копия без базы, с пометкой: базу на сервере
# организации резервирует её администратор баз.
DBNOTE=""
mapfile -t BJDB < <(python3 - <<'PY'
import json,urllib.parse
try:
d=json.load(open("/var/lib/bj/.bj/setup.json")).get("postgres",{}).get("dsn","")
u=urllib.parse.urlparse(d); h=(u.hostname or "").lower()
if d and h not in ("","localhost","127.0.0.1","::1") and not h.startswith("/"):
host="["+u.hostname+"]" if ":" in u.hostname else u.hostname
netloc=(urllib.parse.quote(u.username or "")+"@" if u.username else "")+host+(":"+str(u.port) if u.port else "")
print("ext"); print(urllib.parse.urlunparse((u.scheme,netloc,u.path,"",u.query,""))); print(urllib.parse.unquote(u.password or "")); print(u.hostname)
except Exception: pass
PY
)
if [ "${BJDB[0]:-}" = ext ]; then
if ! PGPASSWORD="${BJDB[2]:-}" pg_dump -Fc --no-owner --no-privileges --dbname="${BJDB[1]}" > "$W/bj.pgdump" 2>"$W/pgdump.err"; then
rm -f "$W/bj.pgdump"
DBNOTE="база bj на сервере организации ${BJDB[3]} в копию не вошла ($(grep -v '^\s*$' "$W/pgdump.err" | tail -1 | head -c 160)) — её резервирует администратор баз"
else
DBNOTE="база bj — с сервера организации ${BJDB[3]}"
fi
rm -f "$W/pgdump.err"
else
runuser -u postgres -- pg_dump -Fc bj > "$W/bj.pgdump" || fail "дамп базы bj"
fi
if runuser -u postgres -- psql -Atc "select 1 from pg_database where datname='igate'" 2>/dev/null | grep -q 1; then
runuser -u postgres -- pg_dump -Fc igate > "$W/igate.pgdump" || fail "дамп базы igate"
fi
@@ -83,5 +109,5 @@ smb "cd \"$DIR\"; ls" 2>/dev/null | awk '{print $1}' | grep -E '^[0-9]{4}-[0-9]{
smb "cd \"$DIR/$d\"; prompt; mask *; mdel *; cd ..; rmdir \"$d\"" >/dev/null 2>&1 && echo "удалена старая копия $d"
fi
done
status true "размер $SIZE"
echo "копия $DIR/$TS готова ($SIZE)"
status true "размер $SIZE${DBNOTE:+; $DBNOTE}"
echo "копия $DIR/$TS готова ($SIZE)${DBNOTE:+; $DBNOTE}"