104 lines
3.7 KiB
JavaScript
104 lines
3.7 KiB
JavaScript
document.addEventListener('DOMContentLoaded', function() {
|
|
const filterIp = document.getElementById('filter_ip');
|
|
const filterStatus = document.getElementById('filter_status');
|
|
const filterMethod = document.getElementById('filter_method');
|
|
const filterThreats = document.getElementById('filter_threats');
|
|
const filterHideStats = document.getElementById('filter_hide_stats');
|
|
const resetBtn = document.getElementById('reset_filters');
|
|
|
|
const logsTable = document.getElementById('logs_table');
|
|
if (!logsTable) return; // Exit if no logs
|
|
|
|
const allRows = Array.from(document.querySelectorAll('.log-row'));
|
|
|
|
// Filter function
|
|
function applyFilters() {
|
|
const ipValue = filterIp.value.toLowerCase();
|
|
const statusValue = filterStatus.value;
|
|
const methodValue = filterMethod.value;
|
|
const showThreats = filterThreats.checked;
|
|
const hideStats = filterHideStats.checked;
|
|
|
|
let visibleCount = 0;
|
|
let threatCount = 0;
|
|
let count2xx = 0, count4xx = 0, count5xx = 0;
|
|
const uniqueIps = new Set();
|
|
|
|
allRows.forEach(row => {
|
|
const ip = row.dataset.ip;
|
|
const status = row.dataset.status;
|
|
const method = row.dataset.method;
|
|
const hasThreat = row.dataset.threats === '1';
|
|
const url = row.querySelector('td:nth-child(4)').textContent.trim();
|
|
|
|
let show = true;
|
|
|
|
// IP filter
|
|
if (ipValue && !ip.includes(ipValue)) {
|
|
show = false;
|
|
}
|
|
|
|
// Status filter
|
|
if (statusValue) {
|
|
const statusStart = statusValue;
|
|
if (!status.startsWith(statusStart)) {
|
|
show = false;
|
|
}
|
|
}
|
|
|
|
// Method filter
|
|
if (methodValue && method !== methodValue) {
|
|
show = false;
|
|
}
|
|
|
|
// Threats filter
|
|
if (!showThreats && hasThreat) {
|
|
show = false;
|
|
}
|
|
|
|
// Hide /stats filter
|
|
if (hideStats && url.includes('/stats')) {
|
|
show = false;
|
|
}
|
|
|
|
row.style.display = show ? '' : 'none';
|
|
|
|
if (show) {
|
|
visibleCount++;
|
|
if (hasThreat) threatCount++;
|
|
if (status.startsWith('2')) count2xx++;
|
|
if (status.startsWith('4')) count4xx++;
|
|
if (status.startsWith('5')) count5xx++;
|
|
uniqueIps.add(ip);
|
|
}
|
|
});
|
|
|
|
// Update stats
|
|
document.getElementById('stat_total').textContent = visibleCount;
|
|
document.getElementById('stat_threats').textContent = threatCount;
|
|
document.getElementById('stat_2xx').textContent = count2xx;
|
|
document.getElementById('stat_4xx').textContent = count4xx;
|
|
document.getElementById('stat_5xx').textContent = count5xx;
|
|
document.getElementById('stat_ips').textContent = uniqueIps.size;
|
|
}
|
|
|
|
// Event listeners
|
|
filterIp.addEventListener('input', applyFilters);
|
|
filterStatus.addEventListener('change', applyFilters);
|
|
filterMethod.addEventListener('change', applyFilters);
|
|
filterThreats.addEventListener('change', applyFilters);
|
|
filterHideStats.addEventListener('change', applyFilters);
|
|
|
|
// Reset button
|
|
resetBtn.addEventListener('click', function() {
|
|
filterIp.value = '';
|
|
filterStatus.value = '';
|
|
filterMethod.value = '';
|
|
filterThreats.checked = true;
|
|
filterHideStats.checked = true;
|
|
applyFilters();
|
|
});
|
|
|
|
applyFilters();
|
|
});
|