Commit Graph

225 Commits

Author SHA1 Message Date
753d4076c9 Migre etat vers labels iTop verbatim (Production, Nouveau, etc.)
Aligne la colonne servers.etat sur les valeurs iTop exactes au lieu
des codes lowercase internes.

Impact:
- servers.etat stocke: Production, Implémentation, Stock, Obsolète,
  EOL, prêt, tests, Nouveau, A récupérer, Cassé, Cédé, En panne,
  Perdu, Recyclé, Occasion, A détruire, Volé
- Remplace tous les 'production'/'obsolete'/'stock'/'eol'/'implementation'
  en WHERE/comparisons par les labels iTop verbatim (~10 fichiers)
- Templates badges/filtres: valeurs + labels iTop
- itop_service: maintient mapping iTop API internal code <-> DB label
- import_sanef_*: norm_etat retourne la valeur iTop verbatim ou None
  (plus de fallback silencieux sur 'production')

Ajoute:
- tools/import_etat_itop.py : migration lowercase -> iTop + re-import CSV
- tools/import_environnement.py : fix dry-run pour ADD COLUMN idempotent

Supprime:
- tools/fix_etat_extend.py (obsolete par import_etat_itop.py)
2026-04-14 18:40:56 +02:00
7b87074faa Qualys page size 100 2026-04-14 16:58:03 +02:00
d15db654d4 Qualys: activation keys lazy (no API on page load if cache empty) 2026-04-14 16:24:45 +02:00
49b1865d13 Qualys page size 250 (lower timeout risk) 2026-04-14 16:19:29 +02:00
67287b8256 Qualys: cancel button for ongoing refresh 2026-04-14 16:12:44 +02:00
69aeb0e77a Qualys agents page: sync route + drop LOWER (citext is case-insensitive) 2026-04-14 16:09:56 +02:00
1bfdb16bfb Qualys: actkeys cache 24h + refresh timeout 600s 2026-04-14 16:07:25 +02:00
07775a385f Qualys activation keys: short timeout (5s) 2026-04-14 16:07:03 +02:00
347ea53c27 Qualys skip threshold: 5 min -> 40 min 2026-04-14 15:56:41 +02:00
ec90a4a9d1 Qualys: reduce refresh page size to 500 2026-04-14 15:55:35 +02:00
6db58952ec Qualys refresh: early exit if no stale assets (< 5 min) 2026-04-14 15:48:41 +02:00
f66d728d2d Qualys timeout 300s for bulk hostasset search 2026-04-14 15:37:50 +02:00
d24afa37b2 Qualys refresh: skip assets updated within last 5 minutes 2026-04-14 15:32:01 +02:00
d779426118 Bump Qualys page size back to 1000 2026-04-14 15:21:04 +02:00
71f83d5d4f Qualys refresh: threading lock + 409 if already running 2026-04-14 15:20:17 +02:00
e3bcf8fcc1 Qualys refresh: sync route so blocking requests run in threadpool 2026-04-14 15:18:16 +02:00
67f123e9f5 Qualys refresh: pagination + per-row savepoint to isolate errors 2026-04-14 15:13:48 +02:00
a422894f83 Sync Qualys FQDN to servers + use fqdn first for DNS resolution 2026-04-14 15:00:40 +02:00
92175992f8 Qualys: tagName + CONTAINS (API field, not UI syntax) 2026-04-14 14:53:54 +02:00
a19281a771 Qualys filter: CONTAINS instead of EQUALS for tag 2026-04-14 14:48:29 +02:00
a331d16a12 Qualys filter: tags.name instead of tagName 2026-04-14 14:47:48 +02:00
053c9a3b59 Add Voir detail button and results route for realtime audit 2026-04-14 13:10:23 +02:00
747e883d22 Smart DNS suffix order based on hostname convention (r=rec, p/i=prod) 2026-04-14 13:02:24 +02:00
53545585f0 Configurable DNS suffixes + 2s socket timeout for faster resolve 2026-04-14 12:58:54 +02:00
da1042fef4 Fix SSH key: read PEM content from settings + ssh_key_default_user 2026-04-14 12:56:09 +02:00
8dba0706b0 Filter Qualys agent refresh on tag name=server 2026-04-14 12:18:43 +02:00
677f621c81 Admin applications + correspondance cleanup + tools presentation DSI
- Admin applications: CRUD module (list/add/edit/delete/assign/multi-app)
  avec push iTop bidirectionnel (applications.py + 3 templates)
