From 074fccb1b3464972d448caaa7d2f8202cc11cc97 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Mon, 25 Mar 2019 17:01:26 +0100 Subject: [PATCH 1/8] Use network alias in alerts --- scripts/lua/modules/alert_utils.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/lua/modules/alert_utils.lua b/scripts/lua/modules/alert_utils.lua index f79eee649e67..05ae061a6017 100644 --- a/scripts/lua/modules/alert_utils.lua +++ b/scripts/lua/modules/alert_utils.lua @@ -602,7 +602,7 @@ local function formatAlertEntity(ifid, entity_type, entity_value, entity_info) "'>"..value.."" end elseif entity_type == "network" then - value = hostkey2hostinfo(entity_value)["host"] + value = getLocalNetworkAlias(hostkey2hostinfo(entity_value)["host"]) if entity_info ~= nil then value = "'+empty_str+"")}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");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 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 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){if(typeof bits==="undefined")return"-";var sizes=["bps","Kbit/s","Mbit/s","Gbit/s","Tbit/s"];if(bits<.005)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){if(typeof bytes==="undefined")return"-";return fbits(bytes*8)}function fpackets(pps){if(typeof pps==="undefined")return"-";var sizes=["pps","Kpps","Mpps","Gpps","Tpps"];if(pps<.005)return"0";var res=scaleValue(pps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}function fflows(fps){if(typeof fps==="undefined")return"-";var sizes=["fps","Kfps","Mfps","Gfps","Tfps"];if(fps<.005)return"0";var res=scaleValue(fps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}function falerts(aps){if(typeof aps==="undefined")return"-";return Math.round(aps*100)/100+" alerts/s"}function fint(value){if(typeof value==="undefined")return"-";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])+res[1]}function formatPackets(n){return addCommas(n.toFixed(0))+" Pkts"}function formatFlows(n){return addCommas(n.toFixed(0))+" Flows"}function fmillis(value){if(typeof value==="undefined")return"-";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_interface_details.lua");$("").attr({type:"hidden",id:"snmp_port_idx",name:"snmp_port_idx",value:data.snmp_port_idx}).appendTo(form)}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}function cleanCustomHostUrl(host){return host.replace(/^http:\/\//gi,"").replace(/^https:\/\//gi,"").replace(/^www\./gi,"").replace(/[^0-9a-zA-Z\.:\/_-]/gi,"")}function parseQuery(queryString){var query={};var pairs=(queryString[0]==="?"?queryString.substr(1):queryString).split("&");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$.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 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/get/timeseries/ts.lua";var first_load=true;var first_time_loaded=true;var manual_trigger_cmp_serie=false;var datetime_format="dd/MM/yyyy hh:mm:ss";var max_over_total_ratio=3;var query_timer=null;var seconds_before_query_slow=6;var query_completed=0;var query_was_aborted=false;chart.is_zoomed=current_zoom_level>0||has_initial_zoom();var spinner=$('');$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 update_chart_data=function(new_data){d3_sel.datum([]).call(chart);d3_sel.datum(new_data).transition().call(chart);nv.utils.windowResize(chart.update);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(d.legend_key.indexOf("ago")!=-1)manual_trigger_cmp_serie=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=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.on("dblclick",function(event){if($(event.target).hasClass("nv-legend-text"))return;var delta=zoom_out_value;if((params.epoch_end+delta/2)*1e3<=$.now())delta/=2;$("#period_begin").data("DateTimePicker").date(new Date((params.epoch_begin-delta)*1e3));$("#period_end").data("DateTimePicker").date(new Date((params.epoch_end+delta)*1e3));updateChartFromPickers()});$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 input");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;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=Date.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").data("DateTimePicker").date(new Date(params.epoch_begin*1e3));$("#period_end").data("DateTimePicker").maxDate(new Date($.now())).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;pending_chart_request=$.get(url,req_params,function(data){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 res=[];var series=data.series;var total_serie;var color_i=0;var chart_colors=series.length<=chart_colors_min.length?chart_colors_min:chart_colors_full;for(var j=0;jmax_over_total_ratio)is_disabled=true;res.push({key:capitaliseFirstLetter(key),yAxis:1,values:values,type:"line",classed:"line-dashed line-animated",color:"#7E91A0",legend_key:key,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={trend:[graph_i18n.trend,"#62ADF6",smooth,num_smoothed_points],ema:["EMA","#F96BFF",exponentialMovingAverageArray,{periods:num_smoothed_points}],sma:["SMA","#A900FF",simpleMovingAverageArray,{periods:num_smoothed_points}],rsi:["RSI cur vs past","#00FF5D",relativeStrengthIndexArray,{periods:num_smoothed_points}]};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;i0){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=remaining0||enabled_series.length==0){for(var i=0;i0){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+='
"}nindex_buttons+='
";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%","white-space":"nowrap","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.loading_time){$("#flows-load-time").html(data.stats.loading_time);$("#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 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 ipAddressValidator(input){var host=input.val();if(host==="")return true;return is_good_ipv4(host)||is_good_ipv6(host)} +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 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 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 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){if(typeof bits==="undefined")return"-";var sizes=["bps","Kbit/s","Mbit/s","Gbit/s","Tbit/s"];if(bits<.005)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){if(typeof bytes==="undefined")return"-";return fbits(bytes*8)}function fpackets(pps){if(typeof pps==="undefined")return"-";var sizes=["pps","Kpps","Mpps","Gpps","Tpps"];if(pps<.005)return"0";var res=scaleValue(pps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}function fflows(fps){if(typeof fps==="undefined")return"-";var sizes=["fps","Kfps","Mfps","Gfps","Tfps"];if(fps<.005)return"0";var res=scaleValue(fps,sizes,1e3);return Math.round(res[0]*100)/100+" "+res[1]}function falerts(aps){if(typeof aps==="undefined")return"-";return Math.round(aps*100)/100+" alerts/s"}function fint(value){if(typeof value==="undefined")return"-";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])+res[1]}function formatPackets(n){return addCommas(n.toFixed(0))+" Pkts"}function formatFlows(n){return addCommas(n.toFixed(0))+" Flows"}function fmillis(value){if(typeof value==="undefined")return"-";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=="network"){form.attr("action",http_prefix+"/lua/hosts_stats.lua");$("").attr({type:"hidden",id:"network",name:"network",value:data.network}).appendTo(form)}else if(data.type=="snmp"){form.attr("action",http_prefix+"/lua/pro/enterprise/snmp_interface_details.lua");$("").attr({type:"hidden",id:"snmp_port_idx",name:"snmp_port_idx",value:data.snmp_port_idx}).appendTo(form)}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}function cleanCustomHostUrl(host){return host.replace(/^http:\/\//gi,"").replace(/^https:\/\//gi,"").replace(/^www\./gi,"").replace(/[^0-9a-zA-Z\.:\/_-]/gi,"")}function parseQuery(queryString){var query={};var pairs=(queryString[0]==="?"?queryString.substr(1):queryString).split("&");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$.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 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/get/timeseries/ts.lua";var first_load=true;var first_time_loaded=true;var manual_trigger_cmp_serie=false;var datetime_format="dd/MM/yyyy hh:mm:ss";var max_over_total_ratio=3;var query_timer=null;var seconds_before_query_slow=6;var query_completed=0;var query_was_aborted=false;chart.is_zoomed=current_zoom_level>0||has_initial_zoom();var spinner=$('');$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 update_chart_data=function(new_data){d3_sel.datum([]).call(chart);d3_sel.datum(new_data).transition().call(chart);nv.utils.windowResize(chart.update);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(d.legend_key.indexOf("ago")!=-1)manual_trigger_cmp_serie=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=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.on("dblclick",function(event){if($(event.target).hasClass("nv-legend-text"))return;var delta=zoom_out_value;if((params.epoch_end+delta/2)*1e3<=$.now())delta/=2;$("#period_begin").data("DateTimePicker").date(new Date((params.epoch_begin-delta)*1e3));$("#period_end").data("DateTimePicker").date(new Date((params.epoch_end+delta)*1e3));updateChartFromPickers()});$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 input");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;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=Date.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").data("DateTimePicker").date(new Date(params.epoch_begin*1e3));$("#period_end").data("DateTimePicker").maxDate(new Date($.now())).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;pending_chart_request=$.get(url,req_params,function(data){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 res=[];var series=data.series;var total_serie;var color_i=0;var chart_colors=series.length<=chart_colors_min.length?chart_colors_min:chart_colors_full;for(var j=0;jmax_over_total_ratio)is_disabled=true;res.push({key:capitaliseFirstLetter(key),yAxis:1,values:values,type:"line",classed:"line-dashed line-animated",color:"#7E91A0",legend_key:key,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={trend:[graph_i18n.trend,"#62ADF6",smooth,num_smoothed_points],ema:["EMA","#F96BFF",exponentialMovingAverageArray,{periods:num_smoothed_points}],sma:["SMA","#A900FF",simpleMovingAverageArray,{periods:num_smoothed_points}],rsi:["RSI cur vs past","#00FF5D",relativeStrengthIndexArray,{periods:num_smoothed_points}]};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;i0){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=remaining0||enabled_series.length==0){for(var i=0;i0){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+='
"}nindex_buttons+='
";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%","white-space":"nowrap","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.loading_time){$("#flows-load-time").html(data.stats.loading_time);$("#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 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 ipAddressValidator(input){var host=input.val();if(host==="")return true;return is_good_ipv4(host)||is_good_ipv6(host)} //# sourceMappingURL=ntop.min.js.map \ No newline at end of file diff --git a/httpdocs/js/ntop.min.js.map b/httpdocs/js/ntop.min.js.map index 730e1a712fab..e1ac9c739846 100644 --- a/httpdocs/js/ntop.min.js.map +++ b/httpdocs/js/ntop.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["datatable_utils.js","ays_utils.js","ntopng_utils.js","graph_utils.js","ebpf_utils.js","ntopng_validators.js"],"names":["datatableRemoveEmptyRow","table","$","remove","datatableAddEmptyRow","empty_str","columns","filter","this","css","length","html","datatableGetNumDisplayedItems","datatableIsEmpty","datatableGetByForm","form","parent","datatableUndoAddRow","new_row","bt_to_enable","callback_str","removeAttr","closest","aysUpdateForm","dt","window","datatableForEachRow","callbacks","each","row_i","bind","i","datatableAddButtonCallback","td_idx","label","bs_class","link","append","datatableAddDeleteButtonCallback","datatableAddActionButtonCallback","datatableAddLinkButtonCallback","datatableMakeSelectUnique","tr_obj","added_rows_prefix","options","paramsExtend","on_change","noop","selector_fn","obj","find","first","datatableForeachSelectOtherThan","this_select","callback","other","datatableOptionChangeStatus","option_obj","enable","select_obj","should_reset","val","attr","new_val","datatableOnSelectEntryChange","change_callback","old_value","new_value","others","push","datatableOnAddSelectEntry","trigger","new_sel","select","on","datatableOrderedInsert","to_insert","to_insert_val","cmp_fn","a","b","inserted","tr","cmp_val","parseInt","isNaN","before","datatableIsLastPage","lastpage","hasClass","datatableGetColumn","id_key","id_value","res","data","resultset","item","aysHandleForm","form_selector","default_options","submit_selector","on_dirty_callback","on_clean_callback","handle_submit_buttons","handle_datatable","handle_tabs","disable_on_dirty","ays_options","o","extend","areYouSure","addClass","removeClass","aysResetForm","aysRecheckForm","aysGetDirty","fields_selector","getValue","$field","undefined","is","type","$option","isFieldDirty","origValue","curValue","dirty","l","dirty_status","input","is_good_ipv4","ipv4","test","is_good_ipv6","ipv6","isNumeric","value","is_mac_address","what","is_network_mask","optional_mask","elems","split","mask","ip_addr","address","fbits","bits","sizes","bits_log1000","Math","log","floor","round","pow","ret","parseFloat","toFixed","fbits_from_bytes","bytes","fpackets","pps","scaleValue","fflows","fps","falerts","aps","fint","x","toString","replace","fdate","when","epoch","d","Date","capitaliseFirstLetter","string","charAt","toUpperCase","slice","String","prototype","startsWith","indexOf","get_trend","actual","getOSIcon","name","icon","search","abbreviateString","str","len","substring","bytesToSize","precision","kilobyte","megabyte","gigabyte","terabyte","capitalizeSingleWord","uc","capitalize","join","drawTrend","current","last","withColor","toggleAllTabs","enabled","disableAllDropdownsAndTabs","prop","enableAllDropdownsAndTabs","s","addCommas","nStr","x1","x2","rgx","scale","formatValue","formatPackets","n","formatFlows","fmillis","bytesToVolume","bytesToVolumeAndLabel","bitsToSize","factor","secondsToTime","seconds","days","hours","minutes","sec","msg","msg_array","years","format","M+","getMonth","d+","getDate","h+","getHours","m+","getMinutes","s+","getSeconds","q+","S","getMilliseconds","RegExp","$1","getFullYear","substr","k","epoch2Seen","tdiff","getTime","graphGetXAxisTicksFormat","diff_epoch","tickFormat","defaults","override","paramsToForm","params","hasOwnProperty","appendTo","paramsPairsEncode","jQuery","fn","disable","state","$this","disabled","toggleClass","hostkey2hostInfo","host_key","info","hostinfo","handle_tab_state","nav_object","default_tab","click","e","preventDefault","id","target","history","replaceState","location","hash","tab","sformat","args","arguments","match","number","contains","makeFindHostBeforeSubmitCallback","http_prefix","snmp_port_idx","tstampToDateString","html_tag","timestamp","localized","d3","time","cleanCustomHostUrl","host","parseQuery","queryString","query","pairs","pair","decodeURIComponent","getHistoryParameters","cur_params","new_params","new_query","param","baseUrl","protocol","pathname","schema_2_label","data_2_label","graph_i18n","initLabelMaps","_schema_2_label","_data_2_label","_graph_i18n","getSerieLabel","schema","serie","data_label","new_label","tags","category","device","if_index","ext_label","port","profile","traffic_volume","traffic","getValueFormatter","metric_type","series","as_counter","makeFlatLineValues","tstart","tstep","num","t","values","checkSeriesConsinstency","schema_name","count","rv","console","error","upsampleSerie","num_points","intervals","lerp","v0","v1","index","prev_i","next_i","min","ceil","v","buildTotalSerie","data_series","transpose","map","g","sum","arrayToNvSerie","serie_data","start","step","buildOtherSerie","total_serie","visual_total","warn","max_val","max","buildTimeArray","start_time","end_time","arr","fixTimeRange","chart","align_step","actual_step","epoch_end","epoch_begin","frame","align","tick_step","resolution","fmt","range_params","range","limit","xAxis","tickValues","findActualStep","raw_step","supported_steps","retention","now_ts","now","delta","partial","aggregation_dp","tframe","retention_dp","has_initial_zoom","current_zoom_level","canCompareBackwards","jump_duration","current_duration","fixJumpButtons","duration","showQuerySlow","show","hideQuerySlow","hide","attachStackedChartCallback","chart_id","zoom_reset_id","show_all_smooth","initial_range","ts_table_shown","pending_chart_request","pending_table_request","d3_sel","$chart","$zoom_reset","$graph_zoom","max_interval","initial_interval","is_max_zoom","url","first_load","first_time_loaded","manual_trigger_cmp_serie","datetime_format","max_over_total_ratio","query_timer","seconds_before_query_slow","query_completed","query_was_aborted","is_zoomed","spinner","chart_colors_full","chart_colors_min","update_chart_data","new_data","datum","call","transition","nv","utils","windowResize","update","isLegendDisabled","key","default_val","localStorage","getItem","legend","dispatch","legend_key","setItem","cur_zoom","t_start","xDomain","t_end","old_zoomed","is_user_zoom","updateStackedChart","push_state","pushState","zoom_level","fixChartButtons","updateZoom","zoom","force","event","zoom_out_value","date","updateChartFromPickers","go","addEventListener","zoom_link","checkQueryCompleted","flows_dt","wait_num_queries","clearInterval","queryWasAborted","abortQuery","abort","noData","i18n","tableRequestCompleted","getDataUrl","data_params","ts_compare","extended","old_start","old_end","old_interval","tend","no_spinner","on_load_callback","force_update","cur_interval","new_end","zoomType","maxDate","setInterval","no_data_available","req_params","get","color_i","chart_colors","j","yAxis","axis","color","has_full_data","additional_series","total","other_serie","past_serie","ratio_over_total","is_disabled","classed","no_trend","num_smoothed_points","smooth_functions","trend","smooth","ema","exponentialMovingAverageArray","periods","sma","simpleMovingAverageArray","rsi","relativeStrengthIndexArray","add_smoothed_serie","fn_to_use","smoothed","delta_serie","aligned","scaled","remaining","to_fill","splice","yDomainRatioY2","formatter1","value_formatter","tot_formatter","stats_formatter","yAxis1","yAxis1_formatter","second_axis_series","formatter2","value_formatter2","yAxis2","yAxis2_formatter","stats_table","stats","statistics","average","avg","total_cell","average_cell","min_cell","max_cell","perc_cell","min_val","min_val_idx","max_val_idx","enabled_series","updateState","source_aggregation","fail","xhr","status","statusText","always","pendingRequest","updateGraphsTableView","graph_old_view","graph_old_has_nindex","graph_old_nindex_query","tsQueryToTags","ts_query","reduce","pos","recheckGraphTableEntries","table_view","graph_table_views","graph_params","reset_selection","view_id","view","elem","html_id","min_step","items_ul","idx","next_item","nextAll","divider","first_view","setActiveGraphsTableView","has_nindex","nindex_query","per_page","graph_table","nindex_buttons","params_obj","nindex_view","col","title","field","textAlign","width","hidden","actions","white-space","text-align","old_dt","removeData","datatable","perPage","noResultsMessage","ts_chart","no_results_found","post","initial_point","detail_view","loadingYOffset","buttons","tableCallback","currentPage","stats_div","has_drilldown","some","row","drilldown","loading_time","num_records_processed","rowCallback","row_data","draw_processes_graph","graph_div_id","links","nodes","json","_link","forEach","source_pid","source","source_name","source_type","pid","target_pid","target_name","target_type","height","arrow_size","category10","layout","size","linkDistance","charge","tick","svg","selectAll","enter","path","circle","style","drag","href","text","linkArc","transform","dx","dy","y","dr","sqrt","makeUniqueValidator","items_function","cmp_name","memberValueValidator","member","makePasswordPatternValidator","pattern","passwordPatternValidator","passwordMatchValidator","other_input","not","poolnameValidator","passwordMatchRecheck","items","not_empty","hostOrMacValidator","ipAddressValidator"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["datatable_utils.js","ays_utils.js","ntopng_utils.js","graph_utils.js","ebpf_utils.js","ntopng_validators.js"],"names":["datatableRemoveEmptyRow","table","$","remove","datatableAddEmptyRow","empty_str","columns","filter","this","css","length","html","datatableGetNumDisplayedItems","datatableIsEmpty","datatableGetByForm","form","parent","datatableUndoAddRow","new_row","bt_to_enable","callback_str","removeAttr","closest","aysUpdateForm","dt","window","datatableForEachRow","callbacks","each","row_i","bind","i","datatableAddButtonCallback","td_idx","label","bs_class","link","append","datatableAddDeleteButtonCallback","datatableAddActionButtonCallback","datatableAddLinkButtonCallback","datatableMakeSelectUnique","tr_obj","added_rows_prefix","options","paramsExtend","on_change","noop","selector_fn","obj","find","first","datatableForeachSelectOtherThan","this_select","callback","other","datatableOptionChangeStatus","option_obj","enable","select_obj","should_reset","val","attr","new_val","datatableOnSelectEntryChange","change_callback","old_value","new_value","others","push","datatableOnAddSelectEntry","trigger","new_sel","select","on","datatableOrderedInsert","to_insert","to_insert_val","cmp_fn","a","b","inserted","tr","cmp_val","parseInt","isNaN","before","datatableIsLastPage","lastpage","hasClass","datatableGetColumn","id_key","id_value","res","data","resultset","item","aysHandleForm","form_selector","default_options","submit_selector","on_dirty_callback","on_clean_callback","handle_submit_buttons","handle_datatable","handle_tabs","disable_on_dirty","ays_options","o","extend","areYouSure","addClass","removeClass","aysResetForm","aysRecheckForm","aysGetDirty","fields_selector","getValue","$field","undefined","is","type","$option","isFieldDirty","origValue","curValue","dirty","l","dirty_status","input","is_good_ipv4","ipv4","test","is_good_ipv6","ipv6","isNumeric","value","is_mac_address","what","is_network_mask","optional_mask","elems","split","mask","ip_addr","address","fbits","bits","sizes","bits_log1000","Math","log","floor","round","pow","ret","parseFloat","toFixed","fbits_from_bytes","bytes","fpackets","pps","scaleValue","fflows","fps","falerts","aps","fint","x","toString","replace","fdate","when","epoch","d","Date","capitaliseFirstLetter","string","charAt","toUpperCase","slice","String","prototype","startsWith","indexOf","get_trend","actual","getOSIcon","name","icon","search","abbreviateString","str","len","substring","bytesToSize","precision","kilobyte","megabyte","gigabyte","terabyte","capitalizeSingleWord","uc","capitalize","join","drawTrend","current","last","withColor","toggleAllTabs","enabled","disableAllDropdownsAndTabs","prop","enableAllDropdownsAndTabs","s","addCommas","nStr","x1","x2","rgx","scale","formatValue","formatPackets","n","formatFlows","fmillis","bytesToVolume","bytesToVolumeAndLabel","bitsToSize","factor","secondsToTime","seconds","days","hours","minutes","sec","msg","msg_array","years","format","M+","getMonth","d+","getDate","h+","getHours","m+","getMinutes","s+","getSeconds","q+","S","getMilliseconds","RegExp","$1","getFullYear","substr","k","epoch2Seen","tdiff","getTime","graphGetXAxisTicksFormat","diff_epoch","tickFormat","defaults","override","paramsToForm","params","hasOwnProperty","appendTo","paramsPairsEncode","jQuery","fn","disable","state","$this","disabled","toggleClass","hostkey2hostInfo","host_key","info","hostinfo","handle_tab_state","nav_object","default_tab","click","e","preventDefault","id","target","history","replaceState","location","hash","tab","sformat","args","arguments","match","number","contains","makeFindHostBeforeSubmitCallback","http_prefix","network","snmp_port_idx","tstampToDateString","html_tag","timestamp","localized","d3","time","cleanCustomHostUrl","host","parseQuery","queryString","query","pairs","pair","decodeURIComponent","getHistoryParameters","cur_params","new_params","new_query","param","baseUrl","protocol","pathname","schema_2_label","data_2_label","graph_i18n","initLabelMaps","_schema_2_label","_data_2_label","_graph_i18n","getSerieLabel","schema","serie","data_label","new_label","tags","category","device","if_index","ext_label","port","profile","traffic_volume","traffic","getValueFormatter","metric_type","series","as_counter","makeFlatLineValues","tstart","tstep","num","t","values","checkSeriesConsinstency","schema_name","count","rv","console","error","upsampleSerie","num_points","intervals","lerp","v0","v1","index","prev_i","next_i","min","ceil","v","buildTotalSerie","data_series","transpose","map","g","sum","arrayToNvSerie","serie_data","start","step","buildOtherSerie","total_serie","visual_total","warn","max_val","max","buildTimeArray","start_time","end_time","arr","fixTimeRange","chart","align_step","actual_step","epoch_end","epoch_begin","frame","align","tick_step","resolution","fmt","range_params","range","limit","xAxis","tickValues","findActualStep","raw_step","supported_steps","retention","now_ts","now","delta","partial","aggregation_dp","tframe","retention_dp","has_initial_zoom","current_zoom_level","canCompareBackwards","jump_duration","current_duration","fixJumpButtons","duration","showQuerySlow","show","hideQuerySlow","hide","attachStackedChartCallback","chart_id","zoom_reset_id","show_all_smooth","initial_range","ts_table_shown","pending_chart_request","pending_table_request","d3_sel","$chart","$zoom_reset","$graph_zoom","max_interval","initial_interval","is_max_zoom","url","first_load","first_time_loaded","manual_trigger_cmp_serie","datetime_format","max_over_total_ratio","query_timer","seconds_before_query_slow","query_completed","query_was_aborted","is_zoomed","spinner","chart_colors_full","chart_colors_min","update_chart_data","new_data","datum","call","transition","nv","utils","windowResize","update","isLegendDisabled","key","default_val","localStorage","getItem","legend","dispatch","legend_key","setItem","cur_zoom","t_start","xDomain","t_end","old_zoomed","is_user_zoom","updateStackedChart","push_state","pushState","zoom_level","fixChartButtons","updateZoom","zoom","force","event","zoom_out_value","date","updateChartFromPickers","go","addEventListener","zoom_link","checkQueryCompleted","flows_dt","wait_num_queries","clearInterval","queryWasAborted","abortQuery","abort","noData","i18n","tableRequestCompleted","getDataUrl","data_params","ts_compare","extended","old_start","old_end","old_interval","tend","no_spinner","on_load_callback","force_update","cur_interval","new_end","zoomType","maxDate","setInterval","no_data_available","req_params","get","color_i","chart_colors","j","yAxis","axis","color","has_full_data","additional_series","total","other_serie","past_serie","ratio_over_total","is_disabled","classed","no_trend","num_smoothed_points","smooth_functions","trend","smooth","ema","exponentialMovingAverageArray","periods","sma","simpleMovingAverageArray","rsi","relativeStrengthIndexArray","add_smoothed_serie","fn_to_use","smoothed","delta_serie","aligned","scaled","remaining","to_fill","splice","yDomainRatioY2","formatter1","value_formatter","tot_formatter","stats_formatter","yAxis1","yAxis1_formatter","second_axis_series","formatter2","value_formatter2","yAxis2","yAxis2_formatter","stats_table","stats","statistics","average","avg","total_cell","average_cell","min_cell","max_cell","perc_cell","min_val","min_val_idx","max_val_idx","enabled_series","updateState","source_aggregation","fail","xhr","status","statusText","always","pendingRequest","updateGraphsTableView","graph_old_view","graph_old_has_nindex","graph_old_nindex_query","tsQueryToTags","ts_query","reduce","pos","recheckGraphTableEntries","table_view","graph_table_views","graph_params","reset_selection","view_id","view","elem","html_id","min_step","items_ul","idx","next_item","nextAll","divider","first_view","setActiveGraphsTableView","has_nindex","nindex_query","per_page","graph_table","nindex_buttons","params_obj","nindex_view","col","title","field","textAlign","width","hidden","actions","white-space","text-align","old_dt","removeData","datatable","perPage","noResultsMessage","ts_chart","no_results_found","post","initial_point","detail_view","loadingYOffset","buttons","tableCallback","currentPage","stats_div","has_drilldown","some","row","drilldown","loading_time","num_records_processed","rowCallback","row_data","draw_processes_graph","graph_div_id","links","nodes","json","_link","forEach","source_pid","source","source_name","source_type","pid","target_pid","target_name","target_type","height","arrow_size","category10","layout","size","linkDistance","charge","tick","svg","selectAll","enter","path","circle","style","drag","href","text","linkArc","transform","dx","dy","y","dr","sqrt","makeUniqueValidator","items_function","cmp_name","memberValueValidator","member","makePasswordPatternValidator","pattern","passwordPatternValidator","passwordMatchValidator","other_input","not","poolnameValidator","passwordMatchRecheck","items","not_empty","hostOrMacValidator","ipAddressValidator"],"mappings":"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"} \ No newline at end of file diff --git a/httpdocs/js/ntopng_utils.js b/httpdocs/js/ntopng_utils.js index 558cf36e95a1..9b2749d50c09 100644 --- a/httpdocs/js/ntopng_utils.js +++ b/httpdocs/js/ntopng_utils.js @@ -540,6 +540,15 @@ 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 == "network") { + form.attr("action", http_prefix + "/lua/hosts_stats.lua"); + /* Must add also the network to properly set the destination link */ + $('').attr({ + type: 'hidden', + id: 'network', + name: 'network', + value: data.network, + }).appendTo(form); } else if (data.type == "snmp") { form.attr("action", http_prefix + "/lua/pro/enterprise/snmp_interface_details.lua"); /* Must add also the snmp port index to properly set the destination link */ diff --git a/scripts/lua/find_host.lua b/scripts/lua/find_host.lua index 2d3304ea95d0..efc7743cd015 100644 --- a/scripts/lua/find_host.lua +++ b/scripts/lua/find_host.lua @@ -41,6 +41,26 @@ for mac, name in pairs(mac_to_name) do end end +-- Look by network +local network_stats = interface.getNetworksStats() + +for network, stats in pairs(network_stats) do + local name = getFullLocalNetworkName(network) + + if string.contains(string.lower(name), string.lower(query)) then + local network_id = stats.network_id + + results[#results + 1] = { + name = name, + type="network", network = network_id, + } + + if #results >= max_num_to_find then + break + end + end +end + -- Check also in the mac addresses of snmp devices -- The query can be partial so we can't use functions to -- test if it'a an IPv4, an IPv6, or a mac as they would yield diff --git a/scripts/lua/modules/lua_utils.lua b/scripts/lua/modules/lua_utils.lua index 71e988f6ed8e..1e00534191c8 100644 --- a/scripts/lua/modules/lua_utils.lua +++ b/scripts/lua/modules/lua_utils.lua @@ -1573,14 +1573,14 @@ end -- ############################################## -function getLocalNetworkAliassKey() +function getLocalNetworkAliasKey() return "ntopng.network_aliases" end -- ############################################## function getLocalNetworkAlias(network) - local alias = ntop.getHashCache(getLocalNetworkAliassKey(), network) + local alias = ntop.getHashCache(getLocalNetworkAliasKey(), network) if not isEmptyString(alias) then return alias @@ -1605,9 +1605,9 @@ end function setLocalNetworkAlias(network, alias) if((network ~= alias) or isEmptyString(alias)) then - ntop.setHashCache(getLocalNetworkAliassKey(), network, alias) + ntop.setHashCache(getLocalNetworkAliasKey(), network, alias) else - ntop.delHashCache(getLocalNetworkAliassKey(), network) + ntop.delHashCache(getLocalNetworkAliasKey(), network) end end From 34b36422ad86283a42501c19a93009462272ec52 Mon Sep 17 00:00:00 2001 From: Simone Mainardi Date: Mon, 25 Mar 2019 17:34:54 +0100 Subject: [PATCH 3/8] Parses nProbe application latency --- include/Flow.h | 3 ++- src/NetworkInterface.cpp | 7 +++++-- src/ParserInterface.cpp | 2 -- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/include/Flow.h b/include/Flow.h index 0ac4c0bb4522..5d11663aaad4 100644 --- a/include/Flow.h +++ b/include/Flow.h @@ -457,7 +457,8 @@ class Flow : public GenericHashEntry { inline void setFlowNwLatency(const struct timeval * const tv, bool client) { if(client) memcpy(&clientNwLatency, tv, sizeof(*tv)); else memcpy(&serverNwLatency, tv, sizeof(*tv)); - }; + } + inline void setFlowApplLatency(float latency_msecs) { applLatencyMsec = latency_msecs; } inline bool setFlowDevice(u_int32_t device_ip, u_int16_t inidx, u_int16_t outidx) { if((flow_device.device_ip > 0 && flow_device.device_ip != device_ip) || (flow_device.in_index > 0 && flow_device.in_index != inidx) diff --git a/src/NetworkInterface.cpp b/src/NetworkInterface.cpp index b79779e4eec5..e71b16f5d478 100644 --- a/src/NetworkInterface.cpp +++ b/src/NetworkInterface.cpp @@ -1191,10 +1191,13 @@ void NetworkInterface::processFlow(ZMQ_Flow *zflow) { } if(zflow->core.tcp.clientNwLatency.tv_sec || zflow->core.tcp.clientNwLatency.tv_usec) - flow->setFlowNwLatency(&zflow->core.tcp.clientNwLatency, true /* Client */); + flow->setFlowNwLatency(&zflow->core.tcp.clientNwLatency, src2dst_direction); if(zflow->core.tcp.serverNwLatency.tv_sec || zflow->core.tcp.serverNwLatency.tv_usec) - flow->setFlowNwLatency(&zflow->core.tcp.serverNwLatency, false /* Server */); + flow->setFlowNwLatency(&zflow->core.tcp.serverNwLatency, !src2dst_direction); + + if(src2dst_direction) + flow->setFlowApplLatency(zflow->core.tcp.applLatencyMsec); /* Update flow device stats */ if(!flow->setFlowDevice(zflow->core.deviceIP, diff --git a/src/ParserInterface.cpp b/src/ParserInterface.cpp index 905d9d98c22a..513ed8879989 100755 --- a/src/ParserInterface.cpp +++ b/src/ParserInterface.cpp @@ -474,7 +474,6 @@ bool ParserInterface::parsePENNtopField(ZMQ_Flow * const flow, u_int32_t field, float client_nw_latency = atof(value); flow->core.tcp.clientNwLatency.tv_sec = client_nw_latency / 1e3; flow->core.tcp.clientNwLatency.tv_usec = 1e3 * (client_nw_latency - flow->core.tcp.clientNwLatency.tv_sec * 1e3); - break; } case SERVER_NW_LATENCY_MS: @@ -482,7 +481,6 @@ bool ParserInterface::parsePENNtopField(ZMQ_Flow * const flow, u_int32_t field, float server_nw_latency = atof(value); flow->core.tcp.serverNwLatency.tv_sec = server_nw_latency / 1e3; flow->core.tcp.serverNwLatency.tv_usec = 1e3 * (server_nw_latency - flow->core.tcp.serverNwLatency.tv_sec * 1e3); - break; } case APPL_LATENCY_MS: From e230c3a451b47ba9653ddf9b39b7b5079c8046d3 Mon Sep 17 00:00:00 2001 From: Luca Deri Date: Mon, 25 Mar 2019 18:54:45 +0100 Subject: [PATCH 4/8] SSL cleanup --- include/Flow.h | 25 ----------- src/Flow.cpp | 97 ---------------------------------------- src/NetworkInterface.cpp | 4 -- 3 files changed, 126 deletions(-) diff --git a/include/Flow.h b/include/Flow.h index 9a6095398d28..e1a4ad71e4ff 100644 --- a/include/Flow.h +++ b/include/Flow.h @@ -39,19 +39,6 @@ typedef struct { InterarrivalStats pktTime; } FlowPacketStats; -typedef enum { - SSL_STAGE_UNKNOWN = 0, - SSL_STAGE_HELLO, - SSL_STAGE_CCS -} FlowSSLStage; - -typedef enum { - SSL_ENCRYPTION_PLAIN = 0x0, - SSL_ENCRYPTION_SERVER = 0x1, - SSL_ENCRYPTION_CLIENT = 0x2, - SSL_ENCRYPTION_BOTH = 0x3, -} FlowSSLEncryptionStatus; - class Flow : public GenericHashEntry { private: Host *cli_host, *srv_host; @@ -107,13 +94,6 @@ class Flow : public GenericHashEntry { struct { char *certificate, *server_certificate; - FlowSSLStage cli_stage, srv_stage; - u_int8_t hs_packets; - bool is_data; - /* firstdata refers to the time where encryption is active on both ends */ - bool firstdata_seen; - struct timeval clienthello_time, hs_end_time, lastdata_time; - float hs_delta_time, delta_firstData, deltaTime_data; } ssl; struct { @@ -395,7 +375,6 @@ class Flow : public GenericHashEntry { void guessProtocol(); bool dumpFlow(bool dump_alert); bool match(AddressTree *ptree); - void dissectSSL(u_int8_t *payload, u_int16_t payload_len, const struct bpf_timeval *when, bool cli2srv); void dissectHTTP(bool src2dst_direction, char *payload, u_int16_t payload_len); void dissectSSDP(bool src2dst_direction, char *payload, u_int16_t payload_len); void dissectMDNS(u_int8_t *payload, u_int16_t payload_len); @@ -420,10 +399,6 @@ class Flow : public GenericHashEntry { inline char* getHTTPContentType() { return(isHTTP() ? protos.http.last_content_type : (char*)""); } inline char* getSSLCertificate() { return(isSSL() ? protos.ssl.certificate : (char*)""); } bool isSSLProto(); - inline bool isSSLData() { return(isSSLProto() && good_ssl_hs && protos.ssl.is_data); } - inline bool isSSLHandshake() { return(isSSLProto() && good_ssl_hs && !protos.ssl.is_data); } - inline bool hasSSLHandshakeEnded() { return(getSSLEncryptionStatus() == SSL_ENCRYPTION_BOTH); } - FlowSSLEncryptionStatus getSSLEncryptionStatus(); #if defined(NTOPNG_PRO) && !defined(HAVE_NEDGE) inline void updateProfile() { trafficProfile = iface->getFlowProfile(this); } diff --git a/src/Flow.cpp b/src/Flow.cpp index 7943b41ab82b..21269f1f665f 100644 --- a/src/Flow.cpp +++ b/src/Flow.cpp @@ -3319,98 +3319,6 @@ bool Flow::isLowGoodput() { return((((get_goodput_bytes()*100)/(get_bytes()+1 /* avoid zero divisions */)) < FLOW_GOODPUT_THRESHOLD) ? true : false); } -/* *************************************** */ - -void Flow::dissectSSL(u_int8_t *payload, u_int16_t payload_len, const struct bpf_timeval *when, bool cli2srv) { - uint16_t skiphello; - bool hs_now_end = false; - - if(good_ssl_hs && twh_over && payload_len >= SSL_MIN_PACKET_SIZE) { - if((cli2srv && (getSSLEncryptionStatus() & SSL_ENCRYPTION_CLIENT)) || - (!cli2srv && (getSSLEncryptionStatus() & SSL_ENCRYPTION_SERVER)) ) { - protos.ssl.is_data = true; - - if(!protos.ssl.firstdata_seen) { - if(getSSLEncryptionStatus() == SSL_ENCRYPTION_BOTH) { - memcpy(&protos.ssl.lastdata_time, when, sizeof(struct timeval)); - protos.ssl.delta_firstData = ((float)(Utils::timeval2usec(&protos.ssl.lastdata_time) - - Utils::timeval2usec(&protos.ssl.hs_end_time)))/1000; - ntop->getTrace()->traceEvent(TRACE_DEBUG, "[%p][%u.%u] SSL first (full) data: %u", - this, when->tv_sec, when->tv_usec, payload_len); - protos.ssl.firstdata_seen = true; - } - } else { - protos.ssl.deltaTime_data = ((float)(Utils::timeval2usec((struct timeval*)when) - - Utils::timeval2usec(&protos.ssl.lastdata_time)))/1000; - memcpy(&protos.ssl.lastdata_time, when, sizeof(struct timeval)); - } - } else { - protos.ssl.is_data = false; - - if(payload[0] == SSL_HANDSHAKE_PACKET) { - if(payload[5] == SSL_CLIENT_HELLO) { - if(protos.ssl.cli_stage == SSL_STAGE_UNKNOWN) { - memcpy(&protos.ssl.clienthello_time, when, sizeof(struct timeval)); - protos.ssl.cli_stage = SSL_STAGE_HELLO; - } - } else if((payload[5] == SSL_SERVER_HELLO) - && (protos.ssl.srv_stage == SSL_STAGE_UNKNOWN) - && (protos.ssl.cli_stage == SSL_STAGE_HELLO)) { - skiphello = 5 + 4 + ntohs(get_u_int16_t(payload, 7)); - - if((payload_len > skiphello) - && (payload[skiphello] == SSL_SERVER_CHANGE_CIPHER_SPEC)) { - protos.ssl.srv_stage = SSL_STAGE_CCS; - // here client encryption is still plain - } else { - protos.ssl.srv_stage = SSL_STAGE_HELLO; - } - } else if((payload[5] == SSL_CLIENT_KEY_EXCHANGE) - && (protos.ssl.cli_stage == SSL_STAGE_HELLO)) { - protos.ssl.cli_stage = SSL_STAGE_CCS; - - if(getSSLEncryptionStatus() == SSL_ENCRYPTION_BOTH) - hs_now_end = true; - } else if((payload[5] == SSL_NEW_SESSION_TICKET) - && (protos.ssl.srv_stage == SSL_STAGE_HELLO)) { - protos.ssl.srv_stage = SSL_STAGE_CCS; - - if(getSSLEncryptionStatus() == SSL_ENCRYPTION_BOTH) - hs_now_end = true; - } - } else if((payload[0] == SSL_SERVER_CHANGE_CIPHER_SPEC) - && (protos.ssl.srv_stage == SSL_STAGE_HELLO)) { - protos.ssl.srv_stage = SSL_STAGE_CCS; - if(getSSLEncryptionStatus() == SSL_ENCRYPTION_BOTH) - hs_now_end = true; - } - - if(hs_now_end) { - // both client and server CCS appeared here - memcpy(&protos.ssl.hs_end_time, when, sizeof(struct timeval)); - protos.ssl.hs_delta_time = ((float)(Utils::timeval2usec(&protos.ssl.hs_end_time) - - Utils::timeval2usec(&protos.ssl.clienthello_time)))/1000; - } - - protos.ssl.hs_packets++; - good_ssl_hs &= protos.ssl.hs_packets <= SSL_MAX_HANDSHAKE_PCKS; - } - } -} - -/* ***************************************************** */ - -FlowSSLEncryptionStatus Flow::getSSLEncryptionStatus() { - if(isSSLProto()) { - return(FlowSSLEncryptionStatus)( - ((protos.ssl.srv_stage == SSL_STAGE_CCS) << 0) | - ((protos.ssl.cli_stage == SSL_STAGE_CCS) << 1) - ); - } - - return SSL_ENCRYPTION_PLAIN; -} - /* ***************************************************** */ FlowStatus Flow::getFlowStatus() { @@ -3471,11 +3379,6 @@ FlowStatus Flow::getFlowStatus() { /* 3WH is over */ switch(l7proto) { case NDPI_PROTOCOL_SSL: -#ifndef HAVE_NEDGE - if(!protos.ssl.firstdata_seen && isIdle) - return status_slow_application_header; -#endif - if(protos.ssl.certificate && protos.ssl.server_certificate) { if(protos.ssl.server_certificate[0] == '*') { if(!strstr(protos.ssl.certificate, &protos.ssl.server_certificate[1])) diff --git a/src/NetworkInterface.cpp b/src/NetworkInterface.cpp index 269289993fbc..07e26f7b1ef4 100644 --- a/src/NetworkInterface.cpp +++ b/src/NetworkInterface.cpp @@ -1874,10 +1874,6 @@ bool NetworkInterface::processPacket(u_int32_t bridge_iface_idx, if((src_port == dst_port) && (dst_port == htons(17500))) flow->get_cli_host()->dissectDropbox((const char *)payload, payload_len); break; - - default: - if(flow->isSSLProto()) - flow->dissectSSL(payload, payload_len, when, src2dst_direction); } flow->processDetectedProtocol(); From 3fcb15cda22adef1c8aeff67bc20f7368ff4e48a Mon Sep 17 00:00:00 2001 From: Simone Mainardi Date: Mon, 25 Mar 2019 20:31:13 +0100 Subject: [PATCH 5/8] Handles TCP flags via nProbe --- include/Flow.h | 14 +++++++-- include/Host.h | 2 +- include/ntop_flow.h | 8 +++-- include/ntop_typedefs.h | 3 +- scripts/lua/modules/flow_utils.lua | 22 +++++++------- src/Flow.cpp | 48 +++++++++++++++++++++++++++--- src/Host.cpp | 2 +- src/NetworkInterface.cpp | 15 +++++++--- src/ParserInterface.cpp | 6 +++- 9 files changed, 91 insertions(+), 29 deletions(-) diff --git a/include/Flow.h b/include/Flow.h index 7679471bdd90..66892db6f8bb 100644 --- a/include/Flow.h +++ b/include/Flow.h @@ -257,6 +257,7 @@ class Flow : public GenericHashEntry { inline char* getBitTorrentHash() { return(bt_hash); }; inline void setBTHash(char *h) { if(!h) return; if(bt_hash) { free(bt_hash); bt_hash = NULL; }; bt_hash = strdup(h); } inline void setServerName(char *v) { if(host_server_name) free(host_server_name); host_server_name = strdup(v); } + void setTcpFlags(u_int8_t flags, bool src2dst_direction); void updateTcpFlags(const struct bpf_timeval *when, u_int8_t flags, bool src2dst_direction); void incTcpBadStats(bool src2dst_direction, @@ -430,8 +431,17 @@ class Flow : public GenericHashEntry { inline void setVRFid(u_int32_t v) { vrfId = v; } inline void setFlowNwLatency(const struct timeval * const tv, bool client) { - if(client) memcpy(&clientNwLatency, tv, sizeof(*tv)); - else memcpy(&serverNwLatency, tv, sizeof(*tv)); + if(client) { + memcpy(&clientNwLatency, tv, sizeof(*tv)); + if(cli_host) cli_host->updateRoundTripTime(Utils::timeval2ms(&clientNwLatency)); + } else { + memcpy(&serverNwLatency, tv, sizeof(*tv)); + if(srv_host) srv_host->updateRoundTripTime(Utils::timeval2ms(&serverNwLatency)); + } + } + inline void setRtt() { + rttSec = ((float)(serverNwLatency.tv_sec + clientNwLatency.tv_sec)) + +((float)(serverNwLatency.tv_usec + clientNwLatency.tv_usec)) / (float)1000000; } inline void setFlowApplLatency(float latency_msecs) { applLatencyMsec = latency_msecs; } inline bool setFlowDevice(u_int32_t device_ip, u_int16_t inidx, u_int16_t outidx) { diff --git a/include/Host.h b/include/Host.h index 048bc5e6bc0d..597f844c1086 100644 --- a/include/Host.h +++ b/include/Host.h @@ -221,7 +221,7 @@ class Host : public GenericHashEntry { virtual void serialize2redis() {}; bool addIfMatching(lua_State* vm, AddressTree * ptree, char *key); bool addIfMatching(lua_State* vm, u_int8_t *mac); - void updateSynFlags(time_t when, u_int8_t flags, Flow *f, bool syn_sent); + void updateSynAlertsCounter(time_t when, u_int8_t flags, Flow *f, bool syn_sent); inline void updateRoundTripTime(u_int32_t rtt_msecs) { if(as) as->updateRoundTripTime(rtt_msecs); } diff --git a/include/ntop_flow.h b/include/ntop_flow.h index 63b26d3bf12e..ff9096d19956 100644 --- a/include/ntop_flow.h +++ b/include/ntop_flow.h @@ -158,11 +158,13 @@ #define DST_AS_MAP NTOP_BASE_ID+444 #define NPROBE_IPV4_ADDRESS NTOP_BASE_ID+471 /* Exported only via ZMQ */ /* NTOP_BASE_ID+82 ->87 Available (deprecated) */ -#define NUM_PKTS_UP_TO_128_BYTES NTOP_BASE_ID+88 +#define CLIENT_TCP_FLAGS NTOP_BASE_ID+78 +#define SERVER_TCP_FLAGS NTOP_BASE_ID+79 +#define NUM_PKTS_UP_TO_128_BYTES NTOP_BASE_ID+88 #define NUM_PKTS_128_TO_256_BYTES NTOP_BASE_ID+89 #define NUM_PKTS_256_TO_512_BYTES NTOP_BASE_ID+90 -#define NUM_PKTS_512_TO_1024_BYTES NTOP_BASE_ID+91 -#define NUM_PKTS_1024_TO_1514_BYTES NTOP_BASE_ID+92 +#define NUM_PKTS_512_TO_1024_BYTES NTOP_BASE_ID+91 +#define NUM_PKTS_1024_TO_1514_BYTES NTOP_BASE_ID+92 #define NUM_PKTS_OVER_1514_BYTES NTOP_BASE_ID+93 #define CUMULATIVE_ICMP_TYPE NTOP_BASE_ID+98 #define SRC_IP_COUNTRY NTOP_BASE_ID+101 diff --git a/include/ntop_typedefs.h b/include/ntop_typedefs.h index 641f0f467cd8..808d8eabddf5 100644 --- a/include/ntop_typedefs.h +++ b/include/ntop_typedefs.h @@ -189,10 +189,11 @@ typedef struct zmq_flow_core { u_int16_t src_port, dst_port, inIndex, outIndex; ndpi_proto l7_proto; u_int16_t vlan_id, pkt_sampling_rate; - u_int8_t l4_proto, tcp_flags; + u_int8_t l4_proto; u_int32_t in_pkts, in_bytes, out_pkts, out_bytes, vrfId; u_int8_t absolute_packet_octet_counters; struct { + u_int8_t tcp_flags, client_tcp_flags, server_tcp_flags; u_int32_t ooo_in_pkts, ooo_out_pkts; u_int32_t retr_in_pkts, retr_out_pkts; u_int32_t lost_in_pkts, lost_out_pkts; diff --git a/scripts/lua/modules/flow_utils.lua b/scripts/lua/modules/flow_utils.lua index fd5ca78c7cc3..a088113d486a 100644 --- a/scripts/lua/modules/flow_utils.lua +++ b/scripts/lua/modules/flow_utils.lua @@ -2042,28 +2042,26 @@ function printActiveFlowsDropdown(base_url, page_params, ifstats, ndpistats) \ ']] - if interface.isPacketInterface() then - -- TCP flow state filter - local tcp_state_params = table.clone(page_params) - tcp_state_params["tcp_flow_state"] = nil + -- TCP flow state filter + local tcp_state_params = table.clone(page_params) + tcp_state_params["tcp_flow_state"] = nil - print[[, '\ + print[[, '\
\ \ \
\ ']] - end -- Unidirectional flows selector local traffic_type_params = table.clone(page_params) diff --git a/src/Flow.cpp b/src/Flow.cpp index 21269f1f665f..33776ad7343f 100644 --- a/src/Flow.cpp +++ b/src/Flow.cpp @@ -2412,18 +2412,59 @@ void Flow::addFlowStats(bool cli2srv_direction, pkts_thpt = (cli2srv_packets + srv2cli_packets) / (float)(last_seen - first_seen); } } +/* *************************************** */ + +void Flow::setTcpFlags(u_int8_t flags, bool src2dst_direction) { + if(iface->isPacketInterface()) + return; /* Use updateTcpFlags for packet interfaces */ + + iface->incFlagsStats(flags); + + if(cli_host) cli_host->incFlagStats(src2dst_direction, flags); + if(srv_host) srv_host->incFlagStats(!src2dst_direction, flags); + + if((flags & TH_SYN) && (((src2dst_tcp_flags | dst2src_tcp_flags) & TH_SYN) != TH_SYN)) + iface->getTcpFlowStats()->incSyn(); + + if((flags & TH_RST) && (((src2dst_tcp_flags | dst2src_tcp_flags) & TH_RST) != TH_RST)) + iface->getTcpFlowStats()->incReset(); + + if((flags & TH_FIN) && (((src2dst_tcp_flags | dst2src_tcp_flags) & TH_FIN) != TH_FIN)) + iface->getTcpFlowStats()->incFin(); + + /* The update below must be after the above check */ + if(src2dst_direction) + src2dst_tcp_flags |= flags; + else + dst2src_tcp_flags |= flags; + + if(!twh_over) { + if((src2dst_tcp_flags & (TH_SYN|TH_ACK)) == (TH_SYN|TH_ACK) + && ((dst2src_tcp_flags & (TH_SYN|TH_ACK)) == (TH_SYN|TH_ACK))) + twh_ok = twh_over = true, + iface->getTcpFlowStats()->incEstablished(); + } + + /* Can't set these guys for non-packet interfaces */ + memset(&synTime, 0, sizeof(synTime)), + memset(&synAckTime, 0, sizeof(synAckTime)), + memset(&ackTime, 0, sizeof(ackTime)); +} /* *************************************** */ void Flow::updateTcpFlags(const struct bpf_timeval *when, u_int8_t flags, bool src2dst_direction) { + if(!iface->isPacketInterface()) + return; /* Use setTcpFlags for non-packet interfaces */ + iface->incFlagsStats(flags); if(cli_host) cli_host->incFlagStats(src2dst_direction, flags); if(srv_host) srv_host->incFlagStats(!src2dst_direction, flags); if(flags == TH_SYN) { - if(cli_host) cli_host->updateSynFlags(when->tv_sec, flags, this, true); - if(srv_host) srv_host->updateSynFlags(when->tv_sec, flags, this, false); + if(cli_host) cli_host->updateSynAlertsCounter(when->tv_sec, flags, this, true); + if(srv_host) srv_host->updateSynAlertsCounter(when->tv_sec, flags, this, false); } if((flags & TH_SYN) && (((src2dst_tcp_flags | dst2src_tcp_flags) & TH_SYN) != TH_SYN)) @@ -2467,8 +2508,7 @@ void Flow::updateTcpFlags(const struct bpf_timeval *when, else if(cli_host) cli_host->updateRoundTripTime(Utils::timeval2ms(&clientNwLatency)); - rttSec = ((float)(serverNwLatency.tv_sec+clientNwLatency.tv_sec)) - +((float)(serverNwLatency.tv_usec+clientNwLatency.tv_usec))/(float)1000000; + setRtt(); twh_ok = true; } diff --git a/src/Host.cpp b/src/Host.cpp index 9c0b44d70208..f98a63d73468 100644 --- a/src/Host.cpp +++ b/src/Host.cpp @@ -90,7 +90,7 @@ Host::~Host() { /* *************************************** */ -void Host::updateSynFlags(time_t when, u_int8_t flags, Flow *f, bool syn_sent) { +void Host::updateSynAlertsCounter(time_t when, u_int8_t flags, Flow *f, bool syn_sent) { AlertCounter *counter = syn_sent ? syn_flood_attacker_alert : syn_flood_victim_alert; if(triggerAlerts()) diff --git a/src/NetworkInterface.cpp b/src/NetworkInterface.cpp index 88b018ac46fe..8e68dc91d2ce 100644 --- a/src/NetworkInterface.cpp +++ b/src/NetworkInterface.cpp @@ -1196,6 +1196,8 @@ void NetworkInterface::processFlow(ZMQ_Flow *zflow) { if(zflow->core.tcp.serverNwLatency.tv_sec || zflow->core.tcp.serverNwLatency.tv_usec) flow->setFlowNwLatency(&zflow->core.tcp.serverNwLatency, !src2dst_direction); + flow->setRtt(); + if(src2dst_direction) flow->setFlowApplLatency(zflow->core.tcp.applLatencyMsec); @@ -1242,11 +1244,16 @@ void NetworkInterface::processFlow(ZMQ_Flow *zflow) { } if(zflow->core.l4_proto == IPPROTO_TCP) { - struct timeval when; + if(zflow->core.tcp.client_tcp_flags || zflow->core.tcp.server_tcp_flags) { + /* There's a breadown between client and server TCP flags */ + if(zflow->core.tcp.client_tcp_flags) + flow->setTcpFlags(zflow->core.tcp.client_tcp_flags, src2dst_direction); + if(zflow->core.tcp.server_tcp_flags) + flow->setTcpFlags(zflow->core.tcp.server_tcp_flags, !src2dst_direction); + } else if(zflow->core.tcp.tcp_flags) + /* TCP flags are cumulated client + server */ + flow->setTcpFlags(zflow->core.tcp.tcp_flags, src2dst_direction); - when.tv_sec = (long)now, when.tv_usec = 0; - flow->updateTcpFlags((const struct bpf_timeval*)&when, - zflow->core.tcp_flags, src2dst_direction); flow->incTcpBadStats(true, zflow->core.tcp.ooo_in_pkts, zflow->core.tcp.retr_in_pkts, zflow->core.tcp.lost_in_pkts); diff --git a/src/ParserInterface.cpp b/src/ParserInterface.cpp index 513ed8879989..29f80fa82660 100755 --- a/src/ParserInterface.cpp +++ b/src/ParserInterface.cpp @@ -341,7 +341,7 @@ bool ParserInterface::parsePENZeroField(ZMQ_Flow * const flow, u_int32_t field, flow->core.l4_proto = atoi(value); break; case TCP_FLAGS: - flow->core.tcp_flags = atoi(value); + flow->core.tcp.tcp_flags = atoi(value); break; case INITIATOR_PKTS: flow->core.absolute_packet_octet_counters = true; @@ -483,6 +483,10 @@ bool ParserInterface::parsePENNtopField(ZMQ_Flow * const flow, u_int32_t field, flow->core.tcp.serverNwLatency.tv_usec = 1e3 * (server_nw_latency - flow->core.tcp.serverNwLatency.tv_sec * 1e3); break; } + case CLIENT_TCP_FLAGS: + flow->core.tcp.client_tcp_flags = atoi(value); + case SERVER_TCP_FLAGS: + flow->core.tcp.server_tcp_flags = atoi(value); case APPL_LATENCY_MS: flow->core.tcp.applLatencyMsec = atof(value); break; From aa8d228aed3bc3be18bc0081412f5ad27617a5be Mon Sep 17 00:00:00 2001 From: Simone Mainardi Date: Mon, 25 Mar 2019 21:26:20 +0100 Subject: [PATCH 6/8] Globals cleanup --- scripts/lua/host_pkt_distro.lua | 72 ++++++++++++++++----------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/scripts/lua/host_pkt_distro.lua b/scripts/lua/host_pkt_distro.lua index ff2bb2a98190..f5d43bfb1d0a 100644 --- a/scripts/lua/host_pkt_distro.lua +++ b/scripts/lua/host_pkt_distro.lua @@ -2,7 +2,7 @@ -- (C) 2013-18 - ntop.org -- -dirs = ntop.getDirs() +local dirs = ntop.getDirs() package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path require "lua_utils" @@ -11,55 +11,55 @@ sendHTTPContentTypeHeader('text/html') interface.select(ifname) -mode = _GET["direction"] -type = _GET["distr"] -host_info = url2hostinfo(_GET) -host = interface.getHostInfo(host_info["host"],host_info["vlan"]) +local mode = _GET["direction"] +local type = _GET["distr"] +local host_info = url2hostinfo(_GET) +local host = interface.getHostInfo(host_info["host"],host_info["vlan"]) if(host == nil) then print("
This flow cannot be found (expired ?)
") else -if((type == nil) or (type == "size")) then - - if((mode == nil) or (mode == "sent")) then - - what = host["pktStats.sent"] - - else - - what = host["pktStats.recv"] + if((type == nil) or (type == "size")) then + + if((mode == nil) or (mode == "sent")) then + + what = host["pktStats.sent"] + + else + + what = host["pktStats.recv"] + end end -end -tot = 0 -for key, value in pairs(what) do - tot = tot + value -end + local tot = 0 + for key, value in pairs(what) do + tot = tot + value + end + + local threshold = (5 * tot) / 100 -threshold = (5 * tot) / 100 + print "[\n" + local num = 0 + local s = 0 + for key, value in pairs(what) do + if(value > threshold) then + if(num > 0) then + print ",\n" + end -print "[\n" -num = 0 -s = 0 -for key, value in pairs(what) do - if(value > threshold) then - if(num > 0) then - print ",\n" + print("\t { \"label\": \"" .. key .."\", \"value\": ".. value .." }") + num = num + 1 + s = s + value end - - print("\t { \"label\": \"" .. key .."\", \"value\": ".. value .." }") - num = num + 1 - s = s + value end -end -if(tot > s) then - print(",\t { \"label\": \"Other\", \"value\": ".. (tot-s) .." }") -end + if(tot > s) then + print(",\t { \"label\": \"Other\", \"value\": ".. (tot-s) .." }") + end -print "\n]" + print "\n]" end From 0e785d58f92558e18f4e87fe2493e7f3553b9e0f Mon Sep 17 00:00:00 2001 From: Salvatore Costantino <40372400+SalvatoreCostantino@users.noreply.github.com> Date: Mon, 25 Mar 2019 21:29:36 +0100 Subject: [PATCH 7/8] Added new time series (#2481) --- scripts/lua/host_details.lua | 5 +++ .../modules/timeseries/schemas/ts_5min.lua | 43 +++++++++++++++++++ scripts/lua/modules/ts_5min_dump_utils.lua | 43 ++++++++++++++++++- 3 files changed, 90 insertions(+), 1 deletion(-) diff --git a/scripts/lua/host_details.lua b/scripts/lua/host_details.lua index 1e3a9f434708..af254d4487b2 100644 --- a/scripts/lua/host_details.lua +++ b/scripts/lua/host_details.lua @@ -1930,6 +1930,11 @@ drawGraphs(ifId, schema, tags, _GET["zoom"], url, selected_epoch, { {schema="host:unreachable_flows", label=i18n("graphs.total_unreachable_flows")}, {schema="host:contacts", label=i18n("graphs.active_host_contacts")}, {schema="host:total_alerts", label=i18n("details.alerts")}, + {schema="host:dns_pkts_rcvd", label="DNS Packets Rcvd"}, + {schema="host:dns_pkts_sent", label="DNS Packets Sent"}, + {schema="host:arp_requests_pkts", label="ARP Requests Packets"}, + {schema="host:udp_pkts", label="UDP Packets"}, + {schema="host:tcp_pkts_stats", label="TCP Packets Stats"}, {schema="host:1d_delta_traffic_volume", label="1 Day Traffic Delta"}, -- TODO localize {schema="host:1d_delta_flows", label="1 Day Active Flows Delta"}, -- TODO localize diff --git a/scripts/lua/modules/timeseries/schemas/ts_5min.lua b/scripts/lua/modules/timeseries/schemas/ts_5min.lua index a1decba3ed8e..808a354dadf1 100644 --- a/scripts/lua/modules/timeseries/schemas/ts_5min.lua +++ b/scripts/lua/modules/timeseries/schemas/ts_5min.lua @@ -190,6 +190,49 @@ schema:addMetric("flows_as_server") -- ############################################## +schema = ts_utils.newSchema("host:tcp_pkts_stats", {step = 300}) +schema:addTag("ifid") +schema:addTag("host") +schema:addMetric("retransmission_packets") +schema:addMetric("out_of_order_packets") +schema:addMetric("lost_packets") + +-- ############################################## + +schema = ts_utils.newSchema("host:dns_pkts_sent", {step = 300}) +schema:addTag("ifid") +schema:addTag("host") +schema:addMetric("queries_packets") +schema:addMetric("replies_ok_packets") +schema:addMetric("replies_error_packets") + +-- ############################################## + +schema = ts_utils.newSchema("host:dns_pkts_rcvd", {step = 300}) +schema:addTag("ifid") +schema:addTag("host") +schema:addMetric("queries_packets") +schema:addMetric("replies_ok_packets") +schema:addMetric("replies_error_packets") + +-- ############################################## + +schema = ts_utils.newSchema("host:arp_requests_pkts", {step = 300}) +schema:addTag("ifid") +schema:addTag("host") +schema:addMetric("requests_packets_sent") +schema:addMetric("requests_packets_rcvd") + +-- ############################################## + +schema = ts_utils.newSchema("host:udp_pkts", {step = 300}) +schema:addTag("ifid") +schema:addTag("host") +schema:addMetric("packets_sent") +schema:addMetric("packets_rcvd") + +-- ############################################## + schema = ts_utils.newSchema("host:total_alerts", {step = 300, rrd_fname = "total_alerts"}) schema:addTag("ifid") schema:addTag("host") diff --git a/scripts/lua/modules/ts_5min_dump_utils.lua b/scripts/lua/modules/ts_5min_dump_utils.lua index 5ba2caf46bf7..7227b25f949e 100644 --- a/scripts/lua/modules/ts_5min_dump_utils.lua +++ b/scripts/lua/modules/ts_5min_dump_utils.lua @@ -187,7 +187,48 @@ function ts_dump.host_update_stats_rrds(when, hostname, host, ifstats, verbose) ts_utils.append("host:unreachable_flows", {ifid = ifstats.id, host = hostname, flows_as_client = host["unreachable_flows.as_client"], flows_as_server = host["unreachable_flows.as_server"]}, - when, verbose) + when, verbose) + + interface.select(tostring(ifstats.id)) + + local host_ = interface.getHostInfo(hostname) + + if(host_ ~= nil) then + + ts_utils.append("host:tcp_pkts_stats", {ifid = ifstats.id, host = hostname, + retransmission_packets = host_["tcp.packets.retransmissions"], + out_of_order_packets = host_["tcp.packets.out_of_order"], + lost_packets = host_["tcp.packets.lost"]}, + when, verbose) + + ts_utils.append("host:dns_pkts_sent", {ifid = ifstats.id, host = hostname, + queries_packets = host_["dns"]["sent"]["num_queries"], + replies_ok_packets = host_["dns"]["sent"]["num_replies_ok"], + replies_error_packets = host_["dns"]["sent"]["num_replies_error"]}, + when, verbose) + + ts_utils.append("host:dns_pkts_rcvd",{ifid = ifstats.id, host = hostname, + queries_packets = host_["dns"]["rcvd"]["num_queries"], + replies_ok_packets = host_["dns"]["rcvd"]["num_replies_ok"], + replies_error_packets = host_["dns"]["rcvd"]["num_replies_error"]}, + when, verbose) + + ts_utils.append("host:udp_pkts", {ifid = ifstats.id, host = hostname, + packets_sent = host_["udp.packets.sent"], + packets_rcvd = host_["udp.packets.rcvd"]}, + when, verbose) + + local stats = interface.getMacInfo(host_["mac"]) + + if(stats ~= nil) then + + ts_utils.append("host:arp_requests_pkts", {ifid = ifstats.id, host = hostname, + requests_packets_sent = stats["arp_requests.sent"], + requests_packets_rcvd = stats["arp_requests.rcvd"]}, + when, verbose) + end + + end -- Total number of alerts ts_utils.append("host:total_alerts", {ifid = ifstats.id, host = hostname, From afda95c8d6c6f367bc0355600f2b94d063c057f2 Mon Sep 17 00:00:00 2001 From: Luca Deri Date: Mon, 25 Mar 2019 23:54:02 +0100 Subject: [PATCH 8/8] Added SSL certificate dissection --- include/Flow.h | 5 ++ src/Flow.cpp | 77 +++++++++++++++++++++++ src/NetworkInterface.cpp | 133 ++++++++++++++++++++------------------- 3 files changed, 151 insertions(+), 64 deletions(-) diff --git a/include/Flow.h b/include/Flow.h index 7679471bdd90..481f7e62d9f4 100644 --- a/include/Flow.h +++ b/include/Flow.h @@ -94,6 +94,10 @@ class Flow : public GenericHashEntry { struct { char *certificate, *server_certificate; + /* Certificate dissection */ + char *certificate_buf_leftover; + u_int certificate_leftover; + bool dissect_certificate; } ssl; struct { @@ -376,6 +380,7 @@ class Flow : public GenericHashEntry { bool dumpFlow(bool dump_alert); bool match(AddressTree *ptree); void dissectHTTP(bool src2dst_direction, char *payload, u_int16_t payload_len); + void dissectSSL(char *payload, u_int16_t payload_len); void dissectSSDP(bool src2dst_direction, char *payload, u_int16_t payload_len); void dissectMDNS(u_int8_t *payload, u_int16_t payload_len); void dissectBittorrent(char *payload, u_int16_t payload_len); diff --git a/src/Flow.cpp b/src/Flow.cpp index 21269f1f665f..cdee76d1ff6a 100644 --- a/src/Flow.cpp +++ b/src/Flow.cpp @@ -160,6 +160,8 @@ Flow::Flow(NetworkInterface *_iface, setDetectedProtocol(ndpiDetectedProtocol, true); break; } + + protos.ssl.dissect_certificate = true; // FIX } /* *************************************** */ @@ -3598,3 +3600,78 @@ void Flow::fillZmqFlowCategory() { } } } + +/* ***************************************************** */ + +void Flow::dissectSSL(char *payload, u_int16_t payload_len) { + if(protos.ssl.dissect_certificate) { + u_int16_t _payload_len = payload_len+protos.ssl.certificate_leftover; + u_char *_payload = (u_char*)malloc(_payload_len); + bool find_initial_pattern = true; + + if(!_payload) + return; + else { + int i = 0; + + if(protos.ssl.certificate_leftover > 0) { + memcpy(_payload, protos.ssl.certificate_buf_leftover, (i = protos.ssl.certificate_leftover)); + free(protos.ssl.certificate_buf_leftover); + protos.ssl.certificate_buf_leftover = NULL, protos.ssl.certificate_leftover = 0; + find_initial_pattern = false; + } + + memcpy(&_payload[i], payload, payload_len); + } + + for(u_int i = (find_initial_pattern ? 9 : 0); i < _payload_len-4; i++) { + if((find_initial_pattern && (_payload[i] == 0x55) && (_payload[i+1] == 0x1d) && (_payload[i+2] == 0x11)) + || (!find_initial_pattern)) { + if(find_initial_pattern) + i += 11; + + while(i < _payload_len) { + if(_payload[i] == 0x82) { + u_int8_t len = _payload[i+1]; + + i += 2; + + if((i+len) < _payload_len) { + if((len < 3) + || ((!isalpha(_payload[i])) && (_payload[i] != '*')) + || (_payload[i+len] != 0x82) + ) { + protos.ssl.dissect_certificate = false; + break; + } else { + char buf[len+1]; + + strncpy(buf, (const char*)&_payload[i], len); + buf[len] = '\0'; +#if 0 + ntop->getTrace()->traceEvent(TRACE_NORMAL, "%s [Len %u]", buf, len); +#endif + } + } else { + i -= 2; + /* ntop->getTrace()->traceEvent(TRACE_NORMAL, "Leftover %u bytes [%u len]", _payload_len-i, len); */ + protos.ssl.certificate_leftover = _payload_len-i; + + if((protos.ssl.certificate_buf_leftover = (char*)malloc(protos.ssl.certificate_leftover)) != NULL) + memcpy(protos.ssl.certificate_buf_leftover, &_payload[i], protos.ssl.certificate_leftover); + else + protos.ssl.certificate_leftover = 0; + } + + i += len; + } else { + protos.ssl.dissect_certificate = false; + break; + } + } + } + } /* for */ + + free(_payload); + } +} diff --git a/src/NetworkInterface.cpp b/src/NetworkInterface.cpp index 88b018ac46fe..6451f16a8a28 100644 --- a/src/NetworkInterface.cpp +++ b/src/NetworkInterface.cpp @@ -297,7 +297,7 @@ void NetworkInterface::init() { pollLoopCreated = false, bridge_interface = false, mdns = NULL, discovery = NULL, ifDescription = NULL, flowHashingMode = flowhashing_none; - macs_hash = NULL, ases_hash = NULL, countries_hash = NULL, vlans_hash = NULL, + macs_hash = NULL, ases_hash = NULL, countries_hash = NULL, vlans_hash = NULL, arp_hash_matrix = NULL; numSubInterfaces = 0; @@ -305,7 +305,7 @@ void NetworkInterface::init() { reload_custom_categories = reload_hosts_blacklist = false; reload_hosts_bcast_domain = false; hosts_bcast_domain_last_update = 0; - + ip_addresses = "", networkStats = NULL, pcap_datalink_type = 0, cpu_affinity = -1; hide_from_top = hide_from_top_shadow = NULL; @@ -567,7 +567,7 @@ void NetworkInterface::deleteDataStructures() { if(vlans_hash) { delete(vlans_hash); vlans_hash = NULL; } if(macs_hash) { delete(macs_hash); macs_hash = NULL; } if(arp_hash_matrix) { delete(arp_hash_matrix); arp_hash_matrix = NULL; } - + #ifdef NTOPNG_PRO if(aggregated_flows_hash) { aggregated_flows_hash->cleanup(); @@ -668,7 +668,7 @@ NetworkInterface::~NetworkInterface() { int NetworkInterface::dumpFlow(time_t when, Flow *f) { int rc = -1; - + #ifndef HAVE_NEDGE char *json; bool es_flow = ntop->getPrefs()->do_dump_flows_on_es() || @@ -1421,7 +1421,7 @@ bool NetworkInterface::processPacket(u_int32_t bridge_iface_idx, if(((iph->ihl * 4) > ipsize) || (ipsize < ntohs(iph->tot_len)) || (iph->frag_off & htons(0x1FFF /* IP_OFFSET */)) != 0) - is_fragment = true; + is_fragment = true; l4_packet_len = ntohs(iph->tot_len) - (iph->ihl * 4); l4_proto = iph->protocol; @@ -1590,24 +1590,24 @@ bool NetworkInterface::processPacket(u_int32_t bridge_iface_idx, /* Neighbor Solicitation and Neighbor Advertisement have the Target Address at offset 8. - + https://tools.ietf.org/html/rfc2461#section-4.1 */ Host * target_address_h; IpAddress target_address; - + target_address.set((ndpi_in6_addr*)&l4[8]); char buf[64]; ntop->getTrace()->traceEvent(TRACE_WARNING, "->> %s", target_address.print(buf, sizeof(buf))); - + if(target_address.isNonEmptyUnicastAddress() && (target_address_h = getHost(&target_address, vlan_id)) && (!target_address_h->isBroadcastDomainHost())) target_address_h->setBroadcastDomainHost(); } #endif - + flow->setICMP(src2dst_direction, icmp_type, icmp_code, l4); if(l4_proto == IPPROTO_ICMP) icmp_v4.incStats(icmp_type, icmp_code, is_sent_packet, NULL); @@ -1673,70 +1673,70 @@ bool NetworkInterface::processPacket(u_int32_t bridge_iface_idx, switch(ndpi_get_lower_proto(flow->get_detected_protocol())) { case NDPI_PROTOCOL_DHCP: - { - Mac *mac = (*srcHost)->getMac(), *payload_cli_mac; + { + Mac *mac = (*srcHost)->getMac(), *payload_cli_mac; - if(mac && (payload_len > 240)) { - struct dhcp_packet *dhcpp = (struct dhcp_packet*)payload; + if(mac && (payload_len > 240)) { + struct dhcp_packet *dhcpp = (struct dhcp_packet*)payload; - if(dhcpp->msgType == 0x01) /* Request */ - ;//mac->setDhcpHost(); - else if(dhcpp->msgType == 0x02) /* Reply */ - checkMacIPAssociation(false, dhcpp->chaddr, dhcpp->yiaddr); + if(dhcpp->msgType == 0x01) /* Request */ + ;//mac->setDhcpHost(); + else if(dhcpp->msgType == 0x02) /* Reply */ + checkMacIPAssociation(false, dhcpp->chaddr, dhcpp->yiaddr); - for(int i = 240; igetTrace()->traceEvent(TRACE_WARNING, "[DHCP] [id=%u][len=%u]", id, len); + ntop->getTrace()->traceEvent(TRACE_WARNING, "[DHCP] [id=%u][len=%u]", id, len); #endif - if(id == 12 /* Host Name */) { - char name[64], buf[24], *client_mac, key[64]; - int j; + if(id == 12 /* Host Name */) { + char name[64], buf[24], *client_mac, key[64]; + int j; - j = ndpi_min(len, sizeof(name)-1); - strncpy((char*)name, (char*)&payload[i+2], j); - name[j] = '\0'; + j = ndpi_min(len, sizeof(name)-1); + strncpy((char*)name, (char*)&payload[i+2], j); + name[j] = '\0'; - client_mac = Utils::formatMac(&payload[28], buf, sizeof(buf)); - ntop->getTrace()->traceEvent(TRACE_INFO, "[DHCP] %s = '%s'", client_mac, name); + client_mac = Utils::formatMac(&payload[28], buf, sizeof(buf)); + ntop->getTrace()->traceEvent(TRACE_INFO, "[DHCP] %s = '%s'", client_mac, name); - snprintf(key, sizeof(key), DHCP_CACHE, get_id()); - ntop->getRedis()->hashSet(key, client_mac, name); + snprintf(key, sizeof(key), DHCP_CACHE, get_id()); + ntop->getRedis()->hashSet(key, client_mac, name); - if((payload_cli_mac = getMac(&payload[28], false))) - payload_cli_mac->inlineSetDHCPName(name); + if((payload_cli_mac = getMac(&payload[28], false))) + payload_cli_mac->inlineSetDHCPName(name); #ifdef DHCP_DEBUG - ntop->getTrace()->traceEvent(TRACE_WARNING, "[DHCP] %s = '%s'", client_mac, name); + ntop->getTrace()->traceEvent(TRACE_WARNING, "[DHCP] %s = '%s'", client_mac, name); #endif - } else if(id == 55 /* Parameters List (Fingerprint) */) { - char fingerprint[64], buf[32]; - u_int idx, offset = 0; + } else if(id == 55 /* Parameters List (Fingerprint) */) { + char fingerprint[64], buf[32]; + u_int idx, offset = 0; - len = ndpi_min(len, sizeof(buf)/2); + len = ndpi_min(len, sizeof(buf)/2); - for(idx=0; idxgetTrace()->traceEvent(TRACE_WARNING, "%s = %s", mac->print(buf, sizeof(buf)),fingerprint); + ntop->getTrace()->traceEvent(TRACE_WARNING, "%s = %s", mac->print(buf, sizeof(buf)),fingerprint); #endif - mac->inlineSetFingerprint((char*)flow->get_ndpi_flow()->protos.dhcp.fingerprint); - } else if(id == 0xFF) - break; /* End of options */ + mac->inlineSetFingerprint((char*)flow->get_ndpi_flow()->protos.dhcp.fingerprint); + } else if(id == 0xFF) + break; /* End of options */ - i += len + 2; + i += len + 2; + } } } - } - break; + break; case NDPI_PROTOCOL_DHCPV6: { @@ -1758,7 +1758,7 @@ bool NetworkInterface::processPacket(u_int32_t bridge_iface_idx, if(((payload[2] & 0x80) /* NetBIOS Response */ || ((payload[2] & 0x78) == 0x28 /* NetBIOS Registration */)) && (ndpi_netbios_name_interpret((char*)&payload[12], name, sizeof(name)) > 0) && (!strstr(name, "__MSBROWSE__")) - ) { + ) { if(name[0] == '*') { int limit = min(payload_len-57, (int)sizeof(name)-1); @@ -1822,7 +1822,7 @@ bool NetworkInterface::processPacket(u_int32_t bridge_iface_idx, struct ndpi_dns_packet_header *header = (struct ndpi_dns_packet_header*)(payload + dns_offset); u_int16_t dns_flags = ntohs(header->flags); bool is_query = (dns_flags & 0x8000) ? 0 : 1; - + if(flow->get_cli_host() && flow->get_srv_host()) { Host *client = src2dst_direction ? flow->get_cli_host() : flow->get_srv_host(); Host *server = src2dst_direction ? flow->get_srv_host() : flow->get_cli_host(); @@ -1871,7 +1871,7 @@ bool NetworkInterface::processPacket(u_int32_t bridge_iface_idx, char outbuf[1024]; _dissectMDNS(payload, payload_len, outbuf, sizeof(outbuf)); - ntop->getTrace()->traceEvent(TRACE_NORMAL, "%s", outbuf); + ntop->getTrace()->traceEvent(TRACE_NORMAL, "%s", outbuf); #endif flow->dissectMDNS(payload, payload_len); @@ -1881,7 +1881,12 @@ bool NetworkInterface::processPacket(u_int32_t bridge_iface_idx, case NDPI_PROTOCOL_DROPBOX: if((src_port == dst_port) && (dst_port == htons(17500))) - flow->get_cli_host()->dissectDropbox((const char *)payload, payload_len); + flow->get_cli_host()->dissectDropbox((const char *)payload, payload_len); + break; + + case NDPI_PROTOCOL_SSL: + if(payload_len > 0) + flow->dissectSSL((char *)payload, payload_len); break; } @@ -2596,7 +2601,7 @@ bool NetworkInterface::dissectPacket(u_int32_t bridge_iface_idx, cur_bcast_domain.set(htonl(net)); bcast_domains->inlineAddAddress(&cur_bcast_domain, cidr); } - + e = getArpHashMatrixElement(srcMac->get_mac(), dstMac->get_mac(), &src2dst_element); #if 0 @@ -5607,7 +5612,7 @@ Mac* NetworkInterface::getMac(u_int8_t _mac[6], bool createIfNotPresent) { /* **************************************************** */ -ArpStatsMatrixElement* NetworkInterface::getArpHashMatrixElement(u_int8_t _src_mac[6], +ArpStatsMatrixElement* NetworkInterface::getArpHashMatrixElement(u_int8_t _src_mac[6], u_int8_t _dst_mac[6], bool * const src2dst){ ArpStatsMatrixElement *ret = NULL; @@ -5616,9 +5621,9 @@ ArpStatsMatrixElement* NetworkInterface::getArpHashMatrixElement(u_int8_t _src_m return NULL; ret = arp_hash_matrix->get(_src_mac, _dst_mac, src2dst); - + if(ret == NULL) { - try{ + try{ if((ret = new ArpStatsMatrixElement(this, _src_mac, _dst_mac, src2dst)) != NULL) if(!arp_hash_matrix->add(ret)){ delete ret; @@ -5634,13 +5639,13 @@ ArpStatsMatrixElement* NetworkInterface::getArpHashMatrixElement(u_int8_t _src_m return(NULL); } } - + return ret; } /* **************************************************** */ -bool NetworkInterface::getArpStatsMatrixInfo(lua_State* vm){ +bool NetworkInterface::getArpStatsMatrixInfo(lua_State* vm){ if(getNumArpStatsMatrixElements() > 0) { lua_newtable(vm); arp_hash_matrix->lua(vm); @@ -6295,7 +6300,7 @@ void NetworkInterface::reloadHideFromTop(bool refreshHosts) { bool NetworkInterface::isHiddenFromTop(Host *host) { VlanAddressTree *vlan_addrtree = hide_from_top; - + if(!vlan_addrtree) return false; return(host->get_ip()->findAddress(vlan_addrtree->getAddressTree(host->getVlanId()))); @@ -7241,7 +7246,7 @@ static bool local_hosts_2_dropbox_walker(GenericHashEntry *h, void *user_data, b if(host && (host->getNumDropboxPeers() > 0)) { lua_State *vm = (lua_State*)user_data; - + host->dumpDropbox(vm); *matched = true; } @@ -7256,7 +7261,7 @@ int NetworkInterface::dumpDropboxHosts(lua_State *vm) { u_int32_t begin_slot = 0; lua_newtable(vm); - + disablePurge(false /* on hosts */); rc = walker(&begin_slot, true /* walk_all */, walker_hosts, local_hosts_2_dropbox_walker, vm) ? 0 : -1; @@ -7366,7 +7371,7 @@ bool NetworkInterface::isInDhcpRange(IpAddress *ip) { bool NetworkInterface::isLocalBroadcastDomainHost(Host * const h, bool isInlineCall) { IpAddress *i = h->get_ip(); - + return(bcast_domains->isLocalBroadcastDomainHost(h, isInlineCall) || (ntop->getLoadInterfaceAddresses() && i->match(ntop->getLoadInterfaceAddresses()))); }