diff --git a/httpdocs/js/graph_utils.js b/httpdocs/js/graph_utils.js index b675176890..35b82ece5a 100644 --- a/httpdocs/js/graph_utils.js +++ b/httpdocs/js/graph_utils.js @@ -275,7 +275,7 @@ function attachStackedChartCallback(chart, schema_name, chart_id, zoom_out_id, f var chart_colors_min = [ "#69B87F", - "#B3DEB6", + "#C1E3C4", "#E5F1A6", ]; diff --git a/httpdocs/js/ntop.min.js b/httpdocs/js/ntop.min.js index 6c2c851f33..b26b6085d0 100644 --- a/httpdocs/js/ntop.min.js +++ b/httpdocs/js/ntop.min.js @@ -1,2 +1,2 @@ -(function(){"use strict";var root=this;var Springy;if(typeof exports!=="undefined"){Springy=exports}else{Springy=root.Springy={}}var Graph=Springy.Graph=function(){this.nodeSet={};this.nodes=[];this.edges=[];this.adjacency={};this.nextNodeId=0;this.nextEdgeId=0;this.eventListeners=[]};var Node=Springy.Node=function(id,data){this.id=id;this.data=data!==undefined?data:{}};var Edge=Springy.Edge=function(id,source,target,data){this.id=id;this.source=source;this.target=target;this.data=data!==undefined?data:{}};Graph.prototype.addNode=function(node){if(!(node.id in this.nodeSet)){this.nodes.push(node)}this.nodeSet[node.id]=node;this.notify();return node};Graph.prototype.addNodes=function(){for(var i=0;i=0;i--){if(this.nodes[i].id===node.id){this.nodes.splice(i,1)}}this.detachNode(node)};Graph.prototype.detachNode=function(node){var tmpEdges=this.edges.slice();tmpEdges.forEach(function(e){if(e.source.id===node.id||e.target.id===node.id){this.removeEdge(e)}},this);this.notify()};Graph.prototype.removeEdge=function(edge){for(var i=this.edges.length-1;i>=0;i--){if(this.edges[i].id===edge.id){this.edges.splice(i,1)}}for(var x in this.adjacency){for(var y in this.adjacency[x]){var edges=this.adjacency[x][y];for(var j=edges.length-1;j>=0;j--){if(this.adjacency[x][y][j].id===edge.id){this.adjacency[x][y].splice(j,1)}}if(this.adjacency[x][y].length==0){delete this.adjacency[x][y]}}if(isEmpty(this.adjacency[x])){delete this.adjacency[x]}}this.notify()};Graph.prototype.merge=function(data){var nodes=[];data.nodes.forEach(function(n){nodes.push(this.addNode(new Node(n.id,n.data)))},this);data.edges.forEach(function(e){var from=nodes[e.from];var to=nodes[e.to];var id=e.directed?id=e.type+"-"+from.id+"-"+to.id:from.idtopright.x){topright.x=point.p.x}if(point.p.y>topright.y){topright.y=point.p.y}});var padding=topright.subtract(bottomleft).multiply(.07);return{bottomleft:bottomleft.subtract(padding),topright:topright.add(padding)}};var Vector=Springy.Vector=function(x,y){this.x=x;this.y=y};Vector.random=function(){return new Vector(10*(Math.random()-.5),10*(Math.random()-.5))};Vector.prototype.add=function(v2){return new Vector(this.x+v2.x,this.y+v2.y)};Vector.prototype.subtract=function(v2){return new Vector(this.x-v2.x,this.y-v2.y)};Vector.prototype.multiply=function(n){return new Vector(this.x*n,this.y*n)};Vector.prototype.divide=function(n){return new Vector(this.x/n||0,this.y/n||0)};Vector.prototype.magnitude=function(){return Math.sqrt(this.x*this.x+this.y*this.y)};Vector.prototype.normal=function(){return new Vector(-this.y,this.x)};Vector.prototype.normalise=function(){return this.divide(this.magnitude())};Layout.ForceDirected.Point=function(position,mass){this.p=position;this.m=mass;this.v=new Vector(0,0);this.a=new Vector(0,0)};Layout.ForceDirected.Point.prototype.applyForce=function(force){this.a=this.a.add(force.divide(this.m))};Layout.ForceDirected.Spring=function(point1,point2,length,k){this.point1=point1;this.point2=point2;this.length=length;this.k=k};var Renderer=Springy.Renderer=function(layout,clear,drawEdge,drawNode,onRenderStop,onRenderStart){this.layout=layout;this.clear=clear;this.drawEdge=drawEdge;this.drawNode=drawNode;this.onRenderStop=onRenderStop;this.onRenderStart=onRenderStart;this.layout.graph.addGraphListener(this)};Renderer.prototype.graphChanged=function(e){this.start()};Renderer.prototype.start=function(done){var t=this;this.layout.start(function render(){t.clear();t.layout.eachEdge(function(edge,spring){t.drawEdge(edge,spring.point1.p,spring.point2.p)});t.layout.eachNode(function(node,point){t.drawNode(node,point.p)})},this.onRenderStart,this.onRenderStop)};Renderer.prototype.stop=function(){this.layout.stop()};if(!Array.prototype.forEach){Array.prototype.forEach=function(callback,thisArg){var T,k;if(this==null){throw new TypeError(" this is null or not defined")}var O=Object(this);var len=O.length>>>0;if({}.toString.call(callback)!="[object Function]"){throw new TypeError(callback+" is not a function")}if(thisArg){T=thisArg}k=0;while(kMath.PI/2||angle<-Math.PI/2)){displacement=8;angle+=Math.PI}var textPos=s1.add(s2).divide(2).add(normal.multiply(displacement));ctx.translate(textPos.x,textPos.y);ctx.rotate(angle);ctx.fillText(text,0,-2);ctx.restore()}},function drawNode(node,p){var s=toScreen(p);ctx.save();var paddingX=6;var paddingY=6;var contentWidth=node.getWidth();var contentHeight=node.getHeight();var boxWidth=contentWidth+paddingX;var boxHeight=contentHeight+paddingY;ctx.clearRect(s.x-boxWidth/2,s.y-boxHeight/2,boxWidth,boxHeight);if(selected!==null&&selected.node!==null&&selected.node.id===node.id){ctx.fillStyle="#FFFFE0"}else if(nearest!==null&&nearest.node!==null&&nearest.node.id===node.id){ctx.fillStyle="#EEEEEE"}else{ctx.fillStyle="#FFFFFF"}ctx.fillRect(s.x-boxWidth/2,s.y-boxHeight/2,boxWidth,boxHeight);if(node.data.image==undefined){ctx.textAlign="left";ctx.textBaseline="top";ctx.font=node.data.font!==undefined?node.data.font:nodeFont;ctx.fillStyle="#000000";var text=node.data.label!==undefined?node.data.label:node.id;ctx.fillText(text,s.x-contentWidth/2,s.y-contentHeight/2);if(node.data.ip!==undefined){ctx.textBaseline="top";ctx.textAlign="center";ctx.font="8px Verdana, sans-serif";ctx.fillStyle="#000000";ctx.fillText(node.data.ip,s.x,s.y+contentHeight/2)}}else{var src=node.data.image.src;if(src in nodeImages){if(nodeImages[src].loaded){ctx.drawImage(nodeImages[src].object,s.x-contentWidth/2,s.y-contentHeight/2,contentWidth,contentHeight);if(node.data.ip!==undefined){ctx.textBaseline="top";ctx.textAlign="center";ctx.font="8px Verdana, sans-serif";ctx.fillStyle="#000000";ctx.fillText(node.data.ip,s.x,s.y+contentHeight/2)}}}else{nodeImages[src]={};var img=new Image;nodeImages[src].object=img;img.addEventListener("load",function(){nodeImages[src].loaded=true});img.src=src}}ctx.restore()});renderer.start();function intersect_line_line(p1,p2,p3,p4){var denom=(p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y);if(denom===0){return false}var ua=((p4.x-p3.x)*(p1.y-p3.y)-(p4.y-p3.y)*(p1.x-p3.x))/denom;var ub=((p2.x-p1.x)*(p1.y-p3.y)-(p2.y-p1.y)*(p1.x-p3.x))/denom;if(ua<0||ua>1||ub<0||ub>1){return false}return new Springy.Vector(p1.x+ua*(p2.x-p1.x),p1.y+ua*(p2.y-p1.y))}function intersect_line_box(p1,p2,p3,w,h){var tl={x:p3.x,y:p3.y};var tr={x:p3.x+w,y:p3.y};var bl={x:p3.x,y:p3.y+h};var br={x:p3.x+w,y:p3.y+h};var result;if(result=intersect_line_line(p1,p2,tl,tr)){return result}if(result=intersect_line_line(p1,p2,tr,br)){return result}if(result=intersect_line_line(p1,p2,br,bl)){return result}if(result=intersect_line_line(p1,p2,bl,tl)){return result}return false}return this}})();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(''+empty_str+"")}function datatableGetNumDisplayedItems(table){return $("tr:not(.emptyRow)",$(table)).length-1}function datatableIsEmpty(table){return datatableGetNumDisplayedItems(table)==0}function datatableGetTotalItems(table){if(datatableIsEmpty(table))return 0;return $("#dt-bottom-details div.pull-left",$(table)).html().match(/of (\d+) rows/)[1]}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");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'+label+"")}function datatableAddDeleteButtonCallback(td_idx,callback_str,label){datatableAddButtonCallback.bind(this)(td_idx,label,"label-danger",callback_str,"javascript:void(0)")}function datatableAddActionButtonCallback(td_idx,callback_str,label){datatableAddButtonCallback.bind(this)(td_idx,label,"label-info",callback_str,"javascript:void(0)")}function datatableAddLinkButtonCallback(td_idx,link,label){datatableAddButtonCallback.bind(this)(td_idx,label,"label-info","",link)}function datatableMakeSelectUnique(tr_obj,added_rows_prefix,options){options=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 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}function is_good_ipv4(ipv4){if(/^(?:(?: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])$/.test(ipv4)){return true}else{return false}}function is_good_ipv6(ipv6){if(/^(([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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(ipv6)){return true}else{return false}}function isNumeric(value){return/^\d+$/.test(value)}function is_mac_address(what){return/^([0-9A-Fa-f]{2}:){5}([0-9A-Fa-f]{2})$/.test(what)}function 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(!isNumeric(elems[1]))return null;mask=parseInt(elems[1]);if(mask<0)return null}if(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(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}function fbits(bits){var sizes=["bps","Kbit/s","Mbit/s","Gbit/s","Tbit/s"];if(bits<=0)return"0";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]}}function fbits_from_bytes(bytes){return fbits(bytes*8)}function fpackets(pps){var sizes=["pps","Kpps","Mpps","Gpps","Tpps"];if(pps==0)return"0";var res=scaleValue(pps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}function fflows(fps){var sizes=["fps","Kfps","Mfps","Gfps","Tfps"];if(fps==0)return"0";var res=scaleValue(fps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}function fint(value){var x=Math.round(value);return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}function fdate(when){var epoch=when*1e3;var d=new Date(epoch);return d}function capitaliseFirstLetter(string){return string.charAt(0).toUpperCase()+string.slice(1)}String.prototype.startsWith=function(string){return this.indexOf(string)===0};function get_trend(actual,before){if(before===undefined||actual==before){return''}else{return''}}function getOSIcon(name){var icon="";if(name.search("Linux")!=-1||name.search("Ubuntu")!=-1)icon=" ";else if(name.search("Android")!=-1)icon=" ";else if(name.search("Windows")!=-1||name.search("Win32")!=-1||name.search("MSIE")!=-1)icon=" ";else if(name.search("iPhone")!=-1||name.search("iPad")!=-1||name.search("OS X")!=-1)icon=" ";return icon}function abbreviateString(str,len){if(!str)return"";if(str.length=0&&bytes=kilobyte&&bytes=megabyte&&bytes=gigabyte&&bytes=terabyte)return(bytes/terabyte).toFixed(precision)+" TB";else return bytes.toFixed(precision)+" Bytes"}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(" ")};function drawTrend(current,last,withColor){if(current==last){return''}else if(current>last){return'"}else{return''}}function 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")}function disableAllDropdownsAndTabs(){$("select").each(function(){$(this).prop("disabled",true)});toggleAllTabs(false)}function enableAllDropdownsAndTabs(){$("select").each(function(){$(this).prop("disabled",false)});toggleAllTabs(true)}function capitalize(s){return s&&s[0].toUpperCase()+s.slice(1)}function 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}function scaleValue(val,sizes,scale){if(val==0)return[0,sizes[0]];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[val/Math.pow(scale,i),sizes[i]]}function formatValue(val){var sizes=["","K","M","G","T"];var res=scaleValue(val,sizes,1e3);return Math.round(res[0]*100)/100+res[1]}function formatPackets(n){return addCommas(n.toFixed(2))+" Pkts"}function formatFlows(n){return addCommas(n.toFixed(0))+" Flows"}function fmillis(value){var x=Math.round(value);var res=scaleValue(x,["ms","s"],1e3);return res[0]+" "+res[1]}function bytesToVolume(bytes){var sizes=["Bytes","KB","MB","GB","TB"];if(bytes==0)return"0 Bytes";var res=scaleValue(bytes,sizes,1024);return res[0].toFixed(2)+" "+res[1]}function 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]]}function bitsToSize(bits,factor){factor=factor||1e3;var sizes=["bit/s","kbit/s","Mbit/s","Gbit/s","Tbit/s"];if(bits==0)return"0 bps";var res=scaleValue(bits,sizes,factor);return res[0].toFixed(2)+" "+res[1]}function secondsToTime(seconds){if(seconds<1){return"< 1 sec"}var days=Math.floor(seconds/86400);var hours=Math.floor(seconds/3600-days*24);var minutes=Math.floor(seconds/60-days*1440-hours*60);var sec=seconds%60;var msg="",msg_array=[];if(days>0){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(", ")}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};function 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")+" ["+secondsToTime(tdiff)+" ago]"}function 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}function paramsExtend(defaults,override){return $.extend({},defaults,override)}function paramsToForm(form,params){form=$(form);for(var k in params){if(params.hasOwnProperty(k)){var input=$('');input.appendTo(form)}}return form}function 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}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)})}});function 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}function 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")}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}}function makeFindHostBeforeSubmitCallback(http_prefix){return function(form,data){if(data.type=="mac")form.attr("action",http_prefix+"/lua/mac_details.lua");else if(data.type=="snmp")form.attr("action",http_prefix+"/lua/pro/enterprise/snmp_device_details.lua");else form.attr("action",http_prefix+"/lua/host_details.lua");return true}}function 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}var schema_2_label={};var data_2_label={};function initLabelMaps(_schema_2_label,_data_2_label){schema_2_label=_schema_2_label;data_2_label=_data_2_label}function getSerieLabel(schema,serie){var data_label=serie.label;var new_label=data_2_label[data_label];if(schema=="top:local_senders"||schema=="top:local_receivers"){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.device&&serie.tags.if_index){if(serie.tags.if_index!=serie.ext_label)return serie.ext_label+" ("+serie.tags.if_index+")";else return serie.ext_label}else if(serie.tags.device&&serie.tags.port)return serie.tags.port;else if(serie.tags.profile)return serie.tags.profile}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}if(schema_2_label[schema])return capitaliseFirstLetter(schema_2_label[schema]);if(new_label)return capitaliseFirstLetter(new_label);return capitaliseFirstLetter(data_label)}function getValueFormatter(schema,series){if(series&&series.length&&series[0].label){var label=series[0].label;if(label.contains("bytes"))return[fbits_from_bytes,bytesToSize];else if(label.contains("packets"))return[fpackets,formatPackets];else if(label.contains("flows"))return[formatValue,formatFlows,formatFlows];else if(label.contains("millis"))return[fmillis,fmillis]}return[fint,fint]}function makeFlatLineValues(tstart,tstep,num,data){var t=tstart;var values=[];for(var i=0;icount){console.error("points mismatch: serie '"+getSerieLabel(schema_name,series[i])+"' has "+data.length+" points, expected "+count);rv=false}else if(data.length.1)return res}function buildTimeArray(start_time,end_time,step){var arr=[];for(var t=start_time;t');$chart.parent().css("position","relative");var chart_colors_full=["#69B87F","#94CFA4","#B3DEB6","#E5F1A6","#FFFCC6","#FEDEA5","#FFB97B","#FF8D6D","#E27B85"];var chart_colors_min=["#69B87F","#B3DEB6","#E5F1A6"];var update_chart_data=function(new_data){d3_sel.datum([]).call(chart);d3_sel.datum(new_data).transition().call(chart);nv.utils.windowResize(chart.update);pending_request=null;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){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]);if(chart.updateStackedChart(t_start,t_end)){chart.is_zoomed=true;zoom_stack.push(cur_zoom);$zoom_out.show()}});$zoom_out.on("click",function(){if(zoom_stack.length){var zoom=zoom_stack.pop();var t_start=zoom[0];var t_end=zoom[1];chart.updateStackedChart(t_start,t_end);if(!zoom_stack.length)$zoom_out.hide()}});var old_start,old_end;chart.updateStackedChart=function(tstart,tend,no_spinner){if(tstart)params.epoch_begin=tstart;if(tend)params.epoch_end=tend;var cur_interval=params.epoch_end-params.epoch_begin;if(cur_interval0){var scale=d3.max(total_serie)/max_val;var scaled=$.map(smoothed,function(x){return x*scale});var aligned=upsampleSerie(scaled,data.count);res.push({key:"Trend",yAxis:1,values:arrayToNvSerie(aligned,data.start,data.step),type:"line",classed:"line-animated",color:"#62ADF6",legend_key:"trend",disabled:isLegendDisabled("trend",false)})}}var formatter1=getValueFormatter(schema_name,series.filter(function(d){return d.axis!=2}));var value_formatter=formatter1[0];var tot_formatter=formatter1[1];var stats_formatter=formatter1[2]||value_formatter;chart.yAxis1.tickFormat(value_formatter);chart.yAxis1_formatter=value_formatter;var formatter2=getValueFormatter(schema_name,series.filter(function(d){return d.axis==2}));var value_formatter2=formatter2[0];chart.yAxis2.tickFormat(value_formatter2);chart.yAxis2_formatter=value_formatter2;var stats_table=$chart.closest("table").find(".graph-statistics");var stats=data.statistics;if(stats){if(stats.average){var values=makeFlatLineValues(data.start,data.step,data.count,stats.average);res.push({key:"Avg",yAxis:1,values:values,type:"line",classed:"line-dashed line-animated",color:"#AC9DDF",legend_key:"avg",disabled:isLegendDisabled("avg",true)})}if(stats.total)stats_table.find(".graph-val-total").show().find("span").html(tot_formatter(stats.total));if(stats.average)stats_table.find(".graph-val-average").show().find("span").html(stats_formatter(stats.average));if(stats.min_val)stats_table.find(".graph-val-min").show().find("span").html(stats_formatter(stats.min_val)+"@"+new Date(res[0].values[stats.min_val_idx][0]*1e3).format("dd/MM/yyyy hh:mm:ss"));if(stats.max_val)stats_table.find(".graph-val-max").show().find("span").html(stats_formatter(stats.max_val)+"@"+new Date(res[0].values[stats.max_val_idx][0]*1e3).format("dd/MM/yyyy hh:mm:ss"));if(stats["95th_percentile"]){stats_table.find(".graph-val-95percentile").show().find("span").html(stats_formatter(stats["95th_percentile"]));var values=makeFlatLineValues(data.start,data.step,data.count,stats["95th_percentile"]);res.push({key:"95th Perc",yAxis:1,values:values,type:"line",classed:"line-dashed line-animated",color:"#476DFF",legend_key:"95perc",disabled:isLegendDisabled("95perc",true)})}if(stats_table.find("td").filter(function(){return $(this).css("display")!="none"}).length>0)stats_table.show();else stats_table.hide()}else{stats_table.hide()}update_chart_data(res)}).fail(function(xhr,status,error){if(xhr.statusText=="abort"){return}console.error("Error while retrieving the timeseries data ["+status+"]: "+error);update_chart_data([])});if(first_load){first_load=false}else{if(flows_dt)flows_dt.render()}return true}}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 is_mac_address(member)||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 is_mac_address(host)||is_good_ipv4(host)||is_good_ipv6(host)} +(function(){"use strict";var root=this;var Springy;if(typeof exports!=="undefined"){Springy=exports}else{Springy=root.Springy={}}var Graph=Springy.Graph=function(){this.nodeSet={};this.nodes=[];this.edges=[];this.adjacency={};this.nextNodeId=0;this.nextEdgeId=0;this.eventListeners=[]};var Node=Springy.Node=function(id,data){this.id=id;this.data=data!==undefined?data:{}};var Edge=Springy.Edge=function(id,source,target,data){this.id=id;this.source=source;this.target=target;this.data=data!==undefined?data:{}};Graph.prototype.addNode=function(node){if(!(node.id in this.nodeSet)){this.nodes.push(node)}this.nodeSet[node.id]=node;this.notify();return node};Graph.prototype.addNodes=function(){for(var i=0;i=0;i--){if(this.nodes[i].id===node.id){this.nodes.splice(i,1)}}this.detachNode(node)};Graph.prototype.detachNode=function(node){var tmpEdges=this.edges.slice();tmpEdges.forEach(function(e){if(e.source.id===node.id||e.target.id===node.id){this.removeEdge(e)}},this);this.notify()};Graph.prototype.removeEdge=function(edge){for(var i=this.edges.length-1;i>=0;i--){if(this.edges[i].id===edge.id){this.edges.splice(i,1)}}for(var x in this.adjacency){for(var y in this.adjacency[x]){var edges=this.adjacency[x][y];for(var j=edges.length-1;j>=0;j--){if(this.adjacency[x][y][j].id===edge.id){this.adjacency[x][y].splice(j,1)}}if(this.adjacency[x][y].length==0){delete this.adjacency[x][y]}}if(isEmpty(this.adjacency[x])){delete this.adjacency[x]}}this.notify()};Graph.prototype.merge=function(data){var nodes=[];data.nodes.forEach(function(n){nodes.push(this.addNode(new Node(n.id,n.data)))},this);data.edges.forEach(function(e){var from=nodes[e.from];var to=nodes[e.to];var id=e.directed?id=e.type+"-"+from.id+"-"+to.id:from.idtopright.x){topright.x=point.p.x}if(point.p.y>topright.y){topright.y=point.p.y}});var padding=topright.subtract(bottomleft).multiply(.07);return{bottomleft:bottomleft.subtract(padding),topright:topright.add(padding)}};var Vector=Springy.Vector=function(x,y){this.x=x;this.y=y};Vector.random=function(){return new Vector(10*(Math.random()-.5),10*(Math.random()-.5))};Vector.prototype.add=function(v2){return new Vector(this.x+v2.x,this.y+v2.y)};Vector.prototype.subtract=function(v2){return new Vector(this.x-v2.x,this.y-v2.y)};Vector.prototype.multiply=function(n){return new Vector(this.x*n,this.y*n)};Vector.prototype.divide=function(n){return new Vector(this.x/n||0,this.y/n||0)};Vector.prototype.magnitude=function(){return Math.sqrt(this.x*this.x+this.y*this.y)};Vector.prototype.normal=function(){return new Vector(-this.y,this.x)};Vector.prototype.normalise=function(){return this.divide(this.magnitude())};Layout.ForceDirected.Point=function(position,mass){this.p=position;this.m=mass;this.v=new Vector(0,0);this.a=new Vector(0,0)};Layout.ForceDirected.Point.prototype.applyForce=function(force){this.a=this.a.add(force.divide(this.m))};Layout.ForceDirected.Spring=function(point1,point2,length,k){this.point1=point1;this.point2=point2;this.length=length;this.k=k};var Renderer=Springy.Renderer=function(layout,clear,drawEdge,drawNode,onRenderStop,onRenderStart){this.layout=layout;this.clear=clear;this.drawEdge=drawEdge;this.drawNode=drawNode;this.onRenderStop=onRenderStop;this.onRenderStart=onRenderStart;this.layout.graph.addGraphListener(this)};Renderer.prototype.graphChanged=function(e){this.start()};Renderer.prototype.start=function(done){var t=this;this.layout.start(function render(){t.clear();t.layout.eachEdge(function(edge,spring){t.drawEdge(edge,spring.point1.p,spring.point2.p)});t.layout.eachNode(function(node,point){t.drawNode(node,point.p)})},this.onRenderStart,this.onRenderStop)};Renderer.prototype.stop=function(){this.layout.stop()};if(!Array.prototype.forEach){Array.prototype.forEach=function(callback,thisArg){var T,k;if(this==null){throw new TypeError(" this is null or not defined")}var O=Object(this);var len=O.length>>>0;if({}.toString.call(callback)!="[object Function]"){throw new TypeError(callback+" is not a function")}if(thisArg){T=thisArg}k=0;while(kMath.PI/2||angle<-Math.PI/2)){displacement=8;angle+=Math.PI}var textPos=s1.add(s2).divide(2).add(normal.multiply(displacement));ctx.translate(textPos.x,textPos.y);ctx.rotate(angle);ctx.fillText(text,0,-2);ctx.restore()}},function drawNode(node,p){var s=toScreen(p);ctx.save();var paddingX=6;var paddingY=6;var contentWidth=node.getWidth();var contentHeight=node.getHeight();var boxWidth=contentWidth+paddingX;var boxHeight=contentHeight+paddingY;ctx.clearRect(s.x-boxWidth/2,s.y-boxHeight/2,boxWidth,boxHeight);if(selected!==null&&selected.node!==null&&selected.node.id===node.id){ctx.fillStyle="#FFFFE0"}else if(nearest!==null&&nearest.node!==null&&nearest.node.id===node.id){ctx.fillStyle="#EEEEEE"}else{ctx.fillStyle="#FFFFFF"}ctx.fillRect(s.x-boxWidth/2,s.y-boxHeight/2,boxWidth,boxHeight);if(node.data.image==undefined){ctx.textAlign="left";ctx.textBaseline="top";ctx.font=node.data.font!==undefined?node.data.font:nodeFont;ctx.fillStyle="#000000";var text=node.data.label!==undefined?node.data.label:node.id;ctx.fillText(text,s.x-contentWidth/2,s.y-contentHeight/2);if(node.data.ip!==undefined){ctx.textBaseline="top";ctx.textAlign="center";ctx.font="8px Verdana, sans-serif";ctx.fillStyle="#000000";ctx.fillText(node.data.ip,s.x,s.y+contentHeight/2)}}else{var src=node.data.image.src;if(src in nodeImages){if(nodeImages[src].loaded){ctx.drawImage(nodeImages[src].object,s.x-contentWidth/2,s.y-contentHeight/2,contentWidth,contentHeight);if(node.data.ip!==undefined){ctx.textBaseline="top";ctx.textAlign="center";ctx.font="8px Verdana, sans-serif";ctx.fillStyle="#000000";ctx.fillText(node.data.ip,s.x,s.y+contentHeight/2)}}}else{nodeImages[src]={};var img=new Image;nodeImages[src].object=img;img.addEventListener("load",function(){nodeImages[src].loaded=true});img.src=src}}ctx.restore()});renderer.start();function intersect_line_line(p1,p2,p3,p4){var denom=(p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y);if(denom===0){return false}var ua=((p4.x-p3.x)*(p1.y-p3.y)-(p4.y-p3.y)*(p1.x-p3.x))/denom;var ub=((p2.x-p1.x)*(p1.y-p3.y)-(p2.y-p1.y)*(p1.x-p3.x))/denom;if(ua<0||ua>1||ub<0||ub>1){return false}return new Springy.Vector(p1.x+ua*(p2.x-p1.x),p1.y+ua*(p2.y-p1.y))}function intersect_line_box(p1,p2,p3,w,h){var tl={x:p3.x,y:p3.y};var tr={x:p3.x+w,y:p3.y};var bl={x:p3.x,y:p3.y+h};var br={x:p3.x+w,y:p3.y+h};var result;if(result=intersect_line_line(p1,p2,tl,tr)){return result}if(result=intersect_line_line(p1,p2,tr,br)){return result}if(result=intersect_line_line(p1,p2,br,bl)){return result}if(result=intersect_line_line(p1,p2,bl,tl)){return result}return false}return this}})();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(''+empty_str+"")}function datatableGetNumDisplayedItems(table){return $("tr:not(.emptyRow)",$(table)).length-1}function datatableIsEmpty(table){return datatableGetNumDisplayedItems(table)==0}function datatableGetTotalItems(table){if(datatableIsEmpty(table))return 0;return $("#dt-bottom-details div.pull-left",$(table)).html().match(/of (\d+) rows/)[1]}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");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'+label+"")}function datatableAddDeleteButtonCallback(td_idx,callback_str,label){datatableAddButtonCallback.bind(this)(td_idx,label,"label-danger",callback_str,"javascript:void(0)")}function datatableAddActionButtonCallback(td_idx,callback_str,label){datatableAddButtonCallback.bind(this)(td_idx,label,"label-info",callback_str,"javascript:void(0)")}function datatableAddLinkButtonCallback(td_idx,link,label){datatableAddButtonCallback.bind(this)(td_idx,label,"label-info","",link)}function datatableMakeSelectUnique(tr_obj,added_rows_prefix,options){options=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 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}function is_good_ipv4(ipv4){if(/^(?:(?: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])$/.test(ipv4)){return true}else{return false}}function is_good_ipv6(ipv6){if(/^(([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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[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|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(ipv6)){return true}else{return false}}function isNumeric(value){return/^\d+$/.test(value)}function is_mac_address(what){return/^([0-9A-Fa-f]{2}:){5}([0-9A-Fa-f]{2})$/.test(what)}function 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(!isNumeric(elems[1]))return null;mask=parseInt(elems[1]);if(mask<0)return null}if(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(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}function fbits(bits){var sizes=["bps","Kbit/s","Mbit/s","Gbit/s","Tbit/s"];if(bits<=0)return"0";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]}}function fbits_from_bytes(bytes){return fbits(bytes*8)}function fpackets(pps){var sizes=["pps","Kpps","Mpps","Gpps","Tpps"];if(pps==0)return"0";var res=scaleValue(pps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}function fflows(fps){var sizes=["fps","Kfps","Mfps","Gfps","Tfps"];if(fps==0)return"0";var res=scaleValue(fps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}function fint(value){var x=Math.round(value);return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}function fdate(when){var epoch=when*1e3;var d=new Date(epoch);return d}function capitaliseFirstLetter(string){return string.charAt(0).toUpperCase()+string.slice(1)}String.prototype.startsWith=function(string){return this.indexOf(string)===0};function get_trend(actual,before){if(before===undefined||actual==before){return''}else{return''}}function getOSIcon(name){var icon="";if(name.search("Linux")!=-1||name.search("Ubuntu")!=-1)icon=" ";else if(name.search("Android")!=-1)icon=" ";else if(name.search("Windows")!=-1||name.search("Win32")!=-1||name.search("MSIE")!=-1)icon=" ";else if(name.search("iPhone")!=-1||name.search("iPad")!=-1||name.search("OS X")!=-1)icon=" ";return icon}function abbreviateString(str,len){if(!str)return"";if(str.length=0&&bytes=kilobyte&&bytes=megabyte&&bytes=gigabyte&&bytes=terabyte)return(bytes/terabyte).toFixed(precision)+" TB";else return bytes.toFixed(precision)+" Bytes"}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(" ")};function drawTrend(current,last,withColor){if(current==last){return''}else if(current>last){return'"}else{return''}}function 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")}function disableAllDropdownsAndTabs(){$("select").each(function(){$(this).prop("disabled",true)});toggleAllTabs(false)}function enableAllDropdownsAndTabs(){$("select").each(function(){$(this).prop("disabled",false)});toggleAllTabs(true)}function capitalize(s){return s&&s[0].toUpperCase()+s.slice(1)}function 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}function scaleValue(val,sizes,scale){if(val==0)return[0,sizes[0]];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[val/Math.pow(scale,i),sizes[i]]}function formatValue(val){var sizes=["","K","M","G","T"];var res=scaleValue(val,sizes,1e3);return Math.round(res[0]*100)/100+res[1]}function formatPackets(n){return addCommas(n.toFixed(2))+" Pkts"}function formatFlows(n){return addCommas(n.toFixed(0))+" Flows"}function fmillis(value){var x=Math.round(value);var res=scaleValue(x,["ms","s"],1e3);return res[0]+" "+res[1]}function bytesToVolume(bytes){var sizes=["Bytes","KB","MB","GB","TB"];if(bytes==0)return"0 Bytes";var res=scaleValue(bytes,sizes,1024);return res[0].toFixed(2)+" "+res[1]}function 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]]}function bitsToSize(bits,factor){factor=factor||1e3;var sizes=["bit/s","kbit/s","Mbit/s","Gbit/s","Tbit/s"];if(bits==0)return"0 bps";var res=scaleValue(bits,sizes,factor);return res[0].toFixed(2)+" "+res[1]}function secondsToTime(seconds){if(seconds<1){return"< 1 sec"}var days=Math.floor(seconds/86400);var hours=Math.floor(seconds/3600-days*24);var minutes=Math.floor(seconds/60-days*1440-hours*60);var sec=seconds%60;var msg="",msg_array=[];if(days>0){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(", ")}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};function 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")+" ["+secondsToTime(tdiff)+" ago]"}function 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}function paramsExtend(defaults,override){return $.extend({},defaults,override)}function paramsToForm(form,params){form=$(form);for(var k in params){if(params.hasOwnProperty(k)){var input=$('');input.appendTo(form)}}return form}function 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}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)})}});function 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}function 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")}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}}function makeFindHostBeforeSubmitCallback(http_prefix){return function(form,data){if(data.type=="mac")form.attr("action",http_prefix+"/lua/mac_details.lua");else if(data.type=="snmp")form.attr("action",http_prefix+"/lua/pro/enterprise/snmp_device_details.lua");else form.attr("action",http_prefix+"/lua/host_details.lua");return true}}function 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}var schema_2_label={};var data_2_label={};function initLabelMaps(_schema_2_label,_data_2_label){schema_2_label=_schema_2_label;data_2_label=_data_2_label}function getSerieLabel(schema,serie){var data_label=serie.label;var new_label=data_2_label[data_label];if(schema=="top:local_senders"||schema=="top:local_receivers"){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.device&&serie.tags.if_index){if(serie.tags.if_index!=serie.ext_label)return serie.ext_label+" ("+serie.tags.if_index+")";else return serie.ext_label}else if(serie.tags.device&&serie.tags.port)return serie.tags.port;else if(serie.tags.profile)return serie.tags.profile}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}if(schema_2_label[schema])return capitaliseFirstLetter(schema_2_label[schema]);if(new_label)return capitaliseFirstLetter(new_label);return capitaliseFirstLetter(data_label)}function getValueFormatter(schema,series){if(series&&series.length&&series[0].label){var label=series[0].label;if(label.contains("bytes"))return[fbits_from_bytes,bytesToSize];else if(label.contains("packets"))return[fpackets,formatPackets];else if(label.contains("flows"))return[formatValue,formatFlows,formatFlows];else if(label.contains("millis"))return[fmillis,fmillis]}return[fint,fint]}function makeFlatLineValues(tstart,tstep,num,data){var t=tstart;var values=[];for(var i=0;icount){console.error("points mismatch: serie '"+getSerieLabel(schema_name,series[i])+"' has "+data.length+" points, expected "+count);rv=false}else if(data.length.1)return res}function buildTimeArray(start_time,end_time,step){var arr=[];for(var t=start_time;t');$chart.parent().css("position","relative");var chart_colors_full=["#69B87F","#94CFA4","#B3DEB6","#E5F1A6","#FFFCC6","#FEDEA5","#FFB97B","#FF8D6D","#E27B85"];var chart_colors_min=["#69B87F","#C1E3C4","#E5F1A6"];var update_chart_data=function(new_data){d3_sel.datum([]).call(chart);d3_sel.datum(new_data).transition().call(chart);nv.utils.windowResize(chart.update);pending_request=null;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){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]);if(chart.updateStackedChart(t_start,t_end)){chart.is_zoomed=true;zoom_stack.push(cur_zoom);$zoom_out.show()}});$zoom_out.on("click",function(){if(zoom_stack.length){var zoom=zoom_stack.pop();var t_start=zoom[0];var t_end=zoom[1];chart.updateStackedChart(t_start,t_end);if(!zoom_stack.length)$zoom_out.hide()}});var old_start,old_end;chart.updateStackedChart=function(tstart,tend,no_spinner){if(tstart)params.epoch_begin=tstart;if(tend)params.epoch_end=tend;var cur_interval=params.epoch_end-params.epoch_begin;if(cur_interval0){var scale=d3.max(total_serie)/max_val;var scaled=$.map(smoothed,function(x){return x*scale});var aligned=upsampleSerie(scaled,data.count);res.push({key:"Trend",yAxis:1,values:arrayToNvSerie(aligned,data.start,data.step),type:"line",classed:"line-animated",color:"#62ADF6",legend_key:"trend",disabled:isLegendDisabled("trend",false)})}}var formatter1=getValueFormatter(schema_name,series.filter(function(d){return d.axis!=2}));var value_formatter=formatter1[0];var tot_formatter=formatter1[1];var stats_formatter=formatter1[2]||value_formatter;chart.yAxis1.tickFormat(value_formatter);chart.yAxis1_formatter=value_formatter;var formatter2=getValueFormatter(schema_name,series.filter(function(d){return d.axis==2}));var value_formatter2=formatter2[0];chart.yAxis2.tickFormat(value_formatter2);chart.yAxis2_formatter=value_formatter2;var stats_table=$chart.closest("table").find(".graph-statistics");var stats=data.statistics;if(stats){if(stats.average){var values=makeFlatLineValues(data.start,data.step,data.count,stats.average);res.push({key:"Avg",yAxis:1,values:values,type:"line",classed:"line-dashed line-animated",color:"#AC9DDF",legend_key:"avg",disabled:isLegendDisabled("avg",true)})}if(stats.total)stats_table.find(".graph-val-total").show().find("span").html(tot_formatter(stats.total));if(stats.average)stats_table.find(".graph-val-average").show().find("span").html(stats_formatter(stats.average));if(stats.min_val)stats_table.find(".graph-val-min").show().find("span").html(stats_formatter(stats.min_val)+"@"+new Date(res[0].values[stats.min_val_idx][0]*1e3).format("dd/MM/yyyy hh:mm:ss"));if(stats.max_val)stats_table.find(".graph-val-max").show().find("span").html(stats_formatter(stats.max_val)+"@"+new Date(res[0].values[stats.max_val_idx][0]*1e3).format("dd/MM/yyyy hh:mm:ss"));if(stats["95th_percentile"]){stats_table.find(".graph-val-95percentile").show().find("span").html(stats_formatter(stats["95th_percentile"]));var values=makeFlatLineValues(data.start,data.step,data.count,stats["95th_percentile"]);res.push({key:"95th Perc",yAxis:1,values:values,type:"line",classed:"line-dashed line-animated",color:"#476DFF",legend_key:"95perc",disabled:isLegendDisabled("95perc",true)})}if(stats_table.find("td").filter(function(){return $(this).css("display")!="none"}).length>0)stats_table.show();else stats_table.hide()}else{stats_table.hide()}update_chart_data(res)}).fail(function(xhr,status,error){if(xhr.statusText=="abort"){return}console.error("Error while retrieving the timeseries data ["+status+"]: "+error);update_chart_data([])});if(first_load){first_load=false}else{if(flows_dt)flows_dt.render()}return true}}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 is_mac_address(member)||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 is_mac_address(host)||is_good_ipv4(host)||is_good_ipv6(host)} //# sourceMappingURL=ntop.min.js.map \ No newline at end of file diff --git a/scripts/lua/if_stats.lua b/scripts/lua/if_stats.lua index ece02d3136..0e65ad8be9 100644 --- a/scripts/lua/if_stats.lua +++ b/scripts/lua/if_stats.lua @@ -872,6 +872,7 @@ elseif(page == "historical") then {schema="iface:flows", label=i18n("graphs.active_flows")}, {schema="iface:hosts", label=i18n("graphs.active_hosts")}, {schema="custom:flows_vs_local_hosts", label=i18n("graphs.flows_vs_local_hosts"), check={"iface:flows", "iface:local_hosts"}, step=60}, + {schema="custom:flows_vs_traffic", label=i18n("graphs.flows_vs_traffic"), check={"iface:flows", "iface:traffic"}, step=60}, {schema="iface:devices", label=i18n("graphs.active_devices")}, {schema="iface:http_hosts", label=i18n("graphs.active_http_servers"), nedge_exclude=1}, {schema="iface:traffic", label=i18n("traffic")},