Commit Graph

165 Commits

Author SHA1 Message Date
90444c0c56 feat(patching): particularites par serveur (notes wiki SANEF) + skip_first_reboot + reboot_delay cluster
Migration migrate_patching_notes_20260507.sql:
- servers.skip_first_reboot boolean (TPV1: vptraatpf1/2 a true)
- servers.patching_notes text (markdown — meme operateur)
- server_clusters.reboot_delay_min_minutes int default 0
- Backfill patching_notes pour 22 cas particuliers du wiki SANEF:
  ASM Oracle (~50 hosts kernel*), TPV1, HAproxy FL, Covoiturage,
  SI Patrimoine (vrpatbsip1 avant vrpataels1, kibana, certs),
  Talend, Scoop (Debian apt-mark hold + CentOS containers Docker),
  DATI (pm2/tomcat post-reboot), COMMVAULT (mode maintenance),
  Masterparc (kmeihm pm2), Splunk (RPM special),
  Site institutionnel (HAproxy backend rotation, no *node*),
  Centreon (1 par 1 + check centengine), Sextan (10min reboot delay),
  OCTAN, PAIPOR (site maintenance), Gaspar, Postgres, Oracle OEM, SMTP relay
- Cluster Sextan cree (10 min entre reboots) + 10 serveurs Sextan rattaches

UI iexec:
- Banner cumule en haut: '⚠ Particularites pour N serveur(s)' si au moins 1 note
- Badges sur la cellule asset_name: ⚠ note (modal markdown au clic),
  ⏭ skip 1st reboot, ⏱ Xmin (cluster reboot delay)
- Modal patching_notes avec rendu pre/markdown, fermeture Escape

UI fiche serveur (server_detail.html):
- Ligne 'Skip 1er reboot' dans bloc Patching
- Bandeau orange particularites avec contenu patching_notes si renseigne

Pas encore implemente cote logique d'execution (Phase 2):
- skip_first_reboot logic dans le step reboot
- enforcement reboot_delay_min_minutes entre membres cluster
- Pour l'instant: notes affichees en mode 'memo operateur' uniquement
2026-05-07 11:41:05 +02:00
29f6153370 feat(pct): workflow prevenance PCT (auto-detection + gate confirmation + suffixe Teams)
- Migration migrate_pct_workflow_20260507.sql: ajoute patch_planning_import_rows
  pct_required (boolean default false), pct_confirmed_at (timestamptz),
  pct_confirmed_by_user_id (FK users). Backfill depuis servers.pct_required.
- Auto-detection a l'import (planning_import.py): scan referent_technique +
  mode_operatoire + impacts + commentaire pour pattern \bPCT\b mot entier
  (insensible casse) -> pct_required=true sur la row. Propage egalement vers
  servers.pct_required si pas deja true.
- UI iexec: badge orange '⚠ Prév PCT à faire' sur la cellule asset_name si
  pct_required=true et pas confirme, badge vert ' PCT ok' une fois confirme.
- Gate avant Step 3 (PATCH REEL): scan des serveurs cibles, si certains ont
  pct_required && !pct_confirmed -> 2 confirmations successives + appel
  POST /patching/iexec/confirm-pct qui marque pct_confirmed_at + user_id.
  Ne lance pas le patch si l'operateur annule.
- Endpoint POST /patching/iexec/confirm-pct: marque les rows comme PCT confirmes
  (pct_confirmed_at = now(), pct_confirmed_by_user_id = current user).
- Notif Teams: send_notification accepte planning_row_id optionnel ; si la row
  a pct_required && pct_confirmed, le message debut/fin est suffixe par
  ' (Prévenance PCT ok)' pour informer le responsable que l'amont a ete gere.
2026-05-07 08:19:19 +02:00
060af01db9 feat(teams): fan-out multi-recipient + flag is_database_server + multi-referents
- Migration v2: ajoute teams_channel_rules.match_is_database_server (NULL=any/TRUE=DB only/FALSE=non-DB only),
  servers.is_database_server boolean (default false), table server_additional_referents pour multi-referents
