Implementing auto-disable of the jail when reload fails after saving filter/jail config

This commit is contained in:
2026-02-11 17:23:38 +01:00
parent 08112ff9b9
commit 514c9dd444
8 changed files with 31 additions and 3 deletions

View File

@@ -1459,9 +1459,24 @@ func SetJailFilterConfigHandler(c *gin.Context) {
config.DebugLog("Reloading fail2ban")
if err := conn.Reload(c.Request.Context()); err != nil {
log.Printf("⚠️ Config saved but fail2ban reload failed: %v", err)
// Auto-disable this jail so fail2ban won't crash on next restart (invalid filter/jail config)
disableUpdate := map[string]bool{jail: false}
if disableErr := conn.UpdateJailEnabledStates(c.Request.Context(), disableUpdate); disableErr != nil {
log.Printf("⚠️ Failed to auto-disable jail %s after reload failure: %v", jail, disableErr)
c.JSON(http.StatusOK, gin.H{
"message": "Config saved successfully, but fail2ban reload failed",
"warning": err.Error(),
})
return
}
if reloadErr2 := conn.Reload(c.Request.Context()); reloadErr2 != nil {
log.Printf("⚠️ Failed to reload fail2ban after auto-disabling jail %s: %v", jail, reloadErr2)
}
c.JSON(http.StatusOK, gin.H{
"message": "Config saved successfully, but fail2ban reload failed",
"warning": err.Error(),
"message": "Config saved successfully, but fail2ban reload failed",
"warning": err.Error(),
"jailAutoDisabled": true,
"jailName": jail,
})
return
}

View File

@@ -156,7 +156,14 @@ function saveJailConfig() {
}
closeModal('jailConfigModal');
if (data.warning) {
showToast(t('filter_debug.save_reload_warning', 'Config saved, but fail2ban reload failed') + ': ' + data.warning, 'warning', 12000);
var warnMsg = t('filter_debug.save_reload_warning', 'Config saved, but fail2ban reload failed') + ': ' + data.warning;
if (data.jailAutoDisabled && data.jailName) {
warnMsg = (typeof t === 'function' ? t('filter_debug.jail_auto_disabled', "Jail '%s' was automatically disabled.").replace('%s', data.jailName) : "Jail '" + data.jailName + "' was automatically disabled.") + ' ' + warnMsg;
var toggleId = 'toggle-' + data.jailName.replace(/[^a-zA-Z0-9]/g, '_');
var cb = document.getElementById(toggleId);
if (cb) cb.checked = false;
}
showToast(warnMsg, 'warning', 12000);
} else {
showToast(t('filter_debug.save_success', 'Filter and jail config saved and reloaded'), 'success');
}