first with full handle over rpm

Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
This commit is contained in:
GnomeZworc 2026-04-25 14:49:14 +02:00
commit 274ea454dd
Signed by: nicolas.boufideline
GPG key ID: 4406BBBF8845D632
50 changed files with 4309 additions and 0 deletions

228
README.md Normal file
View file

@ -0,0 +1,228 @@
# ClonePack
ClonePack est un système de clonage et de gel d'artefacts. Il permet de synchroniser des dépôts externes, de les figer à un instant donné, et de les exposer localement via un miroir HTTP.
## Types d'artefacts supportés
- Enterprise Linux (RPM/YUM/DNF)
- Debian (APT) — *à venir*
- Docker images — *à venir*
- Binaires — *à venir*
## Fonctionnalités
- Clonage de dépôts externes avec vérification SHA256
- Scan régulier des sources pour détecter les nouveaux paquets
- Validation manuelle ou automatique des mises à jour
- Snapshots métadonnées avec diff et rollback
- Proxy miroir HTTP (consommable directement par `yum`/`apt`)
---
## Compilation
**Prérequis** : Go 1.25+
```bash
make build # compile → bin/clonepack
make run # compile + démarre le serveur
make test # lance les tests
make vet # analyse statique
make clean # supprime bin/
```
Le binaire est généré dans `bin/clonepack`.
---
## Configuration
ClonePack se configure via fichier YAML ou variables d'environnement (préfixe `CLONEPACK_`).
**Fichier de config (optionnel) :**
```yaml
server:
host: 0.0.0.0
port: 8080
db:
path: ./clonepack.db
data_dir: ./data
sync:
interval: 1h
```
**Variables d'environnement :**
```bash
CLONEPACK_SERVER_PORT=9090
CLONEPACK_DB_PATH=/var/lib/clonepack/clonepack.db
CLONEPACK_DATA_DIR=/var/lib/clonepack/data
CLONEPACK_SYNC_INTERVAL=30m
```
**Démarrer le serveur :**
```bash
./bin/clonepack serve
./bin/clonepack serve --config /etc/clonepack/config.yaml
```
Par défaut le serveur écoute sur `http://0.0.0.0:8080`.
---
## CLI
Toutes les commandes CLI appellent l'API REST. L'URL du serveur se configure avec `--api-url` (défaut : `http://localhost:8080`).
### Dépôts
```bash
# Créer un dépôt RPM (sync auto)
./bin/clonepack repo create \
--name rocky9-baseos \
--type rpm \
--source-url https://download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os
# Créer avec validation manuelle
./bin/clonepack repo create \
--name rocky9-baseos \
--type rpm \
--source-url https://download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os \
--sync-mode manual
# Lister les dépôts
./bin/clonepack repo list
# Détail d'un dépôt
./bin/clonepack repo get 1
# Supprimer un dépôt
./bin/clonepack repo delete 1
```
### Clonage
```bash
# Lancer le clonage complet d'un dépôt (télécharge tous les paquets)
./bin/clonepack repo clone 1
```
Le clonage est asynchrone : la commande affiche la progression du job jusqu'à completion.
### Synchronisation
```bash
# Déclencher un scan pour détecter les nouveaux paquets
./bin/clonepack repo sync 1
# Lister les paquets en attente de validation (mode manual)
./bin/clonepack repo sync-list 1
# Approuver des paquets spécifiques (téléchargement en arrière-plan)
./bin/clonepack repo sync-approve 1 42 43 44
# Approuver tous les paquets en attente
./bin/clonepack repo sync-approve 1 --all
# Rejeter des paquets (ils réapparaîtront au prochain scan)
./bin/clonepack repo sync-reject 1 42
```
Le scheduler tourne automatiquement selon l'intervalle configuré (`sync.interval`). En mode `auto`, les nouveaux paquets sont téléchargés directement. En mode `manual`, ils s'accumulent dans la liste d'attente.
### Blocklist
Les paquets bloqués n'apparaissent plus jamais dans la liste pending, quelle que soit leur version.
```bash
# Bloquer définitivement un paquet (par ID de la liste pending)
# → bloque la version exacte ET toutes les futures versions du même paquet
./bin/clonepack repo sync-block 1 42 43
# Voir les paquets bloqués
./bin/clonepack repo sync-blocklist 1
# Débloquer (par ID de la liste blocked)
./bin/clonepack repo sync-unblock 1 1 2
```
### Snapshots
```bash
# Créer un snapshot manuellement
./bin/clonepack repo snapshot create 1
./bin/clonepack repo snapshot create 1 --label "avant-mise-a-jour"
# Lister les snapshots d'un dépôt
./bin/clonepack repo snapshot list 1
# Détail d'un snapshot (métadonnées + liste des paquets)
./bin/clonepack repo snapshot show 1 3
# Comparer deux snapshots
./bin/clonepack repo snapshot diff 1 2 3
# Rollback vers un snapshot (supprime les paquets intrus, re-télécharge les manquants)
./bin/clonepack repo snapshot rollback 1 2
# Supprimer un snapshot
./bin/clonepack repo snapshot delete 1 3
```
Un snapshot automatique est créé après chaque `sync-approve`.
---
## Proxy miroir
ClonePack expose chaque dépôt cloné comme un miroir HTTP à l'adresse :
```
http://<host>:<port>/mirror/<repo_id>/
```
**Configuration YUM/DNF** (`/etc/yum.repos.d/clonepack.repo`) :
```ini
[rocky9-baseos]
name=Rocky Linux 9 BaseOS via ClonePack
baseurl=http://clonepack:8080/mirror/1
enabled=1
gpgcheck=0
```
**Configuration APT** (`/etc/apt/sources.list.d/clonepack.list`) :
```
deb [trusted=yes] http://clonepack:8080/mirror/2 bookworm main
```
Le proxy sert uniquement ce qui a été cloné localement (mode local-only). Si un fichier est absent, le serveur retourne 404.
---
## API REST
| Méthode | Route | Action |
|---------|-------|--------|
| `GET` | `/health` | Santé du serveur |
| `POST` | `/api/v1/repos` | Créer un dépôt |
| `GET` | `/api/v1/repos` | Lister les dépôts |
| `GET` | `/api/v1/repos/{id}` | Détail d'un dépôt |
| `DELETE` | `/api/v1/repos/{id}` | Supprimer un dépôt |
| `POST` | `/api/v1/repos/{id}/clone` | Démarrer le clonage |
| `GET` | `/api/v1/repos/{id}/clone/status` | Statut du clonage |
| `POST` | `/api/v1/repos/{id}/sync/trigger` | Déclencher un scan |
| `GET` | `/api/v1/repos/{id}/sync/pending` | Paquets en attente |
| `POST` | `/api/v1/repos/{id}/sync/approve` | Approuver des paquets |
| `POST` | `/api/v1/repos/{id}/sync/reject` | Rejeter des paquets |
| `POST` | `/api/v1/repos/{id}/sync/block` | Bloquer définitivement des paquets |
| `POST` | `/api/v1/repos/{id}/sync/unblock` | Débloquer des paquets |
| `GET` | `/api/v1/repos/{id}/sync/blocked` | Lister les paquets bloqués |
| `POST` | `/api/v1/repos/{id}/snapshots` | Créer un snapshot |
| `GET` | `/api/v1/repos/{id}/snapshots` | Lister les snapshots |
| `GET` | `/api/v1/repos/{id}/snapshots/{snap_id}` | Détail d'un snapshot |
| `DELETE` | `/api/v1/repos/{id}/snapshots/{snap_id}` | Supprimer un snapshot |
| `GET` | `/api/v1/repos/{id}/snapshots/diff?from=X&to=Y` | Diff deux snapshots |
| `POST` | `/api/v1/repos/{id}/snapshots/{snap_id}/rollback` | Rollback |
| `GET` | `/mirror/{id}/*` | Proxy miroir HTTP |