mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 09:48:58 -04:00
Add IP range aggregation, add ip address input validator. Closes #240
This commit is contained in:
parent
a118748fe2
commit
750675b89b
6 changed files with 129 additions and 1 deletions
|
@ -11,6 +11,7 @@ define(function (require) {
|
|||
|
||||
var controlHtml = {
|
||||
ranges: require('text!apps/visualize/partials/controls/ranges.html'),
|
||||
ip_range: require('text!apps/visualize/partials/controls/ip_range.html'),
|
||||
filters: require('text!apps/visualize/partials/controls/filters.html'),
|
||||
orderAndSize: require('text!apps/visualize/partials/controls/order_and_size.html'),
|
||||
minDocCount: require('text!apps/visualize/partials/controls/min_doc_count.html'),
|
||||
|
@ -57,6 +58,7 @@ define(function (require) {
|
|||
aggs.bucketAggsByName.terms,
|
||||
aggs.bucketAggsByName.histogram,
|
||||
aggs.bucketAggsByName.range,
|
||||
aggs.bucketAggsByName.ip_range,
|
||||
aggs.bucketAggsByName.date_histogram,
|
||||
aggs.bucketAggsByName.filters,
|
||||
// 'range'
|
||||
|
@ -123,10 +125,14 @@ define(function (require) {
|
|||
if (!controlsHtml.match(/aggParams\.interval\.options/)) ; //debugger;
|
||||
}
|
||||
|
||||
if (params.ranges) {
|
||||
if (aggName === 'range' && params.ranges) {
|
||||
controlsHtml += ' ' + controlHtml.ranges;
|
||||
}
|
||||
|
||||
if (aggName === 'ip_range' && params.ranges) {
|
||||
controlsHtml += ' ' + controlHtml.ip_range;
|
||||
}
|
||||
|
||||
if (params.filters) {
|
||||
controlsHtml += ' ' + controlHtml.filters;
|
||||
}
|
||||
|
|
43
src/kibana/apps/visualize/partials/controls/ip_range.html
Normal file
43
src/kibana/apps/visualize/partials/controls/ip_range.html
Normal file
|
@ -0,0 +1,43 @@
|
|||
<div ng-init="config.ranges = (config.ranges || [{}])">
|
||||
<div class="form-group" >
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-5">
|
||||
<label>From</label>
|
||||
</div>
|
||||
<div class="col-xs-5">
|
||||
<label>To</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row"
|
||||
ng-repeat="range in config.ranges track by $index">
|
||||
<div class="col-xs-5">
|
||||
<input validate-ip
|
||||
ng-model="range.from"
|
||||
type="text"
|
||||
class="form-control"
|
||||
name="range.from" />
|
||||
</div>
|
||||
<div class="col-xs-5">
|
||||
<input validate-ip
|
||||
ng-model="range.to"
|
||||
type="text"
|
||||
class="form-control"
|
||||
name="range.to" />
|
||||
</div>
|
||||
<div class="col-xs-1">
|
||||
<button ng-click="config.ranges.splice($index, 1)"
|
||||
class="btn btn-danger btn-xs">
|
||||
<i class="fa fa-ban" ></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div
|
||||
ng-click="config.ranges.push({})"
|
||||
class="sidebar-item-button primary">
|
||||
Add Range
|
||||
</div>
|
||||
</div>
|
|
@ -80,6 +80,7 @@ define(function (require) {
|
|||
],
|
||||
ip: [
|
||||
aggs.bucketAggsByName.terms,
|
||||
aggs.bucketAggsByName.ip_range,
|
||||
// 'ipv4 range'
|
||||
],
|
||||
geo_point: [
|
||||
|
|
|
@ -4,6 +4,7 @@ define(function (require) {
|
|||
Private(require('apps/visualize/saved_visualizations/bucket_aggs/date_histogram')),
|
||||
Private(require('apps/visualize/saved_visualizations/bucket_aggs/histogram')),
|
||||
Private(require('apps/visualize/saved_visualizations/bucket_aggs/range')),
|
||||
Private(require('apps/visualize/saved_visualizations/bucket_aggs/ip_range')),
|
||||
Private(require('apps/visualize/saved_visualizations/bucket_aggs/terms')),
|
||||
Private(require('apps/visualize/saved_visualizations/bucket_aggs/filters')),
|
||||
Private(require('apps/visualize/saved_visualizations/bucket_aggs/significant_terms'))
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
define(function (require) {
|
||||
require('directives/validate_ip');
|
||||
|
||||
return function RangeAggDefinition(timefilter, config) {
|
||||
var _ = require('lodash');
|
||||
var moment = require('moment');
|
||||
var angular = require('angular');
|
||||
|
||||
var agg = this;
|
||||
agg.name = 'ip_range';
|
||||
agg.display = 'IP Range';
|
||||
//agg.ordered = {};
|
||||
|
||||
agg.makeLabel = function (params) {
|
||||
return params.field;
|
||||
};
|
||||
|
||||
agg.params = {};
|
||||
|
||||
agg.params.ranges = {
|
||||
custom: true,
|
||||
default: [{from: '0.0.0.0', to: '255.255.255.255'}],
|
||||
write: function (input, output) {
|
||||
output.aggParams.ranges = input.val;
|
||||
output.aggParams.keyed = true;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
});
|
46
src/kibana/directives/validate_ip.js
Normal file
46
src/kibana/directives/validate_ip.js
Normal file
|
@ -0,0 +1,46 @@
|
|||
define(function (require) {
|
||||
var _ = require('lodash');
|
||||
|
||||
require('modules')
|
||||
.get('kibana')
|
||||
.directive('validateIp', function () {
|
||||
return {
|
||||
restrict: 'A',
|
||||
require: 'ngModel',
|
||||
scope: {
|
||||
'ngModel': '=',
|
||||
},
|
||||
link: function ($scope, elem, attr, ngModel) {
|
||||
|
||||
var isIP = function (value) {
|
||||
if (!value) return false;
|
||||
var parts = value.match(/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/);
|
||||
|
||||
var valid = true;
|
||||
if (parts) {
|
||||
_.each(parts.slice(1, 5), function (octet) {
|
||||
if (octet > 255 || octet < 0) valid = false;
|
||||
});
|
||||
} else {
|
||||
valid = false;
|
||||
}
|
||||
return valid;
|
||||
};
|
||||
|
||||
// From User
|
||||
ngModel.$parsers.unshift(function (value) {
|
||||
var valid = isIP(value);
|
||||
ngModel.$setValidity('ipInput', valid);
|
||||
return valid ? value : undefined;
|
||||
});
|
||||
|
||||
// To user
|
||||
ngModel.$formatters.unshift(function (value) {
|
||||
ngModel.$setValidity('ipInput', isIP(value));
|
||||
return value;
|
||||
});
|
||||
|
||||
}
|
||||
};
|
||||
});
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue