updates
This commit is contained in:
268
html/admin.html
268
html/admin.html
@@ -178,6 +178,39 @@
|
||||
|
||||
</div>
|
||||
|
||||
<!-- SYSTEMD SERVICES SECTION -->
|
||||
<div class="row mb-3">
|
||||
<div class="col-12">
|
||||
<h3 class="mt-4">SystemD Services</h3>
|
||||
<div id="services-table">
|
||||
<div class="d-flex justify-content-end mb-3">
|
||||
<button type="button" class="btn btn-primary" onclick="refreshServices()">
|
||||
<svg width="16" height="16" fill="currentColor" class="bi bi-arrow-clockwise" viewBox="0 0 16 16">
|
||||
<path fill-rule="evenodd" d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z"/>
|
||||
<path d="M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466z"/>
|
||||
</svg>
|
||||
Refresh
|
||||
</button>
|
||||
</div>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Service</th>
|
||||
<th>Status</th>
|
||||
<th>Enabled</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="services-tbody">
|
||||
<tr>
|
||||
<td colspan="4" class="text-center">Loading services...</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- toast -->
|
||||
|
||||
@@ -409,6 +442,8 @@ window.onload = function() {
|
||||
}
|
||||
}); //end AJAx
|
||||
|
||||
// Load services on page load
|
||||
refreshServices();
|
||||
|
||||
} //end window.onload
|
||||
|
||||
@@ -925,6 +960,239 @@ function updateSondeCoefficient(id, coefficient) {
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
____ _ __ __ _
|
||||
/ ___| ___ _ ____ _(_) ___ ___| \/ | __ _ _ __ __ _ __ _ ___ _ __ ___ ___ _ __ | |_
|
||||
\___ \ / _ \ '__\ \ / / |/ __/ _ \ |\/| |/ _` | '_ \ / _` |/ _` |/ _ \ '_ ` _ \ / _ \ '_ \| __|
|
||||
___) | __/ | \ V /| | (_| __/ | | | (_| | | | | (_| | (_| | __/ | | | | | __/ | | | |_
|
||||
|____/ \___|_| \_/ |_|\___\___|_| |_|\__,_|_| |_|\__,_|\__, |\___|_| |_| |_|\___|_| |_|\__|
|
||||
|___/
|
||||
*/
|
||||
|
||||
function refreshServices() {
|
||||
console.log("Refreshing services status");
|
||||
|
||||
$.ajax({
|
||||
url: 'launcher.php?type=get_systemd_services',
|
||||
dataType: 'json',
|
||||
method: 'GET',
|
||||
cache: false,
|
||||
success: function(response) {
|
||||
console.log("Services data:", response);
|
||||
|
||||
if (response.success) {
|
||||
displayServices(response.services);
|
||||
} else {
|
||||
showServiceError("Failed to load services: " + response.error);
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
console.error('Failed to load services:', error);
|
||||
showServiceError("Failed to load services: " + error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function displayServices(services) {
|
||||
const tbody = document.getElementById('services-tbody');
|
||||
tbody.innerHTML = '';
|
||||
|
||||
services.forEach(function(service) {
|
||||
const row = document.createElement('tr');
|
||||
|
||||
// Service name
|
||||
const nameCell = document.createElement('td');
|
||||
nameCell.textContent = service.display_name || service.name;
|
||||
row.appendChild(nameCell);
|
||||
|
||||
// Status
|
||||
const statusCell = document.createElement('td');
|
||||
const statusBadge = document.createElement('span');
|
||||
statusBadge.className = `badge ${service.active ? 'bg-success' : 'bg-danger'}`;
|
||||
statusBadge.textContent = service.active ? 'Running' : 'Stopped';
|
||||
statusCell.appendChild(statusBadge);
|
||||
row.appendChild(statusCell);
|
||||
|
||||
// Enabled
|
||||
const enabledCell = document.createElement('td');
|
||||
const enabledBadge = document.createElement('span');
|
||||
enabledBadge.className = `badge ${service.enabled ? 'bg-info' : 'bg-secondary'}`;
|
||||
enabledBadge.textContent = service.enabled ? 'Enabled' : 'Disabled';
|
||||
enabledCell.appendChild(enabledBadge);
|
||||
row.appendChild(enabledCell);
|
||||
|
||||
// Actions
|
||||
const actionsCell = document.createElement('td');
|
||||
|
||||
// Restart button
|
||||
const restartBtn = document.createElement('button');
|
||||
restartBtn.className = 'btn btn-sm btn-warning me-2';
|
||||
restartBtn.innerHTML = '<i class="bi bi-arrow-clockwise"></i> Restart';
|
||||
restartBtn.onclick = function() {
|
||||
restartService(service.name);
|
||||
};
|
||||
actionsCell.appendChild(restartBtn);
|
||||
|
||||
// Enable/Disable button
|
||||
const toggleBtn = document.createElement('button');
|
||||
toggleBtn.className = `btn btn-sm ${service.enabled ? 'btn-danger' : 'btn-success'}`;
|
||||
toggleBtn.innerHTML = service.enabled ? '<i class="bi bi-stop"></i> Disable' : '<i class="bi bi-play"></i> Enable';
|
||||
toggleBtn.onclick = function() {
|
||||
toggleService(service.name, !service.enabled);
|
||||
};
|
||||
actionsCell.appendChild(toggleBtn);
|
||||
|
||||
row.appendChild(actionsCell);
|
||||
tbody.appendChild(row);
|
||||
});
|
||||
}
|
||||
|
||||
function showServiceError(message) {
|
||||
const tbody = document.getElementById('services-tbody');
|
||||
tbody.innerHTML = `
|
||||
<tr>
|
||||
<td colspan="4" class="text-center text-danger">
|
||||
<i class="bi bi-exclamation-triangle"></i> ${message}
|
||||
</td>
|
||||
</tr>
|
||||
`;
|
||||
}
|
||||
|
||||
function restartService(serviceName) {
|
||||
console.log(`Restarting service: ${serviceName}`);
|
||||
|
||||
if (!confirm(`Are you sure you want to restart ${serviceName}?`)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const toastLiveExample = document.getElementById('liveToast');
|
||||
const toastBody = toastLiveExample.querySelector('.toast-body');
|
||||
|
||||
$.ajax({
|
||||
url: 'launcher.php?type=restart_systemd_service&service=' + encodeURIComponent(serviceName),
|
||||
dataType: 'json',
|
||||
method: 'GET',
|
||||
cache: false,
|
||||
success: function(response) {
|
||||
console.log('Service restart response:', response);
|
||||
|
||||
let formattedMessage = '';
|
||||
|
||||
if (response.success) {
|
||||
// Success message
|
||||
toastLiveExample.classList.remove('text-bg-danger');
|
||||
toastLiveExample.classList.add('text-bg-success');
|
||||
|
||||
formattedMessage = `
|
||||
<strong>Success!</strong><br>
|
||||
Service: ${serviceName}<br>
|
||||
${response.message || 'Service restarted successfully'}
|
||||
`;
|
||||
|
||||
// Refresh services after a short delay
|
||||
setTimeout(refreshServices, 2000);
|
||||
} else {
|
||||
// Error message
|
||||
toastLiveExample.classList.remove('text-bg-success');
|
||||
toastLiveExample.classList.add('text-bg-danger');
|
||||
|
||||
formattedMessage = `
|
||||
<strong>Error!</strong><br>
|
||||
Service: ${serviceName}<br>
|
||||
${response.error || 'Unknown error occurred'}
|
||||
`;
|
||||
}
|
||||
|
||||
// Update and show toast
|
||||
toastBody.innerHTML = formattedMessage;
|
||||
const toastBootstrap = bootstrap.Toast.getOrCreateInstance(toastLiveExample);
|
||||
toastBootstrap.show();
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
console.error('Failed to restart service:', error);
|
||||
|
||||
// Show error toast
|
||||
toastLiveExample.classList.remove('text-bg-success');
|
||||
toastLiveExample.classList.add('text-bg-danger');
|
||||
toastBody.innerHTML = `
|
||||
<strong>Request Failed!</strong><br>
|
||||
Service: ${serviceName}<br>
|
||||
Error: ${error}
|
||||
`;
|
||||
const toastBootstrap = bootstrap.Toast.getOrCreateInstance(toastLiveExample);
|
||||
toastBootstrap.show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function toggleService(serviceName, enable) {
|
||||
const action = enable ? 'enable' : 'disable';
|
||||
console.log(`${action} service: ${serviceName}`);
|
||||
|
||||
if (!confirm(`Are you sure you want to ${action} ${serviceName}?`)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const toastLiveExample = document.getElementById('liveToast');
|
||||
const toastBody = toastLiveExample.querySelector('.toast-body');
|
||||
|
||||
$.ajax({
|
||||
url: 'launcher.php?type=toggle_systemd_service&service=' + encodeURIComponent(serviceName) + '&enable=' + enable,
|
||||
dataType: 'json',
|
||||
method: 'GET',
|
||||
cache: false,
|
||||
success: function(response) {
|
||||
console.log('Service toggle response:', response);
|
||||
|
||||
let formattedMessage = '';
|
||||
|
||||
if (response.success) {
|
||||
// Success message
|
||||
toastLiveExample.classList.remove('text-bg-danger');
|
||||
toastLiveExample.classList.add('text-bg-success');
|
||||
|
||||
formattedMessage = `
|
||||
<strong>Success!</strong><br>
|
||||
Service: ${serviceName}<br>
|
||||
${response.message || `Service ${action}d successfully`}
|
||||
`;
|
||||
|
||||
// Refresh services after a short delay
|
||||
setTimeout(refreshServices, 2000);
|
||||
} else {
|
||||
// Error message
|
||||
toastLiveExample.classList.remove('text-bg-success');
|
||||
toastLiveExample.classList.add('text-bg-danger');
|
||||
|
||||
formattedMessage = `
|
||||
<strong>Error!</strong><br>
|
||||
Service: ${serviceName}<br>
|
||||
${response.error || 'Unknown error occurred'}
|
||||
`;
|
||||
}
|
||||
|
||||
// Update and show toast
|
||||
toastBody.innerHTML = formattedMessage;
|
||||
const toastBootstrap = bootstrap.Toast.getOrCreateInstance(toastLiveExample);
|
||||
toastBootstrap.show();
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
console.error('Failed to toggle service:', error);
|
||||
|
||||
// Show error toast
|
||||
toastLiveExample.classList.remove('text-bg-success');
|
||||
toastLiveExample.classList.add('text-bg-danger');
|
||||
toastBody.innerHTML = `
|
||||
<strong>Request Failed!</strong><br>
|
||||
Service: ${serviceName}<br>
|
||||
Error: ${error}
|
||||
`;
|
||||
const toastBootstrap = bootstrap.Toast.getOrCreateInstance(toastLiveExample);
|
||||
toastBootstrap.show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user