docs(registry): document Russian Gitea contour and backup evidence
This commit is contained in:
@@ -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
|
||||
```
|
||||
|
||||
|
||||
@@ -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/<backup>.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.
|
||||
@@ -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`.
|
||||
@@ -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 на отдельном сервере.
|
||||
@@ -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, если он уже выполнен.
|
||||
@@ -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 и должен быть подтвержден в официальном пакете документов.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
полностью закрыт для подачи.
|
||||
@@ -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.
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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[@]}"
|
||||
Reference in New Issue
Block a user