Advertisement
FlyFar

server/webui/templates/agent_detail.html

Jan 13th, 2024
816
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 4.66 KB | Cybersecurity | 0 0
  1. {% with previous_page=url_for('webui.agent_list'), title=agent.display_name %}
  2. {% include "header.html" %}
  3. {% endwith %}
  4.  
  5. <div class="container">
  6. <section id="main_content">
  7.    
  8.     <div id="terminal">
  9.     </div>
  10.    
  11.     <div style="width:80%;height:40px;">
  12.         <div id="msg-term-update">
  13.         &#8595; Terminal updated &#8595;
  14.         </div>
  15.     </div>
  16.    
  17.     <div >
  18.         <input type="text" name="cmd" id="cmd" style="width: 80%" placeholder="Type command here and press Enter..."/>
  19.     </div>
  20.    
  21.     <script>
  22.     (function(){
  23.    
  24.         // list of the last commands
  25.         var commandHistory = [];
  26.        
  27.         // max number of remembered commands
  28.         var COMMAND_HISTORY_MAX_SIZE = 100;
  29.        
  30.         // index of the command displayed in the input field
  31.         var currentHistoryIndex = -1;
  32.        
  33.         // the hash of the current console output
  34.         var currentMd5Hash = $.md5("");
  35.    
  36.         /**
  37.          * Add an entry in the command history, if the max size is reached, the oldest commands is removed.
  38.          * @param cmd the command line to add the list.
  39.          */
  40.         function addComandToHistory(cmd){
  41.             commandHistory.push(cmd);
  42.            
  43.             if(commandHistory.length > COMMAND_HISTORY_MAX_SIZE){
  44.                 commandHistory.splice(0, 1);
  45.             }
  46.            
  47.             currentHistoryIndex = commandHistory.length;
  48.         }
  49.         /**
  50.          * listening keypress on command prompt field.
  51.          */
  52.         $('#cmd').keypress(function(e){
  53.             onCommandKeypressedAction(e);
  54.         });
  55.  
  56.         /**
  57.          * While focusing the command field, handle actions when pressing the ENTER, KEY_UP or KEY_DOWN button.
  58.          * Send the command to the server when pressing ENTER.
  59.          * Navigate through the cmd history when pressing the KEY_UP or KEY_DOWN button.
  60.          * @param e the current event.
  61.          */
  62.         function onCommandKeypressedAction(e){
  63.             var displayValue = '';
  64.            
  65.             if(e.keyCode === 13){ // ENTER
  66.                 sendCommand();             
  67.             }else if(e.keyCode == 38){ // KEY_UP
  68.                 if(currentHistoryIndex > 0){
  69.                     currentHistoryIndex--;
  70.                     $('#cmd').val(commandHistory[currentHistoryIndex]);
  71.                 }              
  72.             }else if(e.keyCode == 40){ // KEY_DOWN
  73.                 if(currentHistoryIndex < commandHistory.length){
  74.                     currentHistoryIndex++;
  75.                     displayValue = (currentHistoryIndex == commandHistory.length)? '': commandHistory[currentHistoryIndex];
  76.                     $('#cmd').val(commandHistory[currentHistoryIndex]);
  77.                 }  
  78.             }
  79.            
  80.             return false;
  81.         }
  82.        
  83.         /**
  84.          * Send the command in the command field to the server and add it in the command history.
  85.          */
  86.         function sendCommand() {
  87.             $.post("{{ url_for('api.push_command', agent_id=agent.id) }}",
  88.                     {'cmdline': $('#cmd').val()}, function(){});
  89.                    
  90.             addComandToHistory($('#cmd').val());
  91.             $('#cmd').val('');
  92.             return false;
  93.         }
  94.        
  95.         /**
  96.          * send the command when clicking on the send bouton.
  97.          */
  98.         $('#send-btn').click(function(){
  99.             sendCommand();
  100.         });
  101.        
  102.         /**
  103.           * Refresh the terminal if the console output changed.
  104.           */
  105.         function refreshTerminal() {
  106.  
  107.             $.get("{{ url_for('api.agent_console', agent_id=agent.id) }}", function(data) {
  108.                 var oldScrollPosition, newScrollPosition;
  109.                 var scrollToBottom = true;
  110.                 var currentHtmlHash = $.md5(data);
  111.                    
  112.                 if(currentMd5Hash != currentHtmlHash){
  113.                     currentMd5Hash = currentHtmlHash; // keep the hash in global scope to compare it at the next iteration
  114.                     oldScrollPosition = $('#termtext').scrollTop();
  115.                     scrollToBottom = (typeof oldScrollPosition == "undefined" || (oldScrollPosition + $('#termtext').innerHeight() >= $('#termtext')[0].scrollHeight)) ? true: false;
  116.                     $('#terminal').html(data);
  117.                     newScrollPosition = (scrollToBottom == true)? $('#termtext').prop('scrollHeight') : oldScrollPosition;
  118.                     $('#termtext').scrollTop(newScrollPosition);
  119.                    
  120.                     if(typeof oldScrollPosition != "undefined" && scrollToBottom == false){
  121.                         $('#msg-term-update').show();
  122.                     }else{
  123.                         $('#msg-term-update').hide();
  124.                     }
  125.                     terminalScrollAction();
  126.                    
  127.                 }
  128.             });
  129.         }
  130.        
  131.         /**
  132.          * Scroll the terminal to the bottom when clicking "Terminal updated" message and hide it.
  133.          */
  134.         $('#msg-term-update').click(function(){
  135.             $('#termtext').scrollTop($('#termtext').prop('scrollHeight'));
  136.             $(this).hide();
  137.         });
  138.        
  139.         /**
  140.          * Hide the message "Terminal updated" when the scrollbar reaches the bottom.
  141.          */
  142.          function terminalScrollAction(){
  143.             $('#termtext').on('scroll', function() {
  144.                if($('#termtext').scrollTop() + $('#termtext').innerHeight() >= $('#termtext')[0].scrollHeight) {
  145.                     $('#msg-term-update').hide();
  146.                }
  147.             });
  148.         }
  149.        
  150.         /**
  151.          * Call the refresh terminal fonction twice each second.
  152.          */
  153.         $(document).ready(function(){
  154.             setInterval(refreshTerminal, 500);
  155.         });
  156.     })();
  157.  
  158.     </script>
  159.  
  160. </section>
  161. </div>
  162.  
  163. {% include "footer.html" %}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement