%PDF- %PDF-
Direktori : /backups/router/usr/local/opnsense/mvc/app/views/OPNsense/Unbound/ |
Current File : //backups/router/usr/local/opnsense/mvc/app/views/OPNsense/Unbound/stats.volt |
{# # Copyright (c) 2018 Deciso B.V. # All rights reserved. # # Redistribution and use in source and binary forms, with or without modification, # are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. #} <script> 'use strict'; const descriptionMapThread = { 'recursion': { 'time': { 'avg': "{{ lang._('Recursion time (average)') }}", 'median': "{{ lang._('Recursion time (median)') }}" } }, 'tcpusage': "{{ lang._('TCP usage') }}", 'num': { 'queries_ip_ratelimited': "{{ lang._('IP ratelimited queries') }}", 'recursivereplies': "{{ lang._('Recursive replies') }}", 'cachemiss': "{{ lang._('Cache misses') }}", 'cachehits': "{{ lang._('Cache hits') }}", 'expired': "{{ lang._('Serve expired') }}", 'prefetch': "{{ lang._('Prefetch') }}", 'queries': "{{ lang._('Queries') }}", }, 'requestlist': { 'avg': "{{ lang._('Request queue avg') }}", 'max': "{{ lang._('Request queue max') }}", 'overwritten': "{{ lang._('Request queue overwritten') }}", 'exceeded': "{{ lang._('Request queue exceeded') }}", 'current': { 'all': "{{ lang._('Request queue size (all)') }}", 'user': "{{ lang._('Request queue size (client)') }}" } } }; const descriptionMapTime = { 'now': "{{ lang._('Now') }}", 'up': "{{ lang._('Uptime') }}", 'elapsed': "{{ lang._('Elapsed') }}" }; function writeDescs(parent, data, descriptions) { $.each(descriptions, function(descKey, descValue) { if (typeof descValue !== 'object') { let tr = document.createElement("tr"); let th = document.createElement("th"); th.innerHTML = descValue + ':'; let td = document.createElement("td"); td.innerHTML = data[descKey]; tr.append(th); tr.append(td); parent.append(tr); } else { writeDescs(parent, data[descKey], descriptions[descKey]); } }); } /** * fetch Unbound stats */ function updateStats() { ajaxGet("/api/unbound/diagnostics/stats", {}, function (data, status) { if (status === "success") { // Clear old view let statsView = $("#statsView"); statsView.html(''); // Sort the keys - ensure total and time is listed first. let dataKeys = Object.keys(data['data']); let sortOrder = ['total', 'time']; dataKeys.sort(function(a, b) { var indA = sortOrder.indexOf(a); var indB = sortOrder.indexOf(b); return (indA > -1 ? indA : 999) - (indB > -1 ? indB : 999); }); dataKeys.forEach(function(key) { let value = data['data'][key]; if (key === 'total' || key.substr(0, 6) === 'thread') { let description; if (key === 'total') { description = 'Total'; } else { description = 'Thread ' + key.substr(6); } let title = document.createElement("h2"); title.innerHTML = description; statsView.append(title); let table = document.createElement('table'); table.classList.add('table'); table.classList.add('table-striped'); table.style.width = 'auto'; let tbody = document.createElement('tbody'); writeDescs(tbody, value, descriptionMapThread); table.append(tbody); statsView.append(table); } else if (key === "time") { let title = document.createElement("h2"); title.innerHTML = "Times"; statsView.append(title); let table = document.createElement('table'); table.classList.add('table'); table.classList.add('table-striped'); table.style.width = 'auto'; let tbody = document.createElement('tbody'); writeDescs(tbody, value, descriptionMapTime); table.append(tbody); statsView.append(table); } }); } } ); } $(document).ready(function() { // Autorefresh every 10 seconds. setInterval(function() { if ($("#auto_refresh").is(':checked')) { updateStats(); } }, 10000); // initial fetch updateStats(); updateServiceControlUI('unbound'); }); </script> <div class="content-box"> <div class="content-box-main"> <div class="table-responsive"> <div class="col-sm-12" id="statsView"> </div> <div class="col-sm-12"> <div class="row"> <div class="col-xs-12"> <div class="pull-right"> <label> <input id="auto_refresh" type="checkbox" checked="checked"> <span class="fa fa-refresh"></span> {{ lang._('Auto refresh') }} </label> </div> </div> </div> <hr/> </div> </div> </div> </div>