blob: dfd7bc4f87887a1d6d1ee850ad8c58e14ea422be [file] [log] [blame]
var rule_json = {}
function create_rule_form(form, rid) {
if (!rid || rid == '') {
rid = 'new';
rule_json['new'] = {
name: '',
type: '',
span: 24,
limit: '',
query: [],
}
}
let n = _input({type: 'text', style: {width: '300px'}, id: "%s_name".format(rid), value: rule_json[rid].name});
form.inject("Name of rule: ");
form.inject(n);
form.inject(br());
// type
let s = _select({id: "%s_type".format(rid)});
s.inject(_option({value: 'httpd_traffic', selected: rule_json[rid].type == 'httpd_traffic' ? 'selected' : null}, 'HTTPd traffic (bytes)'));
s.inject(_option({value: 'httpd_visits', selected: rule_json[rid].type == 'httpd_visits' ? 'selected' : null}, 'HTTPd visits (requests)'));
form.inject("Type of rule: ");
form.inject(s);
form.inject(br());
// span
let sp = _select({id: "%s_span".format(rid)});
sp.inject(_option({value: 1, selected: rule_json[rid].span == 1 ? 'selected' : null}, '1 hour'));
sp.inject(_option({value: 6, selected: rule_json[rid].span == 6 ? 'selected' : null}, '6 hours'));
sp.inject(_option({value: 12, selected: rule_json[rid].span == 12 ? 'selected' : null}, '12 hours'));
sp.inject(_option({value: 24, selected: rule_json[rid].span == 24 ? 'selected' : null}, '24 hours'));
sp.inject(_option({value: (24*7), selected: rule_json[rid].span == (24*7) ? 'selected' : null}, 'one week'));
sp.inject(_option({value: (24*30), selected: rule_json[rid].span == (24*30) ? 'selected' : null}, 'one month'));
form.inject("Time span: ");
form.inject(sp);
form.inject(br());
let l = _input({type: 'number', style: {width: '120px'}, id: "%s_limit".format(rid), value: rule_json[rid].limit || 0});
form.inject("Traffic/Request limit: ");
form.inject(l);
form.inject(br());
let q = _textarea({style: {width: '300px', height: '120px'},id: "%s_query".format(rid)}, rule_json[rid].query.join("\n"));
form.inject("Query parameters: ");
form.inject(q);
form.inject(br());
form.inject(_input({type: 'submit', value: 'Save rule'}))
}
function list_rules(state, json) {
let obj = document.getElementById('rules');
obj.innerHTML = ''; // clear object
if (json.rules && json.rules.length > 0) {
let div = _div();
div.inject(_hr());
let wheader = _h3({class:'subtitle'},"Current ban rules (%u):".format(json.rules.length));
div.inject(wheader);
let tbl = new HTML('table', { style: {fontSize: '0.8rem'}});
let tbh = new HTML('thead');
let tbody = new HTML('tbody');
tbh.inject(new HTML('tr', {}, [
new HTML('th', 'Ruleset'),
]));
tbl.inject(tbh);
div.inject(tbl);
for (var i = 0; i < json.rules.length; i++) {
let res = json.rules[i];
rule_json[res.rid] = res;
let innards = _div();
let form = _form({onsubmit: "add_rule('%s'); return false;".format(res.rid)});
create_rule_form(form, res.rid);
innards.inject(form);
let tr = new HTML('tr', {}, [
new HTML('td', {style: {padding: '5px'}}, [
_a({href: 'javascript:void();', onclick:"showrule('%s');".format(res.rid)}, _kbd(res.name)),
" ",
_a({style: {color: '#930', float: 'right'}, href: 'javascript:void();', onclick:"remove_rule('%s');".format(res.rid)}, "Remove ruleset"),
_div({id: res.rid, style: {margin: '6px', background: '#3692', border: '1.5px solid #3339', padding: '3px', display: 'none'}}, innards)
])
]);
tbody.inject(tr);
}
tbl.inject(tbody);
obj.inject(div);
obj.inject(_hr());
obj.inject(_h3("Create a new rule:"));
let form = _form({onsubmit: "add_rule('new'); return false;"});
create_rule_form(form, '');
obj.inject(form);
}
}
function showrule(rid) {
let obj = document.getElementById(rid)
obj.style.display = obj.style.display == 'none' ? 'block' : 'none';
}
function init_rules(source) {
let obj = document.getElementById('rules');
obj.innerText = "Fetching rules, hang on...";
GET('./api/rules', list_rules, manage_error, {});
}
function remove_rule(rid) {
DELETE('./api/rules', rule_removed, {rid: rid}, manage_error, {rid: rid});
}
function rule_added(state, json) {
alert("Rule entry added!");
location.reload();
}
function rule_removed(state, json) {
alert("Rule entry removed!");
location.reload();
}
function add_rule(rid) {
let name = document.getElementById('%s_name'.format(rid)).value;
let rtype = document.getElementById('%s_type'.format(rid)).value;
let span = parseInt(document.getElementById('%s_span'.format(rid)).value);
let limit = parseInt(document.getElementById('%s_limit'.format(rid)).value);
let query = document.getElementById('%s_query'.format(rid)).value.split(/\r?\n/);
let entry = {
name: name,
type: rtype,
span: span,
limit: limit,
query: query
}
if (rid && rid != 'new') {
entry.rid = rid
}
if (span > 0 && limit > 0 && query.length > 0) {
PUT('./api/rules', rule_added, {}, manage_error, entry);
} else {
alert("Span, query lines, and limits must be greater than 0!");
}
return false
}