ntopng/httpdocs/js/ntop.min.js
2021-07-05 12:43:42 +02:00

2 lines
No EOL
95 KiB
JavaScript

function aysHandleForm(form_selector,options){if(!form_selector)form_selector="form";if(form_selector==="form"){form_selector='form:not([data-ays-ignore="true"])'}var default_options={submit_selector:'button[type="submit"]:not([data-ays-ignore="true"])',on_dirty_callback:$.noop,on_clean_callback:$.noop,handle_submit_buttons:true,handle_datatable:false,handle_tabs:false,disable_on_dirty:"",ays_options:{}};var o=$.extend(true,{},default_options,options);o.form_selector=form_selector;$(function(){$(o.form_selector).areYouSure(o.ays_options);if(o.handle_submit_buttons)$(o.form_selector).find(o.submit_selector).attr("disabled","disabled");$(o.form_selector).on("dirty.areYouSure",function(){if(o.handle_submit_buttons)$(this).find(o.submit_selector).removeAttr("disabled");if(o.handle_datatable){$(this).find("a.dropdown-toggle").attr("disabled","disabled");$(this).find("ul.pagination a").css("pointer-events","none").css("cursor","default")}if(o.handle_tabs){$(".nav-tabs").find("a").each(function(){if(!$(this).closest("li").hasClass("active"))$(this).removeAttr("data-toggle").closest("li").addClass("disabled")})}$(o.disable_on_dirty).addClass("disabled");o.on_dirty_callback.bind(this)()});$(o.form_selector).on("clean.areYouSure",function(){if(o.handle_submit_buttons)$(this).find(o.submit_selector).attr("disabled","disabled");if(o.handle_datatable){$(this).find("a.dropdown-toggle").removeAttr("disabled");$(this).find("ul.pagination a").css("pointer-events","").css("cursor","")}if(o.handle_tabs){$(".nav-tabs").find("a").each(function(){$(this).attr("data-toggle","tab").closest("li").removeClass("disabled")})}$(o.disable_on_dirty).removeClass("disabled");o.on_clean_callback.bind(this)()})})}function aysResetForm(form_selector){$(form_selector).trigger("reinitialize.areYouSure")}function aysUpdateForm(form_selector){$(form_selector).trigger("rescan.areYouSure")}function aysRecheckForm(form_selector){$(form_selector).trigger("checkform.areYouSure")}function aysGetDirty(form_selector,fields_selector){fields_selector=fields_selector||":input:not(input[type=submit]):not(input[type=button])";var getValue=function($field){if($field.hasClass("ays-ignore")||$field.hasClass("aysIgnore")||$field.attr("data-ays-ignore")||$field.attr("name")===undefined){return null}if($field.is(":disabled")){return"ays-disabled"}var val;var type=$field.attr("type");if($field.is("select")){type="select"}switch(type){case"checkbox":case"radio":val=$field.is(":checked");break;case"select":val="";$field.find("option").each(function(o){var $option=$(this);if($option.is(":selected")){val+=$option.val()}});break;default:val=$field.val()}return val};var isFieldDirty=function($field){var origValue=$field.data("ays-orig");var curValue=getValue($field);var dirty=undefined!==origValue&&origValue!=curValue;return{dirty:dirty,origValue:origValue,curValue:curValue}};var l=[];$(form_selector).find(fields_selector).each(function(){var dirty_status=isFieldDirty($(this));if(dirty_status.dirty){dirty_status.input=$(this);l.push(dirty_status)}});return l}String.prototype.capitalizeSingleWord=function(){var uc=this.toUpperCase();if(uc=="ASN"||uc=="OS")return uc;else return this.charAt(0).toUpperCase()+this.slice(1)};String.prototype.capitalize=function(){var res=this.split(" ");for(var i in res){res[i]=res[i].capitalizeSingleWord()}return res.join(" ")};String.prototype.startsWith=function(string){return this.indexOf(string)===0};String.prototype.sformat=function(){var args=arguments;return this.replace(/{(\d+)}/g,function(match,number){return typeof args[number]!="undefined"?args[number]:match})};if(typeof String.prototype.contains==="undefined"){String.prototype.contains=function(s){return this.indexOf(s)!==-1}}Date.prototype.format=function(format){var o={"M+":this.getMonth()+1,"d+":this.getDate(),"h+":this.getHours(),"m+":this.getMinutes(),"s+":this.getSeconds(),"q+":Math.floor((this.getMonth()+3)/3),S:this.getMilliseconds()};if(/(y+)/.test(format))format=format.replace(RegExp.$1,(this.getFullYear()+"").substr(4-RegExp.$1.length));for(var k in o)if(new RegExp("("+k+")").test(format))format=format.replace(RegExp.$1,RegExp.$1.length==1?o[k]:("00"+o[k]).substr((""+o[k]).length));return format};jQuery.fn.extend({disable:function(state){return this.each(function(){var $this=$(this);if($this.is("input, button, textarea, select"))this.disabled=state;else $this.toggleClass("disabled",state)})}});const NTOPNG_MIN_VISUAL_VALUE=.005;const REGEXES={ipv4:"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]).){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(@[0-9]+)?$",ipv6:"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]):){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*$",domainName:"^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][-_.a-zA-Z0-9]{1,61}[a-zA-Z0-9])).([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}.[a-zA-Z]{2,3})",port:"^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$",url:"^(https?://[^/\\s]+(/.*)?)$",macAddress:"^([0-9A-Fa-f]{2}:){5}([0-9A-Fa-f]{2})$",username:"^(?=[a-zA-Z0-9._]{3,20}$)(?!.*[_.]{2})[^_.].*[^_.]$",singleword:"^(?=[a-zA-Z0-9._-]{3,20}$)(?!.*[_.-]{2})[^_.-].*[^_.-]$",email:"^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*)$",https:"^https?://.+$",token:"^[0-9a-f]{32}"};class NtopUtils{static get REGEXES(){return REGEXES}static getIPv4RegexWithCIDR(){const length=REGEXES.ipv4.length;return`${REGEXES.ipv4.substring(0,length-1)}(\\/?)(\\b([0-9]|[12][0-9]|3[0-2])?\\b)$`}static getIPv6RegexWithCIDR(){const length=REGEXES.ipv6.length;return`${REGEXES.ipv6.substring(0,length-1)}(\\/?)\\b([0-9]|[1-9][0-9]|1[01][0-9]|12[0-8])?\\b$`}static async resolveDNS(hostname="ntop.org"){try{const request=await fetch(`${http_prefix}/lua/rest/v1/get/dns/resolve.lua?hostname=${hostname}`);const response=await request.json();return response}catch(err){console.error(`Something went wrong when resolving hostname: ${err}`)}return{rc:-1,rc_str:"FAILED_HTTP_REQUEST"}}static initDataPatterns(){$(`input[data-pattern]`).each(function(){const dataPattern=$(this).data("pattern");if(!dataPattern){console.warn(`An empty data-pattern on an input was found!`,this);return}const pattern=dataPattern.split("|").map(p=>REGEXES[p].toString()).join("|");$(this).attr("pattern",pattern);$(this).removeAttr("data-pattern")})}static is_good_ipv4(ipv4){return new RegExp(REGEXES.ipv4).test(ipv4)}static is_good_ipv6(ipv6){return new RegExp(REGEXES.ipv6).test(ipv6)}static is_mac_address(mac){return new RegExp(REGEXES.macAddress).test(mac)}static isNumeric(value){return/^\d+$/.test(value)}static is_network_mask(what,optional_mask){var elems=what.split("/");var mask=null;var ip_addr;if(elems.length!=2){if(!optional_mask)return null;else ip_addr=what}else{ip_addr=elems[0];if(!NtopUtils.isNumeric(elems[1]))return null;mask=parseInt(elems[1]);if(mask<0)return null}if(NtopUtils.is_good_ipv4(ip_addr)){if(mask===null)mask=32;else if(mask>32)return null;return{type:"ipv4",address:ip_addr,mask:mask}}else if(NtopUtils.is_good_ipv6(elems[0])){if(mask===null)mask=128;else if(mask>128)return false;return{type:"ipv6",address:ip_addr,mask:mask}}return null}static fbits(bits){const sizes=["bit/s","Kbit/s","Mbit/s","Gbit/s","Tbit/s"];if(typeof bits==="undefined")return"-";if(bits==0)return"0";if(bits>0&&bits<NTOPNG_MIN_VISUAL_VALUE)return"< "+NTOPNG_MIN_VISUAL_VALUE+" bps";var bits_log1000=Math.log(bits)/Math.log(1e3);var i=parseInt(Math.floor(bits_log1000));if(i<0||isNaN(i)){i=0}else if(i>=sizes.length){return"> "+sizes[sizes.length-1]}if(i<=1){return Math.round(bits/Math.pow(1e3,i)*100)/100+" "+sizes[i]}else{var ret=parseFloat(bits/Math.pow(1e3,i)).toFixed(2);if(ret%1==0)ret=Math.round(ret);return ret+" "+sizes[i]}}static export_rate(eps){if(typeof eps==="undefined")return"-";var sizes=["exp/s","Kexp/s"];if(eps==0)return"0";if(eps>0&&eps<NTOPNG_MIN_VISUAL_VALUE)return"< "+NTOPNG_MIN_VISUAL_VALUE+" exps/s";var res=NtopUtils.scaleValue(eps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}static exports_format(exports){if(typeof exports==="undefined")return"-";var exports_label=i18n.exports.toLowerCase();var sizes=[exports_label,"K "+exports_label];if(exports==0)return"0";if(exports>0&&exports<NTOPNG_MIN_VISUAL_VALUE)return"< "+NTOPNG_MIN_VISUAL_VALUE+" exps/s";var res=NtopUtils.scaleValue(exports,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}static fbits_from_bytes(bytes){if(typeof bytes==="undefined")return"-";return NtopUtils.fbits(bytes*8)}static fpackets(pps){if(typeof pps==="undefined")return"-";var sizes=["pps","Kpps","Mpps","Gpps","Tpps"];if(pps==0)return"0";if(pps>0&&pps<NTOPNG_MIN_VISUAL_VALUE)return"< "+NTOPNG_MIN_VISUAL_VALUE+" pps";var res=NtopUtils.scaleValue(pps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}static fpoints(pps){if(typeof pps==="undefined")return"-";var sizes=["pt/s","Kpt/s","Mpt/s","Gpt/s","Tpt/s"];if(pps==0)return"0";if(pps>0&&pps<NTOPNG_MIN_VISUAL_VALUE)return"< "+NTOPNG_MIN_VISUAL_VALUE+" pt/s";var res=NtopUtils.scaleValue(pps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}static fflows(fps){if(typeof fps==="undefined")return"-";var sizes=["fps","Kfps","Mfps","Gfps","Tfps"];if(fps==0)return"0";if(fps>0&&fps<NTOPNG_MIN_VISUAL_VALUE)return"< "+NTOPNG_MIN_VISUAL_VALUE+" fps";var res=NtopUtils.scaleValue(fps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}static fmsgs(mps){if(typeof mps==="undefined")return"-";var sizes=["msg/s","Kmsg/s","Msg/s","Gmsg/s","Tmsg/s"];if(mps==0)return"0";if(mps>0&&mps<NTOPNG_MIN_VISUAL_VALUE)return"< "+NTOPNG_MIN_VISUAL_VALUE+" mps";var res=NtopUtils.scaleValue(mps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}static fmillis(ms){if(ms===undefined)return"-";const sizes=["ms"];const res=NtopUtils.scaleValue(ms,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}static fnone(val){if(val===undefined)return"-";return Math.round(val*100)/100}static falerts(aps){if(typeof aps==="undefined")return"-";return Math.round(aps*100)/100+" alerts/s"}static fint(value){if(typeof value==="undefined")return"-";var x=Math.round(value);return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}static ffloat(value){if(typeof value==="undefined")return"-";var x=Math.round(value*100)/100;return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}static fpercent(value){if(typeof value==="undefined")return"-";return Math.round(value*100)/100+"%"}static fdate(when){var epoch=when*1e3;var d=new Date(epoch);return d}static capitaliseFirstLetter(string){return string.charAt(0).toUpperCase()+string.slice(1)}static get_trend(actual,before){if(actual===undefined||before===undefined||actual==before){return'<i class="fas fa-minus"></i>'}else if(actual>before){return'<i class="fas fa-arrow-up"></i>'}else{return'<i class="fas fa-arrow-down"></i>'}}static abbreviateString(str,len){if(!str)return"";if(str.length<len)return str;return str.substring(0,len)+"..."}static toFixed2(num){if(!num)return"";return num.toFixed(2)}static bytesToSize(bytes){if(typeof bytes==="undefined")return"-";var precision=2;var kilobyte=1024;var megabyte=kilobyte*1024;var gigabyte=megabyte*1024;var terabyte=gigabyte*1024;if(bytes>=0&&bytes<kilobyte)return parseFloat(bytes.toFixed(precision))+" Bytes";else if(bytes>=kilobyte&&bytes<megabyte)return parseFloat((bytes/kilobyte).toFixed(precision))+" KB";else if(bytes>=megabyte&&bytes<gigabyte)return parseFloat((bytes/megabyte).toFixed(precision))+" MB";else if(bytes>=gigabyte&&bytes<terabyte)return parseFloat((bytes/gigabyte).toFixed(precision))+" GB";else if(bytes>=terabyte)return parseFloat((bytes/terabyte).toFixed(precision))+" TB";else return parseFloat(bytes.toFixed(precision))+" Bytes"}static drawTrend(current,last,withColor){if(current==last){return'<i class="fas fa-minus"></i>'}else if(current>last){return'<i class="fas fa-arrow-up"'+withColor+"></i>"}else{return'<i class="fas fa-arrow-down"></i>'}}static toggleAllTabs(enabled){if(enabled===true)$("#historical-tabs-container").find("li").removeClass("disabled").find("a").attr("data-toggle","tab");else $("#historical-tabs-container").find("li").addClass("disabled").find("a").removeAttr("data-toggle")}static disableAllDropdownsAndTabs(){$("select").each(function(){$(this).prop("disabled",true)});NtopUtils.toggleAllTabs(false)}static enableAllDropdownsAndTabs(){$("select").each(function(){$(this).prop("disabled",false)});NtopUtils.toggleAllTabs(true)}static capitalize(s){return s&&s[0].toUpperCase()+s.slice(1)}static addCommas(nStr){nStr+="";var x=nStr.split(".");var x1=x[0];var x2=x.length>1?"."+x[1]:"";var rgx=/(\d+)(\d{3})/;while(rgx.test(x1)){x1=x1.replace(rgx,"$1"+","+"$2")}return x1+x2}static scaleValue(val,sizes,scale,decimals){if(val==0)return[0,sizes[0]];let factor=decimals?10*decimals:10;var i=parseInt(Math.floor(Math.log(val)/Math.log(scale)));if(i<0||isNaN(i)){i=0}else if(i>=sizes.length){i=sizes.length-1}return[Math.round(val/Math.pow(scale,i)*factor)/factor,sizes[i]]}static formatValue(val){var sizes=["","K","M","G","T"];if(val==0)return"0";if(val>0&&val<NTOPNG_MIN_VISUAL_VALUE)return"< "+NTOPNG_MIN_VISUAL_VALUE;var res=NtopUtils.scaleValue(val,sizes,1e3);return Math.round(res[0])+res[1]}static formatPackets(n){return NtopUtils.addCommas(n.toFixed(0))+" Pkts"}static bytesToVolume(bytes){var sizes=["Bytes","KB","MB","GB","TB"];if(bytes==0)return"0 Bytes";if(bytes>0&&bytes<NTOPNG_MIN_VISUAL_VALUE)return"< "+NTOPNG_MIN_VISUAL_VALUE+" Bytes";var res=NtopUtils.scaleValue(bytes,sizes,1024);return parseFloat(res[0])+" "+res[1]}static bytesToVolumeAndLabel(bytes){var sizes=["Bytes","KB","MB","GB","TB"];if(bytes==0)return"0 Bytes";var i=parseInt(Math.floor(Math.log(bytes)/Math.log(1024)));return[(bytes/Math.pow(1024,i)).toFixed(2),sizes[i]]}static bitsToSize(bits,factor){factor=factor||1e3;var sizes=["bit/s","kbit/s","Mbit/s","Gbit/s","Tbit/s"];if(bits==0)return"0 bps";if(bits>0&&bits<NTOPNG_MIN_VISUAL_VALUE)return"< "+NTOPNG_MIN_VISUAL_VALUE+" bps";var res=NtopUtils.scaleValue(bits,sizes,factor);return res[0].toFixed(2)+" "+res[1]}static secondsToTime(seconds){if(seconds<1){return"< 1 sec"}let days=Math.floor(seconds/86400);let hours=Math.floor(seconds/3600-days*24);let minutes=Math.floor(seconds/60-days*1440-hours*60);let sec=seconds%60;let msg="",msg_array=[];if(days>0){let years=Math.floor(days/365);if(years>0){days=days%365;msg=years+" year";if(years>1){msg+="s"}msg_array.push(msg);msg=""}msg=days+" day";if(days>1){msg+="s"}msg_array.push(msg);msg=""}if(hours>0){if(hours<10){msg="0"}msg+=hours+":"}if(minutes<10){msg+="0"}msg+=minutes+":";if(sec<10){msg+="0"}msg+=sec;msg_array.push(msg);return msg_array.join(", ")}static epoch2Seen(epoch){var d=new Date(epoch*1e3);var tdiff=Math.floor((new Date).getTime()/1e3-epoch);return d.format("dd/MM/yyyy hh:mm:ss")+" ["+NtopUtils.secondsToTime(tdiff)+" ago]"}static graphGetXAxisTicksFormat(diff_epoch){var tickFormat;if(diff_epoch<=86400){tickFormat="%H:%M:%S"}else if(diff_epoch<=2*86400){tickFormat="%b %e, %H:%M:%S"}else{tickFormat="%b %e"}return tickFormat}static paramsExtend(defaults,override){return $.extend({},defaults,override)}static paramsToForm(form,params){form=$(form);for(var k in params){if(params.hasOwnProperty(k)){var input=$('<input type="hidden" name="'+k+'" value="'+params[k]+'">');input.appendTo(form)}}return form}static paramsPairsEncode(params){var i=0;var res={};for(var k in params){res["key_"+i]=k;res["val_"+i]=params[k];i=i+1}return res}static hostkey2hostInfo(host_key){var info;var hostinfo=[];host_key=host_key.replace(/____/g,":");host_key=host_key.replace(/___/g,"/");host_key=host_key.replace(/__/g,".");info=host_key.split("@");return info}static handle_tab_state(nav_object,default_tab){$("a",nav_object).click(function(e){e.preventDefault()});$(" > li > a",nav_object).on("shown.bs.tab",function(e){var id=$(e.target).attr("href").substr(1);if(history.replaceState){history.replaceState(null,null,"#"+id)}else{window.location.hash=id}});var hash=window.location.hash;if(!hash)hash="#"+default_tab;$('a[href="'+hash+'"]',nav_object).tab("show")}static _add_find_host_link(form,name,data){$("<input>").attr({type:"hidden",id:name,name:name,value:data}).appendTo(form)}static makeFindHostBeforeSubmitCallback(http_prefix){return function(form,data){if(data.type=="mac"){form.attr("action",http_prefix+"/lua/mac_details.lua")}else if(data.type=="network"){form.attr("action",http_prefix+"/lua/hosts_stats.lua");NtopUtils._add_find_host_link(form,"network",data.network)}else if(data.type=="snmp"){form.attr("action",http_prefix+"/lua/pro/enterprise/snmp_interface_details.lua");NtopUtils._add_find_host_link(form,"snmp_port_idx",data.snmp_port_idx)}else if(data.type=="snmp_device"){form.attr("action",http_prefix+"/lua/pro/enterprise/snmp_device_details.lua")}else if(data.type=="asn"){form.attr("action",http_prefix+"/lua/hosts_stats.lua");NtopUtils._add_find_host_link(form,"asn",data.asn)}else{form.attr("action",http_prefix+"/lua/host_details.lua");NtopUtils._add_find_host_link(form,"mode","restore")}return true}}static tstampToDateString(html_tag,format,tdiff){tdiff=tdiff||0;var timestamp=parseInt(html_tag.html())+tdiff;var localized=d3.time.format(format)(new Date(timestamp*1e3));html_tag.html(localized).removeClass("hidden");return localized}static noHtml(s){return s.replace(/<[^>]+>/g,"")}static cleanCustomHostUrl(host){return host.replace(/^http:\/\//gi,"").replace(/^https:\/\//gi,"").replace(/^www\./gi,"").replace(/[^0-9a-zA-Z\.:\/_-]/gi,"")}static parseQuery(queryString){var query={};var pairs=(queryString[0]==="?"?queryString.substr(1):queryString).split("&");for(var i=0;i<pairs.length;i++){var pair=pairs[i].split("=");query[decodeURIComponent(pair[0])]=decodeURIComponent(pair[1]||"")}return query}static getHistoryParameters(params){var cur_params=NtopUtils.parseQuery(window.location.search);var new_params=$.extend(cur_params,params);var new_query="?"+$.param(new_params,true);var baseUrl=[location.protocol,"//",location.host,location.pathname].join("");return baseUrl+new_query}static check_status_code(status_code,status_text,$error_label){const is_different=status_code!=200;if(is_different&&$error_label!=null){let message=i18n.request_failed_message;if(status_code&&status_text){message+=`: ${status_code} - ${status_text}`}$error_label.text(message).show()}else if(is_different&&$error_label==null){alert(`${i18n.request_failed_message}: ${status_code} - ${status_text}`)}return is_different}static importModalHelper(params){if(!params.loadConfigXHR){throw"importModalHelper:: Missing 'loadConfigXHR' param";return}$(`input#import-input`).on("change",function(){const filename=$(this).val().replace("C:\\fakepath\\","");$(`#btn-confirm-import`).removeAttr("disabled")});$(`#import-modal`).on("hidden.bs.modal",function(){$(`#import-input`).val("");$("#import-error").hide().removeClass("text-warning").addClass("invalid-feedback");$(`#btn-confirm-import`).attr("disabled","disabled")});$("#import-modal").on("submit","form",function(e){e.preventDefault();const $button=$("#btn-confirm-import");$button.attr("disabled","");const file=$("#import-input")[0].files[0];if(!file){$("#import-error").text(`${i18n.no_file}`).show();$button.removeAttr("disabled");return}const reader=new FileReader;reader.readAsText(file,"UTF-8");reader.onload=function(){let jsonConfiguration=null;try{jsonConfiguration=JSON.parse(reader.result)}catch(e){}if(!jsonConfiguration){$("#import-error").text(i18n.rest_consts[responseJSON.rc_str]||"Not Implemented Yet").show();$button.removeAttr("disabled");return}params.loadConfigXHR(reader.result).done((response,status,xhr)=>{if(response.rc<0){$("#import-error").text(response.rc_str).show();return}if(params.successCallback){params.successCallback(response)}const key=$(`input[name='configuration']:checked`).val();const body=key=="all"?i18n.manage_configurations.messagges.import_all_success:i18n.manage_configurations.messagges.import_success;ToastUtils.showToast({id:"import-configuration-alert",level:"success",title:i18n.success,body:body,delay:2e3});$("#import-modal").modal("hide")}).fail(({responseJSON:responseJSON})=>{const PARTIAL_IMPORT_RC=-28;if(params.failureCallback){params.failureCallback(responseJSON)}if(responseJSON&&responseJSON.rc>0)return;if(responseJSON.rc==PARTIAL_IMPORT_RC)$(`#import-error`).removeClass("invalid-feedback").addClass("text-warning");$("#import-error").text(i18n.rest_consts[responseJSON.rc_str]||i18n.FAILED_HTTP_REQUEST).show()}).always(()=>{$button.removeAttr("disabled")})}})}static serializeFormArray(serializedArray){const serialized={};serializedArray.forEach(obj=>{if(obj.name.includes("[]")){return}else{if(typeof obj.value==="string"){obj.value=obj.value.trim()}serialized[obj.name]=obj.value}});return serialized}static cleanForm(formSelector){$(formSelector).find("input,select,textarea").each(function(i,input){$(this).removeClass(`is-valid`).removeClass(`is-invalid`)});$(formSelector)[0].reset()}static fetchWithTimeout(uri,options={},time=5e3){const controller=new AbortController;const config={...options,signal:controller.signal};const timeout=setTimeout(()=>{controller.abort()},time);return fetch(uri,config).then(response=>{if(!response.ok){throw new Error(`${response.status}: ${response.statusText}`)}return response}).catch(error=>{if(error.name==="AbortError"){throw new Error("Response timed out")}})}static setPref(action,csrf,success,failure){if(action==undefined){console.warn("An action key must be defined to set a preference!");return}const empty=()=>{};const request=$.post(`${http_prefix}/lua/update_prefs.lua`,{action:action,csrf:csrf});request.done(success||empty);request.fail(failure||empty)}static arrayToListString(array,limit){if(array==undefined)return"";if(array.length>limit){return array.slice(0,limit).join(", ")+` ${i18n.and_x_more.replace("$num",array.length-limit)}`}return array.slice(0,limit).join(", ")}static buildURL(location,params={},hasReferer=false,refererParams={}){const url=new URL(location,window.location);for(const[name,value]of Object.entries(params)){if(!value)continue;url.searchParams.set(name,value)}if(hasReferer){const refUrl=new URL(window.location.href);for(const[name,value]of Object.entries(refererParams)){if(!value)continue;refUrl.searchParams.set(name,value)}url.searchParams.set("referer",refUrl.toString())}return url.toString()}static getEditPoolLink(href,poolId){const url=new URL(href,window.location);url.searchParams.set("pool_id",poolId);return url.toString()}static getPoolLink(poolType,poolId=0){return`${http_prefix}/lua/rest/v1/get/${poolType}/pools.lua?pool=${poolId}`}static async getPool(poolType,id=0){if(poolType===null)throw"A pool type must be defined!";try{const request=await fetch(NtopUtils.getPoolLink(poolType,id));const pool=await request.json();if(pool.rc<0){return[false,{}]}return[true,pool.rsp[0]]}catch(err){return[false,{}]}}static saveElementScale($element,scale={width:0,height:0}){const key=NtopUtils.generateScaleElementKey($element);localStorage.setItem(key,JSON.stringify(scale))}static generateScaleElementKey($element){let identificator;const page=location.pathname;const elementId=$element.attr("id");if(elementId!==""){identificator=elementId}else{const className=$element.attr("class");identificator=className}const key=`${identificator}-${page}-scale`;return key}static loadElementScale($element){const key=NtopUtils.generateScaleElementKey($element);const currentValue=localStorage.getItem(key);if(currentValue==null)return undefined;return JSON.parse(currentValue)}static fillFieldIfValid($field,value){if(value===undefined){$field.val("")}else{$field.val(value)}}}$(function(){NtopUtils.initDataPatterns()});var schema_2_label={};var data_2_label={};var graph_i18n={};function initLabelMaps(_schema_2_label,_data_2_label,_graph_i18n){schema_2_label=_schema_2_label;data_2_label=_data_2_label;graph_i18n=_graph_i18n}function getSerieLabel(schema,serie,visualization,serie_index){var data_label=serie.label;var new_label=data_2_label[data_label];if(visualization&&visualization.metrics_labels&&visualization.metrics_labels[serie_index])return visualization.metrics_labels[serie_index];if(serie.ext_label){if(new_label)return serie.ext_label+" ("+new_label+")";else return serie.ext_label}else if(schema=="top:local_senders"||schema=="top:local_receivers"){if(serie.ext_label)return serie.ext_label;else return serie.tags.host}else if(schema.startsWith("top:")){if(serie.tags.protocol)return serie.tags.protocol;else if(serie.tags.category)return serie.tags.category;else if(serie.tags.l4proto)return serie.tags.l4proto;else if(serie.tags.dscp_class)return serie.tags.dscp_class;else if(serie.tags.device&&serie.tags.if_index){if(serie.ext_label!="")return serie.ext_label;else return"("+serie.tags.if_index+")"}else if(serie.tags.device&&serie.tags.port)return serie.tags.port;else if(serie.tags.exporter&&serie.tags.ifname)return serie.tags.ifname;else if(serie.tags.profile)return serie.tags.profile;else if(serie.tags.check)return serie.tags.check;else if(serie.tags.command)return serie.tags.command.substring(4).toUpperCase()}else if(data_label!="bytes"){if(serie.tags.protocol)return serie.tags.protocol+" ("+new_label+")";else if(serie.tags.category)return serie.tags.category+" ("+new_label+")";else if(serie.tags.device&&serie.tags.if_index)return serie.ext_label+" ("+new_label+")";else if(serie.tags.device&&serie.tags.port)return serie.tags.port+" ("+new_label+")"}else{if(serie.tags.protocol)return serie.tags.protocol;else if(serie.tags.category)return serie.tags.category;else if(serie.tags.profile)return serie.tags.profile;else if(data_label=="bytes"){if(schema.contains("volume"))return graph_i18n.traffic_volume;else return graph_i18n.traffic}}if(schema_2_label[schema])return NtopUtils.capitaliseFirstLetter(schema_2_label[schema]);if(new_label)return NtopUtils.capitaliseFirstLetter(new_label);return NtopUtils.capitaliseFirstLetter(data_label)}function getValueFormatter(schema,metric_type,series,custom_formatter,stats){if(series&&series.length&&series[0].label){if(custom_formatter){var formatters=[];if(typeof custom_formatter!="object")custom_formatter=[custom_formatter];for(var i=0;i<custom_formatter.length;i++){const functionName=custom_formatter[i].replace("NtopUtils.","");const formatterFunction=NtopUtils[functionName];if(typeof formatterFunction!=="function")console.error('Cannot find custom value formatter "'+custom_formatter+'"');formatters[i]=formatterFunction}return formatters}var label=series[0].label;if(label.contains("bytes")){if(schema.contains("volume")||schema.contains("memory")||schema.contains("size"))return[NtopUtils.bytesToSize,NtopUtils.bytesToSize];else return[NtopUtils.fbits_from_bytes,NtopUtils.bytesToSize]}else if(label.contains("packets"))return[NtopUtils.fpackets,NtopUtils.formatPackets];else if(label.contains("points"))return[NtopUtils.fpoints,formatPoints];else if(label.contains("flows")){var as_counter=metric_type==="counter"&&schema!=="custom:memory_vs_flows_hosts";return[as_counter?NtopUtils.fflows:NtopUtils.formatValue,NtopUtils.formatFlows,as_counter?NtopUtils.fflows:NtopUtils.formatFlows]}else if(label.contains("millis")||label.contains("_ms")){return[NtopUtils.fmillis,NtopUtils.fmillis]}else if(label.contains("alerts")&&metric_type==="counter"){return[NtopUtils.falerts,NtopUtils.falerts]}else if(label.contains("percent")){return[NtopUtils.fpercent,NtopUtils.fpercent]}}if(stats&&stats.max_val<1){return[NtopUtils.ffloat,NtopUtils.ffloat]}return[NtopUtils.fint,NtopUtils.fint]}function makeFlatLineValues(tstart,tstep,num,data){var t=tstart;var values=[];for(var i=0;i<num;i++){values[i]=[t,data];t+=tstep}return values}function checkSeriesConsinstency(schema_name,count,series){var rv=true;for(var i=0;i<series.length;i++){var data=series[i].data;if(data.length>count){console.error("points mismatch: serie '"+getSerieLabel(schema_name,series[i])+"' has "+data.length+" points, expected "+count);rv=false}else if(data.length<count){series[i].data=upsampleSerie(data,count)}}return rv}function upsampleSerie(serie,num_points){if(num_points<=serie.length)return serie;var res=[];var intervals=num_points/serie.length;function lerp(v0,v1,t){return(1-t)*v0+t*v1}for(var i=0;i<num_points;i++){var index=i/intervals;var prev_i=Math.floor(index);var next_i=Math.min(Math.ceil(index),serie.length-1);var t=index%1;var v=lerp(serie[prev_i],serie[next_i],t);res.push(v)}return res.slice(0,num_points)}function buildTotalSerie(data_series){var series=[];for(var i=0;i<data_series.length;i++)series.push(data_series[i].data);return d3.transpose(series).map(function(x){return x.map(function(g){return g})}).map(function(x){return d3.sum(x)})}function arrayToNvSerie(serie_data,start,step){var values=[];var t=start;for(var i=0;i<serie_data.length;i++){values[i]=[t,serie_data[i]];t+=step}return values}function buildOtherSerie(total_serie,visual_total){if(total_serie.length!==visual_total.length){console.warn("Total/Visual length mismatch: "+total_serie.length+" vs "+visual_total.length);return}var res=[];var max_val=0;for(var i=0;i<total_serie.length;i++){var value=Math.max(0,total_serie[i]-visual_total[i]);max_val=Math.max(max_val,value);res.push(value)}if(max_val>.1)return res}function buildTimeArray(start_time,end_time,step){var arr=[];for(var t=start_time;t<end_time;t+=step)arr.push(t);return arr}function fixTimeRange(chart,params,align_step,actual_step){var diff_epoch=params.epoch_end-params.epoch_begin;var frame,align,tick_step,resolution,fmt="%H:%M:%S";var range_params=[[15,1,"%H:%M:%S",1,1],[60,1,"%H:%M:%S",1,5],[120,1,"%H:%M:%S",10,10],[300,1,"%H:%M:%S",10,30],[600,5,"%H:%M:%S",30,60],[1200,5,"%H:%M:%S",60,120],[3600,10,"%H:%M:%S",60,300],[5400,15,"%H:%M",300,900],[10800,30,"%H:%M",300,900],[21600,60,"%H:%M",3600,1800],[43200,120,"%H:%M",3600,3600],[86400,240,"%H:%M",3600,7200],[172800,480,"%a, %H:%M",3600,14400],[604800,1800,"%Y-%m-%d",86400,86400],[1209600,3600,"%Y-%m-%d",86400,172800],[2678400,7200,"%Y-%m-%d",86400,259200],[15768e3,43200,"%Y-%m-%d",2678400,1314e3],[31622400,86400,"%Y-%m-%d",2678400,2678400]];for(var i=0;i<range_params.length;i++){var range=range_params[i];if(diff_epoch<=range[0]){frame=range[0];resolution=range[1];fmt=range[2];align=range[3];tick_step=range[4];break}}resolution=Math.max(actual_step,resolution);if(align){align=align_step&&frame!=86400?Math.max(align,align_step):1;params.epoch_begin-=params.epoch_begin%align;params.epoch_end-=params.epoch_end%align;diff_epoch=params.epoch_end-params.epoch_begin;params.limit=Math.ceil(diff_epoch/resolution);params.epoch_end+=Math.ceil(diff_epoch/params.limit)*params.limit-diff_epoch;chart.align=align;chart.tick_step=tick_step}else chart.tick_step=null;chart.x_fmt=fmt}function findActualStep(raw_step,tstart){if(typeof supported_steps==="object"){if(supported_steps[raw_step]){var retention=supported_steps[raw_step].retention;if(retention){var now_ts=Date.now()/1e3;var delta=now_ts-tstart;for(var i=0;i<retention.length;i++){var partial=raw_step*retention[i].aggregation_dp;var tframe=partial*retention[i].retention_dp;delta-=tframe;if(delta<=0)return partial}}}}return raw_step}function has_initial_zoom(){return typeof NtopUtils.parseQuery(window.location.search).epoch_begin!=="undefined"}var current_zoom_level=history.state?history.state.zoom_level:0;function canCompareBackwards(epoch_begin,epoch_end){var jump_duration=$("#btn-jump-time-ahead").data("duration");var current_duration=epoch_end-epoch_begin;return jump_duration==current_duration}function fixJumpButtons(epoch_begin,epoch_end){var duration=$("#btn-jump-time-ahead").data("duration");if((epoch_end+duration)*1e3>$.now())$("#btn-jump-time-ahead").addClass("disabled");else $("#btn-jump-time-ahead").removeClass("disabled")}function showQuerySlow(){$("#query-slow-alert").show()}function hideQuerySlow(){$("#query-slow-alert").hide()}function chart_data_sum(series){return series.reduce(function(acc,x){return acc+x.values.reduce(function(acc,pt){return acc+pt[1]||0},0)},0)}function redrawExtraLines(chart,chart_id,extra_lines){d3.selectAll(chart_id+" line.extra-line").remove();if(extra_lines.length>0){var xValueScale=chart.xAxis.scale();var yValueScale=chart.yAxis1.scale();var g=d3.select(chart_id+" .stack1Wrap");for(var i=0;i<extra_lines.length;i++){var d=extra_lines[i];g.append("line").style("stroke","#FF5B56").style("stroke-width","2.5px").attr("x1",xValueScale(d[0])).attr("y1",yValueScale(d[2])).attr("x2",xValueScale(d[1])).attr("y2",yValueScale(d[3])).attr("class","extra-line")}}}function attachStackedChartCallback(chart,schema_name,chart_id,zoom_reset_id,params,step,metric_type,align_step,show_all_smooth,initial_range,ts_table_shown){var pending_chart_request=null;var pending_table_request=null;var d3_sel=d3.select(chart_id);var $chart=$(chart_id);var $zoom_reset=$(zoom_reset_id);var $graph_zoom=$("#graph_zoom");var max_interval=findActualStep(step,params.epoch_begin)*8;var initial_interval=params.epoch_end-params.epoch_begin;var is_max_zoom=initial_interval<=max_interval;var url=http_prefix+"/lua/rest/v1/get/timeseries/ts.lua";var first_load=true;var first_time_loaded=true;var manual_trigger_extra_series={};var datetime_format="dd/MM/yyyy hh:mm:ss";var max_cmp_over_total_ratio=3;var max_line_over_total_ratio=10;var query_timer=null;var seconds_before_query_slow=6;var query_completed=0;var query_was_aborted=false;let last_known_t=null;const visualization=chart.visualization_options||{};chart.is_zoomed=current_zoom_level>0||has_initial_zoom();let extra_lines=[];let unreachable_timestamps={};var spinner=$('<i class="chart-loading-spinner fas fa-spinner fa-lg fa-spin"></i>');$chart.parent().css("position","relative");var chart_colors_full=["#69B87F","#94CFA4","#B3DEB6","#E5F1A6","#FFFCC6","#FEDEA5","#FFB97B","#FF8D6D","#E27B85"];var chart_colors_min=["#7CC28F","#FCD384","#FD977B"];var split_directions_colors=["#69B87F","#FF7C00","#FF4700"];function format_unreachable(formatter){return function(y,d){if(d&&unreachable_timestamps[d[0]])return i18n.unreachable_host;return formatter(y)}}var num_ticks_y1=null;var num_ticks_y2=null;var domain_y1=null;var domain_y2=null;var first_run=true;var update_chart_data=function(new_data){d3_sel.datum([]).call(chart);d3_sel.datum(new_data);d3_sel.transition().duration(500).call(chart);if(first_run){num_ticks_y1=chart.yAxis1.ticks();num_ticks_y2=chart.yAxis2.ticks();domain_y1=chart.yDomain1();domain_y2=chart.yDomain2();first_run=false}if(metric_type==="gauge"){var cur_domain_y1=chart.yAxis1.scale().domain();var cur_domain_y2=chart.yAxis2.scale().domain();cur_domain_y1=cur_domain_y1[1]-cur_domain_y1[0];cur_domain_y2=cur_domain_y2[1]-cur_domain_y2[0];if(chart.yAxis1.tickFormat()!=NtopUtils.ffloat)chart.yAxis1.ticks(Math.min(cur_domain_y1,num_ticks_y1));if(chart.yAxis2.tickFormat()!=NtopUtils.ffloat)chart.yAxis2.ticks(Math.min(cur_domain_y2,num_ticks_y2))}var y1_sum=chart_data_sum(new_data.filter(function(x){return x.yAxis==1}));var y2_sum=chart_data_sum(new_data.filter(function(x){return x.yAxis==2}));if(y1_sum==0)chart.yDomain1([0,1]);else chart.yDomain1(domain_y1);if(y2_sum==0)chart.yDomain2([0,1]);else chart.yDomain2(domain_y2);d3_sel.call(chart);nv.utils.windowResize(function(){chart.update();redrawExtraLines(chart,chart_id,extra_lines)});redrawExtraLines(chart,chart_id,extra_lines);spinner.remove()};function isLegendDisabled(key,default_val){if(typeof localStorage!=="undefined"){var val=localStorage.getItem("chart_series.disabled."+key);if(val!=null)return val==="true"}return default_val}chart.legend.dispatch.on("legendClick",function(d,i){manual_trigger_extra_series[d.legend_key]=true;if(typeof localStorage!=="undefined")localStorage.setItem("chart_series.disabled."+d.legend_key,!d.disabled?true:false)});chart.dispatch.on("zoom",function(e){var cur_zoom=[params.epoch_begin,params.epoch_end];var t_start=Math.floor(e.xDomain[0]);var t_end=Math.ceil(e.xDomain[1]);var old_zoomed=chart.is_zoomed;var is_user_zoom=typeof e.is_user_zoom!=="undefined"?e.is_user_zoom:true;chart.is_zoomed=true;if(chart.updateStackedChart(t_start,t_end,false,is_user_zoom)){if(is_user_zoom||e.push_state){current_zoom_level+=1;var url=NtopUtils.getHistoryParameters({epoch_begin:t_start,epoch_end:t_end});history.pushState({zoom_level:current_zoom_level,range:[t_start,t_end]},"",url)}chart.fixChartButtons()}else chart.is_zoomed=old_zoomed});function updateZoom(zoom,is_user_zoom,force){var t_start=zoom[0];var t_end=zoom[1];chart.updateStackedChart(t_start,t_end,false,is_user_zoom,null,force);chart.fixChartButtons()}chart.zoom_in=function(){var cur_interval=params.epoch_end-params.epoch_begin;if(cur_interval>60){var delta=cur_interval/4;$("#period_begin").datetimepicker("date",new Date((params.epoch_begin+delta)*1e3));$("#period_end").datetimepicker("date",new Date((params.epoch_end-delta)*1e3));updateChartFromPickers()}};chart.zoom_out=function(){var cur_interval=params.epoch_end-params.epoch_begin;var delta=cur_interval/2;$("#period_begin").datetimepicker("date",new Date((params.epoch_begin-delta)*1e3));$("#period_end").datetimepicker("date",new Date((params.epoch_end+delta)*1e3));updateChartFromPickers()};$chart.on("dblclick",function(event){if($(event.target).hasClass("nv-legend-text"))return;chart.zoom_out()});$zoom_reset.on("click",function(){if(current_zoom_level){history.go(-current_zoom_level)}});window.addEventListener("popstate",function(e){var zoom=initial_range;if(e.state){zoom=e.state.range;current_zoom_level=e.state.zoom_level}else current_zoom_level=0;updateZoom(zoom,true,true)});chart.fixChartButtons=function(){if(current_zoom_level>0||has_initial_zoom()){$graph_zoom.find(".btn-warning:not(.custom-zoom-btn)").addClass("initial-zoom-sel").removeClass("btn-warning");$graph_zoom.find(".custom-zoom-btn").css("visibility","visible");var zoom_link=$graph_zoom.find(".custom-zoom-btn");var link=zoom_link.val().replace(/&epoch_begin=.*/,"");link+="&epoch_begin="+params.epoch_begin+"&epoch_end="+params.epoch_end;zoom_link.val(link)}else{$graph_zoom.find(".initial-zoom-sel").addClass("btn-warning");$graph_zoom.find(".custom-zoom-btn").css("visibility","hidden");chart.is_zoomed=false}fixJumpButtons(params.epoch_begin,params.epoch_end);if(current_zoom_level>0)$zoom_reset.show();else $zoom_reset.hide()};function checkQueryCompleted(){var flows_dt=$("#chart1-flows");var wait_num_queries=ts_table_shown&&$("#chart1-flows").css("display")!=="none"?2:1;query_completed+=1;if(query_completed>=wait_num_queries){if(query_timer){clearInterval(query_timer);query_timer=null}hideQuerySlow()}}chart.queryWasAborted=function(){return query_was_aborted};chart.abortQuery=function(){query_was_aborted=true;if(pending_chart_request){pending_chart_request.abort();chart.noData(i18n.query_was_aborted);update_chart_data([])}if(pending_table_request)pending_table_request.abort();if(query_timer){clearInterval(query_timer);query_timer=null}hideQuerySlow()};chart.tableRequestCompleted=function(){checkQueryCompleted();pending_table_request=null};chart.getDataUrl=function(){var data_params=jQuery.extend({},params);delete data_params.zoom;delete data_params.ts_compare;data_params.extended=1;return url+"?"+$.param(data_params,true)};var old_start,old_end,old_interval;chart.updateStackedChart=function(tstart,tend,no_spinner,is_user_zoom,on_load_callback,force_update){if(tstart)params.epoch_begin=tstart;if(tend)params.epoch_end=tend;const series_formatted_labels={};const now=Date.now()/1e3;var cur_interval=params.epoch_end-params.epoch_begin;var actual_step=findActualStep(step,params.epoch_begin);max_interval=actual_step*6;if(cur_interval<max_interval){if(is_max_zoom&&cur_interval<old_interval&&!force_update){old_interval=cur_interval;return false}if(!force_update){var epoch=params.epoch_begin+(params.epoch_end-params.epoch_begin)/2;var new_end=Math.floor(epoch+max_interval/2);if(new_end>=now){params.epoch_begin=params.epoch_end-max_interval}else{params.epoch_begin=Math.floor(epoch-max_interval/2);params.epoch_end=Math.floor(epoch+max_interval/2)}is_max_zoom=true;chart.zoomType(null)}}else if(cur_interval>max_interval){is_max_zoom=false;chart.zoomType("x")}old_interval=cur_interval;if(!first_load||has_initial_zoom()||force_update)align_step=null;fixTimeRange(chart,params,align_step,actual_step);if(first_load)initial_range=[params.epoch_begin,params.epoch_end];if(old_start==params.epoch_begin&&old_end==params.epoch_end&&!force_update)return false;old_start=params.epoch_begin;old_end=params.epoch_end;if(pending_table_request)pending_table_request.abort();if(pending_chart_request)pending_chart_request.abort();else if(!no_spinner)spinner.appendTo($chart.parent());$("#period_begin").datetimepicker("date",new Date(params.epoch_begin*1e3));$("#period_end").datetimepicker("date",new Date(Math.min(params.epoch_end*1e3,$.now())));if(query_timer)clearInterval(query_timer);query_timer=setInterval(showQuerySlow,seconds_before_query_slow*1e3);query_completed=0;query_was_aborted=false;chart.noData(i18n.no_data_available);hideQuerySlow();var req_params=$.extend({},params);if(!canCompareBackwards(req_params.epoch_begin,req_params.epoch_end))delete req_params.ts_compare;if(visualization.show_unreachable)req_params.no_fill=1;pending_chart_request=$.get(url,req_params,function(data){data=data.rsp;if(data&&data.error)chart.noData(data.error);if(!data||!data.series||!data.series.length||!checkSeriesConsinstency(schema_name,data.count,data.series)){update_chart_data([]);return}var tick_step=Math.ceil(chart.tick_step/data.step)*data.step;chart.xAxis.tickValues(buildTimeArray(data.start,data.start+data.count*data.step,tick_step));chart.xAxis.tickFormat(function(d){return d3.time.format(chart.x_fmt)(new Date(d*1e3))});var res=[];var series=data.series;var total_serie;var color_i=0;let time_elapsed=1;if(visualization.time_elapsed)time_elapsed=visualization.time_elapsed;var chart_colors=series.length<=chart_colors_min.length?chart_colors_min:chart_colors_full;for(var j=0;j<series.length;j++){var values=[];var serie_data=series[j].data;var t=data.start;for(var i=0;i<serie_data.length;i++){values[i]=[t,serie_data[i]/time_elapsed];t+=data.step}var label=getSerieLabel(schema_name,series[j],visualization,j);var legend_key=schema_name+":"+label;chart.current_step=data.step;let serie_type=series[j].type;let serie_color=chart_colors[color_i++];if(!serie_type){if(visualization.split_directions){serie_type=j==0?"area":"line";serie_color=split_directions_colors[j]||serie_color}else serie_type="area"}series_formatted_labels[j]=label;res.push({key:label,yAxis:series[j].axis||1,values:values,type:serie_type,color:serie_color,legend_key:legend_key,disabled:isLegendDisabled(legend_key,false)})}var visual_total=buildTotalSerie(series);var has_full_data=false;if(data.additional_series&&data.additional_series.total){total_serie=data.additional_series.total;var other_serie=buildOtherSerie(total_serie,visual_total);if(other_serie){res.push({key:graph_i18n.other,yAxis:1,values:arrayToNvSerie(other_serie,data.start,data.step),type:"area",color:chart_colors[color_i++],legend_key:"other",disabled:isLegendDisabled("other",false)});has_full_data=true}}else{total_serie=visual_total;has_full_data=!schema_name.startsWith("top:")}var past_serie=null;if(data.additional_series){for(var key in data.additional_series){if(key=="total"){continue}var serie_data=upsampleSerie(data.additional_series[key],data.count);var ratio_over_total=d3.max(serie_data)/d3.max(visual_total);var values=arrayToNvSerie(serie_data,data.start,data.step);var is_disabled=isLegendDisabled(key,false);past_serie=serie_data;if((first_time_loaded||!manual_trigger_extra_series[key])&&ratio_over_total>max_cmp_over_total_ratio)is_disabled=true;res.push({key:NtopUtils.capitaliseFirstLetter(key),yAxis:1,values:values,type:"line",classed:"line-dashed line-animated",color:"#7E91A0",legend_key:key,disabled:is_disabled})}}if(visualization&&visualization.extra_series){for(var i=0;i<visualization.extra_series.length;i++){var serie=visualization.extra_series[i];if(!serie.label){console.warn("Missing extra_series label");continue}if(!serie.value){console.warn("Missing extra_series value");continue}var ratio_over_total=serie.value/d3.max(visual_total);var is_disabled=isLegendDisabled(serie.label,false);if((first_time_loaded||!manual_trigger_extra_series[serie.label])&&ratio_over_total>max_line_over_total_ratio)is_disabled=true;res.push({key:serie.label,yAxis:serie.axis||1,values:arrayToNvSerie(upsampleSerie([serie.value],data.count),data.start,data.step),type:serie.type||"line",color:serie.color||"red",classed:serie.class,legend_key:serie.label,disabled:is_disabled})}}if(!data.no_trend&&has_full_data&&total_serie.length>=3){var num_smoothed_points=Math.min(Math.max(Math.floor(total_serie.length/5),3),12);var smooth_functions={};function add_smoothed_serie(fn_to_use){var options=smooth_functions[fn_to_use];var smoothed;if(fn_to_use=="rsi"){if(!past_serie)return;var delta_serie=[];for(var i=0;i<total_serie.length;i++){delta_serie[i]=total_serie[i]-past_serie[i]}smoothed=options[2](delta_serie,options[3])}else smoothed=options[2](total_serie,options[3]);if(smoothed[0])delete smoothed[0];var max_val=d3.max(smoothed);if(max_val>0){var aligned;if(fn_to_use!="ema"&&fn_to_use!="sma"&&fn_to_use!="rsi"){var scale=d3.max(total_serie)/max_val;var scaled=$.map(smoothed,function(x){return x*scale});aligned=upsampleSerie(scaled,data.count)}else{var remaining=data.count-smoothed.length;var to_fill=remaining<num_smoothed_points?remaining:num_smoothed_points;for(var i=0;i<to_fill;i++)smoothed.splice(0,0,smoothed[0]);aligned=upsampleSerie(smoothed,data.count)}if(fn_to_use=="rsi")chart.yDomainRatioY2(1);res.push({key:options[0],yAxis:fn_to_use!="rsi"?1:2,values:arrayToNvSerie(aligned,data.start,data.step),type:"line",classed:"line-animated",color:options[1],legend_key:fn_to_use,disabled:isLegendDisabled(fn_to_use,false)})}}if(show_all_smooth){for(fn_to_use in smooth_functions)add_smoothed_serie(fn_to_use)}}extra_lines=[];if(visualization.show_unreachable&&res.length>0){var ref_serie=res[0].values;let tok=ref_serie[0][0];let was_unreachable=false;unreachable_timestamps={};for(var i=0;i<ref_serie.length;i++){const is_unreachable=ref_serie[i][1]===0;const tval=ref_serie[i][0];if(ref_serie[i][1]==ref_serie[i][1])last_known_t=tval;if(!is_unreachable){if(was_unreachable)extra_lines.push([tok,tval,0,0]);tok=tval;was_unreachable=false}else{ref_serie[i][1]=null;unreachable_timestamps[tval]=true;was_unreachable=true}}if(was_unreachable){const tlast=ref_serie[ref_serie.length-1][0];if(tlast!=tok)extra_lines.push([tok,tlast,0,0])}}var formatter1=getValueFormatter(schema_name,metric_type,series.filter(function(d){return d.axis!=2}),visualization.value_formatter,data.statistics);var value_formatter=formatter1[0];var tot_formatter=formatter1[1]||value_formatter;var stats_formatter=formatter1[2]||value_formatter;chart.yAxis1.tickFormat(value_formatter);chart.yAxis1_formatter=visualization.show_unreachable?format_unreachable(value_formatter):value_formatter;var second_axis_series=series.filter(function(d){return d.axis==2});var formatter2=getValueFormatter(schema_name,metric_type,second_axis_series,visualization.value_formatter2||visualization.value_formatter,data.statistics);var value_formatter2=formatter2[0];chart.yAxis2.tickFormat(value_formatter2);chart.yAxis2_formatter=value_formatter2;var stats_table=$("#ts-chart-stats");var stats=data.statistics;if(stats){if(stats.average){var values=makeFlatLineValues(data.start,data.step,data.count,stats.average);res.push({key:graph_i18n.avg,yAxis:1,values:values,type:"line",classed:"line-dashed line-animated",color:"#AC9DDF",legend_key:"avg",disabled:isLegendDisabled("avg",true)})}function splitSeriesInfo(stats_name,cell,show_date,formatter,total){let val="";let time_elapsed=1;const val_formatter=formatter?formatter:stats_formatter;if(visualization.time_elapsed)time_elapsed=visualization.time_elapsed;if(visualization.first_timeseries_only){val=val_formatter(stats.by_serie[0][stats_name]/time_elapsed)+(show_date?" ("+new Date(res[0].values[stats[stats_name+"_idx"]][0]*1e3).format(datetime_format)+")":"")}else if(visualization.split_directions&&stats.by_serie&&!total){const values=[];for(var i=0;i<series.length;i++){if(stats.by_serie[i])values.push(val_formatter(stats.by_serie[i][stats_name]/time_elapsed)+" ["+series_formatted_labels[i]+"]"+(show_date?" ("+new Date(res[i].values[stats.by_serie[i][stats_name+"_idx"]+1][0]*1e3).format(datetime_format)+")":""))}val=values.join("<br />")}else val=val_formatter(stats[stats_name]/time_elapsed)+(show_date?" ("+new Date(res[0].values[stats[stats_name+"_idx"]][0]*1e3).format(datetime_format)+")":"");if(val)cell.show().find("span").html(val);return values}var total_cell=stats_table.find(".graph-val-total");var average_cell=stats_table.find(".graph-val-average");var min_cell=stats_table.find(".graph-val-min");var max_cell=stats_table.find(".graph-val-max");var perc_cell=stats_table.find(".graph-val-95percentile");if(stats.total||total_cell.is(":visible"))splitSeriesInfo("total",total_cell,false,tot_formatter,true);if(stats.average||average_cell.is(":visible"))splitSeriesInfo("average",average_cell,false,stats_formatter);if((stats.min_val||min_cell.is(":visible"))&&res[0].values[stats.min_val_idx])splitSeriesInfo("min_val",min_cell,true,stats_formatter);if((stats.max_val||max_cell.is(":visible"))&&res[0].values[stats.max_val_idx])splitSeriesInfo("max_val",max_cell,true,stats_formatter);if(stats["95th_percentile"]||perc_cell.is(":visible")){splitSeriesInfo("95th_percentile",perc_cell,false,stats_formatter);if(!visualization.split_directions){var values=makeFlatLineValues(data.start,data.step,data.count,stats["95th_percentile"]);res.push({key:graph_i18n["95_perc"],yAxis:1,values:values,type:"line",classed:"line-dashed line-animated",color:"#476DFF",legend_key:"95perc",disabled:isLegendDisabled("95perc",true)})}}}stats_table.show();if(visualization.show_unreachable&&last_known_t&&last_known_t+data.step>now&&now<last_known_t+2*data.step){for(var j=0;j<res.length;j++){const serie=res[j].values;if(serie.length>0)serie[serie.length]=[now,serie[serie.length-1][1]]}}var enabled_series=res.filter(function(d){return d.disabled!==true});if(second_axis_series.length>0||enabled_series.length==0){for(var i=0;i<res.length;i++)res[i].disabled=false}if(second_axis_series.length>0){chart.legend.updateState(false)}update_chart_data(res);first_time_loaded=false;if(data.source_aggregation)$("#data-aggr-dropdown > button > span:first").html(data.source_aggregation)}).fail(function(xhr,status,error){if(xhr.statusText=="abort"){return}console.error("Error while retrieving the timeseries data ["+status+"]: "+error);chart.noData(error);update_chart_data([])}).always(function(data,status,xhr){checkQueryCompleted();pending_chart_request=null});if(first_load){first_load=false;$(function(){var flows_dt=$("#chart1-flows").data("datatable");if(flows_dt)pending_table_request=flows_dt.pendingRequest})}else{var flows_dt=$("#chart1-flows");if(ts_table_shown){updateGraphsTableView(null,params);if($("#chart1-flows").css("display")!=="none")pending_table_request=flows_dt.data("datatable").pendingRequest}}if(typeof on_load_callback==="function")on_load_callback(chart);return true}}var graph_old_view=null;var graph_old_has_nindex=null;var graph_old_nindex_query=null;function tsQueryToTags(ts_query){return ts_query.split(",").reduce(function(params,value){var pos=value.indexOf(":");if(pos!=-1){var k=value.slice(0,pos);var v=value.slice(pos+1);params[k]=v}return params},{})}function recheckGraphTableEntries(){var table_view=graph_table_views;var tdiff=graph_params.epoch_end-graph_params.epoch_begin;var reset_selection=false;$("#chart1-flows").show();$("#graphs-table-selector").show();for(view_id in table_view){var view=table_view[view_id];var elem=$("#"+view.html_id);if(tdiff<=view.min_step){if(graph_old_view.id===view_id)reset_selection=true;elem.hide()}else elem.show()}var items_ul=$("#graphs-table-active-view").closest(".btn-group").find("ul:first");items_ul.find("li.dropdown-header").each(function(idx,e){var next_item=$(e).nextAll("li").filter(function(idx,e){return $(e).css("display")!=="none"||!$(e).attr("data-view-id")}).first();var divider=$(e).nextAll(".divider").first();if(!next_item.attr("data-view-id")){$(e).hide();divider.hide()}else{$(e).show();divider.show()}});if(reset_selection){var first_view=items_ul.find("li[data-view-id]").filter(function(idx,e){return $(e).css("display")!=="none"}).first();if(first_view.length)setActiveGraphsTableView(first_view.attr("data-view-id"));else{$("#chart1-flows").hide();$("#graphs-table-selector").hide()}return false}return true}function updateGraphsTableView(view,graph_params,has_nindex,nindex_query,per_page){if(view)graph_old_view=view;if(!recheckGraphTableEntries(graph_params)){return}if(view){graph_old_has_nindex=has_nindex;graph_old_nindex_query=nindex_query}else{view=graph_old_view;has_nindex=graph_old_has_nindex;nindex_query=graph_old_nindex_query}var graph_table=$("#chart1-flows");nindex_query=nindex_query+"&begin_time_clause="+graph_params.epoch_begin+"&end_time_clause="+graph_params.epoch_end;var nindex_buttons="";var params_obj=tsQueryToTags(graph_params.ts_query);if(!params_obj.host){nindex_buttons+='<div class="btn-group"><button class="btn btn-link dropdown-toggle" data-bs-toggle="dropdown">';nindex_buttons+="IP Version";nindex_buttons+='<span class="caret"></span></button><ul class="dropdown-menu" role="menu">';nindex_buttons+='<li><a class="dropdown-item" href="#" onclick="return onGraphMenuClick(null, 4)">4</a></li>';nindex_buttons+='<li><a class="dropdown-item" href="#" onclick="return onGraphMenuClick(null, 6)">6</a></li>';nindex_buttons+="</span></div>"}nindex_buttons+='<div class="btn-group pull-right"><button class="btn btn-link dropdown-toggle" data-bs-toggle="dropdown">';nindex_buttons+="Explorer";nindex_buttons+='<span class="caret"></span></button><ul class="dropdown-menu" role="menu">';nindex_buttons+='<li><a class="dropdown-item" href="'+http_prefix+"/lua/pro/nindex_topk.lua"+nindex_query+'">Top-K</a></li>';nindex_buttons+='<li><a class="dropdown-item" href="'+http_prefix+"/lua/pro/nindex.lua"+nindex_query+'">Flows</a></li>';nindex_buttons+="</span></div>";if(view.columns){var url=http_prefix+(view.nindex_view?"/lua/pro/get_nindex_flows.lua":"/lua/pro/get_ts_table.lua");var columns=view.columns.map(function(col){return{title:col[1],field:col[0],css:{textAlign:col[2],width:col[3]},hidden:col[4]?true:false}});columns.push({title:i18n.actions,field:"drilldown",css:{width:"1%","text-align":"center"}});var old_dt=graph_table.data("datatable");if(old_dt&&old_dt.pendingRequest)old_dt.pendingRequest.abort();graph_table.removeData("datatable");graph_table.html("");graph_table.datatable({title:"",url:url,perPage:per_page,noResultsMessage:function(){if(ts_chart.queryWasAborted())return i18n.query_was_aborted;else return i18n.no_results_found},post:function(){var params=$.extend({},graph_params);delete params.ts_compare;delete params.initial_point;params.limit=1;params.detail_view=view.id;return params},loadingYOffset:40,columns:columns,buttons:view.nindex_view?[nindex_buttons]:[],tableCallback:function(){var data=this.resultset;ts_chart.tableRequestCompleted();if(!data){return}if(data.currentPage>1)graph_table.data("has_interaction",true);var stats_div=$("#chart1-flows-stats");var has_drilldown=data&&data.data.some(function(row){return row.drilldown});if(!has_drilldown)$("table td:last-child, th:last-child",graph_table).remove();if(data&&data.stats&&data.stats.query_duration_msec){$("#flows-query-time").html(data.stats.query_duration_msec/1e3);$("#flows-processed-records").html(data.stats.num_records_processed);stats_div.show()}else stats_div.hide()},rowCallback:function(row,row_data){if(typeof row_data.tags==="object"&&(params_obj.category&&row_data.tags.category===params_obj.category||params_obj.protocol&&row_data.tags.protocol===params_obj.protocol)){row.addClass("info")}return row}})}}function draw_processes_graph(http_prefix,graph_div_id,host){var links;var nodes={};var url=http_prefix+"/lua/get_processes_graph_data.lua?host="+host;d3.json(url,function(error,json){if(error)return console.warn(error);links=json;var _link;links.forEach(function(link){if(link.source_pid==-1){_link=http_prefix+"/lua/host_details.lua?host="+link.source}else{_link=http_prefix+"/lua/process_details.lua?pid="+link.source_pid+"&pid_name="+link.source_name+"&host="+host+"&page=flows"}link.source=nodes[link.source]||(nodes[link.source]={name:link.source_name,num:link.source,link:_link,type:link.source_type,pid:link.source_pid});if(link.target_pid==-1){_link=http_prefix+"/lua/host_details.lua?host="+link.target}else{_link=http_prefix+"/lua/process_details.lua?pid="+link.target_pid+"&pid_name="+link.target_name+"&host="+host+"&page=flows"}link.target=nodes[link.target]||(nodes[link.target]={name:link.target_name,num:link.target,link:_link,type:link.target_type,pid:link.target_pid})});var width=960,height=500,arrow_size=6;var color=d3.scale.category10();color["proc"]="red";color["host"]="lightsteelblue";var force=d3.layout.force().nodes(d3.values(nodes)).links(links).size([width,height]).linkDistance(120).charge(-400).on("tick",tick).start();var svg=d3.select("#"+graph_div_id).append("svg").attr("id","ebpf_graph").attr("width",width).attr("height",height);svg.append("defs").selectAll("marker").data(["proc2proc","proc2host","host2proc","host2host"]).enter().append("marker").attr("id",function(d){return d}).attr("viewBox","0 -5 10 10").attr("refX",15).attr("refY",-1.5).attr("markerWidth",arrow_size).attr("markerHeight",arrow_size).attr("orient","auto").append("path").attr("d","M0,-5L10,0L0,5");var path=svg.append("g").selectAll("path").data(force.links()).enter().append("path").attr("class",function(d){return"link "+d.type}).attr("marker-end",function(d){return"url(#"+d.type+")"});var circle=svg.append("g").selectAll("circle").data(force.nodes()).enter().append("circle").attr("class","ebpf_circle").attr("r",8).style("fill",function(d){return color[d.type]}).call(force.drag).on("dblclick",function(d){window.location.href=d.link});var text=svg.append("g").selectAll("text").data(force.nodes()).enter().append("text").attr("class","ebpf_text").attr("x",12).attr("y",".31em").text(function(d){if(d.pid>=0)return d.name+" [pid: "+d.pid+"]";else{return d.name}});function tick(){path.attr("d",linkArc);circle.attr("transform",transform);text.attr("transform",transform)}function linkArc(d){var dx=d.target.x-d.source.x,dy=d.target.y-d.source.y,dr=Math.sqrt(dx*dx+dy*dy);return"M"+d.source.x+","+d.source.y+"A"+dr+","+dr+" 0 0,1 "+d.target.x+","+d.target.y}function transform(d){return"translate("+d.x+","+d.y+")"}})}function makeUniqueValidator(items_function){return function(field){var cmp_name=field.val();var count=0;if(!cmp_name)return true;items_function(field).each(function(){var name=$(this).val();if(name==cmp_name)count=count+1});return count==1}}function memberValueValidator(input){var member=input.val();if(member==="")return true;return NtopUtils.is_mac_address(member)||NtopUtils.is_network_mask(member,true)}function makePasswordPatternValidator(pattern){return function passwordPatternValidator(input){if(!input.val())return true;return $(input).val().match(pattern)}}function passwordMatchValidator(input){var other_input=$(input).closest("form").find("[data-passwordmatch]").not(input);if(!input.val()||!other_input.val())return true;return other_input.val()===input.val()}function poolnameValidator(input){if(!input.val())return true;return $(input).val().match(/^[a-z0-9_]*$/)}function passwordMatchRecheck(form){var items=$(form).find("[data-passwordmatch]");var not_empty=0;items.each(function(){if($(this).val()!="")not_empty++});if(not_empty==items.length)items.trigger("input")}function hostOrMacValidator(input){var host=input.val();if(host==="")return true;return NtopUtils.is_mac_address(host)||NtopUtils.is_good_ipv4(host)||NtopUtils.is_good_ipv6(host)}function ipAddressValidator(input){var host=input.val();if(host==="")return true;return NtopUtils.is_good_ipv4(host)||NtopUtils.is_good_ipv6(host)}(function($){class ModalHandler{constructor(form,options){if(typeof options.csrf==="undefined"){throw new Error("ModalHandler::Missing CSRF token!")}this.element=form;this.dialog=$(form).closest(".modal");this.options=options;this.csrf=options.csrf;this.dontDisableSubmit=options.dontDisableSubmit;this.observer=new MutationObserver(list=>{this.bindFormValidation();this.toggleFormSubmission();this.initDataPatterns()});this.observer.observe(this.element[0],{childList:true,subtree:true});this.initialState=null;this.currentState=null;this.firstCloseAttempt=false;this.isSubmitting=false;const submitButton=$(this.element).find(`[type='submit']`);if(submitButton.length==0){throw new Error("ModalHandler::The submit button was not found inside the form!")}this.toggleFormSubmission()}initDataPatterns(){NtopUtils.initDataPatterns()}createFormSnapshot(){const snapshot={inputs:{},hidden:[]};$(this.element).find('textarea,select,input[type!="radio"]').each(function(){const type=$(this).prop("nodeName").toLowerCase();const name=$(this).attr("name");snapshot.inputs[`${type}[name='${name}']`]=$(this).val()});$(this.element).find(`[style='display: none;'], span.invalid-feedback`).each(function(){snapshot.hidden.push($(this))});return snapshot}compareFormSnaphsot(s1,s2){if(s1==null||s2==null)return true;for(let[key,value]of Object.entries(s1.inputs)){if(s2.inputs[key]!=value)return false}return true}delegateModalClosing(){const self=this;$(this.dialog).find("button.cancel").off("click").click(function(){self.firstCloseAttempt=false;$(self.element)[0].reportValidity();$(self.dialog).find(".confirm-closing").fadeOut(100,function(){$(self.dialog).find("button.close").fadeIn(100)})});$(this.dialog).off("hide.bs.modal").on("hide.bs.modal",function(event){if(self.isSubmitting){event.preventDefault();return}if(self.compareFormSnaphsot(self.currentState,self.initialState)){return}if(self.firstCloseAttempt)return;event.preventDefault();self.firstCloseAttempt=true;$(self.dialog).find("button.close").fadeOut(100,function(){$(self.dialog).find(".confirm-closing").fadeIn(100)});return});$(this.dialog).off("hidden.bs.modal").on("hidden.bs.modal",function(event){for(const[selector,value]of Object.entries(self.initialState.inputs)){$(self.dialog).find(selector).val(value);$(self.dialog).find(selector).removeClass("is-invalid")}self.initialState.hidden.forEach($hidden=>{$hidden.hide()});self.element.find(`[type='submit']`).attr("disabled","disabled");self.currentState=null;self.firstCloseAttempt=false;$(self.dialog).find(".confirm-closing").fadeOut(100,function(){$(self.dialog).find("button.close").fadeIn(100)});self.cleanForm()})}fillFormModal(){return this.options.loadFormData()}invokeModalInit(data={}){const self=this;this.delegateModalClosing();this.data=data||this.fillFormModal();this.options.onModalInit(this.data,this);$(this.element).parents(".modal").on("show.bs.modal",function(){self.options.onModalShow()});this.initialState=this.createFormSnapshot();this.currentState=null;this.delegateResetButton()}delegateSubmit(){this.bindFormValidation();const self=this;this.submitHandler=function(e){if(!self.options.isSyncRequest){e.preventDefault();e.stopPropagation();self.makeRequest()}};$(this.element).on("submit",this.submitHandler)}bindFormValidation(){const self=this;$(this.element).find(`input,select,textarea`).each(async function(i,input){const $input=$(this);let timeoutId=-1;const validHostname=async()=>{const $spinner=$input.parent().find(".spinner-border");$input.attr("readonly",true);$spinner.show();const response=await NtopUtils.resolveDNS($(input).val());$input.removeAttr("readonly");$spinner.hide();if(response.rc<0){input.setCustomValidity(response.rc_str);return[false,i18n[response.rc_str]]}input.setCustomValidity("");return[true,"Success"]};const validInput=async validation=>{if(validation.data.resolveDNS&&$input.val().match(NtopUtils.REGEXES.domainName)){return await validHostname()}if(validation.data.cannotBeEmpty&&validation.isInputEmpty){input.setCustomValidity("Please fill the input.");return[false,validation.data.validationEmptyMessage||i18n.missing_field]}if(input.validity.patternMismatch){input.setCustomValidity("Pattern mismatch.");return[false,validation.data.validationMessage||i18n.invalid_field]}if(input.validity.rangeOverflow){input.setCustomValidity("Value exceed the maximum value.");return[false,validation.data.rangeOverflowMessage||i18n.invalid_field]}if(input.validity.rangeUnderflow){input.setCustomValidity("Value is under the minimum value.");return[false,validation.data.rangeUnderflowMessage||i18n.invalid_field]}input.setCustomValidity("");return[true,"Success"]};const checkValidation=async()=>{const validation={data:{validationMessage:$input.data("validationMessage"),validationEmptyMessage:$input.data("validationEmptyMessage"),cannotBeEmpty:$input.attr("required")==="required"||$input.data("validationNotEmpty")==true,resolveDNS:$input.data("validationResolvedns"),rangeOverflowMessage:$input.data("validationRangeOverflowMessage"),rangeUnderflowMessage:$input.data("validationUnderflowOverflowMessage")},isInputEmpty:typeof $input.val()==="string"?$input.val().trim()=="":false};const[isValid,messageToShow]=await validInput(validation);let $error=$input.parent().find(`.invalid-feedback`);if($error.length==0){$error=$(`<span class='invalid-feedback'></span>`)}if(!isValid){$input.addClass("is-invalid");$input.parent().append($error);$error.text(messageToShow)}else{$input.removeClass("is-invalid");$error.fadeOut(500,function(){$(this).remove()})}};$(this).off("input").on("input",function(e){self.currentState=self.createFormSnapshot();if(timeoutId!=-1)clearTimeout(timeoutId);if(!$input.attr("formnovalidate")){timeoutId=setTimeout(()=>{checkValidation();self.toggleFormSubmission()},300);self.firstCloseAttempt=false}});$(this).off("invalid").on("invalid",function(e){e.preventDefault();if(!$input.attr("formnovalidate")){checkValidation()}})})}getModalID(){return $(this.element).parents(".modal").attr("id")}toggleFormSubmission(){let isValid=true;$(this.element).find("input:not(:disabled),select:not(:disabled),textarea:not(:disabled)").each(function(idx,input){isValid&=input.validity.valid});isValid?$(this.element).find(`[type='submit'],[type='test']`).removeAttr("disabled"):$(this.element).find(`[type='submit'],[type='test']`).attr("disabled","disabled")}cleanForm(){$(this.element).find("input,textarea,select").each(function(i,input){$(this).removeClass(`is-valid`).removeClass(`is-invalid`)});$(this.element)[0].reset()}makeRequest(){const $feedbackLabel=$(this.element).find(`.invalid-feedback`);const submitButton=$(this.element).find(`[type='submit']`);let dataToSend=this.options.beforeSumbit(this.data);dataToSend.csrf=this.csrf;dataToSend=$.extend(dataToSend,this.options.submitOptions);submitButton.attr("disabled","disabled");const self=this;if(this.options.endpoint){let request;if(self.options.method=="post"){request=$.ajax({url:this.options.endpoint,data:JSON.stringify(dataToSend),method:self.options.method,dataType:"json",contentType:"application/json; charset=utf-8"})}else{request=$.get(this.options.endpoint,dataToSend)}this.isSubmitting=true;request.done(function(response,textStatus){self.isSubmitting=false;self.currentState=null;if(self.options.resetAfterSubmit)self.cleanForm();$feedbackLabel.hide();const success=self.options.onSubmitSuccess(response,dataToSend,self);if(success){self.dialog.modal("hide")}$(self.element).off("submit",self.submitHandler);self.delegateSubmit()}).fail(function(jqxhr,textStatus,errorThrown){self.isSubmitting=false;const response=jqxhr.responseJSON;if(response.rc!==undefined&&response.rc<0){$feedbackLabel.html(i18n.rest[response.rc_str]).show()}self.options.onSubmitError(response,dataToSend,textStatus,errorThrown)}).always(function(d){submitButton.removeAttr("disabled")})}else{self.currentState=null;$feedbackLabel.hide();const success=self.options.onSubmitSuccess({},dataToSend,self);if(success){self.dialog.modal("hide")}$(self.element).off("submit",self.submitHandler);self.delegateSubmit();submitButton.removeAttr("disabled")}}delegateResetButton(){const self=this;const resetButton=$(this.element).find(`[type='reset']`);if(resetButton.length==0)return;const defaultValues=NtopUtils.serializeFormArray($(this.element).serializeArray());resetButton.click(function(e){e.preventDefault();$(self.element).find("input:visible,select").each(function(i,input){const key=$(input).attr("name");$(input).val(defaultValues[key]).removeClass("is-invalid").removeClass("is-valid")})})}}$.fn.modalHandler=function(args){if(this.length!=1)throw new Error("Only a form element can by initialized!");const options=$.extend({csrf:"",endpoint:"",resetAfterSubmit:true,dontDisableSubmit:false,isSyncRequest:false,method:"get",loadFormData:function(){},onModalInit:function(loadedData){},onModalShow:function(){},beforeSumbit:function(){return{}},onSubmitSuccess:function(response){},onSubmitError:function(sent,textStatus,errorThrown){},onModalReset:function(defaultData){}},args);const mh=new ModalHandler(this,options);mh.delegateSubmit();return mh}})(jQuery);function datatableRemoveEmptyRow(table){$("tbody tr.emptyRow",$(table)).remove()}function datatableAddEmptyRow(table,empty_str){var columns=$("thead th",$(table)).filter(function(){return $(this).css("display")!="none"}).length;$("tbody",$(table)).html('<tr class="emptyRow"><td colspan="'+columns+'"><i>'+empty_str+"</i></td></tr>")}function datatableGetNumDisplayedItems(table){return $("tr:not(.emptyRow)",$(table)).length-1}function datatableIsEmpty(table){return datatableGetNumDisplayedItems(table)==0}function datatableGetByForm(form){return $("table",$("#dt-top-details",$(form)).parent())}function datatableUndoAddRow(new_row,empty_str,bt_to_enable,callback_str){if(bt_to_enable)$(bt_to_enable).removeAttr("disabled").removeClass("disabled");var form=$(new_row).closest("form");$(new_row).remove();aysUpdateForm(form);var dt=datatableGetByForm(form);if(datatableIsEmpty(dt))datatableAddEmptyRow(dt,empty_str);if(callback_str)window[callback_str](new_row)}function datatableForEachRow(table,callbacks){$("tr:not(:first)",table).each(function(row_i){if(typeof callbacks==="function"){callbacks.bind(this)(row_i)}else{var i;for(i=0;i<callbacks.length;i++)callbacks[i].bind(this)(row_i)}})}function datatableAddButtonCallback(td_idx,label,bs_class,callback_str,link,visible=true,title=""){if($("td:nth-child("+td_idx+")",$(this)).find("div.d-flex").length==0){$("td:nth-child("+td_idx+")",$(this)).empty();$("td:nth-child("+td_idx+")",$(this)).append($("<div class='d-flex justify-content-center'></div>"))}$("td:nth-child("+td_idx+")",$(this)).find(".d-flex").append('<a href="'+link+`" title='${title}' data-placement="bottom" class="btn btn-sm mx-1 ${bs_class} ${!visible?"disabled":""}" onclick="`+callback_str+'" role="button">'+label+"</a>")}function datatableAddDeleteButtonCallback(td_idx,callback_str,label){datatableAddButtonCallback.bind(this)(td_idx,label,"btn-danger",callback_str,"javascript:void(0)",true,"Delete")}function datatableAddActionButtonCallback(td_idx,callback_str,label,visible=true,title=""){datatableAddButtonCallback.bind(this)(td_idx,label,"btn-info",callback_str,"javascript:void(0)",visible,title)}function datatableAddFilterButtonCallback(td_idx,callback_str,label,title="",visible=true){datatableAddButtonCallback.bind(this)(td_idx,label,"btn-warning",callback_str,"javascript:void(0)",visible,title)}function datatableAddLinkButtonCallback(td_idx,link,label,title=""){datatableAddButtonCallback.bind(this)(td_idx,label,"btn-info","",link,true,title)}function datatableMakeSelectUnique(tr_obj,added_rows_prefix,options){options=NtopUtils.paramsExtend({on_change:$.noop,selector_fn:function(obj){return obj.find("select").first()}},options);function datatableForeachSelectOtherThan(this_select,added_rows_prefix,selector_fn,callback){$("[id^="+added_rows_prefix+"]").each(function(){var other=selector_fn($(this));if(other[0]!=this_select[0])callback(other)})}function datatableOptionChangeStatus(option_obj,enable){if(enable){option_obj.removeAttr("disabled")}else{var select_obj=option_obj.closest("select");var should_reset=select_obj.val()==option_obj.val();option_obj.attr("disabled","disabled");if(should_reset){var new_val=select_obj.find("option:not([disabled])").first().val();select_obj.val(new_val);select_obj.attr("data-old-val",new_val)}}}function datatableOnSelectEntryChange(added_rows_prefix,selector_fn,change_callback){var old_value=$(this).attr("data-old-val")||"";var new_value=$(this).val()||"";var others=[];if(old_value==new_value)old_value="";datatableForeachSelectOtherThan($(this),added_rows_prefix,selector_fn,function(other){datatableOptionChangeStatus(other.find("option[value='"+old_value+"']"),true);datatableOptionChangeStatus(other.find("option[value='"+new_value+"']"),false);others.push(other)});change_callback($(this),old_value,new_value,others,datatableOptionChangeStatus);$(this).attr("data-old-val",new_value)}function datatableOnAddSelectEntry(select_obj,added_rows_prefix,selector_fn){select_obj.val("");datatableForeachSelectOtherThan(select_obj,added_rows_prefix,selector_fn,function(other){other.trigger("change")});var new_sel=select_obj.find("option:not([disabled])").first();var new_val=new_sel.val();select_obj.val(new_val);select_obj.trigger("change")}var select=options.selector_fn(tr_obj);select.on("change",function(){datatableOnSelectEntryChange.bind(this)(added_rows_prefix,options.selector_fn,options.on_change)});select.on("remove",function(){$(this).val("").trigger("change")});datatableOnAddSelectEntry(select,added_rows_prefix,options.selector_fn)}function datatableOrderedInsert(table,td_idx,to_insert,to_insert_val,cmp_fn){var cmp_fn=cmp_fn||function(a,b){return b-a};var inserted=false;datatableForEachRow(table,function(){if(inserted)return;var tr=$(this);var cmp_val=parseInt($("td:nth-child("+td_idx+")",tr).html());if(!isNaN(cmp_val)&&cmp_fn(cmp_val,to_insert_val)<0){tr.before(to_insert);inserted=true}});if(!inserted)$(table).append(to_insert)}function datatableIsLastPage(table){var lastpage=$("#dt-bottom-details .pagination li:nth-last-child(3)",$(table));return!(lastpage.length==1&&lastpage.hasClass("active")==false)}function datatableGetColumn(table,id_key,id_value){var res=table.data("datatable").resultset.data.filter(function(item){return item[id_key]===id_value});if(res)return res[0]}function datatableGetColumnIndex(table,column_key){var index=table.data("datatable").options.columns.findIndex(function(item){return item.field===column_key});return index}function datatableInitRefreshRows(table,column_id,refresh_interval,trend_columns){var $dt=table.data("datatable");var rows=$dt.resultset.data;var old_timer=table.data("dt-rr-timer");var old_req=table.data("dt-rr-ajax");trend_columns=trend_columns||{};if(old_timer){clearInterval(old_timer);table.removeData("dt-rr-timer")}if(old_req){old_req.abort();table.removeData("dt-rr-ajax")}var ids=[];var id_to_row={};for(var row in rows){var data=rows[row];if(data[column_id]){var data_id=data[column_id];id_to_row[data_id]=row;ids.push(data_id)}}if(!ids)return false;var params={custom_hosts:ids.join(",")};var url=$dt.options.url;var first_load=true;var _process_result=function(result){if(typeof result==="string")result=JSON.parse(result);if(!result){console.error("Bad JSON result");return}for(var row in result.data){var data=result.data[row];var data_id=data[column_id];if(data_id&&id_to_row[data_id]){var row_idx=id_to_row[data_id];var row_html=$dt.rows[row_idx];var row_tds=$("td",row_html);for(var key in data){var col_idx=datatableGetColumnIndex(table,key);var cell=row_tds[col_idx];var $cell=$(cell);var old_val=$cell.data("dt-rr-cur-val")||$(cell).html();var trend_value_formatter=trend_columns[key];var new_val=data[key];var arrows="";if(trend_value_formatter){if(parseFloat(new_val)!=new_val)console.warn("Invalid number: "+new_val);if(!first_load)arrows=" "+NtopUtils.drawTrend(parseFloat(new_val),parseFloat(old_val));$cell.data("dt-rr-cur-val",new_val);new_val=trend_value_formatter(new_val)}$(cell).html(new_val!=0?new_val+arrows:"")}}}first_load=false;table.removeData("dt-rr-ajax")};table.data("dt-rr-timer",setInterval(function(){var old_req=table.data("dt-rr-ajax");if(old_req)return;table.data("dt-rr-ajax",$.ajax({type:"GET",url:url,data:params,cache:false,success:_process_result}))},refresh_interval));_process_result($dt.resultset)}jQuery.fn.dataTableExt.sErrMode="console";jQuery.fn.dataTableExt.formatSecondsToHHMMSS=((data,type,row)=>{if(isNaN(data))return data;if(type=="display"&&data<=0)return" ";if(type=="display")return NtopUtils.secondsToTime(data);return data});jQuery.fn.dataTableExt.absoluteFormatSecondsToHHMMSS=((data,type,row)=>{if(isNaN(data))return data;if(type=="display"&&data<=0)return" ";const delta=Math.floor(Date.now()/1e3)-data;if(type=="display")return NtopUtils.secondsToTime(delta);return data});jQuery.fn.dataTableExt.sortBytes=((byte,type,row)=>{if(type=="display")return NtopUtils.bytesToSize(byte);return byte});jQuery.fn.dataTableExt.hideIfZero=((value,type,row)=>{if(type==="display"&&parseInt(value)===0)return"";return value});jQuery.fn.dataTableExt.showProgress=((percentage,type,row)=>{if(type==="display"){const fixed=percentage.toFixed(1);return`\n <div class="d-flex align-items-center">\n <span class="progress w-100">\n <span class="progress-bar bg-warning" role="progressbar" style="width: ${fixed}%" aria-valuenow="${fixed}" aria-valuemin="0" aria-valuemax="100"></span>\n </span>\n <span>${fixed}%</span>\n </div>\n `}return percentage});$.fn.dataTable.Api.registerPlural("columns().names()","column().name()",function(setter){return this.iterator("column",function(settings,column){var col=settings.aoColumns[column];if(setter!==undefined){col.sName=setter;return this}else{return col.sName}},1)});class DataTableFiltersMenu{constructor({tableAPI:tableAPI,filterMenuKey:filterMenuKey,filterTitle:filterTitle,filters:filters,columnIndex:columnIndex}){this.rawFilters=filters;this.tableAPI=tableAPI;this.filterTitle=filterTitle;this.filterMenuKey=filterMenuKey;this.columnIndex=columnIndex;this.preventUpdate=false;this.currentFilterSelected=undefined;this.$datatableWrapper=$(tableAPI.context[0].nTableWrapper)}get selectedFilter(){return this.currentFilterSelected}init(){const self=this;this.$datatableWrapper.on("init.dt",function(){self._render(self.rawFilters)});this.tableAPI.on("draw",function(){self._update()});return self}_countEntries(regex,data=[]){if(regex===undefined){console.error("DataTableFiltersMenu::_countEntries() => the passed regex is undefined!")}const reg=new RegExp(regex);return data.filter(cellValue=>reg.test(cellValue)).length}_createMenuEntry(filter){const self=this;const $entry=$(`<li class='dropdown-item pointer'>${filter.label} </li>`);if(filter.countable===undefined||filter.countable){const data=this.tableAPI.columns(this.columnIndex).data()[0];const count=this._countEntries(filter.regex,data);const $counter=$(`<span class='counter'>(${count})</span>`);if(count==0)$entry.hide();$entry.append($counter)}$entry.click(function(e){self.preventUpdate=true;if(self.$dropdown.title.parent().find(`i.fas`).length==0){self.$dropdown.title.parent().prepend(`<i class='fas fa-filter'></i>`)}const newContent=$entry.html();self.$dropdown.title.html(newContent);self.$dropdown.container.find("li").removeClass(`active`);$entry.addClass(`active`);if(filter.callback)filter.callback();self.tableAPI.column(self.columnIndex).search(filter.regex,true,false).draw();self.currentFilterSelected=filter});return $entry}_createFilters(filters){const filtersCreated={};for(const filter of filters){const $filter=this._createMenuEntry(filter);filtersCreated[filter.key]={filter:filter,$node:$filter}}return filtersCreated}_render(filters){const $dropdownContainer=$(`<div id='${this.filterMenuKey}-filters' class='dropdown d-inline'></div>`);const $dropdownButton=$(`<button class='btn-link btn dropdown-toggle' data-bs-toggle="dropdown" type='button'></button>`);const $dropdownTitle=$(`<span class='filter-title'>${this.filterTitle}</span>`);$dropdownButton.append($dropdownTitle);this.filters=this._createFilters(filters);this.$dropdown={container:$dropdownContainer,title:$dropdownTitle,button:$dropdownButton};const $menuContainer=$(`<ul class='dropdown-menu dropdown-menu-lg-end scrollable-dropdown' id='${this.filterMenuKey}-filter-menu'></ul>`);for(const[_,filter]of Object.entries(this.filters)){$menuContainer.append(filter.$node)}const allFilter=this._generateAllFilter();$menuContainer.prepend(this._createMenuEntry(allFilter));$dropdownContainer.append($dropdownButton);$dropdownContainer.append($menuContainer);$dropdownContainer.insertBefore(this.$datatableWrapper.find(".dataTables_filter").parent());this._selectFilterFromState(this.filterMenuKey)}_selectFilterFromState(filterKey){if(!this.tableAPI.state)return;if(!this.tableAPI.state.loaded())return;if(!this.tableAPI.state.loaded().filters)return;tableAPI.state.save()}_generateAllFilter(){return{key:"all",label:i18n.all,regex:"",countable:false,callback:()=>{this.$dropdown.title.parent().find("i.fas.fa-filter").remove();this.$dropdown.title.html(`${this.filterTitle}`)}}}_update(){if(this.filters===undefined)return;if(this.preventUpdate){this.preventUpdate=false;return}for(const[_,filter]of Object.entries(this.filters)){if(filter.countable==false)continue;const data=this.tableAPI.columns(this.columnIndex).data()[0];const count=this._countEntries(filter.filter.regex,data);count==0?filter.$node.hide():filter.$node.show();filter.$node.find(".counter").text(`(${count})`);this.$dropdown.button.find(".counter").text(`(${count})`)}}}class DataTableRangeFiltersMenu extends DataTableFiltersMenu{constructor(params){super(params);const self=this;this.selectedMin=Number.MIN_VALUE;this.selectedMax=Number.MAX_VALUE;$.fn.dataTable.ext.search.push(function(settings,data,dataIndex){const min=self.selectedMin||Number.MIN_VALUE;const max=self.selectedMax||Number.MAX_VALUE;const currentValue=parseFloat(data[params.columnIndex])||0;return isNaN(min)&&isNaN(max)||isNaN(min)&&currentValue<=max||min<=currentValue&&isNaN(max)||min<=currentValue&&currentValue<=max});this.tableAPI.draw();params.rawFilters=params.filters.map(filter=>{filter.regex="";filter.min=filter.min||Number.MIN_VALUE;filter.max=filter.max||Number.MAX_VALUE;filter.countable=false;filter.callback=(()=>{self.selectedMax=filter.max;self.selectedMin=filter.min;self.tableAPI.draw()});return filter})}_generateAllFilter(){const all=super._generateAllFilter();const oldCallback=all.callback;all.callback=(()=>{oldCallback();this.selectedMin=Number.MIN_VALUE;this.selectedMax=Number.MAX_VALUE;this.tableAPI.draw()});return all}}class DataTableUtils{static getStdDatatableConfig(dtButtons=[],dom="<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6 text-end'<'dt-search'f>B>rtip>"){if(dtButtons.length==0){dom="fBrtip"}return{dom:dom,pagingType:"full_numbers",lengthMenu:[[10,25,50,-1],[10,25,50,`${i18n.all}`]],language:{info:i18n.showing_x_to_y_rows,search:i18n.script_search,infoFiltered:"",paginate:{previous:"&lt;",next:"&gt;",first:"«",last:"»"}},saveState:true,responsive:true,buttons:{buttons:dtButtons,dom:{button:{className:"btn btn-link"},container:{className:"d-inline-block"}}}}}static createActionButtons(actions=[]){const buttons=[];actions.forEach(action=>{let button=`\n <a\n ${action.href||action.modal?`href='${action.href||action.modal}'`:``}\n ${action.onclick?`onclick='${action.onclick}'`:``}\n data-placement='bottom'\n ${action.modal?"data-bs-toggle='modal'":``}\n class='btn btn-sm ${action.class}'\n ${action.hidden?"style='display: none'":``}\n ${action.external?"target='_about'":``}\n ${action.title?`title='${action.title}'`:``}\n >\n <i class='fas ${action.icon}'></i>\n </a>\n `;buttons.push(button)});return`<div class='actions-group' role='group'>${buttons.join("")}</div>`}static setAjaxConfig(config,url,dataSrc="",method="get",params={}){config.ajax={url:url,type:method,dataSrc:dataSrc,data:function(d){return $.extend({},d,params)}};return config}static extendConfig(config,extension){if(extension.hasFilters){extension.stateSaveCallback=function(settings,data){localStorage.setItem("DataTables_"+settings.sInstance,JSON.stringify(data))};extension.stateLoadCallback=function(settings){return JSON.parse(localStorage.getItem("DataTables_"+settings.sInstance))};extension.stateSaveParams=function(settings,data){$("[data-filter]").each(function(){const activeFilter=$(this).find(`li.active`).data("filter-key");if(!activeFilter)return;if(!data.filters)data.filters={};data.filters[$(this).data("filter")]=activeFilter})}}return $.extend({},config,extension)}static secondsToHHMMSS(seconds){const padZeroes=n=>`${n}`.padStart(2,"0");const sec=seconds%60;const mins=Math.floor(seconds/60)%60;const hours=Math.floor(seconds/3600);return`${padZeroes(hours)}:${padZeroes(mins)}:${padZeroes(sec)}`}static openEditModalByQuery(params){const urlParams=new URLSearchParams(window.location.search);if(!urlParams.has(params.paramName))return;const dataID=urlParams.get(params.paramName);const data=params.datatableInstance.data().toArray().find(data=>data[params.paramName]==dataID);if(typeof params.cancelIf==="function"){if(params.cancelIf(data))return}const $modal=$(`#${params.modalHandler.getModalID()}`);if(data!==undefined){params.modalHandler.invokeModalInit(data);$modal.modal("show")}if(!urlParams.has("referer")){$modal.on("hidden.bs.modal",function(e){const url=new URL(window.location.href);url.searchParams.delete(params.paramName);history.replaceState({},"",url.toString())});return}const referer=urlParams.get("referer");$modal.on("hidden.bs.modal",function(e){window.location=referer})}static addToggleColumnsDropdown(tableAPI,toggleCallback=((col,visible)=>{})){if(tableAPI===undefined){throw"The $table is undefined!"}const tableID=tableAPI.table().node().id;DataTableUtils._loadColumnsVisibility(tableAPI).then(function(fetchedData){let savedColumns=[-1];if(fetchedData.success){savedColumns=fetchedData.columns.map(i=>parseInt(i))}else{console.warn(fetchedData.message)}const columns=[];const ignoredColumns=[];const $datatableWrapper=$(tableAPI.context[0].nTableWrapper);tableAPI.columns().every(function(i){if(!tableAPI.column(i).visible()){ignoredColumns.push(i);return}columns.push({index:i,name:this.header().textContent})});const $btnGroup=$(`\n <div class="btn-group">\n <button type="button" class="btn btn-link dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">\n <i class="fas fa-eye"></i>\n </button>\n </div>\n `);const $dropdownMenu=$(`<div class="dropdown-menu dropdown-menu-right" style='width: max-content;'><h6 class="dropdown-header">Show Columns</h6></div>`);const $checkboxes=$(`<div class='px-4'></div>`);for(let i=0;i<columns.length;i++){const column=columns[i];const id=`toggle-${column.name.split().join("_")}`;const toggled=savedColumns.indexOf(column.index)===-1;if(!toggled){const col=tableAPI.column(column.index);col.visible(false)}const $checkbox=$(`<input class="form-check-input" ${toggled?"checked":""} type="checkbox" id="${id}">`);const $wrapper=$(`\n <div class="form-check form-switch">\n <label class="form-check-label" for="${id}">\n ${column.name}\n </label>\n </div>\n `);$checkbox.on("change",function(e){const col=tableAPI.column(column.index);col.visible(!col.visible());const visible=col.visible();const hiddenColumns=[];tableAPI.columns().every(function(i){if(tableAPI.column(i).visible()||ignoredColumns.indexOf(i)!==-1)return;hiddenColumns.push(i)});$.post(`${http_prefix}/lua/datatable_columns.lua`,{action:"save",table:tableID,columns:hiddenColumns.join(","),csrf:window.__CSRF_DATATABLE__}).then(function(data){if(data.success)return;console.warn(data.message)});if(toggleCallback!==undefined){toggleCallback(col,visible)}});$wrapper.prepend($checkbox);$checkboxes.append($wrapper)}$dropdownMenu.on("click.bs.dropdown",function(e){e.stopPropagation()});$btnGroup.append($dropdownMenu.append($checkboxes));$datatableWrapper.find(".dt-search").parent().append($btnGroup)})}static async _loadColumnsVisibility(tableAPI){const tableID=tableAPI.table().node().id;return $.get(`${http_prefix}/lua/datatable_columns.lua?table=${tableID}&action=load`)}}class DataTableRenders{static alertSeverityAndType(severity,type,alert){return`${DataTableRenders.formatValueLabel(severity,type,alert)} ${DataTableRenders.formatValueLabel(alert.alert_id,type,alert)}`}static hideIfZero(obj,type,row){let color=obj.color!==undefined?obj.color:"#aaa";let value=obj.value!==undefined?obj.value:obj;if(type==="display"&&parseInt(value)===0)color="#aaa";let span=`<span style='color: ${color}'>${NtopUtils.fint(value)}</span>`;if(obj.url!==undefined)span=`<a href="${obj.url}">${span}</a>`;return span}static secondsToTime(seconds,type,row){if(type==="display")return NtopUtils.secondsToTime(seconds);return seconds}static filterize(key,value,label,tag_label){return`<a class='tag-filter' data-tag-key='${key}' data-tag-value='${value}' data-tag-label='${tag_label||label||value}' href='#'>${label||value}</a>`}static formatValueLabel(obj,type,row){if(type!=="display")return obj.value;let cell=obj.label;if(obj.color)cell=`<span class='font-weight-bold' style='color: ${obj.color}'>${cell}</span>`;return cell}static formatSubtype(obj,type,row){if(type!=="display")return obj;let label=DataTableRenders.filterize("subtype",obj,obj);return label}static formatHost(obj,type,row){if(type!=="display")return obj;let html_ref="";if(obj.reference!==undefined)html_ref=obj.reference;let label=obj.shown_label||obj.label;label=DataTableRenders.filterize("ip",obj.value,label);if(row.role&&row.role.value=="attacker")label=label+" "+DataTableRenders.filterize("role",row.role.value,'<i class="fas fa-skull" title="'+row.role.label+'"></i>',row.role.label);else if(row.role&&row.role.value=="victim")label=label+" "+DataTableRenders.filterize("role",row.role.value,'<i class="fas fa-sad-tear" title="'+row.role.label+'"></i>',row.role.label);if(row.role_cli_srv&&row.role_cli_srv.value=="client")label=label+" "+DataTableRenders.filterize("role_cli_srv",row.role_cli_srv.value,'<i class="fas fa-long-arrow-alt-right" title="'+row.role_cli_srv.label+'"></i>',row.role_cli_srv.label);else if(row.role_cli_srv&&row.role_cli_srv.value=="server")label=label+" "+DataTableRenders.filterize("role_cli_srv",row.role_cli_srv.value,'<i class="fas fa-long-arrow-alt-left" title="'+row.role_cli_srv.label+'"></i>',row.role_cli_srv.label);return label+" "+html_ref}static formatFlowTuple(flow,type,row){let active_ref=flow.active_url?`<a href="${flow.active_url}"><i class="fas fa-stream"></i></a>`:"";let historical_ref=flow.historical_url?`<a href="${flow.historical_url}"><i class="fas fa-search-plus"></i></a>`:"";let cliLabel=DataTableRenders.filterize("cli_ip",flow.cli_ip.value,flow.cli_ip.label);let cliPortLabel=flow.cli_port&&flow.cli_port>0?":"+DataTableRenders.filterize("cli_port",flow.cli_port,flow.cli_port):"";let srvLabel=DataTableRenders.filterize("srv_ip",flow.srv_ip.value,flow.srv_ip.label);let srvPortLabel=flow.cli_port&&flow.cli_port>0?":"+DataTableRenders.filterize("srv_port",flow.srv_port,flow.srv_port):"";let cliIcons="";let srvIcons="";if(row.cli_role){if(row.cli_role.value=="attacker")cliIcons+=DataTableRenders.filterize("role","attacker",'<i class="fas fa-skull" title="'+row.cli_role.label+'"></i>',row.cli_role.tag_label);else if(row.cli_role.value=="victim")cliIcons+=DataTableRenders.filterize("role","victim",'<i class="fas fa-sad-tear" title="'+row.cli_role.label+'"></i>',row.cli_role.tag_label)}if(row.srv_role){if(row.srv_role.value=="attacker")srvIcons+=DataTableRenders.filterize("role","attacker",'<i class="fas fa-skull" title="'+row.srv_role.label+'"></i>',row.srv_role.tag_label);else if(row.srv_role.value=="victim")srvIcons+=DataTableRenders.filterize("role","victim",'<i class="fas fa-sad-tear" title="'+row.srv_role.label+'"></i>',row.srv_role.tag_label)}return`${active_ref} ${historical_ref} ${cliLabel}${cliPortLabel} ${cliIcons} ${flow.cli_ip.reference} <i class="fas fa-exchange-alt fa-lg" aria-hidden="true"></i> ${srvLabel}${srvPortLabel} ${srvIcons} ${flow.srv_ip.reference}`}static formatNameDescription(obj,type,row){if(type!=="display")return obj.name;let msg=DataTableRenders.filterize("alert_id",obj.value,obj.name);return msg}static applyCellStyle(cell,cellData,rowData,rowIndex,colIndex){if(cellData.highlight){$(cell).css("border-left","5px solid "+cellData.highlight)}}}const globalToasts={};class Toast{constructor({title:title,body:body,link:link,delay:delay=0,id:id,style:style}={}){this.title=title;this.body=body;this.link=link;this.delay=delay;this.id=id;this.style=style}render(){const self=this;const $toast=$(`<div class="toast notification" role="alert"></div>`);if(this.delay!==0){$toast.data("autohide",true);$toast.data("delay",this.delay)}else{$toast.data("autohide",false)}$toast.data("notification-id",this.id);const $toastHeader=$(`<div class="toast-header bg-${this.style.bg} border-${this.style.bg} ${this.style.text}">\n <strong class='mr-auto'><i class='fas ${this.style.icon}'></i> ${this.title}</strong>\n </div>`);const $toastBody=$(`<div class="toast-body">${this.body}</div>`);if(this.action&&this.action.link!=undefined&&this.action.link!=""){const $anchor=$(`<a href='${this.action.link}'>${this.action.label}</a>`);$toastBody.append($anchor)}if(this.dismissable){$toastHeader.append(`\n <button type="button" class="ml-2 mb-1 close" data-bs-dismiss="toast" aria-label="Close">\n <span aria-hidden="true">&times;</span>\n </button>\n `)}if(this.isAboveAll){$toast.css("z-index","9999")}$toast.append($toastHeader,$toastBody);$toast.toast("show");$toast.on("hidden.bs.toast",function(){ToastUtils.hideToast(self.id)});this.$element=$toast;return $toast}updateBody(body){if(this.$element==undefined)throw"The notification has not been rendered yet!";this.$element.find(".toast-body span").text(body)}destroy(){this.$element.toast("dispose");this.$element.empty()}}class ToastUtils{static initToasts(){$(`.toast.notification`).each(function(){$(this).toast("show")})}static hideToast(toastId){if(!toastId){console.warn("The toast id cannot be null!");return}if(!(toastId in globalToasts)){console.warn("The toast hasn't been found!");return}globalToasts[toastId].destroy();delete globalToasts[toastId]}static updateToast(toastId,body){if(!(toastId in globalToasts)){throw"The toast was not found!"}globalToasts[toastId].updateBody(body)}static showToast(option){const styles={warning:{bg:"warning",text:"text-dark",icon:"fa-exclamation-circle"},info:{bg:"info",text:"text-white",icon:"fa-info-circle"},success:{bg:"success",text:"text-white",icon:"fa-check-circle"},error:{bg:"danger",text:"text-white",icon:"fa-times-circle"}};option.style=styles[option.level]||styles.warning;if(option.id===undefined)throw"A toast must have an in id!";if(option.id in globalToasts)return;if(option.title===undefined)throw"A toast must have a title!";if(option.body===undefined)throw"A toast must have a body!";const toast=new Toast(option);$(`#main-container`).prepend(toast.render());globalToasts[option.id]=toast;return toast}static dismissToast(id,csrf,success,failure){if(id==undefined){console.warn("A Toast ID must be defined to dismiss a toast!");return}const empty=()=>{};const request=$.post(`${http_prefix}/lua/dismiss_toast.lua`,{toast_id:id,csrf:csrf});request.done(success||empty);request.fail(failure||empty)}}
//# sourceMappingURL=ntop.min.js.map