mirror of
https://github.com/swissmakers/fail2ban-ui.git
synced 2026-04-19 06:53:14 +02:00
Implemented a real-time console log streaming via WebSocket for debugging purposes. Users can enable console output in settings to view application logs directly in the web interface.
This commit is contained in:
@@ -15,6 +15,7 @@ class WebSocketManager {
|
||||
this.lastBanEventId = null;
|
||||
this.statusCallbacks = [];
|
||||
this.banEventCallbacks = [];
|
||||
this.consoleLogCallbacks = [];
|
||||
|
||||
// Connection metrics for tooltip
|
||||
this.connectedAt = null;
|
||||
@@ -58,11 +59,20 @@ class WebSocketManager {
|
||||
|
||||
this.ws.onmessage = (event) => {
|
||||
try {
|
||||
const message = JSON.parse(event.data);
|
||||
this.messageCount++;
|
||||
this.handleMessage(message);
|
||||
// WebSocket may send multiple JSON messages separated by newlines
|
||||
// Split by newlines and parse each message separately
|
||||
const messages = event.data.split('\n').filter(line => line.trim().length > 0);
|
||||
for (const messageText of messages) {
|
||||
try {
|
||||
const message = JSON.parse(messageText);
|
||||
this.messageCount++;
|
||||
this.handleMessage(message);
|
||||
} catch (parseErr) {
|
||||
console.error('Error parsing individual WebSocket message:', parseErr, 'Raw:', messageText);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Error parsing WebSocket message:', err);
|
||||
console.error('Error processing WebSocket message:', err);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -112,11 +122,27 @@ class WebSocketManager {
|
||||
case 'heartbeat':
|
||||
this.handleHeartbeat(message);
|
||||
break;
|
||||
case 'console_log':
|
||||
this.handleConsoleLog(message);
|
||||
break;
|
||||
default:
|
||||
console.log('Unknown message type:', message.type);
|
||||
}
|
||||
}
|
||||
|
||||
handleConsoleLog(message) {
|
||||
// Notify all registered console log callbacks
|
||||
if (this.consoleLogCallbacks) {
|
||||
this.consoleLogCallbacks.forEach(callback => {
|
||||
try {
|
||||
callback(message.message, message.time);
|
||||
} catch (err) {
|
||||
console.error('Error in console log callback:', err);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
handleBanEvent(eventData) {
|
||||
// Check if we've already processed this event (prevent duplicates)
|
||||
// Only check if event has an ID and we have a lastBanEventId
|
||||
@@ -170,6 +196,13 @@ class WebSocketManager {
|
||||
this.banEventCallbacks.push(callback);
|
||||
}
|
||||
|
||||
onConsoleLog(callback) {
|
||||
if (!this.consoleLogCallbacks) {
|
||||
this.consoleLogCallbacks = [];
|
||||
}
|
||||
this.consoleLogCallbacks.push(callback);
|
||||
}
|
||||
|
||||
disconnect() {
|
||||
if (this.ws) {
|
||||
this.ws.close();
|
||||
|
||||
Reference in New Issue
Block a user