// Firewall — config panel function loadConfig() { $.get('./api/config', function (data) { $('#fw-enabled').prop('checked', data.enabled); $('#enabled-label').text(data.enabled ? 'Firewall Enabled' : 'Firewall Disabled'); $('#waf-url').val(data.waf_url); $('#back-url').val(data.backend_url); $('#return-port').val(data.return_port); $('#health-interval').val(data.health_interval); $('#timeout-ms').val(data.timeout_ms); }); } function loadStats() { $.get('./api/stats', function (data) { $('#circuit-state').text(data.circuit).attr('class', 'stat-value ' + (data.circuit === 'open' ? 'warn' : data.circuit === 'closed' ? 'ok' : 'warn')); $('#fw-status').text(data.enabled ? 'Active' : 'Disabled').attr('class', 'stat-value ' + (data.enabled ? 'ok' : 'off')); $('#stat-total').text(data.total || 0); $('#stat-allowed').text(data.allowed || 0); $('#stat-blocked').text(data.blocked || 0); $('#stat-bypassed').text(data.bypassed || 0); }); } function saveConfig() { $('#save-status').text('Saving...'); $.cjax({ url: './api/config/save', type: 'POST', data: { enabled: $('#fw-enabled').is(':checked'), waf_url: $('#waf-url').val().trim(), back_url: $('#back-url').val().trim(), return_port: $('#return-port').val(), health_interval: $('#health-interval').val(), timeout_ms: $('#timeout-ms').val() }, success: function () { $('#save-status').text('Saved ✓'); loadConfig(); loadStats(); setTimeout(function () { $('#save-status').text(''); }, 2000); }, error: function () { $('#save-status').css('color', '#d63031').text('Save failed'); } }); } $('#fw-enabled').on('change', function () { $('#enabled-label').text(this.checked ? 'Firewall Enabled' : 'Firewall Disabled'); }); $('#save-btn').on('click', saveConfig); $(document).ready(function () { loadConfig(); loadStats(); setInterval(loadStats, 5000); });