client ssl: remove now meaningless check for non-server vhost
[platform/upstream/libwebsockets.git] / plugins / server-status.html
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4  <meta charset=utf-8 http-equiv="Content-Language" content="en"/>
5  <script src="/lws-common.js"></script>
6  <title>LWS Server Status</title>
7 <style type="text/css">
8         span.title { font-size:18pt; font: Arial; font-weight:normal;
9                         text-align:center; color:#000000; }
10         span.mount { font-size:10pt; font: Arial; font-weight:normal;
11                         text-align:center; color:#000000; }
12         span.mountname { font-size:14pt; font: Arial; font-weight:bold;
13                         text-align:center; color:#404010; }
14         span.n { font-size:12pt; font: Arial; font-weight:normal;
15                         text-align:center; color:#808020; }
16         span.v { font-size:12pt; font: Arial; font-weight:bold;
17                         text-align:center; color:#202020; }
18         span.m1 { font-size:12pt; font: Arial; font-weight:bold;
19                         text-align:center; color:#202020; }
20         span.m2 { font-size:12pt; font: Arial; font-weight:normal;
21                         text-align:center; color:#202020; }
22         .browser { font-size:18pt; font: Arial; font-weight:normal; text-align:center; color:#ffff00; vertical-align:middle; text-align:center; background:#d0b070; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px;}
23         .group2 { vertical-align:middle;
24                 text-align:center;
25                 background:#f0f0e0; 
26                 padding:12px; 
27                 -webkit-border-radius:10px; 
28                 -moz-border-radius:10px;
29                 border-radius:10px; }
30         .explain { vertical-align:middle;
31                 text-align:center;
32                 background:#f0f0c0; padding:12px;
33                 -webkit-border-radius:10px;
34                 -moz-border-radius:10px;
35                 border-radius:10px;
36                 color:#404000; }
37         td.wsstatus { vertical-align:middle; width:200px; height:50px;
38                 text-align:center;
39                 background:#f0f0c0; padding:6px;
40                 -webkit-border-radius:8px;
41                 -moz-border-radius:8px;
42                 border-radius:8px;
43                 color:#404000; }
44         td.l { vertical-align:middle;
45                 text-align:center;
46                 background:#d0d0b0; 
47                 padding:3px; 
48                 -webkit-border-radius:3px; 
49                 -moz-border-radius:3px;
50                 border-radius:3px; }
51         td.dl { vertical-align:middle;
52                 text-align:center;
53                 background:#c0c0c0; 
54                 padding:3px; 
55                 -webkit-border-radius:3px; 
56                 -moz-border-radius:3px;
57                 border-radius:3px; }
58         td.c { vertical-align:middle;
59                 text-align:center;
60                 background:#c0c0a0; 
61                 padding:3px; 
62                 -webkit-border-radius:3px; 
63                 -moz-border-radius:3px;
64                 border-radius:3px; }
65         td.c0 { vertical-align:middle;
66                 text-align:center;
67                 background:#b0b090; 
68                 padding:3px; 
69                 -webkit-border-radius:3px; 
70                 -moz-border-radius:3px;
71                 border-radius:3px; }
72         td.dc0 { vertical-align:middle;
73                 text-align:center;
74                 background:#a0a0a0; 
75                 padding:3px; 
76                 -webkit-border-radius:3px; 
77                 -moz-border-radius:3px;
78                 border-radius:3px; }
79         td.c1 { vertical-align:middle;
80                 text-align:center;
81                 background:#c0c0c0; 
82                 padding:3px; 
83                 -webkit-border-radius:3px; 
84                 -moz-border-radius:3px;
85                 border-radius:3px; }
86         td.t { vertical-align:middle;
87                 text-align:center;
88                 background:#e0e0c0; 
89                 padding:3px; 
90                 -webkit-border-radius:3px; 
91                 -moz-border-radius:3px;
92                 border-radius:3px; }
93         .content { vertical-align:top; text-align:center; background:#fffff0; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; }
94         .canvas { vertical-align:top; text-align:center; background:#efefd0; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; }
95 .tabs {
96   position: relative;   
97   min-height: 750px; /* This part sucks */
98   clear: both;
99   margin: 25px 0;
100 }
101 .tab {
102   float: left;
103 }
104 .tab label {
105   background: #eee; 
106   padding: 10px; 
107   border: 1px solid #ccc; 
108   margin-left: -1px; 
109   position: relative;
110   left: 1px; 
111 }
112 .tab [type=radio] {
113   display: none;   
114 }
115 .content {
116   position: absolute;
117   top: 28px;
118   left: 0;
119   background: white;
120   right: 0;
121   bottom: 0;
122   padding: 20px;
123   border: 1px solid #ccc; 
124 }
125 [type=radio]:checked ~ label {
126   background: white;
127   border-bottom: 1px solid white;
128   z-index: 2;
129 }
130 [type=radio]:checked ~ label ~ .content {
131   z-index: 1;
132 }
133 </style>
134 </head>
135
136 <body>
137 <header></header>
138 <article>
139
140 <table>
141 <tr><td><img src="./lwsws-logo.png"></td><td><span id=title class=title>Server status</span></td></tr>
142 <tr><td align=center colspan=2>
143 <div id="conninfo">...</div>
144 <div id="json"></div>
145 </td></tr>
146
147
148 </table>
149
150 </article>
151
152 <script nonce="lwscaro">
153
154 lws_gray_out(true,{'zindex':'499'});
155
156 /*
157  * We display untrusted stuff in html context... reject anything
158  * that has HTML stuff in it
159  */
160
161 function san(s)
162 {
163         if (s.search("<") != -1)
164                 return "invalid string";
165         
166         return s;
167 }
168
169 function humanize(s)
170 {
171         i = parseInt(s);
172         
173         if (i > 1000000000)
174                 return (i / 1000000000).toFixed(3) + "G";
175         
176         if (i > 1000000)
177                 return (i / 1000000).toFixed(3) + "M";
178         
179         if (i > 1000)
180                 return (i / 1000).toFixed(3) + "K";
181         
182         return s;
183 }
184
185         var pos = 0;
186
187 function get_appropriate_ws_url()
188 {
189         var pcol;
190         var u = document.URL;
191
192         /*
193          * We open the websocket encrypted if this page came on an
194          * https:// url itself, otherwise unencrypted
195          */
196
197         if (u.substring(0, 5) == "https") {
198                 pcol = "wss://";
199                 u = u.substr(8);
200         } else {
201                 pcol = "ws://";
202                 if (u.substring(0, 4) == "http")
203                         u = u.substr(7);
204         }
205
206         u = u.split('/');
207
208         /* + "/xxx" bit is for IE10 workaround */
209
210         return pcol + u[0] + "/xxx";
211 }
212
213
214         var socket_status, jso, s;
215
216         if (typeof MozWebSocket != "undefined") {
217                 socket_status = new MozWebSocket(get_appropriate_ws_url(),
218                                    "lws-server-status");
219         } else {
220                 socket_status = new WebSocket(get_appropriate_ws_url(),
221                                    "lws-server-status");
222         }
223
224
225         try {
226                 socket_status.onopen = function() {
227                         document.getElementById("title").innerHTML = "Server Status (Active)";
228                         lws_gray_out(false);
229                 }
230
231                 socket_status.onmessage =function got_packet(msg) {
232                         var u, ci, n;
233                         //document.getElementById("json").innerHTML = "<pre>"+msg.data+"</pre>";
234                         jso = JSON.parse(msg.data);
235                         u = parseInt(san(jso.i.uptime));
236
237                         if (parseInt(jso.i.contexts[0].deprecated) == 0)
238                                 s = "<table><tr><td></td><td class=\"c0\">";
239                         else
240                                 s = "<table><tr><td></td><td class=\"dc0\">";
241                         s +=
242                           "Server</td><td>" +
243                           "<span class=n>Version:</span> <span class=v>" +
244                            san(jso.i.version) + "</span><br>" +
245                           "<span class=n>Uptime:</span> <span class=v>" +
246                           ((u / (24 * 3600)) | 0) + "d " +
247                           (((u % (24 * 3600)) / 3600) | 0) + "h " +
248                           (((u % 3600) / 60) | 0) + "m</span>";
249                         if (jso.i.l1)
250                                 s = s + ", <span class=n>Load:</span> <span class=v>" + san(jso.i.l1) + " ";
251                         if (jso.i.l2)
252                                 s = s + san(jso.i.l2) + " ";
253                         if (jso.i.l3)
254                                 s = s + san(jso.i.l3);
255                         if (jso.i.l1)
256                                 s =s + "<span>";
257                                 
258                         for (n = 0; n < jso.files.length; n++) {
259                                 s += "<br><span class=n>" + san(jso.files[n].path) + ":</span><br>    " + san(jso.files[n].val);
260                         }
261                         s += "</td></tr>";
262
263                         for (ci = 0; ci < jso.i.contexts.length; ci++) {
264
265                                 if (parseInt(jso.i.contexts[ci].deprecated) == 0)
266                                         s += "<tr><td></td><td class=\"c\">" +
267                                           "Active Context</td><td>";
268                                 else
269                                         s += "<tr><td></td><td class=\"c1\">" +
270                                           "Deprecated Context " + ci + "</td><td>";
271
272                                   u = parseInt(san(jso.i.contexts[ci].context_uptime));
273                                   s += "<span class=n>Uptime:</span> <span class=v>" +
274                                   ((u / (24 * 3600)) | 0) + "d " +
275                                   (((u % (24 * 3600)) / 3600) | 0) + "h " +
276                                   (((u % 3600) / 60) | 0) + "m</span>";
277
278                                 s = s +
279                                   "<br>" +
280                                   "<span class=n>Listening wsi:</span> <span class=v>" + san(jso.i.contexts[ci].listen_wsi) + "</span>, " +
281                                   "<span class=n>Current wsi alive:</span> <span class=v>" + (parseInt(san(jso.i.contexts[ci].wsi_alive)) -
282                                         parseInt(san(jso.i.contexts[ci].listen_wsi))) + "</span><br>" +
283                                   "<span class=n>Total Rx:</span> <span class=v>" + humanize(san(jso.i.contexts[ci].rx)) +"</span>, " +
284                                   "<span class=n>Total Tx:</span> <span class=v>" + humanize(san(jso.i.contexts[ci].tx)) +"</span><br>" +
285                                   "<span class=n>Total connections:</span> <span class=v>" + san(jso.i.contexts[ci].conn) +"</span>, " +
286                                   "<span class=n>Total HTTP Transactions:</span> <span class=v>" + san(jso.i.contexts[ci].trans) +"</span><br>" +
287                                   "<span class=n>Total ws upgrades:</span> <span class=v>" + san(jso.i.contexts[ci].ws_upg) +"</span>, " +
288                                   "<span class=n>Total h2 upgrades:</span> <span class=v>" + san(jso.i.contexts[ci].http2_upg) +"</span>, " +
289                                   "<span class=n>Total Rejected:</span> <span class=v>" + san(jso.i.contexts[ci].rejected) +"</span><br>" +
290                                   "<span class=n>Current cgi alive:</span> <span class=v>" + san(jso.i.contexts[ci].cgi_alive) + "</span>, " +
291                                   "<span class=n>Total CGI spawned:</span> <span class=v>" + san(jso.i.contexts[ci].cgi_spawned) +
292                                   "</span><table>";
293                                 
294                                 for (n = 0; n < jso.i.contexts[ci].pt.length; n++) {
295
296                                         if (parseInt(jso.i.contexts[ci].deprecated) == 0)
297                                                 s += "<tr><td>&nbsp;&nbsp;</td><td class=\"l\">service thread " + (n + 1);
298                                         else
299                                                 s += "<tr><td>&nbsp;&nbsp;</td><td class=\"dl\">service thread " + (n + 1);
300                                         s += "</td><td>" +
301                                         "<span class=n>fds:</span> <span class=v>" + san(jso.i.contexts[ci].pt[n].fds_count) + " / " +
302                                                   san(jso.i.contexts[ci].pt_fd_max) + "</span>, ";
303                                         s = s + "<span class=n>ah pool:</span> <span class=v>" + san(jso.i.contexts[ci].pt[n].ah_pool_inuse) + " / " +
304                                                       san(jso.i.contexts[ci].ah_pool_max) + "</span>, " +
305                                         "<span class=n>ah waiting list:</span> <span class=v>" + san(jso.i.contexts[ci].pt[n].ah_wait_list);
306         
307                                         s = s + "</span></td></tr>";
308         
309                                 }
310                                 for (n = 0; n < jso.i.contexts[ci].vhosts.length; n++) {
311                                         if (parseInt(jso.i.contexts[ci].deprecated) == 0)
312                                                 s += "<tr><td>&nbsp;&nbsp;</td><td class=\"l\">vhost " + (n + 1);
313                                         else
314                                                 s += "<tr><td>&nbsp;&nbsp;</td><td class=\"dl\">vhost " + (n + 1);
315                                         s += "</td><td><span class=\"mountname\">";
316                                         if (jso.i.contexts[ci].vhosts[n].use_ssl == '1')
317                                                 s = s + "https://";
318                                         else
319                                                 s = s + "http://";
320                                         s = s + san(jso.i.contexts[ci].vhosts[n].name) + ":" +
321                                                 san(jso.i.contexts[ci].vhosts[n].port) + "</span>";
322                                         if (jso.i.contexts[ci].vhosts[n].sts == '1')
323                                                 s = s + " (STS)";
324                                         s = s +"<br>" +
325                                         "<span class=n>rx:</span> <span class=v>" + humanize(san(jso.i.contexts[ci].vhosts[n].rx)) + "B</span>, " +
326                                         "<span class=n>tx</span> <span class=v>" + humanize(san(jso.i.contexts[ci].vhosts[n].tx)) + "B</span><br>" +
327                                         "<span class=n>vh connections</span> <span class=v>" + san(jso.i.contexts[ci].vhosts[n].conn) + "</span>, " +
328                                         "<span class=n>vh http transactions</span> <span class=v>" + san(jso.i.contexts[ci].vhosts[n].trans) + "</span><br>" +
329                                         "<span class=n>vh upgrades to ws:</span> <span class=v>" + san(jso.i.contexts[ci].vhosts[n].ws_upg) + "</span>, " +
330                                         "<span class=n>to http/2:</span> <span class=v>" + san(jso.i.contexts[ci].vhosts[n].http2_upg) + "</span>, " +
331                                         "<span class=n>rejected:</span> <span class=v>" + san(jso.i.contexts[ci].vhosts[n].rejected) + "</span><br>" +
332                                         "<table style=\"margin-left:16px\"><tr><td class=t>Mountpoint</td><td class=t>Origin</td><td class=t>Cache Policy</td></tr>";
333
334                                         var m;
335                                         for (m = 0; m < jso.i.contexts[ci].vhosts[n].mounts.length; m++) {
336                                                 s = s + "<tr><td>";
337                                                 s = s + "<span class=\"m1\">" + san(jso.i.contexts[ci].vhosts[n].mounts[m].mountpoint) +
338                                                         "</span></td><td><span class=\"m2\">" +
339                                                         san(jso.i.contexts[ci].vhosts[n].mounts[m].origin) +
340                                                         "</span></td><td>";
341                                                 if (parseInt(san(jso.i.contexts[ci].vhosts[n].mounts[m].cache_max_age)))
342                                                         s = s + "<span class=n>max-age:</span> <span class=v>" +
343                                                         san(jso.i.contexts[ci].vhosts[n].mounts[m].cache_max_age) +
344                                                         "</span>, <span class=n>reuse:</span> <span class=v>" +
345                                                         san(jso.i.contexts[ci].vhosts[n].mounts[m].cache_reuse) +
346                                                         "</span>, <span class=n>reval:</span> <span class=v>" +
347                                                         san(jso.i.contexts[ci].vhosts[n].mounts[m].cache_revalidate) +
348                                                         "</span>, <span class=n>inter:</span> <span class=v>" +
349                                                         san(jso.i.contexts[ci].vhosts[n].mounts[m].cache_intermediaries);
350                                                 s = s + "</span></td></tr>"
351                                         }
352                                         s = s + "</table>";
353                                         s = s + "</td></tr>";
354                                 }
355
356                                 s += "</table></td></tr>";
357                                 
358                         } // context
359                         s = s + "</table>";
360                         
361                         document.getElementById("conninfo").innerHTML = s;
362                 } 
363
364                 socket_status.onclose = function(){
365                         document.getElementById("title").innerHTML = "Server Status (Disconnected)";
366                         lws_gray_out(true,{'zindex':'499'});
367                 }
368         } catch(exception) {
369                 alert('<p>Error' + exception);  
370         }
371 </script>
372
373 </body>
374 </html>