- Correspondance prod<->hors-prod: migration vers server_correspondance
  globale, suppression ancien code quickwin, ajout filtre environnement
  et solution applicative, colonne environnement dans builder
- Servers page: colonne application_name + equivalent(s) via get_links_bulk,
  filtre application_id, push iTop sur changement application
- Patching: bulk_update_application, bulk_update_excludes, validations
- Fix paramiko sftp.put (remote_path -> positional arg)
- Tools: wiki_to_pdf.py (DokuWiki -> PDF) + generate_ppt.py (PPTX 19 slides
  DSI patching) + contenu source (processus_patching.txt, script_presentation.txt)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:11:58 +02:00
caa2be71a4 Misc: servers page (application + equivalent), campagne tweaks
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 18:51:36 +02:00
a706e240ca Patching: exclusions + correspondance prod<->hors-prod + validations
- /patching/config-exclusions: exclusions iTop par serveur + bulk + push iTop
- /quickwin/config: liste globale reboot packages (au lieu de per-server)
- /patching/correspondance: builder mark PROD/NON-PROD + bulk change env/app
  + auto-detect par nomenclature + exclut stock/obsolete
- /patching/validations: workflow post-patching (en_attente/OK/KO/force)
  validator obligatoire depuis contacts iTop
- /patching/validations/history/{id}: historique par serveur
- Auto creation patch_validation apres status='patched' dans QuickWin
- check_prod_validations: banniere rouge sur quickwin detail si non-prod non valides
- Menu: Correspondance sous Serveurs, Config exclusions+Validations sous Patching
- Colonne Equivalent(s) sur /servers + section Correspondance sur detail

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 18:51:30 +02:00
ba0bff0f6e Remove: safe-patching (remplace par QuickWin) + audit-full
- Safe Patching v1 redondant avec QuickWin, supprime
- audit-full: page supprimee, tables DB preservees
- menu + main.py nettoyes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 18:51:17 +02:00
3f47fea8e6 Audit: jobs background paralleles + progression live
- Audit global/realtime: threads paralleles, job_id retourne immediat
- /audit/realtime/progress/{job_id}: KPIs + barre progression + tableau live
- Polling AJAX toutes les 2s, etapes animees (DNS/SSH/Audit/OK)
- PRETTY_NAME correction: extraction via grep -E 'PRETTY_NAME' + cut
- OS version: normalisation lors de save_audit_to_db (Debian GNU/Linux -> Debian X (Bookworm))
- Mise a jour base: itop sync bidirectionnel avec push OS version

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 18:51:05 +02:00
5ea4100f4c Qualys: deploy agent background jobs + upgrade/downgrade + AJAX overlays
- Background job system pour deploiement (threads paralleles, progression live)
- Upgrade/downgrade: compare versions installee vs package, rpm -Uvh --oldpackage
- Checkbox "Forcer le downgrade" dans UI
- Choix auto DEB/RPM base sur os_version (centos/rhel/rocky/oracle -> RPM)
- Check agent: rpm -q / dpkg -s (evite faux positifs "agent installe mais inactif")
- Bouton "Rafraichir depuis Qualys" AJAX avec timer
- Agents page: colonne version installee + statut

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 18:50:56 +02:00
8479d7280e Users/Contacts: workflow profils + LDAP + sync iTop + etat aligne
- Users: 4 profils (admin/coordinator/operator/viewer) remplacent la matrix
- /users/add: picker contacts iTop (plus de creation libre)
- /me/change-password: flow force_password_change
- LDAP: service + section settings + option login
- Sync iTop contacts: filtre par teams (SecOps/iPOP/Externe/DSI/Admin DSI)
- Auto-desactivation users si contact inactif
- etat: alignement sur enum iTop (production/implementation/stock/obsolete)
- Menu: Contacts dans Administration, Serveurs en groupe repliable
- Audit bases: demo/prod via JWT mode

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 18:50:43 +02:00
4fa5f67c32 Qualys agents: bouton Rafraichir + cron 6h
- refresh_all_agents(): bulk sync tous les assets depuis API Qualys QPS
- Bouton "Rafraîchir depuis Qualys" sur la page agents
- Cron toutes les 6h: refresh_agents.py (prod + demo)
- Message de confirmation après refresh
2026-04-11 21:56:59 +02:00
6411774004 Fix deploy page: NoneType sort + version extraite du nom fichier dans dropdown 2026-04-11 21:39:59 +02:00
3d053019e6 Deploiement Agent Qualys complet
- Page /qualys/deploy: selection serveurs, config agent, choix package
- Deploiement SSH: copie package, install rpm/dpkg, activation, verification
- Verification agent: check status/version sur serveurs selectionnes
- Auto-detect OS (deb vs rpm)
- Packages stockes dans /opt/patchcenter/agents/
- Filtres: hostname, domaine, environnement, OS
- Log detaille du deploiement
- Menu "Deployer Agent" dans la navigation Qualys
2026-04-11 21:26:45 +02:00
b7b0965722 Fix: qualys/agents - convert rows to dicts pour compatibilite Jinja2 map/attribute 2026-04-11 21:07:44 +02:00
3964dd2c89 Fix: page qualys/agents - try/except sur get_activation_keys et get_agents_summary 2026-04-11 21:04:47 +02:00
1f0c00c1dc Suppression menu Specifiques de la navigation 2026-04-11 21:01:32 +02:00
32d602975b Sync contacts: role depuis Teams iTop (SecOps→referent_technique, iPOP→responsable_applicatif) 2026-04-11 14:33:12 +02:00
3707308063 Sync iTop: responsables domaine par fréquence + emails
- domain_environments.responsable_nom/email = responsable_domaine iTop le plus fréquent par couple domaine×env
- servers.responsable_nom/email = responsable_serveur iTop (par VM)
- servers.referent_nom/email = responsable_domaine iTop (par VM)
- Mapping Excel: Resp Domaine DTS → domain_environments.responsable, Valideur RA = par serveur
2026-04-11 14:22:29 +02:00
73cec814b6 Fix: typologies iTop sans org_id (DomaineApplicatif, Environnement, Zone, DomainLdap) 2026-04-11 14:01:20 +02:00
df4cd3be6f Sync iTop: import emails responsable serveur/domaine dans servers + domain_environments 2026-04-11 13:55:25 +02:00
29e5a28a27 Fix: KeyError 'updated' → 'servers_updated' dans sync_to route 2026-04-11 13:36:23 +02:00
6683813743 Export iTop: sync responsable serveur et responsable domaine 2026-04-11 13:26:51 +02:00
d8a526368e Refonte synchro iTop bidirectionnelle complète
- Import: typologies directement depuis iTop (Environnement, DomaineApplicatif, Zone, DomainLdap)
- Import: contacts, VMs avec tous champs custom, serveurs physiques, IPs
- Export: typologies + serveurs avec champs patching (tier, ssh, freq, window, excludes)
- Timestamp dernière synchro import/export
- Bandeau synchro visible sur TOUS les onglets du referentiel
2026-04-11 13:19:10 +02:00
1ff6b3fd4d Sync to iTop: export referentiel (environnements, domaines, zones) + serveurs 2026-04-11 04:17:22 +02:00
66eeff99e8 Sync iTop: import IPs dans server_ips + traceback sur erreur sync 2026-04-11 03:54:45 +02:00
322fa71324 Fix sync iTop: champs corrects (patch_window, contacts.role, ssh_method constraint, rollback) 2026-04-11 03:20:04 +02:00
be6c5158b8 Sync iTop: tous les champs custom (tier, connexion, ssh_user, patch_freq, pref_jour/heure, domain_ldap, excludes)
Correspondance complete iTop <-> PatchCenter:
- tier_name -> tier (Tier 0 -> tier0)
- connexion_method_name -> ssh_method
- ssh_user_name -> ssh_user
- patch_frequency_name -> patch_frequency (Monthly -> monthly)
- pref_patch_jour_name -> pref_patch_jour
- pref_patch_heure_name -> pref_patch_heure
- patch_excludes -> patch_excludes
- domain_ldap_name -> domain_ltd
2026-04-11 02:28:39 +02:00
3b5f0992b3 Refonte sync iTop: import complet contacts/domaines/envs/zones/serveurs
- Tables referentielles videes (iTop = maitre)
- Import: Person -> contacts, domaine_applicatif -> domains, environnement -> environments, zone -> zones
- Import: domain_environments auto-crees depuis les combinaisons VM
- Import: VirtualMachine + Server avec responsable_serveur, responsable_domaine, IP, OS, description
- Export: status, description, creation VMs manquantes
- Matching par hostname court (sans FQDN)
2026-04-11 01:58:31 +02:00
ba48e75b68 Fix matching iTop: compare aussi par hostname court (sans .mpcz.fr) 2026-04-11 00:23:33 +02:00
db74111d58 Sync iTop enrichie: responsable_serveur + responsable_domaine + creation VMs
- Import: responsable_serveur_name → responsable_nom, responsable_domaine_name → referent_nom
- Import: environnement iTop synchronise
- Export: cree les VMs manquantes dans iTop (classe VirtualMachine, org MPCZ)
- Export: hostname comme nom (pas fqdn)
2026-04-11 00:14:09 +02:00
53e59e7305 Sync iTop: ajout responsable serveur (contacts_list) + commentaire/description 2026-04-10 23:23:48 +02:00
f73ea25d5d Referentiel: boutons sync iTop (import/export) + messages status 2026-04-10 23:17:58 +02:00
acf20c5890 Service iTop REST: synchro bidirectionnelle serveurs + contacts
- ITopClient: wrapper REST API v1.3 (get/create/update servers, contacts)
- sync_from_itop: import serveurs + contacts iTop vers PatchCenter
- sync_to_itop: export serveurs PatchCenter vers iTop
- Correspondance champs: hostname/name, os/osversion, etat/status, contacts
- Config iTop dans app_secrets (url, user, pass)
2026-04-10 23:11:32 +02:00
33dd3a779e Fix: GET /audit/realtime redirige vers dashboard au lieu de crash int_parsing 2026-04-10 22:49:05 +02:00
4801d805b1 Fix: ip_type='primary' au lieu de 'ipv4' dans server_ips 2026-04-10 20:57:14 +02:00
b190c04147 Fix: hosts manquants + no-cache sur resultats audit (evite re-POST) 2026-04-10 20:38:44 +02:00
1be5e867dc Fix: server_ips colonne ip_address au lieu de ip 2026-04-10 20:18:59 +02:00
369ca7e5a3 Audit: mise a jour table servers avec IP, OS, FQDN depuis resultats audit
- Apres un audit reussi, update servers.os_version et servers.fqdn
- Resout l'IP via DNS et l'insere dans server_ips
- Ne touche que les serveurs avec status OK
2026-04-10 20:10:27 +02:00
16315ab3b5 Fix SSH audit: lire settings DB au lieu de hardcoder user/key/suffixes
- SSH key et user lus depuis app_secrets (ssh_key_file, ssh_user)
- Ajout .mpcz.fr dans DNS_SUFFIXES
- Auto-detect Ed25519/RSA/ECDSA
- Fallback password depuis secrets
2026-04-10 20:01:15 +02:00
c2f3d669eb Mode Demo/Reel au login + base patchcenter_demo
- Choix Production/Demo sur la page de login
- Base patchcenter_demo avec schema identique + 10 serveurs mpcz
- Le mode est stocke dans le JWT token
- La session DB bascule automatiquement selon le mode
2026-04-10 19:39:35 +02:00
Khalid MOUTAOUAKIL
e96d79aae3 QuickWin: prereq/snapshot services, referentiel, logs, correspondance
- Split quickwin services: prereq, snapshot, log services
- Add referentiel router and template
- QuickWin detail: prereq/snapshot terminal divs for production
- Server edit partial updates
- QuickWin correspondance and logs templates
- Base template updates

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 18:13:00 +02:00
Khalid MOUTAOUAKIL
13290c1ebb Phase 1 securite: permission checks sur tous les routers
- auth: verification is_active au login (compte desactive = bloque)
- settings: enforcement backend can_edit(settings) + role/section
- servers: can_view/can_edit(servers) sur toutes les routes
- planning: can_view/can_edit(planning) sur toutes les routes
- specifics: can_view/can_edit(specifics) sur toutes les routes
- contacts: rattache au module servers (can_view/can_edit)
- campaigns: can_view/can_edit(campaigns) sur toutes les routes manquantes
- audit/audit_full: can_view/can_edit(audit) sur toutes les routes
- qualys: can_view/can_edit(qualys) sur toutes les routes
- safe_patching: perm checks + authentification sur SSE stream
- quickwin: can_view/can_edit(campaigns|quickwin) sur toutes les routes

97 points d'injection securises, 0 route sans controle

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 16:46:05 +02:00
Khalid MOUTAOUAKIL
5cc10c5b6c Module QuickWin complet + filtres serveurs OS/owner
- QuickWin: campagnes patching rapide avec exclusions générales (OS/reboot) et spécifiques (applicatifs)
- Config serveurs: pagination, filtres (search, env, domain, zone, per_page), dry run, bulk edit
- Détail campagne: pagination hprod/prod séparée, filtres (search, status, domain), section prod masquée si hprod non terminé
- Auth: redirection qw_only vers /quickwin, profil lecture seule quickwin
- Serveurs: filtres OS (Linux/Windows) et Owner (secops/ipop/na), exclusion EOL
- Sidebar: lien QuickWin conditionné sur permission campaigns ou quickwin

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 16:27:45 +02:00
Khalid MOUTAOUAKIL
c550597a86 Export CSV serveurs avec filtres (domaine, env, tier, état, recherche)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 01:49:23 +02:00
Khalid MOUTAOUAKIL
769e199735 Export CSV patching avec filtres (année, scope, domaine, recherche)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 01:30:17 +02:00
Khalid MOUTAOUAKIL
7f5e5c83eb Export CSV: serveurs sans agent + agents inactifs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 01:24:49 +02:00
Khalid MOUTAOUAKIL
5db47c497f Agents sans Qualys: filtres Alpine.js sur hostname, OS, domaine, env, état
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 01:20:59 +02:00
Khalid MOUTAOUAKIL
6a5bdefde5 Sans agent: lister tous les serveurs sans exclusion
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 01:13:49 +02:00
Khalid MOUTAOUAKIL
b159960522 Qualys agents: colonne État ajoutée, exclure décommissionnés de la liste sans agent
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 01:06:49 +02:00
Khalid MOUTAOUAKIL
c22ad75ee8 État édition: labels avec accents (Éteint, En implémentation, Décommissionné, EOL)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 00:59:54 +02:00
Khalid MOUTAOUAKIL
e551ddf575 Tooltip survol sur env/etat tronqués, dropdown labels lisibles, état eteint ajouté
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 00:55:53 +02:00
Khalid MOUTAOUAKIL
c16c628e96 Fix: last_checkin datetime to string avec |string filtre Jinja2
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 00:39:30 +02:00
Khalid MOUTAOUAKIL
067dec6bcd Agents inactifs: KPI cliquable avec *, légende RHEL5/EOL, liste détaillée
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 00:33:54 +02:00
Khalid MOUTAOUAKIL
29a377887f KPI agents Qualys: actifs/inactifs/sans agent sur dashboard + page Agents avec liste détaillée
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 00:01:57 +02:00
Khalid MOUTAOUAKIL
ca16e42ef8 Cache 10min sur détail vulnérabilités (HTMX), indication (cache) affichée
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 23:52:55 +02:00
Khalid MOUTAOUAKIL
e11714c421 Comparaison même semaine 2026 vs 2025: barres, écart pts, objectif, données incomplètes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 23:47:01 +02:00
Khalid MOUTAOUAKIL
340970c108 Comparaison 2026 vs 2025: barres progression, écart serveurs et points
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 23:45:17 +02:00
Khalid MOUTAOUAKIL
8286fe0624 Fix histogramme: cancelled_weeks séparés, barres empilées vert+rouge par semaine
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 23:30:30 +02:00
Khalid MOUTAOUAKIL
4517dcdd39 Histogramme patching: barres empilées vert (patché) + rouge (annulé/reporté), total affiché
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 23:27:14 +02:00
Khalid MOUTAOUAKIL
c05ec932db Fix histogramme patching: exclure annulés/reportés du graphe semaines
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 23:25:36 +02:00
Khalid MOUTAOUAKIL
a43dd01b7e Loading spinner sur vulns et détail asset (HTMX), masqué après réponse
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 23:13:33 +02:00
Khalid MOUTAOUAKIL
1d8502d25b Loading overlay sur bouton Rechercher Qualys
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 23:09:43 +02:00
Khalid MOUTAOUAKIL
c94d952948 Fix resync: retirer data-loading, ajouter texte explication cache 10min
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 23:07:21 +02:00
Khalid MOUTAOUAKIL
c139dfbaa2 Cache mémoire 10min pour Qualys API, bouton Resync temps réel, page Agents (activation keys + versions)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 23:04:48 +02:00
Khalid MOUTAOUAKIL
0dc0fc7643 Vulns: parser results en tableau Package/Version installée/Version requise
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 22:51:50 +02:00
Khalid MOUTAOUAKIL
31bf62651c Qualys vulns: clic sur badges ouvre detail (QID, titre, CVE avec lien NVD, CVSS3, detection, solution)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 22:48:44 +02:00
Khalid MOUTAOUAKIL
662b9c3535 Fix vulns: utiliser IPs au lieu de QPS asset IDs pour API VMDR
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 22:42:30 +02:00
Khalid MOUTAOUAKIL
f04d04224d Qualys: vulnérabilités severity 3/4/5 dans résultats recherche (API VMDR)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 22:38:56 +02:00
Khalid MOUTAOUAKIL
40b0307f62 Accents dans tous les templates: audité, réseau, corrélation, patché, données, décommissionnés
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 22:28:33 +02:00
Khalid MOUTAOUAKIL
cb8ade24e4 Patching: filtre SecOps/Hors SecOps, KPIs par perimetre, detail partial "pas encore audite"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 22:11:35 +02:00
Khalid MOUTAOUAKIL
390a162cf4 Fix: inclure status partial (serveurs Ayoub) dans toutes les requetes audit/patching/dashboard
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 18:20:33 +02:00
Khalid MOUTAOUAKIL
dc3efd081e Fix sidebar Complet/Patching actif, domaines cliquables dans patching
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 18:18:44 +02:00
Khalid MOUTAOUAKIL
dea2889746 Module Patching: KPIs, graphe semaines, domaine, detail par serveur, tri, filtre, 2025/2026
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 18:06:38 +02:00
Khalid MOUTAOUAKIL
24c1db2aca Fix pagination: conserve sort/dir dans les liens de page
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 17:55:11 +02:00
Khalid MOUTAOUAKIL
ed23cc3fb6 Dashboard patching 2026: KPIs, barre progression, graphe semaines, domaine/env/zone
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 17:54:00 +02:00
Khalid MOUTAOUAKIL
2b2fac7c13 Dernier patch: date/semaine depuis Excel, colonne triable, couleur vert/jaune/rouge
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 17:48:11 +02:00
Khalid MOUTAOUAKIL
2ac263e80a Tri colonnes hostname, uptime, reboot (asc/desc) avec indicateur fleche
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 17:35:38 +02:00
Khalid MOUTAOUAKIL
df03852c86 Export CSV avec filtres (domaine/zone/recherche/KPI), BOM UTF-8
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 17:20:35 +02:00
Khalid MOUTAOUAKIL
c42708db75 Processus: restart_hint et cmdline affiches en entier, plus de troncature
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 17:13:39 +02:00
Khalid MOUTAOUAKIL
cdd550c84b KPIs applicatifs: Oracle, PostgreSQL, MariaDB, HANA, httpd, nginx, HAProxy, Tomcat, Java, Node.js, Redis, MongoDB, Elastic, Docker/Podman — cliquables avec filtre
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 17:08:25 +02:00
Khalid MOUTAOUAKIL
38b27beb9d Fix KPIs detail serveur sur une seule ligne (inline flex-nowrap)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:49:45 +02:00
Khalid MOUTAOUAKIL
f6571c2b10 Flow map: filtre par domaine/zone, recherche serveur avec autocompletion
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:48:29 +02:00
Khalid MOUTAOUAKIL
532ecf7e3d Carte flux visuelle SVG: noeuds, liens verts, pan/zoom, tooltip, recherche
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:44:20 +02:00
Khalid MOUTAOUAKIL
0a309ea4f7 Filtre domaine + zones (DMZ, EMV, LAN) dans dropdown
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:38:54 +02:00
Khalid MOUTAOUAKIL
c7831f5b86 KPIs sur une seule ligne (flex-nowrap, min-width:0)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:37:00 +02:00
Khalid MOUTAOUAKIL
a20318f010 Pagination 20 lignes par page
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:34:04 +02:00
Khalid MOUTAOUAKIL
d283e8ab8c Pagination 50/page, recherche hostname, filtre domaine
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:32:07 +02:00
Khalid MOUTAOUAKIL
2864a15817 KPIs audit complet: reboot, disque 90%/80%, uptime > 4 mois, filtres cliquables
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:29:52 +02:00
Khalid MOUTAOUAKIL
09a039a6fd Fix route order: flow-map avant {audit_id}
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:27:48 +02:00
Khalid MOUTAOUAKIL
6834710af6 Fix CAST inet + IPv6 cleanup dans resolve_dest_server
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:23:32 +02:00
Khalid MOUTAOUAKIL
20cd9c7d80 Audit complet: import JSON, carte flux, carte applicative
- server_audit_full_service.py: SSH PSMP/cle, parsing, stockage JSONB, flow map
- server_audit.sh: script bash avec sudo (compatible PSMP cybsecope)
- audit_full router: import JSON, liste, detail, carte flux
- Templates: liste audits, detail 8 onglets, carte flux + carte applicative
- Jointures: server_id via servers, dest_server via server_ips
- Sous-menu Audit > Complet dans la sidebar

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:06:55 +02:00
Khalid MOUTAOUAKIL
833c4fc3d2 Quick Win delete, UI planning/specifics reorganises, accents retires
- Safe Patching: bouton supprimer campagne (admin only)
- Safe Patching: boutons nouvelle campagne et planning en haut
- Safe Patching: message suppression dans les notifications
- Planning: formulaire ajouter deplace apres le Gantt (compact)
- Planning: accents retires des messages flash
- Specifics: formulaire ajouter deplace en haut avant le tableau
- Specifics: colonne Wave retiree, colonnes Stop/Start renommees

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 15:44:22 +02:00
Khalid MOUTAOUAKIL
49d5658475 Safe Patching wizard, SSE terminal, SSH password fallback, Qualys VMDR testé
Safe Patching Quick Win:
- Wizard 4 steps: Prérequis → Snapshot → Exécution → Post-patch
- Step 1: vérif SSH/disque/satellite par branche, exclure les KO
- Step 2: snapshot vSphere VMs
- Step 3: commande yum éditable, lancer hprod puis prod (100% requis)
- Step 4: vérification post-patch, export CSV
- Terminal SSE live (Server-Sent Events) avec couleurs
- Exclusion serveurs par checkbox dans chaque branche
- Label auto Quick Win SXX YYYY

SSH:
- Fallback password depuis settings si clé SSH absente
- Détection auto root (id -u) → pas de sudo si déjà root
- Testé sur VM doli CentOS 7 (10.0.2.4)

Qualys VMDR:
- API 2.0 testée et fonctionnelle avec compte sanef-ae
- Knowledge Base (CVE/QID/packages) accessible
- Host Detections (vulns par host) accessible
- Migration vers API 4.0 à prévoir (EOL dans 85 jours)

Qualys Agent installé sur doli (activation perso qg2)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 06:49:31 +02:00
Khalid MOUTAOUAKIL
977733343a Server pairs, campaign types, wave notes, in_progress fixes
- Table server_pairs: 682 paires prod/hprod auto-détectées via app_group
- Campaign types: standard, quickwin, safe_patching
- Patch waves: note explicative dans spécifiques
- Opérateur peut planifier en in_progress
- Limites intervenants visibles en in_progress
- Formulaires inline actifs en in_progress
- Backup DB uploadé sur Drive

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 05:32:37 +02:00
Khalid MOUTAOUAKIL
032e91a90c BOC SAP corrigé, stop/start order, patch waves, DMZ zone, préférences patching
- BOC SAP: stop_order ajouté (SolMan→CM→CC→AS→CI→HANA), conforme doc v3.1.4
- 3 serveurs BOC HO ajoutés (vpbocarep1, vpbocasec1, vpbocjump1)
- Patch waves: DNS (V1: 1+3, V2: 2+4), SMTP (V1: smtp2, V2: smtp1)
- Colonnes Stop order / Start order dans Spécifiques
- Campagne: colonne Zone (DMZ rouge, EMV jaune, LAN bleu) + KPI DMZ
- DMZ: filtre par zone au lieu de domaine (27 serveurs récupérés)
- Préférences patching: jour/heure éditables dans serveurs, hérités en campagne
- KPIs campagne en flex (une seule ligne)
- Limites intervenants: layout compact (max-width 400px)
- Tri campagne: domaine → hors-prod/prod → hostname
- Opérateur peut prendre en in_progress + planned
- Actions bulk campagne: prendre/assigner/exclure en masse
- Formulaires inline: fix Alpine.js → JS pur (display:none par défaut)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 03:52:46 +02:00
Khalid MOUTAOUAKIL
87a4585cf1 Sécurité: nginx CSP, ACL réseau, SSH hardening, PostgreSQL, assets locaux
- Nginx: headers HSTS/X-Frame/nosniff/CSP, rate limit login 5r/m
- CSP: self only, unsafe-inline (Tailwind JIT), object-src none, pas de CDN externe
- Assets locaux: Tailwind/HTMX/Alpine.js téléchargés dans /static/js/
- ACL réseau: table allowed_networks administrable depuis Settings
- Fichier /etc/nginx/patchcenter_acl.conf régénéré auto depuis la base
- PostgreSQL: logs connexion/déconnexion, requêtes lentes >1s, max 50 conn
- REVOKE CREATE pour user patchcenter, role readonly créé
- SSH: clé only, 3 tentatives, pas de TCP forwarding
- Backup toutes les 30min, rétention 3 jours
- Application 100% hors ligne (aucune dépendance internet côté navigateur)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 01:39:19 +02:00
Khalid MOUTAOUAKIL
a8f7329a48 Loading overlay, fix specifics edit, fix quotes, data-loading
- Overlay plein écran avec spinner pendant les actions longues
- data-loading attribute au lieu de onclick (évite problèmes quotes)
- Auto-attach JS sur tous les boutons data-loading
- Fix panel édition spécifiques (déplacé en haut)
- Fix double display:none sur overlay
- Messages descriptifs par action (resync, bulk, audit, prereqs)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 01:07:12 +02:00
Khalid MOUTAOUAKIL
8e62b1fb11 Qualys complet, contacts, audit refactoré, bulk serveurs
Qualys:
- Recherche API temps réel + cache 24h base locale
- Tags: liste DYN/STAT, mapping V3 (DOM-*, TYP-*, APP-*), nb assets cliquable
- CRUD tags: créer STAT, supprimer, resync API
- Détail asset: infos + décodage nomenclature V3 + tags assignés
- Ajout/retrait tag unitaire avec autocomplete filtrable
- Bulk add/remove tag en masse avec dropdown filtrable
- Tags retirer: charge dynamiquement les STAT assignés aux assets sélectionnés
- Resync assets sélectionnés + retour même recherche

