@@ -286,59 +286,62 @@ const homeTemplateHtml = `<!DOCTYPE html>
286286<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script>
287287<script type="text/javascript">
288288 $(function() {
289-
290- var socket;
291- var msg = $("#msg");
292- var log = document.getElementById('log');
293- var pause = document.getElementById('myCheck');
294- var messages = [];
295- var only_log = true;
296-
297- function appendLog(msg) {
298-
299- if (!pause.checked && (only_log == false || (!(msg.indexOf("{") == 0) && !(msg.indexOf("list") == 0) && only_log == true))) {
300- messages.push(msg);
301- if (messages.length > 100) {
302- messages.shift();
303- }
304- var doScroll = log.scrollTop == log.scrollHeight - log.clientHeight;
305- log.innerHTML = messages.join("<br>");
306- if (doScroll) {
307- log.scrollTop = log.scrollHeight - log.clientHeight;
308- }
309- }
310- }
311-
312- $("#form").submit(function() {
313- if (!socket) {
314- return false;
315- }
316- if (!msg.val()) {
317- return false;
318- }
319- socket.emit("command", msg.val());
320- if (msg.val().indexOf("log off") != -1) {only_log = true}
321- if (msg.val().indexOf("log on") != -1) {only_log = false}
322- msg.val("");
323- return false
324- });
325-
326- if (window["WebSocket"]) {
327- if (window.location.protocol === 'https:') {
328- socket = io('https://{{$}}')
329- } else {
330- socket = io("http://{{$}}");
331- }
332- socket.on("disconnect", function(evt) {
333- appendLog($("<div><b>Connection closed.</b></div>"))
334- });
335- socket.on("message", function(evt) {
336- appendLog(evt);
337- });
338- } else {
339- appendLog($("<div><b>Your browser does not support WebSockets.</b></div>"))
340- }
341- });
289+ var socket;
290+ var input = $('#input');
291+ var log = document.getElementById('log');
292+ var autoscroll = document.getElementById('autoscroll');
293+ var listenabled = document.getElementById('list');
294+ var messages = [];
295+
296+ function appendLog(msg) {
297+ if (listenabled.checked || (typeof msg === 'string' && msg.indexOf('{') !== 0 && msg.indexOf('list') !== 0)) {
298+ messages.push(msg);
299+ if (messages.length > 2000) {
300+ messages.shift();
301+ }
302+ var doScroll = log.scrollTop == log.scrollHeight - log.clientHeight;
303+ log.innerHTML = messages.join('<br>');
304+ if (autoscroll.checked && doScroll) {
305+ log.scrollTop = log.scrollHeight - log.clientHeight;
306+ }
307+ }
308+ }
309+
310+ $('#form').submit(function(e) {
311+ e.preventDefault();
312+ if (!socket) {
313+ return false;
314+ }
315+ if (!input.val()) {
316+ return false;
317+ }
318+ socket.emit('command', input.val());
319+ });
320+
321+ $('#export').click(function() {
322+ var link = document.createElement('a');
323+ link.setAttribute('download', 'agent-log.txt');
324+ var text = log.innerHTML.replace(/<br>/g, '\n');
325+ link.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
326+ link.click();
327+ });
328+
329+ if (window['WebSocket']) {
330+ if (window.location.protocol === 'https:') {
331+ socket = io('https://{{$}}')
332+ } else {
333+ socket = io('http://{{$}}');
334+ }
335+ socket.on('disconnect', function(evt) {
336+ appendLog($('<div><b>Connection closed.</b></div>'))
337+ });
338+ socket.on('message', function(evt) {
339+ appendLog(evt);
340+ });
341+ } else {
342+ appendLog($('<div><b>Your browser does not support WebSockets.</b></div>'))
343+ }
344+ });
342345</script>
343346<style type="text/css">
344347html {
@@ -351,42 +354,85 @@ body {
351354 margin: 0;
352355 width: 100%;
353356 height: 100%;
354- background: gray;
357+ background: #00979d;
358+ font-family: 'Lucida Grande', Lucida, Verdana, sans-serif;
355359}
356360
357361#log {
358362 background: white;
359363 margin: 0;
360- padding: 0.5em 0.5em 0.5em 0 .5em;
364+ padding: .5em;
361365 position: absolute;
362- top: 0 .5em;
363- left: 0 .5em;
364- right: 0 .5em;
366+ top: .5em;
367+ left: .5em;
368+ right: .5em;
365369 bottom: 3em;
366370 overflow: auto;
367371}
368372
369- #form {
370- padding: 0 0.5em 0 0.5em;
373+ .buttons {
374+ display: flex;
375+ padding: 0 .5em;
371376 margin: 0;
372377 position: absolute;
373378 bottom: 1em;
374- left: 0px ;
375- width: 100%;
379+ left: 0 ;
380+ width: calc( 100% - 1em) ;
376381 overflow: hidden;
377382}
378383
384+ #form {
385+ display: inline-block;
386+ }
387+
388+ #export {
389+ float: right;
390+ margin-left: auto;
391+ }
392+
393+ #autoscroll,
394+ #list {
395+ margin-left: 2em;
396+ vertical-align: middle;
397+ }
398+
399+ @media screen and (max-width: 950px) {
400+ #form {
401+ max-width: 60%;
402+ }
403+
404+ #input {
405+ max-width: 55%;
406+ }
407+ }
408+ @media screen and (max-width: 825px) {
409+ .buttons {
410+ flex-direction: column;
411+ }
412+
413+ #log {
414+ bottom: 7em;
415+ }
416+
417+ #autoscroll,
418+ #list {
419+ margin-left: 0;
420+ margin-top: .5em;
421+ }
422+ }
379423</style>
380424</head>
381425<body>
382426<div id="log"></div>
383- <form id="form">
384- <input type="submit" value="Send" />
385- <input type="text" id="msg" size="64"/>
386- <input name="pause" type="checkbox" value="pause" id="myCheck"/> Pause
387- <!--<input type="button" value="Install Certificate" onclick="window.open('http://localhost:8991/certificate.crt')" />-->
388- </form>
389- </form>
427+ <div class="buttons">
428+ <form id="form">
429+ <input type="submit" value="Send" />
430+ <input type="text" id="input" size="64"/>
431+ </form>
432+ <div><input name="pause" type="checkbox" checked id="autoscroll"/> Autoscroll</div>
433+ <div><input name="list" type="checkbox" checked id="list"/> Toggle List</div>
434+ <button id="export">Export Log</button>
435+ </div>
390436</body>
391437</html>
392438`
0 commit comments