server/site/js/source/fail2ban.js (122 lines of code) (raw):

function fail2ban_callback(state, json) { let obj = document.getElementById('results'); let resno = json.results.whitelist.length + json.results.banlist.length + json.results.iptables.length; let header = _h2("Found %u results for %s".format(resno, state.source)); obj.innerHTML = ''; obj.inject(header); // whitelist results? if (json.results.whitelist.length > 0) { let div = _div(); div.inject(_hr()); let wheader = _h3({class:'subtitle'},"Whitelist results (%u):".format(json.results.whitelist.length)); div.inject(wheader); let tbl = new HTML('table'); let tbh = new HTML('thead'); let tbody = new HTML('tbody'); tbh.inject(new HTML('tr', {}, [ new HTML('th', 'Source'), new HTML('th', 'Times out'), new HTML('th', 'Description'), new HTML('th', 'Actions') ])); tbl.inject(tbh); div.inject(tbl); for (var i = 0; i < json.results.whitelist.length; i++) { let res = json.results.whitelist[i]; let timeout = 'never'; if (res.timeout) { timeout = moment(res.timeout*1000.0).fromNow(); } let actions = [ new HTML('a', {href:'javascript:void();', onclick: "remove_whitelist('%s');".format(res.rid)}, "Remove whitelisting") ]; let tr = new HTML('tr', {}, [ new HTML('td', {}, _kbd(res.ip)), new HTML('td', timeout), new HTML('td', res.reason), new HTML('td', {}, actions) ]); tbody.inject(tr); } tbl.inject(tbody); obj.inject(div); } // banlist results? if (json.results.banlist.length > 0) { let div = _div(); div.inject(_hr()); let wheader = _h3({class:'subtitle'},"Banlist results (%u):".format(json.results.banlist.length)); div.inject(wheader); let tbl = new HTML('table'); let tbh = new HTML('thead'); let tbody = new HTML('tbody'); tbh.inject(new HTML('tr', {}, [ new HTML('th', 'Source'), new HTML('th', 'Last updated'), new HTML('th', 'Reason for ban'), new HTML('th', 'Actions') ])); tbl.inject(tbh); div.inject(tbl); for (var i = 0; i < json.results.banlist.length; i++) { let res = json.results.banlist[i]; let timeout = 'unknown?'; if (res.epoch) { timeout = moment(res.epoch*1000.0).fromNow(); } let actions = [ new HTML('a', {href:'javascript:void();', onclick: "remove_banlist('%s');".format(res.rid)}, "Remove ban") ]; let tr = new HTML('tr', {}, [ new HTML('td', {}, _kbd(res.ip)), new HTML('td', timeout), new HTML('td', res.reason), new HTML('td', {}, actions) ]); tbody.inject(tr); } tbl.inject(tbody); obj.inject(div); } // iptables stuff? if (json.results.iptables.length > 0) { let div = _div(); div.inject(_hr()); obj.inject(div); let iheader = _h3({class:'subtitle'},"Local iptables results (%u):".format(json.results.iptables.length)); div.inject(iheader); if (json.results.iptables.length == 10) { div.inject(_i("We're only showing the first ten results, there may be many more!")); } for (var i = 0; i < json.results.iptables.length; i++) { let res = json.results.iptables[i]; let txt = _div("Found on %s, iptables line %u in the %s chain, as %s".format(res.hostname, res.linenumber, res.chain, res.source)); let link = new HTML('a', {style: {marginLeft: '10px'}, href:"whitelist.html?%s".format(res.source)}, "Create whitelist rule") div.inject(txt); txt.inject(link); if (res.msg) { txt.inject(br()); txt.inject(_i({style: {color: '#963'}}, res.msg)); txt.style.marginBottom = '5px'; } } } } function old_fail2ban(e) { if (e && e.state && e.state.what == 'search') { search(e.state.source, true); } } function fail2ban(source, nopush) { let obj = document.getElementById('results'); let m = source.match(/([a-z0-9:.\/]+)/); if (m) { source = m[0]; obj.innerText = "Searching, hang on..."; if (!nopush) history.pushState({what: 'search', source: source}, "Search: " + source, '?' + source); window.onpopstate = old_search; let s = document.getElementById('source'); if (s) s.value = source; POST('./api/fail2ban', fail2ban_callback, {source: source}, manage_error, {source: source}); } else if (source.length > 0) { alert("Invalid IP or CIDR notation entered!") } return false }