diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/NetworkinsightController.php b/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/NetworkinsightController.php index 691121ee6..4fe397e95 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/NetworkinsightController.php +++ b/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/NetworkinsightController.php @@ -169,6 +169,24 @@ class NetworkinsightController extends ApiControllerBase return array(); } + /** + * get metadata from backend aggregation process + * @return array timeseries + */ + public function getMetadataAction() + { + if ($this->request->isGet()) { + $backend = new Backend(); + $configd_cmd = "netflow aggregate metadata json"; + $response = $backend->configdRun($configd_cmd); + $metadata = json_decode($response, true); + if ($metadata != null) { + return $metadata; + } + } + return array(); + } + /** * return interface map (device / name) * @return array interfaces @@ -220,4 +238,34 @@ class NetworkinsightController extends ApiControllerBase } return $result; } + + /** + * request timeserie data to use for reporting + * @param string $provider provider class name + * @param string $from_date from timestamp + * @param string $to_date to timestamp + * @param string $resolution resolution in seconds + * @return string csv output + */ + public function exportAction( + $provider = null, + $from_date = null, + $to_date = null, + $resolution = null + ) { + $this->response->setContentType('application/CSV', 'UTF-8'); + $this->response->setHeader( + 'Content-Disposition:', + "Attachment; filename=\"" . $provider . ".csv\"" + ); + if ($this->request->isGet()) { + $backend = new Backend(); + $configd_cmd = "netflow aggregate export {$provider} {$from_date} {$to_date} {$resolution}" ; + $response = $backend->configdRun($configd_cmd); + return $response; + } else { + return ""; + } + + } } diff --git a/src/opnsense/mvc/app/views/OPNsense/Diagnostics/networkinsight.volt b/src/opnsense/mvc/app/views/OPNsense/Diagnostics/networkinsight.volt index 631edd103..bfe20a126 100644 --- a/src/opnsense/mvc/app/views/OPNsense/Diagnostics/networkinsight.volt +++ b/src/opnsense/mvc/app/views/OPNsense/Diagnostics/networkinsight.volt @@ -75,7 +75,27 @@ POSSIBILITY OF SUCH DAMAGE. // fetch service names ajaxGet('/api/diagnostics/networkinsight/getServices',{}, function(services, status) { service_names = services; + // return promise, no need to wait for getMetadata dfObj.resolve(); + // fetch aggregators + ajaxGet('/api/diagnostics/networkinsight/getMetadata',{}, function(metadata, status) { + Object.keys(metadata['aggregators']).forEach(function (agg_name) { + var res = metadata['aggregators'][agg_name]['resolutions'].join(','); + $("#export_collection").append($("").val(agg_name).text(agg_name)); + }); + $("#export_collection").change(function(){ + //alert($(this).find('option:selected').data('resolutions')); + $("#export_resolution").html(""); + var resolutions = String($(this).find('option:selected').data('resolutions')); + resolutions.split(',').map(function(item) { + $("#export_resolution").append($("").val(item).text(item)); + console.log(item); + }); + $("#export_resolution").selectpicker('refresh'); + }); + $("#export_collection").change(); + $("#export_collection").selectpicker('refresh'); + }); }); }); }); @@ -227,27 +247,27 @@ POSSIBILITY OF SUCH DAMAGE. .valueFormat(d3.format(',.2s')); ; - chart_data = []; - data.map(function(item){ - var label = "(other)"; - var proto = ""; - if (item.protocol != "") { - if (item.protocol in protocol_names) { - proto = ' (' + protocol_names[item.protocol] + ')'; - } - if (item.dst_port in service_names) { - label = service_names[item.dst_port]; - } else { - label = item.dst_port - } - } - chart_data.push({'label': label + proto, 'value': item.total}); - }); + chart_data = []; + data.map(function(item){ + var label = "(other)"; + var proto = ""; + if (item.protocol != "") { + if (item.protocol in protocol_names) { + proto = ' (' + protocol_names[item.protocol] + ')'; + } + if (item.dst_port in service_names) { + label = service_names[item.dst_port]; + } else { + label = item.dst_port + } + } + chart_data.push({'label': label + proto, 'value': item.total}); + }); - d3.select("#chart_top_ports svg") - .datum(chart_data) - .transition().duration(350) - .call(chart); + var diag = d3.select("#chart_top_ports svg") + .datum(chart_data) + .transition().duration(350) + .call(chart); pageCharts["chart_top_ports"] = chart; // copy selection to detail page and query results @@ -295,19 +315,19 @@ POSSIBILITY OF SUCH DAMAGE. .legendPosition("right") .valueFormat(d3.format(',.2s')); - chart_data = []; - data.map(function(item){ - var label = "(other)"; - if (item.src_addr != "") { - label = item.src_addr; - } - chart_data.push({'label': label, 'value': item.total}); - }); + chart_data = []; + data.map(function(item){ + var label = "(other)"; + if (item.src_addr != "") { + label = item.src_addr; + } + chart_data.push({'label': label, 'value': item.total}); + }); - d3.select("#chart_top_sources svg") - .datum(chart_data) - .transition().duration(350) - .call(chart); + d3.select("#chart_top_sources svg") + .datum(chart_data) + .transition().duration(350) + .call(chart); pageCharts["chart_top_sources"] = chart; // copy selection to detail tab and query results @@ -408,6 +428,21 @@ POSSIBILITY OF SUCH DAMAGE. }); } + /** + * export detailed data (generate download link and click) + */ + function export_flow_data() + { + var time_url = $("#export_date_from").val() + '/' + $("#export_date_to").val(); + var url = '/api/diagnostics/networkinsight/export/'+$("#export_collection").val()+'/'+time_url+'/'+$("#export_resolution").val(); + var link = document.createElement("a"); + $(link).click(function(e) { + e.preventDefault(); + window.location.href = url; + }); + $(link).click(); + } + // hide heading $(".page-content-head").addClass("hidden"); @@ -472,17 +507,26 @@ POSSIBILITY OF SUCH DAMAGE. to_date_ts = parseInt((date_end - (24*60*60*1000 * i)) / 1000); tmp_date = new Date(from_date_ts*1000); tmp = tmp_date.getDate() + '/' + (tmp_date.getMonth()+1) + '/' + tmp_date.getFullYear(); - $("#date_detail_from").append($("").val(from_date_ts).text(tmp)); - $("#date_detail_to").append($("").val(to_date_ts).text(tmp)); + if (i < 62) { + $("#date_detail_from").append($("").val(from_date_ts).text(tmp)); + $("#date_detail_to").append($("").val(to_date_ts).text(tmp)); + } + $("#export_date_from").append($("").val(from_date_ts).text(tmp)); + $("#export_date_to").append($("").val(to_date_ts).text(tmp)); + } $("#date_detail_from").selectpicker('refresh'); $("#date_detail_to").selectpicker('refresh'); $("#date_detail_from").change(function(){ // change to date on change from date. - $("#date_detail_to").prop('selectedIndex', $("#date_detail_from").prop('selectedIndex')); - $("#date_detail_to").selectpicker('refresh'); + if ($("#date_detail_to").prop('selectedIndex') > $("#date_detail_from").prop('selectedIndex')) { + $("#date_detail_to").prop('selectedIndex', $("#date_detail_from").prop('selectedIndex')); + $("#date_detail_to").selectpicker('refresh'); + } }); + $("#export_date_from").selectpicker('refresh'); + $("#export_date_to").selectpicker('refresh'); chart_interface_totals(); chart_top_dst_port_usage(); @@ -491,6 +535,7 @@ POSSIBILITY OF SUCH DAMAGE. $("#refresh_details").click(grid_details); + $("#export_btn").click(export_flow_data); }); @@ -498,6 +543,7 @@ POSSIBILITY OF SUCH DAMAGE.
| {{ lang._('Attribute') }} | +{{ lang._('Value') }} | +
|---|---|
| {{ lang._('Collection') }} | ++ + | +
| {{ lang._('Resolution (seconds)') }} | ++ + | +
| {{ lang._('From date') }} | ++ + | +
| {{ lang._('To date') }} | ++ + | +
| + | + + | +