diff --git a/README.md b/README.md index c7a3254..39c9e9c 100755 --- a/README.md +++ b/README.md @@ -218,6 +218,12 @@ collectors. [commercial positioning](docs/REGISTRY_COMMERCIAL_POSITIONING_RU.md), [readiness checklist](docs/REGISTRY_READINESS_CHECKLIST_RU.md). +- Registry-readiness infrastructure: + Russian Git contour: + `https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus`; + GitHub role: public mirror; + detailed docs: [docs/registry/](docs/registry/REGISTER_RU_SOFTWARE_READINESS_RU.md). + - [Позиционирование для реестра российского ПО](docs/RUSSIAN_SOFTWARE_REGISTRY_POSITIONING_RU.md) - [Сведения для подачи в реестр](REGISTER_RU_SOFTWARE.md) - [Registry product passport](docs/REGISTRY_PRODUCT_PASSPORT_RU.md) @@ -688,4 +694,3 @@ PILOT V1 SCOPE (ГОТОВО): ✅ ТРЕБОВАТЬ: Support contract перед production ✅ ПЛАНИРОВАТЬ: Intern training на Rust maintenance ``` - diff --git a/docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md b/docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md new file mode 100644 index 0000000..0b71567 --- /dev/null +++ b/docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md @@ -0,0 +1,81 @@ +# Runbook: backup и restore Gitea + +Статус: registry-readiness runbook. Документ фиксирует целевую схему backup +для self-hosted Gitea AWatch-rus. Backup нельзя считать production-ready до +успешного тестового восстановления на отдельном сервере. + +## Параметры backup-контура + +| Параметр | Значение | +| --- | --- | +| Backup path | `/var/backups/gitea` | +| Backup script | `/usr/local/sbin/awatch-gitea-backup.sh` | +| systemd service | `awatch-gitea-backup.service` | +| systemd timer | `awatch-gitea-backup.timer` | +| Schedule target | daily `03:20` with `RandomizedDelaySec=10m` | +| Backup format | Gitea dump ZIP | +| Checksum | SHA256 | +| Retention | 14 days | + +Целевой backup script использует `gitea dump`, создает ZIP backup и отдельный +SHA256 checksum. Каталог `/var/backups/gitea` должен быть доступен только +административным пользователям, обслуживающим Gitea backup. + +## Проверка timer + +```bash +systemctl status awatch-gitea-backup.timer --no-pager +systemctl list-timers awatch-gitea-backup.timer --no-pager +``` + +## Проверка результата backup + +```bash +ls -lh /var/backups/gitea +sha256sum -c /var/backups/gitea/.zip.sha256 +``` + +Имя backup-файла должно включать timestamp или иной однозначный идентификатор +запуска. Retention target - 14 days. + +## Restore outline + +Restore является ручной процедурой и требует тестового восстановления на +отдельном сервере перед признанием backup production-ready. + +Общий порядок: + +1. Подготовить отдельный сервер или isolated test instance. +2. Установить совместимую версию Gitea. +3. Остановить Gitea на целевом тестовом сервере. +4. Проверить SHA256 checksum выбранного ZIP backup. +5. Выполнить восстановление из `gitea dump` согласно официальной процедуре + Gitea для используемой версии. +6. Проверить права на каталоги, repository storage, database, custom config и + attachments. +7. Запустить Gitea. +8. Выполнить post-restore checks. +9. Зафиксировать timestamp, backup filename, checksum, Gitea version, + restore duration и результат проверки. + +## Post-restore checks + +```bash +systemctl status gitea --no-pager +curl -L https://git.iri1968.dpdns.org | head +gitea doctor check +``` + +Если менялся путь установки или сервер переносился, выполнить: + +```bash +gitea admin regenerate hooks +``` + +## Ограничения + +- Restore-runbook не заменяет фактический restore test. +- Backup не должен считаться production-ready, пока restore не проверен на + отдельном сервере. +- Offsite copy должна быть описана отдельно до финальной подачи в реестр. +- Секреты, токены и приватные ключи не включаются в backup evidence manifest. diff --git a/docs/registry/GIT_RU_MIRRORING_RUNBOOK_RU.md b/docs/registry/GIT_RU_MIRRORING_RUNBOOK_RU.md new file mode 100644 index 0000000..64270e3 --- /dev/null +++ b/docs/registry/GIT_RU_MIRRORING_RUNBOOK_RU.md @@ -0,0 +1,83 @@ +# Runbook: российский Git-контур и зеркалирование + +Статус: operational registry-readiness runbook. Команды ниже описывают +целевую схему remotes для работы с российским self-hosted Gitea и публичным +GitHub mirror. + +## Целевая схема remotes + +Primary Russian Git contour: + +```text +ru-origin: +https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus.git +``` + +Public mirror / external public repository: + +```text +github: +git@github.com:igor04091968/AWatch-rus.git +``` + +или: + +```text +github: +https://github.com/igor04091968/AWatch-rus.git +``` + +GitHub = public mirror only. GitHub не должен описываться как primary +registry source/build system или как целевой source/build/release contour +для registry-readiness. + +## Базовые команды + +Проверить текущие remotes: + +```bash +git remote -v +``` + +Добавить российский remote: + +```bash +git remote add ru-origin https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus.git +``` + +Запушить основную ветку: + +```bash +git push ru-origin main +``` + +Запушить теги: + +```bash +git push ru-origin --tags +``` + +## Операционные предупреждения + +- При работе через HTTPS использовать Gitea token/password согласно настройкам + Gitea. +- SSH-ключи для Gitea настраиваются отдельно и не должны храниться в + репозитории. +- GitHub остается публичным зеркалом и внешней площадкой; он не является + primary registry source/build system в registry-readiness документации. +- Перед release evidence фиксировать `git remote -v`, commit hash, tag, + timestamp и источник сборки. +- Любые секреты, токены, приватные ключи и персональные данные не включать в + repository evidence. + +## Проверка HTTPS-контра + +Ожидаемый публичный URL: + +```text +https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus +``` + +Gitea должна обслуживаться через Nginx reverse proxy с HTTPS. После проверки +HTTPS внешний `3000/tcp` не должен быть доступен извне; локальный endpoint +Gitea фиксируется как `127.0.0.1:3000`. diff --git a/docs/registry/INSTALLATION_AND_TEST_INSTANCE_RU.md b/docs/registry/INSTALLATION_AND_TEST_INSTANCE_RU.md new file mode 100644 index 0000000..d8faed7 --- /dev/null +++ b/docs/registry/INSTALLATION_AND_TEST_INSTANCE_RU.md @@ -0,0 +1,41 @@ +# Installation and test instance + +Статус: registry-readiness document. Документ фиксирует минимальные требования +к тестовому стенду для экспертной проверки. Он не меняет runtime, API, UI или +deployment behavior продукта. + +## Назначение тестового стенда + +Тестовый стенд должен позволить проверить: + +- получение исходного кода из российского Git-контура; +- воспроизводимость сборки по документированной процедуре; +- базовую установку AWatch-rus; +- отсутствие необходимости в cloud dependency для работы продукта; +- сбор release evidence и infrastructure evidence. + +## Git source + +Целевой источник для registry-readiness: + +```text +https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus +``` + +GitHub допускается как public mirror only и не должен описываться как primary +registry source/build/release contour. + +## Проверки до признания стенда готовым + +- Подтвержден доступ к self-hosted Gitea по HTTPS. +- Подтвержден commit hash и tag, если используется tagged release. +- Подтверждена процедура сборки из исходного кода. +- Подтверждено, что секреты и персональные данные не входят в test package. +- Подтверждено, что backup/restore runbook для Gitea доступен в + `docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md`. + +## Оставшиеся пробелы + +Перед финальной подачей требуется отдельно зафиксировать российский +build-runner, storage release artifacts в РФ, access control policy и +результат тестового восстановления Gitea backup на отдельном сервере. diff --git a/docs/registry/LIFECYCLE_AND_SUPPORT_RU.md b/docs/registry/LIFECYCLE_AND_SUPPORT_RU.md new file mode 100644 index 0000000..549a49a --- /dev/null +++ b/docs/registry/LIFECYCLE_AND_SUPPORT_RU.md @@ -0,0 +1,64 @@ +# Lifecycle and support + +Статус: registry-readiness document. Документ описывает целевой жизненный цикл +исходного кода, backup и evidence collection для AWatch-rus. + +## Source code lifecycle + +Целевой lifecycle исходного кода для registry-readiness проходит через +self-hosted Gitea: + +```text +https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus +``` + +Роль Gitea: target primary Russian Git contour for registry-readiness. +Роль GitHub: public mirror only / external public repository. + +Перед release или registry evidence package фиксируются: + +- commit hash; +- tag, если применимо; +- список remotes; +- источник сборки; +- ответственный за выпуск; +- timestamp evidence. + +## Backup lifecycle + +Backup lifecycle для Gitea: + +- tool: `gitea dump`; +- path: `/var/backups/gitea`; +- format: ZIP; +- checksum: SHA256; +- retention target: 14 days; +- timer: `awatch-gitea-backup.timer`; +- schedule target: daily `03:20` with `RandomizedDelaySec=10m`. + +Backup нельзя считать production-ready без тестового восстановления на +отдельном сервере. Offsite copy должна быть описана отдельно. + +## Restore responsibility + +Restore Gitea является ручной административной процедурой. Ответственный за +restore должен: + +- выбрать backup ZIP; +- проверить SHA256 checksum; +- выполнить restore на отдельном test server до использования процедуры в + production; +- выполнить post-restore checks; +- зафиксировать результат и timestamp. + +## Evidence collection before releases + +Перед выпуском или передачей registry-readiness пакета собрать: + +- Gitea HTTPS evidence; +- service status evidence; +- firewall evidence по внешнему `3000/tcp`; +- backup ZIP + SHA256 evidence; +- состояние `awatch-gitea-backup.timer`; +- сведения о правах доступа; +- ссылку на restore-runbook и результат restore test, если он уже выполнен. diff --git a/docs/registry/REGISTER_RU_SOFTWARE_READINESS_RU.md b/docs/registry/REGISTER_RU_SOFTWARE_READINESS_RU.md new file mode 100644 index 0000000..1839cc0 --- /dev/null +++ b/docs/registry/REGISTER_RU_SOFTWARE_READINESS_RU.md @@ -0,0 +1,49 @@ +# AWatch-rus: readiness для реестра российского ПО + +Статус: подготовительный документ. Документ фиксирует текущее состояние +registry-readiness пакета и не является юридическим заключением о готовности +подачи или принятия AWatch-rus в реестр российского ПО. + +## Назначение + +Документ нужен для внутренней подготовки пакета сведений о продукте, +исходном коде, инфраструктуре хранения, выпуске, резервном копировании и +оставшихся пробелах перед финальной юридической проверкой. + +Новые сведения по российскому Git-контуру требуют финального подтверждения +правообладателем и внесения в официальный пакет документов перед подачей. + +## Текущее состояние + +Done / partially done: + +- Развернут целевой российский Git-контур для registry-readiness. +- Развернута self-hosted Gitea на REG.RU VPS / cloud server. +- Репозиторий AWatch-rus мигрирован в Gitea: + `https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus`. +- HTTPS для Gitea включен через Nginx reverse proxy. +- Начат backup-контур Gitea на базе `gitea dump`, ZIP-архивов, + SHA256 checksum и целевого systemd timer. +- GitHub описывается как public mirror only, не как target primary + source/build/release contour для registry-readiness. + +## Что еще требуется + +- Финальное подтверждение правообладателя. +- Российский build-runner или документированная российская сборочная среда. +- Хранение release artifacts на территории РФ или отдельное подтверждение + выбранной схемы хранения. +- Протестированная restore-процедура Gitea на отдельном сервере. +- Документированная access control policy для Gitea. +- Документированная offsite copy для backup-архивов. +- Финальная юридическая проверка registry package. + +## Ограничения формулировок + +AWatch-rus не заявляется как сертифицированное средство защиты информации, +сертифицированная DLP, SIEM или замена штатным средствам ИБ. В текущем пакете +не фиксируется наличие сертификации ФСТЭК или ФСБ. + +REG.RU/Gitea контур сам по себе не является юридически достаточным +доказательством для реестра. Он рассматривается как инфраструктурная часть +registry-readiness и должен быть подтвержден в официальном пакете документов. diff --git a/docs/registry/REGISTRY_READINESS_CHANGELOG_RU.md b/docs/registry/REGISTRY_READINESS_CHANGELOG_RU.md new file mode 100644 index 0000000..27dff92 --- /dev/null +++ b/docs/registry/REGISTRY_READINESS_CHANGELOG_RU.md @@ -0,0 +1,35 @@ +# Registry readiness changelog + +## 2026-06-20 / 2026-06-21 + +Added: + +- REG.RU/Gitea Russian Git contour documentation. +- Self-hosted Gitea repository reference: + `https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus`. +- GitHub role as public mirror only. +- Gitea backup/restore runbook. +- Registry evidence manifest updates for Gitea, backup ZIP, SHA256 checksum, + systemd timer and restore status. +- Registry readiness check script for the new `docs/registry/` package. + +Changed: + +- README now contains a short Registry-readiness infrastructure block. + +Runtime impact: + +- No runtime/product code changes. +- No API changes. +- No UI changes. +- Rust/runtime checks not required: documentation-only change. + +Remaining gaps: + +- Legal rightsholder confirmation. +- Russian build-runner. +- Release artifacts storage in RF. +- Tested restore procedure. +- Documented access control policy. +- Documented backup offsite copy. +- Final registry legal review. diff --git a/docs/registry/RELEASE_EVIDENCE_MANIFEST_RU.md b/docs/registry/RELEASE_EVIDENCE_MANIFEST_RU.md new file mode 100644 index 0000000..9c383f3 --- /dev/null +++ b/docs/registry/RELEASE_EVIDENCE_MANIFEST_RU.md @@ -0,0 +1,44 @@ +# Release evidence manifest + +Статус: registry-readiness document. Документ описывает состав evidence, +который должен прикладываться к релизу или экспертному пакету. Он не +подтверждает юридическую достаточность evidence для реестра российского ПО. + +## Infrastructure evidence + +Для российского Git-контура и backup-контура фиксировать: + +- Gitea URL: `https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus`. +- Provider: REG.RU VPS / cloud server. +- Platform: self-hosted Gitea. +- HTTPS evidence для `https://git.iri1968.dpdns.org`. +- Nginx reverse proxy evidence. +- Firewall evidence: внешний `3000/tcp` не должен быть открыт после HTTPS + validation. +- Service status evidence: `gitea`, `nginx`, `awatch-gitea-backup.timer`. +- Backup ZIP evidence из `/var/backups/gitea`. +- SHA256 checksum evidence для backup ZIP. +- Restore-runbook reference: + `docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md`. +- Timestamped evidence file, если он будет предоставлен владельцем. + +## Source evidence + +Фиксировать: + +- primary source repository: + `https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus`; +- GitHub role: public mirror only; +- commit hash; +- tag, если релиз выпускается по tag; +- `git remote -v`; +- список измененных файлов для релиза; +- manifest JSON: + `docs/registry/registry-evidence-manifest.json`. + +## Build/release evidence + +Для финального registry package дополнительно требуется подтвердить российский +build-runner и storage release artifacts в РФ или документировать принятую +владельцем схему. До этого нельзя утверждать, что source/build/release contour +полностью закрыт для подачи. diff --git a/docs/registry/SOURCE_CODE_AND_BUILD_INFRASTRUCTURE_RU.md b/docs/registry/SOURCE_CODE_AND_BUILD_INFRASTRUCTURE_RU.md new file mode 100644 index 0000000..acbe42c --- /dev/null +++ b/docs/registry/SOURCE_CODE_AND_BUILD_INFRASTRUCTURE_RU.md @@ -0,0 +1,47 @@ +# Исходный код и инфраструктура сборки AWatch-rus + +Статус: registry-readiness document. Документ описывает текущую целевую +инфраструктуру хранения исходного кода и связанные ограничения. Он не +фиксирует юридическую завершенность подачи в реестр российского ПО. + +## Текущий российский Git-контур + +| Параметр | Значение | +| --- | --- | +| Provider | REG.RU VPS / cloud server | +| Platform | self-hosted Gitea | +| URL | `https://git.iri1968.dpdns.org` | +| Organization | `awatch-rus` | +| Repository | `https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus` | +| Role | target primary Russian Git contour for registry-readiness | +| GitHub role | public mirror only / external public repository | +| HTTPS | enabled | +| Reverse proxy | Nginx reverse proxy | +| Gitea local HTTP endpoint | `127.0.0.1:3000` | +| External port policy | external `3000/tcp` should not be exposed after HTTPS validation | + +GitHub = public mirror only. GitHub не должен описываться как primary +registry source/build/release contour для registry-readiness. Он может +использоваться как публичное зеркало и внешняя площадка, но целевой российский +контур хранения исходного кода для подготовки к реестру зафиксирован в Gitea. + +## Сборочный контур + +Текущий документ фиксирует Git-контур хранения исходного кода. Российский +build-runner, release artifact storage в РФ и выпускные процедуры должны быть +описаны отдельно до финальной подачи. + +До завершения этой части нельзя утверждать, что российский source/build/release +contour полностью закрыт. Допустимая формулировка: "развернут целевой +российский Git-контур для registry-readiness". + +## Требования к подтверждению + +Перед включением сведений в официальный пакет документов необходимо собрать: + +- подтверждение владельца инфраструктуры и правообладателя; +- состояние Gitea service и Nginx; +- подтверждение HTTPS endpoint; +- подтверждение, что внешний `3000/tcp` не экспонируется после проверки HTTPS; +- список remotes рабочей копии; +- evidence по backup ZIP, SHA256 checksum и systemd timer. diff --git a/docs/registry/registry-evidence-manifest.json b/docs/registry/registry-evidence-manifest.json new file mode 100644 index 0000000..761d9a0 --- /dev/null +++ b/docs/registry/registry-evidence-manifest.json @@ -0,0 +1,53 @@ +{ + "schema_version": 1, + "product": "AWatch-rus", + "status": "registry-readiness infrastructure evidence manifest", + "updated_at": "2026-06-21", + "primary_source_repository": "https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus", + "primary_git_platform": "self-hosted Gitea", + "primary_git_provider": "REG.RU VPS / cloud server", + "github_role": "public_mirror_only", + "infrastructure": { + "git_url": "https://git.iri1968.dpdns.org", + "organization": "awatch-rus", + "repository": "https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus", + "https_enabled": true, + "reverse_proxy": "Nginx", + "gitea_local_http_endpoint": "127.0.0.1:3000", + "external_3000_tcp_expected_exposed": false, + "legal_sufficiency_confirmed": false + }, + "backup": { + "enabled": true, + "tool": "gitea dump", + "path": "/var/backups/gitea", + "script": "/usr/local/sbin/awatch-gitea-backup.sh", + "format": "zip", + "checksum": "sha256", + "retention_days": 14, + "systemd_service": "awatch-gitea-backup.service", + "systemd_timer": "awatch-gitea-backup.timer", + "schedule_target": "daily 03:20 with RandomizedDelaySec=10m", + "restore_runbook": "docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md", + "restore_tested": false, + "production_ready": false + }, + "github_role_note": "GitHub is a public mirror only, not the target primary source/build/release contour for registry-readiness.", + "remaining_gaps": [ + "legal rightsholder confirmation", + "Russian build-runner", + "release artifacts storage in RF", + "tested restore procedure", + "documented access control policy", + "documented backup offsite copy", + "final registry legal review" + ], + "forbidden_claims_not_made": [ + "FSTEC/FSB certification", + "SIEM replacement", + "DLP replacement", + "ML/LLM-based detection", + "cloud dependency", + "automatic remediation" + ] +} diff --git a/scripts/check_demo_safety.sh b/scripts/check_demo_safety.sh index 89a1359..5a440b8 100644 --- a/scripts/check_demo_safety.sh +++ b/scripts/check_demo_safety.sh @@ -139,6 +139,13 @@ def add_finding(findings: list[dict], path: Path, line_no: int, rule: str, value ) +def is_allowed_registry_infrastructure_reference(path: Path, line: str, value: str) -> bool: + rel = path.relative_to(ROOT).as_posix() + if rel != "README.md": + return False + return value.lower() == "iri1968" and "https://git.iri1968.dpdns.org" in line + + def scan_line(findings: list[dict], path: Path, line_no: int, line: str) -> None: stripped = line.strip() if stripped.startswith("#") and "grep -n" in stripped: @@ -156,7 +163,9 @@ def scan_line(findings: list[dict], path: Path, line_no: int, line: str) -> None add_finding(findings, path, line_no, "non_demo_email", email) for match in FORBIDDEN_DOMAIN_RE.finditer(line): - add_finding(findings, path, line_no, "known_live_domain_or_codename", match.group(0)) + value = match.group(0) + if not is_allowed_registry_infrastructure_reference(path, line, value): + add_finding(findings, path, line_no, "known_live_domain_or_codename", value) for match in SECRET_ASSIGN_RE.finditer(line): value = match.group(2) diff --git a/scripts/registry_readiness_check.sh b/scripts/registry_readiness_check.sh new file mode 100644 index 0000000..f7cd082 --- /dev/null +++ b/scripts/registry_readiness_check.sh @@ -0,0 +1,133 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REGISTRY_DIR="$ROOT/docs/registry" +MANIFEST="$REGISTRY_DIR/registry-evidence-manifest.json" + +failures=() + +fail() { + failures+=("$1") +} + +require_file() { + local file="$1" + if [[ ! -s "$ROOT/$file" ]]; then + fail "missing_or_empty:$file" + fi +} + +require_grep() { + local pattern="$1" + local file="$2" + local name="$3" + if ! grep -Eiq "$pattern" "$ROOT/$file"; then + fail "missing_marker:$name:$file" + fi +} + +required_files=( + "docs/registry/REGISTER_RU_SOFTWARE_READINESS_RU.md" + "docs/registry/SOURCE_CODE_AND_BUILD_INFRASTRUCTURE_RU.md" + "docs/registry/GIT_RU_MIRRORING_RUNBOOK_RU.md" + "docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md" + "docs/registry/RELEASE_EVIDENCE_MANIFEST_RU.md" + "docs/registry/INSTALLATION_AND_TEST_INSTANCE_RU.md" + "docs/registry/LIFECYCLE_AND_SUPPORT_RU.md" + "docs/registry/REGISTRY_READINESS_CHANGELOG_RU.md" + "docs/registry/registry-evidence-manifest.json" + "README.md" +) + +for file in "${required_files[@]}"; do + require_file "$file" +done + +if [[ -s "$MANIFEST" ]]; then + if command -v python3 >/dev/null 2>&1; then + python3 -m json.tool "$MANIFEST" >/dev/null || fail "invalid_json:docs/registry/registry-evidence-manifest.json" + python3 - "$MANIFEST" <<'PY' || fail "manifest_required_fields" +import json +import sys + +path = sys.argv[1] +with open(path, "r", encoding="utf-8") as fh: + data = json.load(fh) + +expected = { + "primary_source_repository": "https://git.iri1968.dpdns.org/awatch-rus/AWatch-rus", + "primary_git_platform": "self-hosted Gitea", + "primary_git_provider": "REG.RU VPS / cloud server", + "github_role": "public_mirror_only", +} +for key, value in expected.items(): + if data.get(key) != value: + raise SystemExit(f"{key} mismatch") + +backup = data.get("backup") or {} +backup_expected = { + "enabled": True, + "tool": "gitea dump", + "path": "/var/backups/gitea", + "checksum": "sha256", + "retention_days": 14, + "systemd_timer": "awatch-gitea-backup.timer", + "restore_tested": False, +} +for key, value in backup_expected.items(): + if backup.get(key) != value: + raise SystemExit(f"backup.{key} mismatch") +PY + elif command -v node >/dev/null 2>&1; then + node -e 'JSON.parse(require("fs").readFileSync(process.argv[1], "utf8"))' "$MANIFEST" \ + || fail "invalid_json:docs/registry/registry-evidence-manifest.json" + else + fail "json_validator_missing:python3_or_node_required" + fi +fi + +require_grep "git\\.iri1968\\.dpdns\\.org" "docs/registry/SOURCE_CODE_AND_BUILD_INFRASTRUCTURE_RU.md" "gitea_domain_source_infra" +require_grep "git\\.iri1968\\.dpdns\\.org" "docs/registry/GIT_RU_MIRRORING_RUNBOOK_RU.md" "gitea_domain_git_runbook" +require_grep "git\\.iri1968\\.dpdns\\.org" "README.md" "gitea_domain_readme" +require_grep "GitHub[[:space:]]*=[[:space:]]*public mirror only|public mirror only" "docs/registry/SOURCE_CODE_AND_BUILD_INFRASTRUCTURE_RU.md" "github_public_mirror_source_infra" +require_grep "GitHub[[:space:]]*=[[:space:]]*public mirror only|public mirror only" "docs/registry/GIT_RU_MIRRORING_RUNBOOK_RU.md" "github_public_mirror_git_runbook" +require_grep "public mirror" "README.md" "github_public_mirror_readme" +require_grep "GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU\\.md|Restore outline|Post-restore checks" "docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md" "backup_restore_runbook" +require_grep "awatch-gitea-backup\\.timer" "docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md" "backup_timer" +require_grep "sha256|SHA256" "docs/registry/GITEA_BACKUP_AND_RESTORE_RUNBOOK_RU.md" "backup_sha256" + +scan_files=( + "$ROOT/README.md" + "$REGISTRY_DIR"/*.md +) + +if grep -RInEi "(ФСТЭК|ФСБ).{0,80}(сертифицирован|сертификация|сертификат).{0,80}(есть|получен|имеется|подтвержден)" "${scan_files[@]}" >/tmp/registry_forbidden_fstec_fsb.$$ 2>/dev/null; then + fail "forbidden_claim_fstec_fsb_certification:$(cat /tmp/registry_forbidden_fstec_fsb.$$)" +fi +rm -f /tmp/registry_forbidden_fstec_fsb.$$ + +if grep -RInEi "(заменяет|replacement for|replaces).{0,80}(SIEM|DLP)|((SIEM|DLP).{0,80}(replacement|заменяет))" "${scan_files[@]}" \ + | grep -Eiv "(не |not |does not|не является|не подменяет|не заявляет|forbidden|not_made)" \ + >/tmp/registry_forbidden_replacement.$$ 2>/dev/null; then + fail "forbidden_claim_siem_dlp_replacement:$(cat /tmp/registry_forbidden_replacement.$$)" +fi +rm -f /tmp/registry_forbidden_replacement.$$ + +if grep -RInEi "(ML/LLM-based detection|LLM-based detection|ML-based detection|automatic remediation)" "${scan_files[@]}" \ + | grep -Eiv "(forbidden|not_made|не заявляет|не фиксируется|не используется)" \ + >/tmp/registry_forbidden_ai_auto.$$ 2>/dev/null; then + fail "forbidden_claim_ai_or_automatic_remediation:$(cat /tmp/registry_forbidden_ai_auto.$$)" +fi +rm -f /tmp/registry_forbidden_ai_auto.$$ + +if ((${#failures[@]} > 0)); then + printf 'registry_readiness_check=fail\n' + for failure in "${failures[@]}"; do + printf '%s\n' "$failure" + done + exit 2 +fi + +printf 'registry_readiness_check=ok\n' +printf 'checked_files=%d\n' "${#required_files[@]}"