diff -ru dnsdist-1.9.11.orig/html/local.js dnsdist-1.9.11/html/local.js --- dnsdist-1.9.11.orig/html/local.js 2025-09-18 09:10:23.000000000 +0200 +++ dnsdist-1.9.11/html/local.js 2026-02-23 14:36:07.113407054 +0100 @@ -1,10 +1,10 @@ "use strict"; -var gdata={} +var gdata = {} $(document).ready(function() { $.ajaxSetup({ cache: false }); - + var qpsgraph = new Rickshaw.Graph( { element: document.getElementById("qpschart"), width: 400, @@ -14,7 +14,7 @@ timeInterval: 1000, maxDataPoints: 100, timeBase: new Date().getTime() / 1000 - }) + }) } ); var y_ticks = new Rickshaw.Graph.Axis.Y( { graph: qpsgraph, @@ -34,7 +34,7 @@ timeInterval: 1000, maxDataPoints: 100, timeBase: new Date().getTime() / 1000 - }) + }) } ); var y_ticks = new Rickshaw.Graph.Axis.Y( { graph: cpugraph, @@ -46,95 +46,14 @@ cpugraph.render(); var intervalcount=0; - function updateRingBuffers() + function appendCellToRow(row, untrusted, align) { - var filtered=$("#filter1").is(':checked') - var qstring='jsonstat?command=get-query-ring&name=queries'; - if(filtered) - qstring=qstring+"&public-filtered=1"; - - $.getJSON(qstring, - function(data) { - console.log(data); - var bouw=""; - var num=0; - var total=0, rest=0; - $.each(data["entries"], function(a,b) { - total+=b[0]; - if(num++ > 10) { - rest+=b[0]; - return; - } - if(b[1].length > 25) - b[1]=b[1].substring(0,25); - - bouw=bouw+(""); - }); - bouw+=""; - bouw=bouw+"
NumberDomainType
"+b[0]+""+b[1]+""+b[2]+"
"+rest+"Rest
"; - $("#queryring").html(bouw); - - }); - - filtered=$("#filter2").is(':checked') - qstring='jsonstat?command=get-query-ring&name=servfail-queries'; - if(filtered) - qstring=qstring+"&public-filtered=1"; - - $.getJSON(qstring, - function(data) { - var bouw=""; - var num=0, total=0, rest=0; - $.each(data["entries"], function(a,b) { - total+=b[0]; - if(num++ > 10) { - rest+=b[0]; - return; - } - if(b[1].length > 25) - b[1]=b[1].substring(0,25); - bouw=bouw+(""); - }); - bouw+=""; - bouw=bouw+"
NumberServfail domainType
"+b[0]+""+b[1]+""+b[2]+"
"+rest+"Rest
"; - $("#servfailqueryring").html(bouw); - - }); - - $.getJSON('jsonstat?command=get-remote-ring&name=remotes', - function(data) { - var bouw=""; - var num=0, total=0, rest=0; - $.each(data["entries"], function(a,b) { - total+=b[0]; - if(num++ > 10) { - rest +=b[0]; - return; - } - bouw=bouw+(""); - }); - bouw+=""; - bouw=bouw+"
NumberRemote
"+b[0]+""+b[1]+"
"+rest+"Rest
"; - $("#remotering").html(bouw); - - }); - - $.getJSON('jsonstat?command=get-remote-ring&name=servfail-remotes', - function(data) { - var bouw=""; - var num=0, total=0, rest=0; - $.each(data["entries"], function(a,b) { - total+=b[0]; - if(num++ > 10) { - rest += b[0]; - return; - } - bouw=bouw+(""); - }); - bouw+=""; - bouw=bouw+"
NumberServfail Remote
"+b[0]+""+b[1]+"
"+rest+"Rest
"; - $("#servfailremotering").html(bouw); - }); + var cell = $(''); + if (align) { + cell = $(''); + } + cell.text(untrusted); + row.append(cell); } function update() @@ -155,125 +74,147 @@ $("#latency-dot").text((data["latency-dot-avg10000"]/1000.0).toFixed(2)); $("#latency-doh").text((data["latency-doh-avg10000"]/1000.0).toFixed(2)); $("#latency-doq").text((data["latency-doq-avg10000"]/1000.0).toFixed(2)); - if(!gdata["cpu-sys-msec"]) - gdata=data; + if (!gdata["cpu-sys-msec"]) { + gdata = data; + } - var cpu=((1.0*data["cpu-sys-msec"]+1.0*data["cpu-user-msec"] - 1.0*gdata["cpu-sys-msec"]-1.0*gdata["cpu-user-msec"])/10.0); + var cpu = ((1*data["cpu-sys-msec"] + 1*data["cpu-user-msec"]) - (1*gdata["cpu-sys-msec"] + 1*gdata["cpu-user-msec"]))/10.0; $("#cpu").text(cpu.toFixed(2)); - var qps=1.0*data["queries"]-1.0*gdata["queries"]; + var qps = 1.0*data["queries"]-1.0*gdata["queries"]; $("#qps").text(qps.toFixed(2)); $("#server-policy").text(data["server-policy"]); - var servfailps=1.0*data["servfail-responses"]-1.0*gdata["servfail-responses"]; + var servfailps = (1*data["servfail-responses"]) - (1*gdata["servfail-responses"]); - var totpcache=1.0*data["cache-hits"]-1.0*gdata["cache-hits"]+1.0*data["cache-misses"]-1.0*gdata["cache-misses"]; - var hitrate=0; - if(totpcache > 0) { - hitrate=100.0*(data["cache-hits"]-1.0*gdata["cache-hits"])/totpcache; + var totpcache = (1*data["cache-hits"] + 1*data["cache-misses"]) - (1*gdata["cache-hits"] + 1*gdata["cache-misses"]); + var hitrate = 0; + if (totpcache > 0) { + hitrate = 100.0*(data["cache-hits"]-1.0*gdata["cache-hits"])/totpcache; $("#phitrate").text(hitrate.toFixed(2)); } - else + else { $("#phitrate").text(0); - + } + qpsgraph.series.addData({ qps: qps, servfailps: servfailps}); qpsgraph.render(); cpugraph.series.addData({ one: cpu, two: hitrate}); cpugraph.render(); - gdata=data; + gdata = data; }, error: function() { }, }); - + $.ajax({ url: 'api/v1/servers/localhost', type: 'GET', dataType: 'json', jsonp: false, success: function(data) { $("#version").text(data["daemon_type"]+" "+data["version"]); $("#acl").text(data["acl"]); $("#local").text(data["local"]); - var bouw=''; + var tableElement = $('
#NameAddressStatusUDP LatencyTCP LatencyQueriesDropsQPSOutWeightOrderPools
#NameAddressStatusUDP LatencyTCP LatencyQueriesDropsQPSOutWeightOrderPools
'); $.each(data["servers"], function(a,b) { - bouw = bouw + (""+b["id"]+""+b["name"]+""+b["address"]+""+b["state"]+""); + var row = $(''); var latency = (b["latency"] === null || b["latency"] === 0.0) ? "-" : b["latency"].toFixed(2); var tcpLatency = (b["tcpLatency"] === null || b["tcpLatency"] === 0.0) ? "-" : b["tcpLatency"].toFixed(2); - bouw = bouw + (""+latency+""+tcpLatency+""+b["queries"]+""+b["reuseds"]+""+(b["qps"]).toFixed(2)+""+b["outstanding"]+""); - bouw = bouw + (""+b["weight"]+""+b["order"]+""+b["pools"]+""); - }); - bouw = bouw + ""; - $("#downstreams").html(bouw); - - bouw=''; - if(data["rules"].length) { + appendCellToRow(row, b["id"]); + appendCellToRow(row, b["name"], 'left'); + appendCellToRow(row, b["address"], 'left'); + appendCellToRow(row, b["state"]); + appendCellToRow(row, latency); + appendCellToRow(row, tcpLatency); + appendCellToRow(row, b["queries"]); + appendCellToRow(row, b["reused"]); + appendCellToRow(row, b["qps"].toFixed(2)); + appendCellToRow(row, b["outstanding"]); + appendCellToRow(row, b["weight"]); + appendCellToRow(row, b["order"]); + appendCellToRow(row, b["pools"], 'left'); + tableElement.append(row); + }); + $("#downstreams").html(tableElement); + + tableElement = $('
#NameRuleActionMatches
#NameRuleActionMatches
'); + if (data["rules"].length) { $.each(data["rules"], function(a,b) { - bouw = bouw + (""+b["id"]+""+b["name"]+""+b["rule"]+""+b["action"]+""); - bouw = bouw + (""+b["matches"]+""); - }); + var row = $(''); + appendCellToRow(row, b["id"]); + appendCellToRow(row, b["name"], 'left'); + appendCellToRow(row, b["rule"], 'left'); + appendCellToRow(row, b["action"]); + appendCellToRow(row, b["matches"]); + tableElement.append(row); + }); } - else - bouw = bouw + 'No rules defined'; - bouw = bouw + ""; - $("#rules").html(bouw); + else { + tableElement.append($('No rules defined')); + } + $("#rules").html(tableElement); - bouw=''; - if(data["response-rules"].length) { + tableElement = $('
#NameResponse RuleActionMatches
#NameResponse RuleActionMatches
'); + if (data["response-rules"].length) { $.each(data["response-rules"], function(a,b) { - bouw = bouw + (""+b["id"]+""+b["name"]+""+b["rule"]+""+b["action"]+""); - bouw = bouw + (""+b["matches"]+""); + var row = $(''); + appendCellToRow(row, b["id"]); + appendCellToRow(row, b["name"], 'left'); + appendCellToRow(row, b["rule"], 'left'); + appendCellToRow(row, b["action"]); + appendCellToRow(row, b["matches"]); + tableElement.append(row); }); } - else - bouw = bouw + 'No response rules defined'; - bouw = bouw + ""; - $("#response-rules").html(bouw); + else { + tableElement.append($('No response rules defined')); + } + $("#response-rules").html(tableElement); } }); - -// if((intervalcount++)%5) - // return; - // updateRingBuffers(); - $.ajax({ url: 'jsonstat?command=dynblocklist', type: 'GET', dataType: 'json', jsonp: false, success: function(data) { - var bouw=''; - var gotsome=false; + var tableElement = $('
Dyn blocked netmaskSecondsBlockseBPFReason
Dyn blocked netmaskSecondsBlockseBPFReason
'); + var gotsome = false; $.each(data, function(a,b) { - bouw=bouw+(""+a+""+b.seconds+""+b.blocks+""+b.ebpf+""+b.reason+""); - gotsome=true; + var row = $(''); + appendCellToRow(row, a); + appendCellToRow(row, b.seconds); + appendCellToRow(row, b.blocks); + appendCellToRow(row, b.ebpf); + appendCellToRow(row, b.reason); + tableElement.append(row); + gotsome = true; }); - - if(!gotsome) - bouw = bouw + 'No dynamic blocks active'; - bouw=bouw+""; - $("#dynblock").html(bouw); + if (!gotsome) { + tableElement.append($('No dynamic blocks active')); + } + $("#dynblock").html(tableElement); }}); $.ajax({ url: 'jsonstat?command=ebpfblocklist', type: 'GET', dataType: 'json', jsonp: false, success: function(data) { - var bouw=''; - var gotsome=false; + var tableElement = $('
Kernel-based dyn blocked netmaskSecondsBlocks
'); + var gotsome = false; $.each(data, function(a,b) { - bouw=bouw+(""); - gotsome=true; + var row = $(''); + appendCellToRow(row, a); + appendCellToRow(row, b.seconds); + appendCellToRow(row, b.blocks); + tableElement.append(row); + gotsome = true; }); - if(!gotsome) - bouw = bouw + ''; - - bouw=bouw+"
Kernel-based dyn blocked netmaskSecondsBlocks
"+a+""+b.seconds+""+b.blocks+"
No eBPF blocks active
"; - $("#ebpfblock").html(bouw); + if (!gotsome) { + tableElement.append($('No eBPF blocks active')); + } + $("#ebpfblock").html(tableElement); }}); - }; - - $("#filter1").click(updateRingBuffers); - $("#filter2").click(updateRingBuffers); update(); setInterval(update, 1000);