kibana-sinatra 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (239) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +1 -0
  7. data/kibana-sinatra.gemspec +24 -0
  8. data/lib/kibana/assets/app/app.js +140 -0
  9. data/lib/kibana/assets/app/components/extend-jquery.js +46 -0
  10. data/lib/kibana/assets/app/components/kbn.js +332 -0
  11. data/lib/kibana/assets/app/components/require.config.js +90 -0
  12. data/lib/kibana/assets/app/components/settings.js +27 -0
  13. data/lib/kibana/assets/app/components/underscore.extended.js +32 -0
  14. data/lib/kibana/assets/app/controllers/all.js +5 -0
  15. data/lib/kibana/assets/app/controllers/dash.js +91 -0
  16. data/lib/kibana/assets/app/controllers/dashLoader.js +123 -0
  17. data/lib/kibana/assets/app/controllers/row.js +76 -0
  18. data/lib/kibana/assets/app/dashboards/blank.json +42 -0
  19. data/lib/kibana/assets/app/dashboards/default.json +89 -0
  20. data/lib/kibana/assets/app/dashboards/guided.json +274 -0
  21. data/lib/kibana/assets/app/dashboards/logstash.js +181 -0
  22. data/lib/kibana/assets/app/dashboards/logstash.json +222 -0
  23. data/lib/kibana/assets/app/dashboards/noted.json +202 -0
  24. data/lib/kibana/assets/app/directives/addPanel.js +30 -0
  25. data/lib/kibana/assets/app/directives/all.js +10 -0
  26. data/lib/kibana/assets/app/directives/arrayJoin.js +34 -0
  27. data/lib/kibana/assets/app/directives/confirmClick.js +26 -0
  28. data/lib/kibana/assets/app/directives/dashUpload.js +37 -0
  29. data/lib/kibana/assets/app/directives/kibanaPanel.js +103 -0
  30. data/lib/kibana/assets/app/directives/ngBlur.js +20 -0
  31. data/lib/kibana/assets/app/directives/ngModelOnBlur.js +25 -0
  32. data/lib/kibana/assets/app/directives/tip.js +20 -0
  33. data/lib/kibana/assets/app/filters/all.js +110 -0
  34. data/lib/kibana/assets/app/panels/bettermap/editor.html +17 -0
  35. data/lib/kibana/assets/app/panels/bettermap/leaflet/images/layers-2x.png +0 -0
  36. data/lib/kibana/assets/app/panels/bettermap/leaflet/images/layers.png +0 -0
  37. data/lib/kibana/assets/app/panels/bettermap/leaflet/images/marker-icon-2x.png +0 -0
  38. data/lib/kibana/assets/app/panels/bettermap/leaflet/images/marker-icon.png +0 -0
  39. data/lib/kibana/assets/app/panels/bettermap/leaflet/images/marker-shadow.png +0 -0
  40. data/lib/kibana/assets/app/panels/bettermap/leaflet/leaflet-src.js +8724 -0
  41. data/lib/kibana/assets/app/panels/bettermap/leaflet/leaflet.css +463 -0
  42. data/lib/kibana/assets/app/panels/bettermap/leaflet/leaflet.ie.css +51 -0
  43. data/lib/kibana/assets/app/panels/bettermap/leaflet/leaflet.js +8 -0
  44. data/lib/kibana/assets/app/panels/bettermap/leaflet/plugins.css +75 -0
  45. data/lib/kibana/assets/app/panels/bettermap/leaflet/plugins.js +16 -0
  46. data/lib/kibana/assets/app/panels/bettermap/module.css +4 -0
  47. data/lib/kibana/assets/app/panels/bettermap/module.html +6 -0
  48. data/lib/kibana/assets/app/panels/bettermap/module.js +232 -0
  49. data/lib/kibana/assets/app/panels/column/editor.html +36 -0
  50. data/lib/kibana/assets/app/panels/column/module.html +16 -0
  51. data/lib/kibana/assets/app/panels/column/module.js +105 -0
  52. data/lib/kibana/assets/app/panels/column/panelgeneral.html +11 -0
  53. data/lib/kibana/assets/app/panels/dashcontrol/editor.html +44 -0
  54. data/lib/kibana/assets/app/panels/dashcontrol/load.html +40 -0
  55. data/lib/kibana/assets/app/panels/dashcontrol/module.html +6 -0
  56. data/lib/kibana/assets/app/panels/dashcontrol/module.js +198 -0
  57. data/lib/kibana/assets/app/panels/dashcontrol/save.html +30 -0
  58. data/lib/kibana/assets/app/panels/dashcontrol/share.html +11 -0
  59. data/lib/kibana/assets/app/panels/derivequeries/editor.html +23 -0
  60. data/lib/kibana/assets/app/panels/derivequeries/module.html +33 -0
  61. data/lib/kibana/assets/app/panels/derivequeries/module.js +160 -0
  62. data/lib/kibana/assets/app/panels/fields/editor.html +10 -0
  63. data/lib/kibana/assets/app/panels/fields/micropanel.html +25 -0
  64. data/lib/kibana/assets/app/panels/fields/module.html +3 -0
  65. data/lib/kibana/assets/app/panels/fields/module.js +37 -0
  66. data/lib/kibana/assets/app/panels/filtering/editor.html +7 -0
  67. data/lib/kibana/assets/app/panels/filtering/meta.html +15 -0
  68. data/lib/kibana/assets/app/panels/filtering/module.html +78 -0
  69. data/lib/kibana/assets/app/panels/filtering/module.js +66 -0
  70. data/lib/kibana/assets/app/panels/histogram/editor.html +74 -0
  71. data/lib/kibana/assets/app/panels/histogram/interval.js +57 -0
  72. data/lib/kibana/assets/app/panels/histogram/module.html +91 -0
  73. data/lib/kibana/assets/app/panels/histogram/module.js +511 -0
  74. data/lib/kibana/assets/app/panels/histogram/timeSeries.js +179 -0
  75. data/lib/kibana/assets/app/panels/hits/editor.html +29 -0
  76. data/lib/kibana/assets/app/panels/hits/module.html +44 -0
  77. data/lib/kibana/assets/app/panels/hits/module.js +270 -0
  78. data/lib/kibana/assets/app/panels/map/editor.html +15 -0
  79. data/lib/kibana/assets/app/panels/map/lib/jquery.jvectormap.min.js +8 -0
  80. data/lib/kibana/assets/app/panels/map/lib/map.europe.js +1 -0
  81. data/lib/kibana/assets/app/panels/map/lib/map.usa.js +1 -0
  82. data/lib/kibana/assets/app/panels/map/lib/map.world.js +1 -0
  83. data/lib/kibana/assets/app/panels/map/module.html +63 -0
  84. data/lib/kibana/assets/app/panels/map/module.js +185 -0
  85. data/lib/kibana/assets/app/panels/pie/editor.html +49 -0
  86. data/lib/kibana/assets/app/panels/pie/module.html +12 -0
  87. data/lib/kibana/assets/app/panels/pie/module.js +297 -0
  88. data/lib/kibana/assets/app/panels/query/editor.html +7 -0
  89. data/lib/kibana/assets/app/panels/query/meta.html +21 -0
  90. data/lib/kibana/assets/app/panels/query/module.html +25 -0
  91. data/lib/kibana/assets/app/panels/query/module.js +69 -0
  92. data/lib/kibana/assets/app/panels/query/query.css +39 -0
  93. data/lib/kibana/assets/app/panels/table/editor.html +48 -0
  94. data/lib/kibana/assets/app/panels/table/micropanel.html +44 -0
  95. data/lib/kibana/assets/app/panels/table/module.html +104 -0
  96. data/lib/kibana/assets/app/panels/table/module.js +389 -0
  97. data/lib/kibana/assets/app/panels/table/pagination.html +27 -0
  98. data/lib/kibana/assets/app/panels/terms/editor.html +51 -0
  99. data/lib/kibana/assets/app/panels/terms/module.html +55 -0
  100. data/lib/kibana/assets/app/panels/terms/module.js +307 -0
  101. data/lib/kibana/assets/app/panels/text/editor.html +16 -0
  102. data/lib/kibana/assets/app/panels/text/lib/showdown.js +1454 -0
  103. data/lib/kibana/assets/app/panels/text/module.html +10 -0
  104. data/lib/kibana/assets/app/panels/text/module.js +85 -0
  105. data/lib/kibana/assets/app/panels/timepicker/editor.html +34 -0
  106. data/lib/kibana/assets/app/panels/timepicker/module.html +73 -0
  107. data/lib/kibana/assets/app/panels/timepicker/module.js +268 -0
  108. data/lib/kibana/assets/app/panels/timepicker/refreshctrl.html +5 -0
  109. data/lib/kibana/assets/app/panels/trends/editor.html +20 -0
  110. data/lib/kibana/assets/app/panels/trends/module.html +11 -0
  111. data/lib/kibana/assets/app/panels/trends/module.js +232 -0
  112. data/lib/kibana/assets/app/partials/dashLoader.html +78 -0
  113. data/lib/kibana/assets/app/partials/dashLoaderShare.html +11 -0
  114. data/lib/kibana/assets/app/partials/dashboard.html +77 -0
  115. data/lib/kibana/assets/app/partials/dasheditor.html +151 -0
  116. data/lib/kibana/assets/app/partials/inspector.html +15 -0
  117. data/lib/kibana/assets/app/partials/load.html +4 -0
  118. data/lib/kibana/assets/app/partials/modal.html +12 -0
  119. data/lib/kibana/assets/app/partials/paneladd.html +6 -0
  120. data/lib/kibana/assets/app/partials/paneleditor.html +23 -0
  121. data/lib/kibana/assets/app/partials/panelgeneral.html +22 -0
  122. data/lib/kibana/assets/app/partials/querySelect.html +24 -0
  123. data/lib/kibana/assets/app/partials/roweditor.html +65 -0
  124. data/lib/kibana/assets/app/services/alertSrv.js +49 -0
  125. data/lib/kibana/assets/app/services/all.js +11 -0
  126. data/lib/kibana/assets/app/services/dashboard.js +417 -0
  127. data/lib/kibana/assets/app/services/fields.js +96 -0
  128. data/lib/kibana/assets/app/services/filterSrv.js +200 -0
  129. data/lib/kibana/assets/app/services/kbnIndex.js +101 -0
  130. data/lib/kibana/assets/app/services/panelMove.js +83 -0
  131. data/lib/kibana/assets/app/services/querySrv.js +147 -0
  132. data/lib/kibana/assets/app/services/timer.js +34 -0
  133. data/lib/kibana/assets/css/animate.min.css +3270 -0
  134. data/lib/kibana/assets/css/bootstrap-responsive.min.css +9 -0
  135. data/lib/kibana/assets/css/bootstrap.dark.min.css +9 -0
  136. data/lib/kibana/assets/css/bootstrap.light.min.css +9 -0
  137. data/lib/kibana/assets/css/font-awesome.min.css +403 -0
  138. data/lib/kibana/assets/css/main.css +193 -0
  139. data/lib/kibana/assets/css/normalize.min.css +1 -0
  140. data/lib/kibana/assets/css/timepicker.css +423 -0
  141. data/lib/kibana/assets/font/FontAwesome.otf +0 -0
  142. data/lib/kibana/assets/font/fontawesome-webfont.eot +0 -0
  143. data/lib/kibana/assets/font/fontawesome-webfont.svg +399 -0
  144. data/lib/kibana/assets/font/fontawesome-webfont.ttf +0 -0
  145. data/lib/kibana/assets/font/fontawesome-webfont.woff +0 -0
  146. data/lib/kibana/assets/img/glyphicons-halflings-white.png +0 -0
  147. data/lib/kibana/assets/img/glyphicons-halflings.png +0 -0
  148. data/lib/kibana/assets/img/kibana.png +0 -0
  149. data/lib/kibana/assets/img/load.gif +0 -0
  150. data/lib/kibana/assets/img/load_big.gif +0 -0
  151. data/lib/kibana/assets/index.html +49 -0
  152. data/lib/kibana/assets/vendor/angular/angular-dragdrop.js +304 -0
  153. data/lib/kibana/assets/vendor/angular/angular-sanitize.js +556 -0
  154. data/lib/kibana/assets/vendor/angular/angular-strap.js +875 -0
  155. data/lib/kibana/assets/vendor/angular/angular.js +15158 -0
  156. data/lib/kibana/assets/vendor/angular/datepicker.js +1046 -0
  157. data/lib/kibana/assets/vendor/angular/timepicker.js +888 -0
  158. data/lib/kibana/assets/vendor/bootstrap/bootstrap.js +2280 -0
  159. data/lib/kibana/assets/vendor/bootstrap/less/accordion.less +34 -0
  160. data/lib/kibana/assets/vendor/bootstrap/less/alerts.less +79 -0
  161. data/lib/kibana/assets/vendor/bootstrap/less/bootstrap.dark.less +4 -0
  162. data/lib/kibana/assets/vendor/bootstrap/less/bootstrap.less +63 -0
  163. data/lib/kibana/assets/vendor/bootstrap/less/bootstrap.light.less +4 -0
  164. data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.dark.less +554 -0
  165. data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.light.less +9 -0
  166. data/lib/kibana/assets/vendor/bootstrap/less/breadcrumbs.less +24 -0
  167. data/lib/kibana/assets/vendor/bootstrap/less/button-groups.less +229 -0
  168. data/lib/kibana/assets/vendor/bootstrap/less/buttons.less +228 -0
  169. data/lib/kibana/assets/vendor/bootstrap/less/carousel.less +158 -0
  170. data/lib/kibana/assets/vendor/bootstrap/less/close.less +32 -0
  171. data/lib/kibana/assets/vendor/bootstrap/less/code.less +61 -0
  172. data/lib/kibana/assets/vendor/bootstrap/less/component-animations.less +22 -0
  173. data/lib/kibana/assets/vendor/bootstrap/less/dropdowns.less +248 -0
  174. data/lib/kibana/assets/vendor/bootstrap/less/forms.less +690 -0
  175. data/lib/kibana/assets/vendor/bootstrap/less/grid.less +21 -0
  176. data/lib/kibana/assets/vendor/bootstrap/less/hero-unit.less +25 -0
  177. data/lib/kibana/assets/vendor/bootstrap/less/labels-badges.less +84 -0
  178. data/lib/kibana/assets/vendor/bootstrap/less/layouts.less +16 -0
  179. data/lib/kibana/assets/vendor/bootstrap/less/media.less +55 -0
  180. data/lib/kibana/assets/vendor/bootstrap/less/mixins.less +702 -0
  181. data/lib/kibana/assets/vendor/bootstrap/less/modals.less +95 -0
  182. data/lib/kibana/assets/vendor/bootstrap/less/navbar.less +497 -0
  183. data/lib/kibana/assets/vendor/bootstrap/less/navs.less +409 -0
  184. data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +237 -0
  185. data/lib/kibana/assets/vendor/bootstrap/less/pager.less +43 -0
  186. data/lib/kibana/assets/vendor/bootstrap/less/pagination.less +123 -0
  187. data/lib/kibana/assets/vendor/bootstrap/less/popovers.less +133 -0
  188. data/lib/kibana/assets/vendor/bootstrap/less/progress-bars.less +122 -0
  189. data/lib/kibana/assets/vendor/bootstrap/less/reset.less +216 -0
  190. data/lib/kibana/assets/vendor/bootstrap/less/responsive-1200px-min.less +28 -0
  191. data/lib/kibana/assets/vendor/bootstrap/less/responsive-767px-max.less +193 -0
  192. data/lib/kibana/assets/vendor/bootstrap/less/responsive-768px-979px.less +19 -0
  193. data/lib/kibana/assets/vendor/bootstrap/less/responsive-navbar.less +189 -0
  194. data/lib/kibana/assets/vendor/bootstrap/less/responsive-utilities.less +59 -0
  195. data/lib/kibana/assets/vendor/bootstrap/less/responsive.less +48 -0
  196. data/lib/kibana/assets/vendor/bootstrap/less/scaffolding.less +53 -0
  197. data/lib/kibana/assets/vendor/bootstrap/less/sprites.less +197 -0
  198. data/lib/kibana/assets/vendor/bootstrap/less/tables.less +244 -0
  199. data/lib/kibana/assets/vendor/bootstrap/less/tests/buttons.html +139 -0
  200. data/lib/kibana/assets/vendor/bootstrap/less/tests/css-tests.css +150 -0
  201. data/lib/kibana/assets/vendor/bootstrap/less/tests/css-tests.html +1399 -0
  202. data/lib/kibana/assets/vendor/bootstrap/less/tests/forms-responsive.html +71 -0
  203. data/lib/kibana/assets/vendor/bootstrap/less/tests/forms.html +179 -0
  204. data/lib/kibana/assets/vendor/bootstrap/less/tests/navbar-fixed-top.html +104 -0
  205. data/lib/kibana/assets/vendor/bootstrap/less/tests/navbar-static-top.html +107 -0
  206. data/lib/kibana/assets/vendor/bootstrap/less/tests/navbar.html +107 -0
  207. data/lib/kibana/assets/vendor/bootstrap/less/thumbnails.less +53 -0
  208. data/lib/kibana/assets/vendor/bootstrap/less/tooltip.less +70 -0
  209. data/lib/kibana/assets/vendor/bootstrap/less/type.less +247 -0
  210. data/lib/kibana/assets/vendor/bootstrap/less/utilities.less +30 -0
  211. data/lib/kibana/assets/vendor/bootstrap/less/variables.dark.less +304 -0
  212. data/lib/kibana/assets/vendor/bootstrap/less/variables.less +301 -0
  213. data/lib/kibana/assets/vendor/bootstrap/less/variables.light.less +301 -0
  214. data/lib/kibana/assets/vendor/bootstrap/less/wells.less +29 -0
  215. data/lib/kibana/assets/vendor/elasticjs/elastic-angular-client.js +81 -0
  216. data/lib/kibana/assets/vendor/elasticjs/elastic.js +19993 -0
  217. data/lib/kibana/assets/vendor/filesaver.js +216 -0
  218. data/lib/kibana/assets/vendor/jquery/jquery-1.8.0.js +2 -0
  219. data/lib/kibana/assets/vendor/jquery/jquery-ui-1.10.3.js +5253 -0
  220. data/lib/kibana/assets/vendor/jquery/jquery.flot.js +3060 -0
  221. data/lib/kibana/assets/vendor/jquery/jquery.flot.pie.js +817 -0
  222. data/lib/kibana/assets/vendor/jquery/jquery.flot.selection.js +360 -0
  223. data/lib/kibana/assets/vendor/jquery/jquery.flot.stack.js +188 -0
  224. data/lib/kibana/assets/vendor/jquery/jquery.flot.stackpercent.js +126 -0
  225. data/lib/kibana/assets/vendor/jquery/jquery.flot.time.js +431 -0
  226. data/lib/kibana/assets/vendor/modernizr-2.6.1.js +4 -0
  227. data/lib/kibana/assets/vendor/moment.js +1662 -0
  228. data/lib/kibana/assets/vendor/require/css-build.js +78 -0
  229. data/lib/kibana/assets/vendor/require/css.js +23 -0
  230. data/lib/kibana/assets/vendor/require/require.js +2024 -0
  231. data/lib/kibana/assets/vendor/require/text.js +386 -0
  232. data/lib/kibana/assets/vendor/require/tmpl.js +17 -0
  233. data/lib/kibana/assets/vendor/timezone.js +993 -0
  234. data/lib/kibana/assets/vendor/underscore.js +1246 -0
  235. data/lib/kibana/sinatra.rb +3 -0
  236. data/lib/kibana/sinatra/version.rb +5 -0
  237. data/lib/kibana/sinatra/web.rb +28 -0
  238. data/lib/kibana/views/config.erb +54 -0
  239. metadata +325 -0
@@ -0,0 +1,96 @@
1
+ define([
2
+ 'angular',
3
+ 'underscore',
4
+ 'config'
5
+ ],
6
+ function (angular, _, config) {
7
+ 'use strict';
8
+
9
+ var module = angular.module('kibana.services');
10
+
11
+ module.service('fields', function(dashboard, $rootScope, $http, alertSrv) {
12
+ // Save a reference to this
13
+ var self = this;
14
+
15
+ this.list = ['_type'];
16
+ this.mapping = {};
17
+
18
+ $rootScope.$watch(function(){return dashboard.indices;},function(n) {
19
+ if(!_.isUndefined(n) && n.length) {
20
+ // Only get the mapping for indices we don't know it for
21
+ var indices = _.difference(n,_.keys(self.mapping));
22
+ // Only get the mapping if there are indices
23
+ if(indices.length > 0) {
24
+ self.map(indices).then(function(result) {
25
+ self.mapping = _.extend(self.mapping,result);
26
+ self.list = mapFields(self.mapping);
27
+ });
28
+ // Otherwise just use the cached mapping
29
+ } else {
30
+ self.list = mapFields(_.pick(self.mapping,n));
31
+ }
32
+ }
33
+ });
34
+
35
+ var mapFields = function (m) {
36
+ var fields = [];
37
+ _.each(m, function(types) {
38
+ _.each(types, function(v) {
39
+ fields = _.union(fields,_.keys(v));
40
+ });
41
+ });
42
+ return fields;
43
+ };
44
+
45
+ this.map = function(indices) {
46
+ var request = $http({
47
+ url: config.elasticsearch + "/" + indices.join(',') + "/_mapping",
48
+ method: "GET"
49
+ }).error(function(data, status) {
50
+ if(status === 0) {
51
+ alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+
52
+ ". Please ensure that Elasticsearch is reachable from your system." ,'error');
53
+ } else {
54
+ alertSrv.set('Error',"No index found at "+config.elasticsearch+"/" +
55
+ indices.join(',')+"/_mapping. Please create at least one index." +
56
+ "If you're using a proxy ensure it is configured correctly.",'error');
57
+ }
58
+ });
59
+
60
+ return request.then(function(p) {
61
+ var mapping = {};
62
+ _.each(p.data, function(v,k) {
63
+ mapping[k] = {};
64
+ _.each(v, function (v,f) {
65
+ mapping[k][f] = flatten(v);
66
+ });
67
+ });
68
+ return mapping;
69
+ });
70
+ };
71
+
72
+ var flatten = function(obj,prefix) {
73
+ var propName = (prefix) ? prefix : '',
74
+ dot = (prefix) ? '.':'',
75
+ ret = {};
76
+ for(var attr in obj){
77
+ // For now only support multi field on the top level
78
+ // and if if there is a default field set.
79
+ if(obj[attr]['type'] === 'multi_field') {
80
+ ret[attr] = obj[attr]['fields'][attr] || obj[attr];
81
+ continue;
82
+ }
83
+ if (attr === 'properties') {
84
+ _.extend(ret,flatten(obj[attr], propName));
85
+ } else if(typeof obj[attr] === 'object'){
86
+ _.extend(ret,flatten(obj[attr], propName + dot + attr));
87
+ } else {
88
+ ret[propName] = obj;
89
+ }
90
+ }
91
+ return ret;
92
+ };
93
+
94
+ });
95
+
96
+ });
@@ -0,0 +1,200 @@
1
+ define([
2
+ 'angular',
3
+ 'underscore',
4
+ 'config'
5
+ ], function (angular, _, config) {
6
+ 'use strict';
7
+
8
+ var module = angular.module('kibana.services');
9
+
10
+ module.service('filterSrv', function(dashboard, ejsResource) {
11
+ // Create an object to hold our service state on the dashboard
12
+ dashboard.current.services.filter = dashboard.current.services.filter || {};
13
+
14
+ // Defaults for it
15
+ var _d = {
16
+ idQueue : [],
17
+ list : {},
18
+ ids : []
19
+ };
20
+
21
+ // For convenience
22
+ var ejs = ejsResource(config.elasticsearch);
23
+ var _f = dashboard.current.services.filter;
24
+
25
+ // Save a reference to this
26
+ var self = this;
27
+
28
+ // Call this whenever we need to reload the important stuff
29
+ this.init = function() {
30
+ // Populate defaults
31
+ _.defaults(dashboard.current.services.filter,_d);
32
+
33
+ // Accessors
34
+ self.list = dashboard.current.services.filter.list;
35
+ self.ids = dashboard.current.services.filter.ids;
36
+ _f = dashboard.current.services.filter;
37
+
38
+ _.each(self.getByType('time',true),function(time) {
39
+ self.list[time.id].from = new Date(time.from);
40
+ self.list[time.id].to = new Date(time.to);
41
+ });
42
+
43
+ };
44
+
45
+ // This is used both for adding filters and modifying them.
46
+ // If an id is passed, the filter at that id is updated
47
+ this.set = function(filter,id) {
48
+ _.defaults(filter,{mandate:'must'});
49
+ filter.active = true;
50
+ if(!_.isUndefined(id)) {
51
+ if(!_.isUndefined(self.list[id])) {
52
+ _.extend(self.list[id],filter);
53
+ return id;
54
+ } else {
55
+ return false;
56
+ }
57
+ } else {
58
+ if(_.isUndefined(filter.type)) {
59
+ return false;
60
+ } else {
61
+ var _id = nextId();
62
+ var _filter = {
63
+ alias: '',
64
+ id: _id
65
+ };
66
+ _.defaults(filter,_filter);
67
+ self.list[_id] = filter;
68
+ self.ids.push(_id);
69
+ return _id;
70
+ }
71
+ }
72
+ };
73
+
74
+ this.getBoolFilter = function(ids) {
75
+ // A default match all filter, just in case there are no other filters
76
+ var bool = ejs.BoolFilter().must(ejs.MatchAllFilter());
77
+ var either_bool = ejs.BoolFilter().must(ejs.MatchAllFilter());
78
+ _.each(ids,function(id) {
79
+ if(self.list[id].active) {
80
+ switch(self.list[id].mandate)
81
+ {
82
+ case 'mustNot':
83
+ bool = bool.mustNot(self.getEjsObj(id));
84
+ break;
85
+ case 'either':
86
+ either_bool = either_bool.should(self.getEjsObj(id));
87
+ break;
88
+ default:
89
+ bool = bool.must(self.getEjsObj(id));
90
+ }
91
+ }
92
+ });
93
+ return bool.must(either_bool);
94
+ };
95
+
96
+ this.getEjsObj = function(id) {
97
+ return self.toEjsObj(self.list[id]);
98
+ };
99
+
100
+ this.toEjsObj = function (filter) {
101
+ if(!filter.active) {
102
+ return false;
103
+ }
104
+ switch(filter.type)
105
+ {
106
+ case 'time':
107
+ return ejs.RangeFilter(filter.field)
108
+ .from(filter.from.valueOf())
109
+ .to(filter.to.valueOf());
110
+ case 'range':
111
+ return ejs.RangeFilter(filter.field)
112
+ .from(filter.from)
113
+ .to(filter.to);
114
+ case 'querystring':
115
+ return ejs.QueryFilter(ejs.QueryStringQuery(filter.query)).cache(true);
116
+ case 'field':
117
+ return ejs.QueryFilter(ejs.FieldQuery(filter.field,filter.query)).cache(true);
118
+ case 'terms':
119
+ return ejs.TermsFilter(filter.field,filter.value);
120
+ case 'exists':
121
+ return ejs.ExistsFilter(filter.field);
122
+ case 'missing':
123
+ return ejs.MissingFilter(filter.field);
124
+ default:
125
+ return false;
126
+ }
127
+ };
128
+
129
+ this.getByType = function(type,inactive) {
130
+ return _.pick(self.list,self.idsByType(type,inactive));
131
+ };
132
+
133
+ this.removeByType = function(type) {
134
+ var ids = self.idsByType(type);
135
+ _.each(ids,function(id) {
136
+ self.remove(id);
137
+ });
138
+ return ids;
139
+ };
140
+
141
+ this.idsByType = function(type,inactive) {
142
+ var _require = inactive ? {type:type} : {type:type,active:true};
143
+ return _.pluck(_.where(self.list,_require),'id');
144
+ };
145
+
146
+ // TOFIX: Error handling when there is more than one field
147
+ this.timeField = function() {
148
+ return _.pluck(self.getByType('time'),'field');
149
+ };
150
+
151
+ // This special function looks for all time filters, and returns a time range according to the mode
152
+ // No idea when max would actually be used
153
+ this.timeRange = function(mode) {
154
+ var _t = _.where(self.list,{type:'time',active:true});
155
+ if(_t.length === 0) {
156
+ return false;
157
+ }
158
+ switch(mode) {
159
+ case "min":
160
+ return {
161
+ from: new Date(_.max(_.pluck(_t,'from'))),
162
+ to: new Date(_.min(_.pluck(_t,'to')))
163
+ };
164
+ case "max":
165
+ return {
166
+ from: new Date(_.min(_.pluck(_t,'from'))),
167
+ to: new Date(_.max(_.pluck(_t,'to')))
168
+ };
169
+ default:
170
+ return false;
171
+ }
172
+ };
173
+
174
+ this.remove = function(id) {
175
+ if(!_.isUndefined(self.list[id])) {
176
+ delete self.list[id];
177
+ // This must happen on the full path also since _.without returns a copy
178
+ self.ids = dashboard.current.services.filter.ids = _.without(self.ids,id);
179
+ _f.idQueue.unshift(id);
180
+ _f.idQueue.sort(function(v,k){return v-k;});
181
+ return true;
182
+ } else {
183
+ return false;
184
+ }
185
+ };
186
+
187
+
188
+ var nextId = function() {
189
+ if(_f.idQueue.length > 0) {
190
+ return _f.idQueue.shift();
191
+ } else {
192
+ return self.ids.length;
193
+ }
194
+ };
195
+
196
+ // Now init
197
+ self.init();
198
+ });
199
+
200
+ });
@@ -0,0 +1,101 @@
1
+ define([
2
+ 'angular',
3
+ 'underscore',
4
+ 'config',
5
+ 'moment'
6
+ ],
7
+ function (angular, _, config, moment) {
8
+ 'use strict';
9
+
10
+ var module = angular.module('kibana.services');
11
+
12
+ module.service('kbnIndex', function($http, alertSrv) {
13
+ // returns a promise containing an array of all indices matching the index
14
+ // pattern that exist in a given range
15
+ this.indices = function(from,to,pattern,interval) {
16
+ var possible = [];
17
+ _.each(expand_range(fake_utc(from),fake_utc(to),interval),function(d){
18
+ possible.push(d.format(pattern));
19
+ });
20
+
21
+ return all_indices().then(function(p) {
22
+ var indices = _.intersection(possible,p);
23
+ indices.reverse();
24
+ return indices;
25
+ });
26
+ };
27
+
28
+ // returns a promise containing an array of all indices in an elasticsearch
29
+ // cluster
30
+ function all_indices() {
31
+ var something = $http({
32
+ url: config.elasticsearch + "/_aliases",
33
+ method: "GET"
34
+ }).error(function(data, status) {
35
+ if(status === 0) {
36
+ alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+
37
+ ". Please ensure that Elasticsearch is reachable from your system." ,'error');
38
+ } else {
39
+ alertSrv.set('Error',"Could not reach "+config.elasticsearch+"/_aliases. If you"+
40
+ " are using a proxy, ensure it is configured correctly",'error');
41
+ }
42
+ });
43
+
44
+ return something.then(function(p) {
45
+ var indices = [];
46
+ _.each(p.data, function(v,k) {
47
+ indices.push(k);
48
+ // Also add the aliases. Could be expensive on systems with a lot of them
49
+ _.each(v.aliases, function(v, k) {
50
+ indices.push(k);
51
+ });
52
+ });
53
+ return indices;
54
+ });
55
+ }
56
+
57
+ // this is stupid, but there is otherwise no good way to ensure that when
58
+ // I extract the date from an object that I get the UTC date. Stupid js.
59
+ // I die a little inside every time I call this function.
60
+ // Update: I just read this again. I died a little more inside.
61
+ // Update2: More death.
62
+ function fake_utc(date) {
63
+ date = moment(date).clone().toDate();
64
+ return moment(new Date(date.getTime() + date.getTimezoneOffset() * 60000));
65
+ }
66
+
67
+ // Create an array of date objects by a given interval
68
+ function expand_range(start, end, interval) {
69
+ if(_.contains(['hour','day','week','month','year'],interval)) {
70
+ var range;
71
+ start = moment(start).clone();
72
+ range = [];
73
+ while (start.isBefore(end)) {
74
+ range.push(start.clone());
75
+ switch (interval) {
76
+ case 'hour':
77
+ start.add('hours',1);
78
+ break;
79
+ case 'day':
80
+ start.add('days',1);
81
+ break;
82
+ case 'week':
83
+ start.add('weeks',1);
84
+ break;
85
+ case 'month':
86
+ start.add('months',1);
87
+ break;
88
+ case 'year':
89
+ start.add('years',1);
90
+ break;
91
+ }
92
+ }
93
+ range.push(moment(end).clone());
94
+ return range;
95
+ } else {
96
+ return false;
97
+ }
98
+ }
99
+ });
100
+
101
+ });
@@ -0,0 +1,83 @@
1
+ define([
2
+ 'angular',
3
+ 'underscore'
4
+ ],
5
+ function (angular, _) {
6
+ 'use strict';
7
+
8
+ var module = angular.module('kibana.services');
9
+
10
+ module.service('panelMove', function(dashboard, $rootScope, alertSrv) {
11
+
12
+ /* each of these can take event,ui,data parameters */
13
+
14
+ var notices = [];
15
+
16
+ this.onStart = function() {
17
+ dashboard.panelDragging = true;
18
+ notices.push(alertSrv.set('Moving','Drop this panel into an available space, or on top of another panel','info'));
19
+ $rootScope.$apply();
20
+ };
21
+
22
+ this.onOver = function() {
23
+ notices.push(alertSrv.set('Add panel',
24
+ 'Drop to add panel to this row. Panel will use row height, but retain their span','success'));
25
+ $rootScope.$apply();
26
+ };
27
+
28
+ this.onOut = function() {
29
+ clearNotices({severity:'success'});
30
+ $rootScope.$apply();
31
+ };
32
+
33
+ /*
34
+ Use our own drop logic. the $parent.$parent this is ugly.
35
+ */
36
+ this.onDrop = function(event,ui,data) {
37
+ var
38
+ dragRow = data.draggableScope.$parent.$parent.row.panels,
39
+ dropRow = data.droppableScope.$parent.$parent.row.panels,
40
+ dragIndex = data.dragSettings.index,
41
+ dropIndex = data.dropSettings.index;
42
+
43
+
44
+ // Remove panel from source row
45
+ dragRow.splice(dragIndex,1);
46
+
47
+ // Add to destination row
48
+ if(!_.isUndefined(dropRow)) {
49
+ dropRow.splice(dropIndex,0,data.dragItem);
50
+ }
51
+
52
+ dashboard.panelDragging = false;
53
+ // Cleanup nulls/undefined left behind
54
+ cleanup();
55
+ $rootScope.$apply();
56
+ $rootScope.$broadcast('render');
57
+ };
58
+
59
+ this.onStop = function() {
60
+ dashboard.panelDragging = false;
61
+ cleanup();
62
+ $rootScope.$apply();
63
+ };
64
+
65
+ var cleanup = function () {
66
+ _.each(notices, function(n){
67
+ alertSrv.clear(n);
68
+ });
69
+ _.each(dashboard.current.rows, function(row) {
70
+ row.panels = _.without(row.panels,{});
71
+ row.panels = _.compact(row.panels);
72
+ });
73
+ };
74
+
75
+ var clearNotices = function(options) {
76
+ _.each(_.where(notices,options), function(n) {
77
+ alertSrv.clear(n);
78
+ });
79
+ };
80
+
81
+ });
82
+
83
+ });