PatchCenter - Application web de gestion du patching
- Service mail_service.py: send_html_mail via SMTP standard (host/port/user/pass/from/use_tls
depuis Settings > SMTP). Gere SSL_465 et STARTTLS_587. Mode dry_run pour preview.
- Settings: nouvelle section 'smtp' avec smtp_host/port/user/pass/from/use_tls/pct_recipient
(a configurer pour O365 SMTP submission)
- Router planning_import.py:
* _build_pct_email(): construit subject + HTML pro/colore (header bleu degrade SANEF,
cards avec border-left bleu/orange, tableau serveurs, footer)
* Subject: 'Intervention sur <app>' si app uniforme, sinon liste des serveurs
* Plage horaire = 20 min × N serveurs (formattee Hh MM)
* 'Moyen d'exploitation prevu : Rollback en cas de probleme' ajoute en bas
* _fetch_pct_cc_emails(): query distinct contacts depuis responsable_domaine_contact_id
+ referent_technique_contact_id + server_additional_referents
* Endpoint POST /patching/import/pct-prevenance/preview retourne {subject, html, to, cc,
smtp_configured, row_count} sans envoyer
* Endpoint POST /patching/import/pct-prevenance/send envoie reellement, audit log,
update pct_mail_sent_at sur les rows
- Template patching_import.html:
* Bouton 'Prevenance PCT' (violet) a cote des autres actions
* Modal preview avec iframe sandboxe pour le rendu HTML mail
* Affiche destinataires, CC, objet, count serveurs
* Warning rouge si SMTP non configure (envoi desactive, preview seulement)
* 2 boutons: Annuler / Envoyer (avec confirmation)
|
||
|---|---|---|
| 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