<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script> <script src="https://unpkg.com/htmx.org@1.9.12"></script> <!-- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> --> <title>g2: gommand & gontrol</title> <script> document.addEventListener('DOMContentLoaded', () => { fetch('/agentNames') .then(response => response.json()) .then(agentNames => { const dropdown = document.getElementById('agentName'); agentNames.forEach(name => { const option = document.createElement('option'); option.value = name; option.textContent = name; dropdown.appendChild(option); }); }) .catch(error => console.error('Error fetching agent names:', error)); fetch('http://localhost:5555/agentNames') .then(response => { console.log('Fetch response status:', response.status); return response.json(); }) .then(agentNames => { console.log('Connected agent names:', agentNames); // Your existing logic here }) .catch(error => { console.error('Error fetching agent names:', error); }); const tableRows = document.querySelectorAll('#agentList table tbody tr'); console.log('Number of rows found:', tableRows.length); tableRows.forEach((row, index) => { const nameCell = row.querySelector('td[data-column="Name"]'); const statusCell = row.querySelector('td[data-column="Status"]'); console.log(`Row ${index + 1} - Name: ${nameCell?.textContent}, Status Cell Found: ${!!statusCell}`); }); }); const updateAgentStatuses = () => { fetch('http://localhost:5555/agentNames') .then(response => response.json()) .then(agentNames => { console.log("Agent names fetched:", agentNames); // Get all rows in the table body const tableRows = document.querySelectorAll('#agentList table tbody tr'); // Loop through each row to find the Name and update Status tableRows.forEach(row => { const nameCell = row.querySelector('td:nth-child(2)'); // Name is in the second column const statusCell = row.querySelector('td:nth-child(5)'); // Status is in the fifth column if (nameCell && statusCell) { const agentName = nameCell.textContent.trim(); if (agentNames.includes(agentName)) { statusCell.innerHTML = '<span class="badge bg-success">Connected</span>'; } else { statusCell.innerHTML = '<span class="badge bg-danger">Disconnected</span>'; } } }); }) .catch(error => console.error('Error fetching agent names:', error)); }; // Initial call to update statuses updateAgentStatuses(); // Set the function to run every 5 seconds setInterval(updateAgentStatuses, 5000); </script> </head> <body> <div class="container"> <div class="row"> <div class="col"> <h2>Agents</h2> <!-- Agent List --> <!-- <div id="agentList" hx-get="/agents" hx-trigger="load, every 2s" hx-swap="innerHTML"></div> --> <div id="agentList" hx-get="/agents" hx-trigger="load" hx-swap="innerHTML"></div> <!-- Agent Commands --> <div id="agentCommands"> <h3>Command Execution</h3> <form hx-post="http://localhost:5555/executeCommand" hx-target="#commandOutput" hx-encoding="application/x-www-form-urlencoded" hx-swap="innerHTML"> <div class="mb-3"> <label for="agentName" class="form-label">Agent Name</label> <select class="form-select" id="agentName" name="agentName" required> <!-- Dynamically populated with agent names --> </select> </div> <div class="mb-3"> <label for="command" class="form-label">Command</label> <input type="text" class="form-control" id="command" name="command" placeholder="Enter command" required> </div> <button type="submit" class="btn btn-primary">Execute</button> </form> <pre id="commandOutput"></pre> </div> <!-- Add Agent Form --> <button class="btn btn-primary mt-3" data-bs-toggle="collapse" data-bs-target="#addAgentForm">Add Agent</button> <div id="addAgentForm" class="collapse mt-2"> <form hx-post="/agents" hx-target="#agentList" hx-swap="innerHTML"> <div class="mb-3"> <label for="agentId" class="form-label">Agent Id</label> <input type="text" class="form-control" id="agentId" name="agentId" required> </div> <div class="mb-3"> <label for="agentName" class="form-label">Agent Name</label> <input type="text" class="form-control" id="agentName" name="agentName" required> </div> <div class="mb-3"> <label for="IPv4Address" class="form-label">IPv4 Address</label> <input type="text" class="form-control" id="IPv4Address" name="IPv4Address" required> </div> <div class="mb-3"> <label for="initialContact" class="form-label">Initial Contact</label> <input type="datetime-local" class="form-control" id="initialContact" name="initialContact" required> </div> <div class="mb-3"> <label for="lastContact" class="form-label">Last Contact</label> <input type="datetime-local" class="form-control" id="lastContact" name="lastContact" required> </div> <button type="submit" class="btn btn-success">Add Agent</button> </form> </div> </div> <!-- Agent Details --> <div class="col" id="agentDetails"> <h3>Details</h3> <p>Select an agent to view details.</p> </div> </div> </div> </body> </html>