cb8885952525d0db7a5f253d2afaf4cc853d2b7f
[kismet-logviewer.git] / logviewer / templates / index.html
1 <html>
2 <head>
3 <title>Kismet</title>
4
5 <meta http-equiv="X-UA-Compatible" content="IE=edge">
6 <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
8 <script src="js/msgpack.js"></script>
9
10 <script src="js/jquery-3.1.0.min.js"></script>
11 <script src="js/jquery-ui.min.js"></script>
12 <script src="js/jquery.ui.touch-punch.min.js"></script>
13 <script src="js/jquery.ajax.binary.js"></script>
14 <script src="js/jquery.jspanel-compiled.min.js"></script>
15 <script src="js/simple-expand.min.js"></script>
16 <script src="js/jqueryui-editable.min.js"></script>
17
18 <script src="js/jquery.dataTables.min.js"></script>
19 <script src="js/dataTables.scroller.min.js"></script>
20 <script src="js/dataTables.scrollResize.js"></script>
21 <!-- <script src="js/dataTables.pageResize.min.js"></script> -->
22 <script src="js/dataTables.colReorder.min.js"></script>
23 <script src="js/dataTables.responsive.min.js"></script>
24
25 <script src="js/jquery.sparkline.min.js"></script>
26
27 <script src="js/raphael.min.js"></script>
28 <script src="js/morris.min.js"></script>
29
30 <script src="js/jquery.layout-latest.js"></script>
31
32 <script src="js/pushmenu.js"></script>
33
34 <script src="js/Chart.bundle.min.js"></script>
35
36 <script src="js/js.storage.min.js"></script>
37
38 <script src="js/tooltipster.bundle.min.js"></script>
39
40 <script src="js/clipboard.min.js"></script>
41
42 <script src="js/kismet.utils.js"></script>
43
44 <!-- Core UI elements that get loaded first -->
45 <script src="js/kismet.ui.sidebar.js"></script>
46 <script src="js/kismet.ui.tabpane.js"></script>
47 <script src="js/kismet.ui.settings.js"></script>
48
49 <script src="js/kismet.ui.js"></script>
50
51 <script src="js/kismet.ui.base.js"></script>
52 <script src="js/kismet.ui.gadgets.js"></script>
53
54 <script src="js/jquery.kismet.devicedata.js"></script>
55 <script src="js/jquery.kismet.messagebus.js"></script>
56 <script src="js/jquery.kismet.channeldisplay.js"></script>
57 <script src="js/kismet.ui.alerts.js"></script>
58
59 <script src="js/kismet.ui.iconbar.js"></script>
60 <script src="js/jquery.kismet.battery.js"></script>
61 <script src="js/jquery.kismet.alert.js"></script>
62 <script src="js/jquery.kismet.gps.js"></script>
63 <script src="js/jquery.kismet.packetrate.js"></script>
64
65 <link rel="stylesheet" type="text/css" href="css/font-awesome.min.css">
66
67 <link rel="stylesheet" type="text/css" href="css/jquery-ui.min.css" />
68 <link rel="stylesheet" type="text/css" href="css/jquery.jspanel.min.css" />
69 <link rel="stylesheet" type="text/css" href="css/jquery.dataTables.min.css" />
70 <link rel="stylesheet" type="text/css" href="css/responsive.dataTables.min.css" />
71 <link rel="stylesheet" type="text/css" href="css/colReorder.dataTables.min.css" />
72 <link rel="stylesheet" type="text/css" href="css/morris.css" />
73
74 <link rel="stylesheet" type="text/css" href="css/layout-default-1.4.0.css" />
75
76 <link rel="stylesheet" type="text/css" href="css/pushmenu.css" />
77
78 <link rel="stylesheet" type="text/css" href="css/tooltipster.bundle.min.css" />
79
80 <link rel="stylesheet" type="text/css" href="css/jqueryui-editable.css" />
81
82 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.messagebus.css" />
83 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.channeldisplay.css" />
84 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.alert.css" />
85 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.battery.css" />
86 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.auth.css" />
87 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.gps.css" />
88
89 <link rel="stylesheet" type="text/css" href="css/reset.css" />
90 <link rel="stylesheet" type="text/css" href="css/text.css" />
91 <link rel="stylesheet" type="text/css" href="css/layout.css" />
92
93 <link rel="stylesheet" type="text/css" href="css/kismet.css" />
94
95 <style type="text/css">
96 /* Fix the hover-highlight of the device table */
97 td.highlight {
98     background-color: #dddddd !important;
99 }
100
101 /* Accordion scroll */
102 div.autosize {
103     min-height: 10px;
104     overflow: scroll;
105 }
106
107 </style>
108
109 <script src="dynamic.js"></script>
110
111 <script>
112 var KISMET_PROXY_PREFIX = "";
113
114 const queryString = window.location.search;
115 const urlParams = new URLSearchParams(queryString);
116
117 window['censor_macs'] = urlParams.get('censor_macs')
118 window['censor_location'] = urlParams.get('censor_location')
119
120 if (urlParams.get('censor')) {
121     window['censor_macs'] = 1
122     window['censor_location'] = 1
123 }
124
125 var orig_title = "";
126
127 // Visibility detection from https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
128 // Set the name of the hidden property and the change event for visibility
129 var hidden, visibilityChange; 
130 if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support 
131       hidden = "hidden";
132       visibilityChange = "visibilitychange";
133 } else if (typeof document.msHidden !== "undefined") {
134       hidden = "msHidden";
135       visibilityChange = "msvisibilitychange";
136 } else if (typeof document.webkitHidden !== "undefined") {
137       hidden = "webkitHidden";
138       visibilityChange = "webkitvisibilitychange";
139 }
140
141 function handleVisibilityChange() {
142     if (document[hidden]) {
143         kismet_ui.window_visible = false;
144         orig_title = document.title;
145         document.title = orig_title + " (Paused)"
146     } else {
147         kismet_ui.window_visible = true;
148         document.title = orig_title;
149     }
150 }
151
152 // Warn if the browser doesn't support addEventListener or the Page Visibility API
153 if (typeof document.addEventListener === "undefined" || hidden === undefined) {
154     ; // Do nothing
155 } else {
156       // Handle page visibility change   
157       document.addEventListener(visibilityChange, handleVisibilityChange, false);
158 }
159
160 function load_main_ui() {
161     load_dynamics().then((res) => {
162     // Don't let DT make alerts
163     $.fn.dataTableExt.sErrMode = "console";
164
165     $('#pm_menu').pushmenu({ button : "#pm_open" });
166
167     // Compute 30% height of window
168     var southsize = $(window).height() * 0.30;
169
170     // Load the framework
171     var layout = $('#panelcontainer').layout({
172         resizeWithWindowDelay:  250,
173         north: {
174             closable: false,
175             resizeable: false,
176             slidable: false,
177             togglerLength_open: 0,
178             togglerLength_closed: -1,
179             fxName: "none",
180             spacing_open: 1,
181         },
182         center: {
183             onresize: function() {
184                 $('#centerpane-tabs').tabs("refresh");
185             },
186         },
187         south: {
188             // Default to computed percentage of total window
189             size: southsize,
190             onresize: function() {
191                 $('#southpane-tabs').tabs("refresh");
192             },
193         },
194     });
195
196
197     // Derive the proxy prefix, if any, from the headers.  We can't get this from our
198     // own current request, we have to do a HEAD req and nest everything inside that.
199     var jqxhr = $.ajax({
200         type: "HEAD",
201         url: Document.URL
202     })
203     .always(function() {
204         const pfx = jqxhr.getResponseHeader('X-Proxy-Dir');
205
206         if (pfx != null) {
207             KISMET_PROXY_PREFIX = pfx;
208         }
209
210         kismet_ui_base.OpenEventbusWs();
211     
212         kismet_ui_iconbar.AddIconbarItem({
213             id: 'gps',
214             priority: 110,
215             createCallback: function(div) {
216                 div.gps();
217             }
218         })
219     
220         kismet_ui_iconbar.AddIconbarItem({
221             id: 'alert',
222             priority: 125,
223             createCallback: function(div) {
224                 div.alert();
225             },
226         });
227     
228         kismet_ui_iconbar.AddIconbarItem({
229             id: 'battery',
230             priority: 150,
231             createCallback: function(div) {
232                 div.battery();
233             }
234         });
235     
236         kismet_ui_iconbar.AddIconbarItem({
237             id: 'packets',
238             priority: 0,
239             createCallback: function(div) {
240                 div.packetrate();
241             }
242         });
243     
244         kismet_ui_iconbar.makeIconbar($('#iconbar'));
245     
246         kismet_ui.HealthCheck();
247  
248         // Finalize the tabs
249         kismet_ui_tabpane.MakeTabPane($('#southpane-tabs'), 'south');
250         kismet_ui_tabpane.MakeTabPane($('#centerpane-tabs'), 'center');
251     
252         // Finalize the sidebar
253         kismet_ui_sidebar.MakeSidebar($('.k-sb-main'));
254    
255         // Try to scrape the server name
256         kismet_ui_base.FetchServerName(function(name) {
257             if (name.length > 0) {
258                 $('#topbar_title').html("Kismet - " + name);
259                 top.document.title = "Kismet - " + name;
260             }
261         
262         });
263     
264     }); // always head fetch
265
266     });
267 }
268
269 // jquery onload complete
270 $(function() {
271     // Set a global timeout
272     $.ajaxSetup({
273         timeout:5000,
274         xhrFields: {
275             withCredentials: true
276         }
277     });
278
279
280     kismet_ui_base.FirstLoginCheck(function() {
281         load_main_ui();
282     });
283
284 }); // onload
285 </script>
286
287 <style>
288 .resize_wrapper {
289     position: relative;
290     box-sizing: border-box;
291     height: calc(100% - 30px);
292     padding: 0.5em 0.5em 1.5em 0.5em;
293     border-radius: 0.5em;
294     background-color: #f9f9f9;
295     overflow: hidden;
296 }
297 </style>
298
299 </head>
300 <body>
301     <div id="mainholder">
302         <div id="pm_menu" class="pm_hide pm_initial kismet_sidebar">
303             <div class="k-sb-header">
304                 <h1>Kismet</h1>
305                 <hr>
306             </div>
307             <div class="k-sb-main">
308             </div>
309         </div>
310
311         <div id="panelcontainer">
312
313             <div class="ui-layout-north">
314                 <div id="topbar">
315                     <i id="pm_open" class="fa fa-bars k-sb-hamburger"></i>
316                     <div id="topbar_title">Kismet</div>
317                     <div class="topright_holder" id="iconbar"></div>
318                 </div>
319             </div>
320
321             <!--
322                 <div class="ui-layout-east">East</div>
323
324                 <div class="ui-layout-west">West</div>
325             -->
326
327             <div class="ui-layout-center" id="main_center">
328                 <div id="centerpane-tabs" class="tabs-min"></div>
329                 <!--
330                 <div id="resize_wrapper">
331                     <table id="devices" class="stripe hover nowrap" cell-spacing="0" width="100%"></table>
332                 </div>
333                 -->
334                 <!-- Must be named foo_status 
335                 <div id="devices_status" style="padding-bottom: 10px;"></div>
336                 -->
337             </div>
338
339             <div class="ui-layout-south">
340                 <div id="southpane-tabs" class="tabs-min"></div>
341             </div>
342
343         </div>
344
345         <div id="creditbar">
346             <p>Powered by many OSS components, see the <a href="credit.html" target="_new">credits page</a>
347         </div>
348     </div>
349
350 </body>
351 </html>