Inventaire des comptes
Liste de tous les comptes cPanel avec leur profil de cache, recherche, filtres, application en masse, export CSV.
La page Account Inventory liste tous les comptes cPanel du serveur avec leur profil de cache actuel et permet d'appliquer des actions individuelles ou en masse.
Accès : Barre latérale → Account Inventory.
💡 Cette page est l'outil principal de gestion de masse. Pour configurer un compte spécifique en profondeur (par domaine, par sous-domaine, listes de bots personnalisées), l'utilisateur final passe par son propre panneau cPanel.

1. Vue d'ensemble
┌──────────────────────────────────────────────────────────┐
│ Account Inventory │
│ 120 cPanel accounts · 357 domains · 12 overrides │
│ [ Export CSV ] [ Back ] │
├──────────────────────────────────────────────────────────┤
│ [ All 120 | Default 95 | Daily 18 | Store 5 | Over. 12 ]│
├──────────────────────────────────────────────────────────┤
│ 🔍 [ Filter by username or domain... ] visible 120/120│
├──────────────────────────────────────────────────────────┤
│ ☐ Account Domains Preset Overrides │
│ ☐ user1 / dom.com 3 Default — [×] │
│ ☐ user2 / shop.fr 7 Daily 2 ov. [×] │
│ ☐ user3 / blog.com 1 Store — [×] │
│ ☐ user4 / app.com 2 Advanced 5 ov. [×] │
│ ... │
├──────────────────────────────────────────────────────────┤
│ 0 selected Apply preset: [Default▾] □ inc. advanced │
│ [ Review & apply… ] │
└──────────────────────────────────────────────────────────┘
2. En-tête
2.1 Compteurs
Affichés sous le titre :
- N cPanel accounts — Nombre total de comptes détectés.
- N domains — Total des domaines hébergés (sommation domaines + sous-domaines + addons).
- N overrides — Total des configurations personnalisées par-domaine (un compte peut avoir plusieurs overrides).
2.2 Bouton Export CSV
Télécharge l'inventaire complet au format CSV. Le fichier est nommé wsa-account-inventory-YYYYMMDD-HHMI.csv.
Colonnes du CSV :
| Colonne | Contenu |
|---|---|
user |
Username cPanel |
main_domain |
Domaine principal |
domain_count |
Nombre de domaines (incl. addons + subs) |
preset |
Profil actuel (default, update_daily, online_store, advanced) |
override_count |
Nombre de configurations par-domaine |
is_suspended |
1 si le compte est suspendu cPanel |
last_modified |
Timestamp de la dernière modification WSA |
Utile pour :
- Facturer en fonction de l'usage WSA réel par client.
- Audit annuel des configurations clients.
- Migration de serveur (export, import sur la cible).
2.3 Bouton Back to dashboard
Retour à la page d'accueil WSA.
3. Filtres rapides (tabs)
5 tabs cliquables qui filtrent la liste des comptes :
[ All 120 | Default 95 | Daily 18 | Store 5 | With overrides 12 ]
| Tab | Filtre |
|---|---|
| All | Tous les comptes. |
| Default | Comptes sur le profil par défaut serveur. |
| Daily | Comptes sur le profil update_daily. |
| Store | Comptes sur le profil online_store. |
| With overrides | Comptes ayant au moins une configuration par-domaine personnalisée. |
Le nombre affiché à côté de chaque tab est le compteur réel mis à jour à chaque chargement de page.
4. Barre de recherche
🔍 [ Filter by username or domain... ] visible 120/120
Filtre en direct sur :
- Username cPanel
- Domaine principal
- Domaines additionnels (addon, sub)
La saisie filtre instantanément la table (pas de bouton Search — la recherche est temps réel JavaScript).
À droite, un compteur affiche visible / total pour indiquer combien de lignes sont actuellement affichées.
5. Le tableau des comptes
5.1 Colonnes
| Colonne | Largeur | Contenu |
|---|---|---|
| ☐ | 34 px | Checkbox pour bulk select. Cliquer la checkbox dans le header sélectionne/désélectionne tout le visible. |
| Account / main domain | flex | Username (gras) + domaine principal (mono). Cliquable — ouvre la modale de détail. |
| Domains | num | Nombre total de domaines (1 = main seul, 5 = main + 4 addons/subs). |
| Cache preset | flex | Profil actuel sous forme de pastille colorée. |
| Overrides | flex | « N overrides » si > 0 (pastille brand), sinon « — ». |
| Actions | actions | Bouton ⌫ (Clear cache) pour la ligne. |
5.2 Bouton ⌫ Clear cache par-row
Sur chaque ligne, un bouton icône avec tooltip Clear this account cache. Au clic :
- Confirmation modale : « Clear all cached responses for USERNAME? »
- Sur OK : POST
account-inventory-clear-cacheavectarget_user. - Exécution backend :
wsa --purgecache-user=<user>. - Bannière de succès : « Cache purge requested for user. »
L'action est rapide (< 1 s par compte typiquement) — les répertoires de cache du compte sont renommés instantanément et supprimés en background.
5.3 Clic sur le nom du compte → modale de détail

