diff --git a/static/js/pages/firewall.js b/static/js/pages/firewall.js
new file mode 100644
index 0000000..c22fc67
--- /dev/null
+++ b/static/js/pages/firewall.js
@@ -0,0 +1,80 @@
+document.addEventListener("DOMContentLoaded", function () {
+ fetchFirewallData();
+});
+
+function renderRulesets(container, rulesets, ipVersion) {
+ container.innerHTML = "";
+
+ if (!rulesets || rulesets.length === 0) {
+ container.innerHTML = `
No ${ipVersion} firewall rulesets found.
`;
+ return;
+ }
+
+ rulesets.forEach(ruleset => {
+ const card = document.createElement("div");
+ card.className = "card mb-4";
+
+ let tableRows = '';
+ ruleset.rules.forEach(rule => {
+ tableRows += `
+
+ | ${rule.rule} |
+ ${rule.action} |
+ ${rule.protocol} |
+ ${rule.packets} |
+ ${rule.bytes} |
+ ${rule.conditions} |
+
+ `;
+ });
+
+ card.innerHTML = `
+
+
+
+
+
+ | Rule |
+ Action |
+ Protocol |
+ Packets |
+ Bytes |
+ Conditions |
+
+
+
+ ${tableRows}
+
+
+
+ `;
+ container.appendChild(card);
+ });
+}
+
+async function fetchFirewallData() {
+ const ipv4Container = document.getElementById("ipv4-rulesets-container");
+ const ipv6Container = document.getElementById("ipv6-rulesets-container");
+
+ try {
+ const response = await fetch("/firewall/json");
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+ const data = await response.json();
+
+ if (data.error) {
+ throw new Error(data.details || data.error);
+ }
+
+ renderRulesets(ipv4Container, data.ipv4, 'IPv4');
+ renderRulesets(ipv6Container, data.ipv6, 'IPv6');
+
+ } catch (error) {
+ console.error("Error fetching firewall data:", error);
+ ipv4Container.innerHTML = `Error loading IPv4 firewall data.
`;
+ ipv6Container.innerHTML = `Error loading IPv6 firewall data.
`;
+ }
+}
\ No newline at end of file