Contacts:
- 50 contacts importés avec 93 scopes (domaine/app/serveur/zone par env)
- 13 rôles (responsable_domaine, ra_prod, ra_recette, referent_technique...)
- Recherche par nom/email/serveur (affiche contacts liés)
- CRUD complet: éditer, scopes, activer/désactiver, supprimer
- Serveurs liés calculés dynamiquement depuis les scopes

Audit:
- Restructuré: Audit général + sous-menu Spécifique
- Dernier audit global affiché avec date
- Lancer audit général avec exclusions (domaines/zones) et parallélisme
- KPIs Qualys KO et S1 KO cliquables
- Export CSV

Serveurs:
- Actions groupées bulk (domaine, env, tier, état, owner, licence)
- Dashboard: KPI EOL ajouté
- Filtre état: EOL + en décommissionnement ajoutés
- 138 serveurs EOL importés depuis Qualys (owner=na, hors périmètre)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 00:47:26 +02:00
Khalid MOUTAOUAKIL
e0105e7e00 Fix assignations datalist restore + intervenant list filter
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 15:28:40 +02:00
Khalid MOUTAOUAKIL
53c393b49b Permissions DB, créneaux auto, assignations, audit Splunk, accents
- Permissions 100% depuis user_permissions (plus de hardcode)
- Middleware injecte perms dans chaque requête
- Créneaux auto: 09h-12h30 / 14h-16h45, pas 15min, hprod lun-mar, prod mer-jeu
- Assignations par défaut: par domaine, app_type, zone, serveur (table default_assignments)
- Auto-liaison app_group: même intervenant recette+prod
- Audit Splunk: /var/log/patchcenter_audit.json (JSON one-line par event)
- Login/logout/campagnes/prereqs loggés en base + fichier
- Page erreur maintenance (500/404) avec contact SecOps
- Accents français dans toute lUI
- Operator affiché comme Intervenant
- Session 1h, redirect / vers dashboard si connecté
- Demo mode prereqs (DEMO_MODE=True)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 15:25:43 +02:00
Khalid MOUTAOUAKIL
ba8a969366 Campagnes: workflow complet, audit serveurs, assignation operateurs
- Workflow: draft → pending_validation (COMEP) → planned → in_progress → completed
- Prereqs auto: SSH, disque (1.2Go /, 800Mo /var), satellite
- Assignation: operateurs prennent/liberent, coordinateur assigne/force
- Limites par operateur par campagne (max_servers + raison)
- Default intervenant permanent par serveur (auto-assigne)
- Planning jours: lun+mar hors-prod, mer+jeu prod, jamais vendredi
- Preferences serveur: pref_patch_jour, pref_patch_heure (permanents)
- Audit serveurs: import Excel, 29 colonnes, KPIs, detail HTMX
- Jours en francais (Lun, Mar, Mer, Jeu)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 13:06:08 +02:00
Khalid MOUTAOUAKIL
8277653c43 PatchCenter v2.0 — Initial commit
Modules: Dashboard, Serveurs, Campagnes, Planning, Specifiques, Settings, Users
Stack: FastAPI + Jinja2 + HTMX + Alpine.js + TailwindCSS + PostgreSQL
Features: Qualys sync, prereqs auto, planning annuel, server specifics, role-based access

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 03:00:12 +02:00