PatchCenter - Application web de gestion du patching
Service snapshot_mgmt_service.py:
- list_snapshots(db, vcenter_filter_id=None): itere les vCenters actifs, walk recursif
des snapshot tree de chaque VM, retourne (vcenter, vm, snap_name, snap_id, vm_moid,
created_at, age_days, author, description, is_current)
- delete_snapshot(db, vcenter_id, vm_moid, snap_id, remove_children=False): supprime
un snapshot par moRef, attend la fin de la task vCenter
- Auteur deduit du prefixe du nom (format PatchCenter '<auteur>_YYYY-MM-DD_<suffixe>')
Router /snapshots:
- GET /snapshots: page principale (filtres + table)
- POST /snapshots/list: AJAX scan vCenters, retourne JSON
- POST /snapshots/delete: AJAX suppression batch, double confirmation cote UI
Template snapshots.html:
- Filtres: vCenter, auteur, 'Mes snapshots uniquement' (preselectionne user courant),
age min en jours (defaut 3)
- Table avec checkboxes, sel-all, badge age (vert <3j, orange 3-7j, rouge >7j)
- Bouton 'Charger/Refresh' (lazy load, eviter scan auto au pageload)
- Bouton 'Supprimer la selection' avec 2 confirmations + liste des snapshots
- Recharge auto apres suppression
Nav: lien '📸 Snapshots VM' ajoute dans le menu Patching.
|
||
|---|---|---|
| agents | ||
| app | ||
| deploy | ||
| docs | ||
| scripts | ||
| tools | ||
| .gitignore | ||
| backfill_canonicalize_env_domain_20260507.sql | ||
| cleanup_fqdn_incoherents.sql | ||
| fill_fqdn_from_domain_ltd.sql | ||
| migrate_applications.sql | ||
| migrate_correspondance.sql | ||
| migrate_drop_legacy_servers.sql | ||
| migrate_etat.sql | ||
| migrate_missing_tables_20260427.sql | ||
| migrate_patch_excludes_v2_20260507.sql | ||
| migrate_patch_excludes_v2_fix_20260507.sql | ||
| migrate_patch_excludes_wiki.sql | ||
| migrate_patching_notes_20260507.sql | ||
| migrate_patching_notes_fix_20260507.sql | ||
| migrate_pct_workflow_20260507.sql | ||
| migrate_planning_imports_v2.sql | ||
| migrate_planning_imports_v3.sql | ||
| migrate_planning_imports_v4.sql | ||
| migrate_planning_imports.sql | ||
| migrate_qualys_vuln_dashboard.sql | ||
| migrate_servers_satellite.sql | ||
| migrate_teams_pct_workflow.sql | ||
| migrate_teams_rules_20260506.sql | ||
| migrate_teams_rules_v2_20260506.sql | ||
| migrate_users.sql | ||
| populate_zones.sql | ||
| README.md | ||
| replace_etat.py | ||
| requirements.txt | ||
| resync_servers_text_fields.sql | ||
| run.sh | ||
| schema.sql | ||
| tailwind.config.js | ||
| update_zone_dmz.sql | ||
PatchCenter — SLPM (SANEF Linux Patch Manager)
App web FastAPI/PostgreSQL pour piloter le patching Linux SANEF : plan de patching, historique, users AD/LDAP, intégration iTop, API Qualys.
Source de vérité : VM CT 116 (pc.mpcz.fr, 172.28.199.185 + pct exec 116 -- ...) + repo Gitea adminmpmcz/patchcenter.
Workflow de dev (validé 2026-04-17)
- Claude modifie direct sur CT 116 via SSH →
git pushGitea - Khalid sur poste SANEF (
C:\patchcenter) →git pull→ test sur127.0.0.1:8080 - Si OK : Khalid ajoute ses modifs +
git pushGitea - Claude sur CT 116 →
git pull+systemctl restart patchcenter
Stack
- Python 3.11+ / FastAPI / Uvicorn
- PostgreSQL (patchcenter)
- Jinja2 + Tailwind (templates)
- LDAP (AD SANEF) pour auth
Structure
app/— code FastAPI (auth, models, routers, services)deploy/— scripts déploiement + migrations SQLtools/— scripts d'import/enrichissement (Qualys, iTop, Ayoub, etc.)docs/— DEPLOY.md, SANEF_PATCHING_PROCESS.mdmigrate_*.sql— migrations DB manuelles
Lancer en local (poste SANEF, pas la copie locale Claude)
python -m uvicorn app.main:app --host 0.0.0.0 --port 8080
Gitea
- Repo :
http://172.28.199.202:3000/adminmpmcz/patchcenter - Creds HTTPS :
adminmpmcz/Admin@2025
Notes
SECRET_KEYcôté VM :sanef-patchcenter-demo-key-change-me(drop-in systemd)- DB échangée via Gitea Releases (attachment
.sql), jamais dans le git tree - Après restore DB :
ALTER TABLE ... OWNER TO patchcenterpour toutes les tables+sequences