- Service teams_service.py: resolve_channel_for_server -> resolve_channels_for_server (pluriel, retourne LIST)
  * msg_type=reboot: 1 seul canal (canal flagge is_reboot_channel)
  * server.teams_channel_id override: 1 seul canal
  * sinon FAN-OUT: TOUTES les regles actives qui matchent contribuent un canal
  * dynamic_to_email calcule selon nature de la regle (responsable / DBA pool / referents)
- send_notification: boucle sur les canaux resultants, ecrit 1 fichier SP par destination
- UI settings.html: nouveau filtre 'Match serveur DB' dans formulaire regle, badge dans tableau
- Compat: resolve_channel_for_server (singulier) conserve comme wrapper qui retourne le 1er canal

Permet le scenario: serveur DB avec responsable=Delcour -> notif a la fois dans conv Delcour
ET dans conv DBA (Nadine+Cedric), via 2 regles qui matchent en parallele.
2026-05-06 10:33:12 +02:00
edec1f7db5 feat(teams): mode SharePoint sync (calque .exe Sanef Patch Manager) + rules-based routing
- Migration: ajoute sp_route/mode/is_reboot_channel/is_dynamic_dm sur teams_channels,
  cree table teams_channel_rules (match resp/domain/env/msg_type/hostname pattern)
- Service teams_service.py: format texte plat compatible workflows existants,
  write_sharepoint_notification (ecrit fichier .txt dans <sp_base>/<sp_route>/),
  resolve_channel_for_server rules-based avec priorite reboot,
  send_notification orchestre resolution + envoi
- Settings UI: CRUD canaux etendu (mode SP/webhook + flags reboot/dyn_dm),
  CRUD regles avec match conditions, sharepoint_notif_path en secret app,
  bouton Test ecrit fichier .txt en mode SP
- Mode is_dynamic_dm: prefixe le contenu par 'TO: <email>' pour permettre
  un workflow PA unique qui dispatch dynamiquement aux responsables
- Pas d'OAuth requis: PatchCenter ecrit fichiers, Workflows PA cote SharePoint
  (deja en place pour le .exe) declenchent et postent sur Teams

Mode webhook conserve mais inactif tant qu'OAuth Entra ID pas mis en place chez SANEF
2026-05-06 09:57:42 +02:00
c77b4b22eb fix(qualys): API 2.0 confirmee (3.0 OTHER_ERROR car endpoint inexistant, 5.0 INVALID_API_VERSION) + body XML + mapping field user-friendly vers nom Qualys (hostname->name, fqdn->dnsHostName, ip->address) - cause racine 401 = mot de passe API expire 2026-05-05 16:56:56 +02:00
cadef89c50 fix(qualys): repasse en API 3.0 (5.0 ne supporte pas l objet hostasset, INVALID_API_VERSION). 12+3+1 endpoints qps/rest revenus en 3.0 2026-05-05 16:48:59 +02:00
37faba382e fix(qualys): migration API 2.0 EOL -> 5.0 (auth refusee en 2.0 INVALID_CREDENTIALS, OK en 5.0). 12+3+1 endpoints qps/rest mis a jour 2026-05-05 16:40:34 +02:00
3e3f5618a0 fix(servers/edit): retire hx-disabled-elt (htmx essaie reactiver bouton apres swap, mais form deja remplace -> TypeError htmx-internal-data null) 2026-05-05 16:25:49 +02:00
6999fbd736 fix(servers/edit): retire hx-indicator/disinherit (causaient erreur htmx) - garde juste le toggle label Sauvegarder->Sauvegarde... sur le bouton submit qui marche proprement 2026-05-05 16:18:01 +02:00
3f8033adbb fix(servers/edit): hx-disinherit='*' sur bouton Annuler (au lieu de la liste explicite qui ne marchait pas) 2026-05-05 16:15:34 +02:00
0e4a2384c8 fix(servers/edit): bouton Annuler n hérite plus de hx-indicator/hx-disabled-elt du form (sinon affichait 'Sauvegarde en cours' au clic Annuler) 2026-05-05 16:10:48 +02:00
9b0c596f2c fix(servers/edit): dropdown application matche aussi par nom si application_id NULL mais application_name renseigne (cas edge import sans FK) 2026-05-05 16:01:37 +02:00
c19309fec2 fix(servers/edit): retire le push iTop sur changement application (etait bloquant 10s+ si iTop injoignable) - update local seulement, push iTop dedie via endpoint async a faire si besoin 2026-05-05 15:50:13 +02:00
4b2a4cb8f2 fix(servers/edit): timeout iTop reduit (3s connect / 10s read au lieu de 30s) + indicateur de chargement htmx visible (bouton change en 'Sauvegarde...' + message en bas du form) 2026-05-05 15:47:12 +02:00
5d3c07885d feat(servers): drop colonnes legacy (snapshot_required/pre_patch_script/post_patch_script/satellite_host/need_pct) avec migration donnees + recreation views v_servers / v_patchable / v_conformity_todo + adaptation prereq_service et server_detail.html 2026-05-05 15:11:30 +02:00
7d6019f5d3 feat(patching/iexec): panneau Details du dernier check pliable (clic header) + bouton Fermer 2026-05-05 14:52:21 +02:00
a7874aec11 feat(settings/clusters M2): UI CRUD server_clusters - groupes + ordre redemarrage + strategie sequential/parallel + panneau detail serveurs rattaches 2026-05-05 14:05:59 +02:00
075706178e feat(settings/teams M1+M4): UI CRUD canaux Teams + service teams_service.py (Adaptive Card via Incoming Webhook) + bouton Test webhook 2026-05-05 13:58:38 +02:00
830eaaa519 feat(patching/iexec): boutons et stepper avec etats visuels (gris pending / orange en cours / vert done / rouge failed) - cascade automatique selon resultats accumules + animation pulse pour running 2026-05-05 12:58:39 +02:00
0f5296ab40 feat(patching/iexec): terminal global HTML colore consolide - toutes les etapes (check, snap, dryrun, pre, patch, reboot, recon, post) appendent dans le meme terminal avec sections horodatees + couleurs ANSI-like + scroll auto + bouton Vider 2026-05-05 12:28:12 +02:00
ff95424e03 feat(patching/iexec B3.6): bouton 3e Reboot manuel (double confirmation, jamais auto) + 3f Wait reconnexion (poll TCP/22 + SSH uptime, timeout 10min) - shutdown -r +1 avec audit log 2026-05-05 12:06:50 +02:00
19d88f2d53 feat(patching/iexec): detection auto deps problematiques + bouton retry sans paquets KO (multilib, requires, conflicts) - extra_excludes via SSE query param 2026-05-05 11:32:44 +02:00
8cf78dfef3 feat(patching/iexec): terminal live SSE pour dry-run et patch reel - generator yum_stream_lines + endpoint /yum-stream + EventSource cote client + log audit en fin de stream 2026-05-04 17:02:28 +02:00
e29ecff949 feat(patching/iexec B3.4+B3.5): pre-capture services+ports + post-compare avant/apres avec rapport diff (scripts wiki SANEF, push base64) - workflow 3a/3b/3c/3d sequentiel 2026-05-04 16:52:15 +02:00
6c92c71d17 feat(patching/iexec B3): step 3a dry-run (yum update --assumeno) + step 3b real patch (yum update -y) avec excludes effectifs depuis v_servers, validation anti-injection sur excludes, log audit, double confirmation pour patch reel 2026-05-04 16:40:46 +02:00
a6b98568f1 feat(patching/iexec B2): branchement snapshot vCenter - bouton Step 2 lance snapshot pour rows verdict OK, nom intervenant_YYYY-MM-DD_avant_patch, log audit dans patch_planning_row_log 2026-05-04 15:50:11 +02:00
b07a6816d4 feat(patching/iexec): check espace disque (/ >= 1.5Go, /var/log >= 1Go) + fix detection subscription-manager identity FR/EN via UUID regex 2026-05-04 15:37:12 +02:00
eb2e0dc8ba feat(patching/iexec B1): page wizard step 1 - checks DNS+SSH+Satellite (LAN vpdsiasat2 / DMZ vpdsiasat1 selon domaine), Linux uniquement (Windows skip), sudo -n partout 2026-05-04 15:14:06 +02:00
a5f3a25198 feat(patching/import): actions Reporter/Ajouter au patching + log + colonne Etat (etape A) + placeholder /patching/iexec affichant excludes effectifs (etape B a venir) 2026-05-04 14:57:49 +02:00
6eb7619efc feat(patching/import): affichage date au format FR dd/mm/yyyy (tri reste sur start_iso ISO) 2026-05-04 14:12:42 +02:00
1ef9ecf85f feat(patching/import): lien Asset s ouvre dans un nouvel onglet 2026-05-04 14:09:27 +02:00
6891736395 feat(patching/import): retire colonnes Impacts et BDD de l affichage, lien Asset pointe vers /servers?search= 2026-05-04 14:09:11 +02:00
f70f5c3704 feat(patching/import): retire colonnes Coupure/Pb disque/Lien serveur/Mode op de l affichage, link sur Asset, raccourci OS version (RedHat 8, Win 2022, ...) 2026-05-04 14:05:16 +02:00
630297f98e feat(patching/import): stockage date/heure typés (DATE+TIME) + jour_text fallback texte libre + tri colonne Date par date+heure combinés 2026-05-04 13:57:24 +02:00
8b6057aef2 feat(patching/import): filtre intervenant en dropdown, retire filtre asset texte, ajoute tri asc/desc/none au clic sur entete Asset 2026-05-04 13:17:23 +02:00
488b5a980b feat(patching/import): ajout colonnes Resp Domaine DTS, Referent technique, Mode operatoire, Impacts, BDD - support nouveau format S07+ + Date au lieu de Jour 2026-05-04 13:12:09 +02:00
13a5625710 feat(patching/import): filtres client-side asset/intervenant/env sur tableau semaine 2026-05-04 13:04:05 +02:00
557015325b feat(patching): import planning xlsx (etape 1) - tables patch_planning_imports + rows, page upload + selecteur semaine + tableau 2026-05-04 12:57:35 +02:00
983552a442 fix(qualys/agents): message d'echec specifique selon cause reelle (DNS/TCP timeout/TCP refused/SSH auth) - plus de 'agent installe? OS supporte?' generique 2026-04-28 02:00:21 +02:00
532549072d fix(qualys/agents): lien fiche serveur 404 - remplace par recherche Qualys du host 2026-04-28 01:55:25 +02:00
767b33095a feat(qualys/agents): bloque troubleshooting pour Windows (route + bouton 'Non gere' dans table) 2026-04-28 01:48:32 +02:00
b6a602e848 ui(qualys/agents): wording diag prudent (constat/hypothese/proposition vers ticket support, pas affirmer) 2026-04-28 01:27:42 +02:00
67bd3a02d6 ui(qualys/agents): bloc Etat checklist OK/KO en tete (connectivite/disque/service/install) + log systeme 10 lignes 2026-04-28 01:24:57 +02:00
7f8c2c710b ui(qualys/agents): renomme 'Suggestions' en 'Diagnostic' + reformulation orientee constat (pas de cmds shell, oriente vers ticket support) 2026-04-28 01:23:56 +02:00
fc480b4376 ui(qualys/agents): retire bloc Configuration proxy agent (inutile car SANEF prod sort en direct, pas via proxy) 2026-04-28 01:13:18 +02:00
9d312f43a3 feat(qualys/agents): check conf proxy agent (qagent-proxy.conf, drop-in systemd, sysconfig, /etc/environment) + suggestion config proxy 2026-04-28 00:20:56 +02:00
640292c1ce feat(qualys/agents): checks LVM + logrotate + suggestions extend FS / cleanup / fix logrotate avec snapshot LVM obligatoire 2026-04-28 00:11:45 +02:00
71a2927e15 ui(qualys/agents): highlight rouge >=90% / orange >=75% sur lignes df dans bloc disque 2026-04-28 00:01:46 +02:00
a877589cf3 feat(qualys/agents): suggestions auto resolution selon patterns logs (disque sature, crash loop, conn KO, service masked, agent obsolete) 2026-04-28 00:01:14 +02:00
54a2a59991 ui(qualys/agents): renomme bouton Check en Troubleshooting 2026-04-27 23:54:29 +02:00