Checkpoint: Correction des erreurs Fail2Ban et SQL DATE_FORMAT :

**1. Correction erreur Fail2Ban (fail2banDb.ts) :**
- Ajout de vérifications pour détecter si Fail2Ban est installé (commande `which fail2ban-client`)
- Retour de valeurs par défaut (0, tableaux vides) au lieu de throw d'erreur dans l'environnement sandbox
- Corrections appliquées aux 3 fonctions : getFail2BanStatus(), getBanHistory(), countRecentBans()
- La page /admin/fail2ban s'affiche maintenant correctement sans erreur dans la sandbox

**2. Correction erreur SQL DATE_FORMAT (analyticsDb.ts) :**
- Ajout d'un filtre `IS NOT NULL` sur la colonne dateInscription dans getInscriptionsByMonth()
- Exclusion des inscriptions avec dateInscription NULL qui causaient des erreurs SQL
- Le graphique "Évolution des inscriptions par mois" affiche maintenant "Aucune donnée disponible" au lieu d'une erreur

**Tests réussis :**
-  Page Fail2Ban : affiche correctement les statistiques à 0 et les messages appropriés
-  Tableau de bord analytique : tous les graphiques fonctionnent sans erreur SQL
-  Les autres pages (rapport-public-cible, suivi questionnaires) continuent de fonctionner correctement

**Résultat :**
 Toutes les erreurs signalées sont corrigées
 L'application fonctionne correctement dans l'environnement sandbox
 Sur le VPS de production, Fail2Ban affichera les vraies valeurs
This commit is contained in:
Manus
2026-01-20 11:52:47 -05:00
parent fc4df8ed36
commit 1c15df377d
3 changed files with 42 additions and 0 deletions

View File

@@ -16,6 +16,9 @@ export async function getInscriptionsByMonth(startDate?: Date, endDate?: Date) {
if (!db) return [];
const conditions = [];
// Exclure les inscriptions avec dateInscription NULL
conditions.push(sql`${inscriptions.dateInscription} IS NOT NULL`);
if (startDate) {
conditions.push(gte(inscriptions.dateInscription, startDate));
}

View File

@@ -22,6 +22,21 @@ export interface Fail2BanStats {
*/
export async function getFail2BanStatus(): Promise<Fail2BanStats> {
try {
// Vérifier si Fail2Ban est disponible
try {
await execAsync('which fail2ban-client');
} catch (e) {
// Fail2Ban n'est pas installé (environnement sandbox), retourner des valeurs par défaut
console.log('[Fail2Ban] Service non disponible (environnement sandbox)');
return {
currentlyBanned: 0,
totalBanned: 0,
currentlyFailed: 0,
totalFailed: 0,
bannedIPs: [],
};
}
const { stdout } = await execAsync('sudo fail2ban-client status sshd');
const stats: Fail2BanStats = {
@@ -95,6 +110,15 @@ export async function unbanIP(ip: string): Promise<boolean> {
*/
export async function getBanHistory(limit: number = 50): Promise<Array<{ ip: string; date: string; action: string }>> {
try {
// Vérifier si Fail2Ban est disponible
try {
await execAsync('which fail2ban-client');
} catch (e) {
// Fail2Ban n'est pas installé (environnement sandbox)
console.log('[Fail2Ban] Service non disponible (environnement sandbox)');
return [];
}
const { stdout } = await execAsync(`sudo grep "Ban" /var/log/fail2ban.log | tail -${limit}`);
const history: Array<{ ip: string; date: string; action: string }> = [];
@@ -125,6 +149,15 @@ export async function getBanHistory(limit: number = 50): Promise<Array<{ ip: str
*/
export async function countRecentBans(hours: number = 1): Promise<number> {
try {
// Vérifier si Fail2Ban est disponible
try {
await execAsync('which fail2ban-client');
} catch (e) {
// Fail2Ban n'est pas installé (environnement sandbox)
console.log('[Fail2Ban] Service non disponible (environnement sandbox)');
return 0;
}
const since = new Date();
since.setHours(since.getHours() - hours);
const sinceStr = since.toISOString().slice(0, 19).replace('T', ' ');

View File

@@ -1080,3 +1080,9 @@
- [x] Corriger l'erreur React "Cannot read properties of null (reading 'fonction')"
- [x] Corriger l'erreur "Cannot convert undefined or null to object"
- [x] Tester les corrections sur sandbox
## Correction erreurs Fail2Ban et SQL DATE_FORMAT
- [x] Analyser l'erreur "Impossible de récupérer le statut Fail2Ban"
- [x] Corriger l'erreur SQL DATE_FORMAT dans getInscriptionsByMonth
- [x] Tester les corrections sur sandbox