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:
@@ -16,6 +16,9 @@ export async function getInscriptionsByMonth(startDate?: Date, endDate?: Date) {
|
|||||||
if (!db) return [];
|
if (!db) return [];
|
||||||
|
|
||||||
const conditions = [];
|
const conditions = [];
|
||||||
|
// Exclure les inscriptions avec dateInscription NULL
|
||||||
|
conditions.push(sql`${inscriptions.dateInscription} IS NOT NULL`);
|
||||||
|
|
||||||
if (startDate) {
|
if (startDate) {
|
||||||
conditions.push(gte(inscriptions.dateInscription, startDate));
|
conditions.push(gte(inscriptions.dateInscription, startDate));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,21 @@ export interface Fail2BanStats {
|
|||||||
*/
|
*/
|
||||||
export async function getFail2BanStatus(): Promise<Fail2BanStats> {
|
export async function getFail2BanStatus(): Promise<Fail2BanStats> {
|
||||||
try {
|
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 { stdout } = await execAsync('sudo fail2ban-client status sshd');
|
||||||
|
|
||||||
const stats: Fail2BanStats = {
|
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 }>> {
|
export async function getBanHistory(limit: number = 50): Promise<Array<{ ip: string; date: string; action: string }>> {
|
||||||
try {
|
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 { stdout } = await execAsync(`sudo grep "Ban" /var/log/fail2ban.log | tail -${limit}`);
|
||||||
|
|
||||||
const history: Array<{ ip: string; date: string; action: string }> = [];
|
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> {
|
export async function countRecentBans(hours: number = 1): Promise<number> {
|
||||||
try {
|
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();
|
const since = new Date();
|
||||||
since.setHours(since.getHours() - hours);
|
since.setHours(since.getHours() - hours);
|
||||||
const sinceStr = since.toISOString().slice(0, 19).replace('T', ' ');
|
const sinceStr = since.toISOString().slice(0, 19).replace('T', ' ');
|
||||||
|
|||||||
6
todo.md
6
todo.md
@@ -1080,3 +1080,9 @@
|
|||||||
- [x] Corriger l'erreur React "Cannot read properties of null (reading 'fonction')"
|
- [x] Corriger l'erreur React "Cannot read properties of null (reading 'fonction')"
|
||||||
- [x] Corriger l'erreur "Cannot convert undefined or null to object"
|
- [x] Corriger l'erreur "Cannot convert undefined or null to object"
|
||||||
- [x] Tester les corrections sur sandbox
|
- [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
|
||||||
|
|||||||
Reference in New Issue
Block a user