// Function to refresh services function refreshServices() { const servicesTable = document.getElementById('services-table'); fetch('/admin/services/data') .then(response => { if (!response.ok) { return response.json().then(err => { throw new Error(err.error || 'Failed to refresh services'); }); } return response.text(); }) .then(html => { servicesTable.innerHTML = html; }) .catch(error => { console.error('Error refreshing services:', error); // Show error message in the services table instead of replacing it const errorHtml = `
Error refreshing services: ${error.message}
`; servicesTable.innerHTML = errorHtml; // Try again after a short delay setTimeout(() => { refreshServices(); }, 3000); }); } // Refresh services as soon as the page loads document.addEventListener('DOMContentLoaded', function() { refreshServices(); }); // Function to start a new service function startService(event) { event.preventDefault(); const form = document.getElementById('start-service-form'); const resultDiv = document.getElementById('start-result'); const formData = new FormData(form); fetch('/admin/services/start', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { if (data.error) { resultDiv.className = 'alert alert-danger'; resultDiv.textContent = data.error; } else { resultDiv.className = 'alert alert-success'; resultDiv.textContent = data.message; form.reset(); refreshServices(); } resultDiv.style.display = 'block'; setTimeout(() => { resultDiv.style.display = 'none'; }, 5000); }) .catch(error => { resultDiv.className = 'alert alert-danger'; resultDiv.textContent = 'An error occurred: ' + error.message; resultDiv.style.display = 'block'; }); } // Function to stop a process function stopProcess(name) { if (!confirm('Are you sure you want to stop this service?')) return; const formData = new FormData(); formData.append('name', name); fetch('/admin/services/stop', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { if (data.error) { alert('Error: ' + data.error); } else { refreshServices(); } }) .catch(error => { alert('An error occurred: ' + error.message); }); } // Function to restart a process function restartProcess(name) { if (!confirm('Are you sure you want to restart this service?')) return; const formData = new FormData(); formData.append('name', name); fetch('/admin/services/restart', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { if (data.error) { alert('Error: ' + data.error); } else { refreshServices(); } }) .catch(error => { alert('An error occurred: ' + error.message); }); } // Function to delete a process function deleteProcess(name) { if (!confirm('Are you sure you want to delete this service? This cannot be undone.')) return; const formData = new FormData(); formData.append('name', name); fetch('/admin/services/delete', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { if (data.error) { alert('Error: ' + data.error); } else { refreshServices(); } }) .catch(error => { alert('An error occurred: ' + error.message); }); } // Function to show process logs function showProcessLogs(name) { // Create a modal to show logs const modal = document.createElement('div'); modal.className = 'modal'; modal.innerHTML = ` `; document.body.appendChild(modal); // Add modal styles if not already present if (!document.getElementById('modal-styles')) { const style = document.createElement('style'); style.id = 'modal-styles'; style.innerHTML = ` .modal { display: block; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.4); } .modal-content { background-color: #fefefe; margin: 5% auto; padding: 20px; border: 1px solid #888; width: 80%; max-width: 800px; border-radius: 5px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); } .modal-header { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid #eee; padding-bottom: 10px; margin-bottom: 15px; } .modal-footer { border-top: 1px solid #eee; padding-top: 15px; margin-top: 15px; text-align: right; } .close { color: #aaa; font-size: 28px; font-weight: bold; cursor: pointer; } .close:hover { color: black; } `; document.head.appendChild(style); } // Close modal when clicking the X modal.querySelector('.close').onclick = closeModal; // Load the logs loadLogs(name); // Close modal when clicking outside window.onclick = function(event) { if (event.target === modal) { closeModal(); } }; } // Function to load logs function loadLogs(name) { fetch(`/admin/services/logs?name=${encodeURIComponent(name)}&lines=100`) .then(response => response.json()) .then(data => { const logContent = document.getElementById('log-content'); if (data.error) { logContent.textContent = `Error: ${data.error}`; } else { logContent.textContent = data.logs || 'No logs available'; // Scroll to bottom logContent.scrollTop = logContent.scrollHeight; } }) .catch(error => { document.getElementById('log-content').textContent = `Error loading logs: ${error.message}`; }); } // Function to refresh logs function refreshLogs(name) { document.getElementById('log-content').textContent = 'Refreshing logs...'; loadLogs(name); } // Function to close the modal function closeModal() { const modal = document.querySelector('.modal'); if (modal) { document.body.removeChild(modal); } window.onclick = null; }