Cliquer sur la colonne Account / main domain d'une ligne ouvre une modale détaillée :
┌──────────────────────────────────────────────────────┐
│ user1 [×] │
│ example.com · 3 domains │
├──────────────────────────────────────────────────────┤
│ │
│ Cache preset │
│ ┌─────────────────────────────────────────────┐ │
│ │ ⚪ Use default settings on my site │ │
│ │ Aggressive cache, long TTLs. Best for │ │
│ │ static or rarely-updated sites. │ │
│ ├─────────────────────────────────────────────┤ │
│ │ ⚪ Update site every day │ │
│ │ Shorter TTLs and background reval. │ │
│ ├─────────────────────────────────────────────┤ │
│ │ ⚫ Online store [current] │ │
│ │ Excludes carts, sessions, checkout... │ │
│ ├─────────────────────────────────────────────┤ │
│ │ ⚪ Advanced (custom) │ │
│ │ Per-account custom configuration... │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ Domains (3) │
│ main example.com inherits [✏][↺] │
│ addon shop.example.fr Daily [✏][↺] │
│ sub blog.example.com inherits [✏] │
│ │
│ preset will change online_store → update_daily │
│ [ Cancel ] [ Apply changes ] │
└──────────────────────────────────────────────────────┘
5.3.1 Section Cache preset
4 cartes radio :
- Default settings — Profil défaut serveur (
default). - Update daily — Profil mise à jour quotidienne (
update_daily). - Online store — Profil e-commerce avec bypass cart/checkout (
online_store). - Advanced — Configuration custom gérée par le client cPanel (
advanced). À ne pas écraser par bulk apply sauf cas spécifique.
Le profil actuel est marqué [current]. Cliquer une autre carte la sélectionne comme pending — le bouton Apply changes devient actif.
5.3.2 Section Domains
Liste de tous les domaines du compte (main + addons + subs) avec leur preset effectif :
- inherits — Le domaine utilise le preset de l'utilisateur (pas d'override).
- Daily / Online store / etc. — Le domaine a un override par-domaine (cf. fichier
~user/.wsa/<domain>.json).
Pour chaque domaine, deux boutons potentiels :
- ✏ Edit — Ouvre un prompt pour choisir un preset. POST
account-inventory-apply-preset-domainavectarget_user,target_domain,preset. - ↺ Revert — (visible seulement quand un override existe). Supprime le fichier d'override et fait hériter le domaine du preset de l'utilisateur. Demande confirmation.
5.3.3 Footer
- « preset will change X → Y » — Indication du diff.
- Cancel — Ferme sans appliquer.
- Apply changes — Active uniquement quand un preset différent est sélectionné. POST
account-inventory-apply-presetavectarget_user,preset. Page rechargée avec banner de succès/erreur.
6. Bulk actions (barre du bas)
Cette barre apparaît dès qu'au moins un compte est coché dans le tableau.
3 selected Apply preset: [Default ▾] ☐ Include advanced
[ Review & apply… ]
6.1 Compteur N selected
Mis à jour en temps réel quand l'utilisateur (dé)coche des lignes.
6.2 Dropdown Apply preset
3 choix :
- Default
- Update daily
- Online store
(Pas d'option Advanced en bulk — chaque compte avancé doit être configuré individuellement.)
6.3 Checkbox Include advanced
Par défaut décochée. Détermine le comportement quand un des comptes cochés est actuellement en mode Advanced :
- Décochée (défaut) — Les comptes Advanced sont silencieusement skippés (préserve la config personnalisée du client).
- Cochée — Les comptes Advanced sont écrasés par le preset choisi. ⚠️ Action destructive — la configuration personnalisée du client est perdue.
6.4 Bouton Review & apply…
Ouvre une modale de plan qui prévisualise les changements avant l'application réelle.
7. Plan modal (prévisualisation)
┌──────────────────────────────────────────────────────┐
│ Bulk preset apply — review [×] │
├──────────────────────────────────────────────────────┤
│ 3 selected · 2 changes · 0 overwrites · 1 skipped │
│ │
│ ⚠ 0 advanced accounts will be overwritten │
│ │
│ User From → To Note │
│ user2 Default → Daily │
│ user5 Store → Daily │
│ user7 Default = Default no change │
│ │
│ Apply will run on 2 accounts and skip 1. │
│ [ Cancel ] [ Apply to 2 ] │
└──────────────────────────────────────────────────────┘
7.1 Compteurs en haut
- N selected — Comptes cochés.
- N changes — Comptes qui vont effectivement changer.
- N overwrites — Comptes en mode Advanced qui seront écrasés (visible uniquement si Include advanced est coché).
- N skipped — Comptes inchangés ou skippés (raison : Advanced sans include, ou no change car déjà sur le preset cible).
7.2 Bannière d'avertissement overwrites
Si des comptes Advanced vont être écrasés, une bannière jaune en haut signale :
⚠️ N advanced accounts will be overwritten — their custom configuration will be lost.
7.3 Tableau par-ligne
Pour chaque compte sélectionné :
- User / Domain
- From (preset actuel, pastille)
- Arrow (→ pour changer, = pour skip)
- To (preset cible, ou « (no change) » pour skip)
- Note (« overwrites custom », « skip · Advanced », « no change »)
Les lignes skip sont visuellement grisées ; les overwrites sont en orange/jaune.
7.4 Footer
-
Cancel — Ferme la modale, aucune action.
-
Apply to N accounts — Désactivé si N=0. Sur clic :
- POST
account-inventory-bulk-applyavecusers[],preset,include_advanced=0|1. - Pour chaque user dans
users[], le serveur :- Valide le username (regex
^[a-z][a-z0-9_-]{0,31}$). - Lit la config actuelle.
- Si Advanced et include_advanced=0 : skip.
- Sinon : applique le nouveau preset, déclenche
wsa --rebuild-user=<user>.
- Valide le username (regex
- Bannière de succès : « Bulk preset apply: N applied, M skipped (advanced mode). »
- POST
8. Sécurité et validation
Toutes les actions de cette page sont validées en triple profondeur :
8.1 Côté client (JS)
- Username : regex
^[a-z][a-z0-9_-]{0,31}$avant l'envoi. - Preset : choix limité aux options du dropdown.
- Pas de submit si la validation échoue.
8.2 Côté dispatcher PHP
target_userre-validé avec la même regex avant tout traitement.target_domainvalidé contre la regex RFC domain.presetvalidé contre la liste blanche dansapply_preset_to_user.
8.3 Côté account_inventory class
- Vérification d'existence du compte (
pwd -u <user>). - Vérification de propriété du domaine (
domain_belongs_to_user). escapeshellargsur tout argument passé àshell_exec.
Aucune injection possible via la configuration ou les POST de cette page.
8.4 Audit log
Chaque action (clear-cache, apply-preset, bulk-apply, apply-preset-domain, revert-domain, export-csv) est journalisée dans /var/log/wsa/wsa.log avec :
- Username de l'admin WHM qui a déclenché l'action.
- Username cible et preset appliqué.
- Timestamp.
- Résultat (success/skip/fail).
9. Pour aller plus loin
- Mode simple cPanel — Comment les clients utilisent le profil que vous appliquez ici.
- Mode avancé cPanel — Comment les clients passent au mode Advanced (et donc sortent du contrôle bulk-apply sans
include_advanced). - Ligne de commande —
wsa --rebuild-user,wsa --purgecache-user, équivalents CLI des actions de cette page.