v1.7.6: Tableau SystemD Services - ajout des 3 services manquants

Ajout dans le tableau admin et dans les listes allowed restart/toggle:
- rtc_save_to_db.service
- nebuleair-wifi-powersave.timer
- nebuleair-cpu-power.service

Aussi: nebuleair-noise-data.timer etait dans get_systemd_services
mais absent des listes restart/toggle (les boutons n'auraient pas
fonctionne). Corrige.

Nouveau: support d'un display_name explicite par service (override
optionnel) pour les noms qui ne suivent pas la convention
'nebuleair-*-data.timer'.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
PaulVua
2026-05-12 17:42:58 +02:00
parent b87b054e2b
commit d34b029d48
3 changed files with 60 additions and 17 deletions

View File

@@ -1 +1 @@
1.7.5 1.7.6

View File

@@ -1,5 +1,20 @@
{ {
"versions": [ "versions": [
{
"version": "1.7.6",
"date": "2026-05-12",
"changes": {
"features": [],
"improvements": [
"Page admin (tableau SystemD Services): ajout de 3 services manquants — rtc_save_to_db, nebuleair-wifi-powersave.timer, nebuleair-cpu-power.service",
"Page admin: support d'un display_name explicite par service (sinon auto-cleanup) — affichage propre pour les services .service en plus des .timer",
"Page admin: nebuleair-noise-data.timer ajoute aux listes allowed pour restart/toggle (etait dans get_systemd_services mais pas dans les 2 autres)"
],
"fixes": [],
"compatibility": []
},
"notes": "Le tableau SystemD Services affiche maintenant la liste complete des 11 services NebuleAir. Cohérence des 3 listes hardcodees (display, restart, toggle)."
},
{ {
"version": "1.7.5", "version": "1.7.5",
"date": "2026-05-12", "date": "2026-05-12",

View File

@@ -1476,6 +1476,7 @@ if ($type == "execute_command") {
if ($type == "get_systemd_services") { if ($type == "get_systemd_services") {
try { try {
// List of NebuleAir services to monitor with descriptions and frequencies // List of NebuleAir services to monitor with descriptions and frequencies
// Optional 'display_name' overrides the auto-generated cleaned-up name.
$services = [ $services = [
'nebuleair-npm-data.timer' => [ 'nebuleair-npm-data.timer' => [
'description' => 'Collects particulate matter data from NextPM sensor', 'description' => 'Collects particulate matter data from NextPM sensor',
@@ -1508,26 +1509,45 @@ if ($type == "get_systemd_services") {
'nebuleair-db-cleanup-data.timer' => [ 'nebuleair-db-cleanup-data.timer' => [
'description' => 'Cleans up old data from database', 'description' => 'Cleans up old data from database',
'frequency' => 'Daily' 'frequency' => 'Daily'
],
'nebuleair-wifi-powersave.timer' => [
'display_name' => 'Wifi powersave',
'description' => 'Enables WiFi power-saving mode to reduce battery consumption',
'frequency' => '10 min after boot'
],
'nebuleair-cpu-power.service' => [
'display_name' => 'Cpu power',
'description' => 'Applies CPU power mode from DB config at boot',
'frequency' => 'At boot'
],
'rtc_save_to_db.service' => [
'display_name' => 'Rtc save to db',
'description' => 'Reads DS3231 RTC over I2C and saves timestamp to DB',
'frequency' => 'Continuous (1Hz)'
] ]
]; ];
$serviceStatus = []; $serviceStatus = [];
foreach ($services as $service => $serviceInfo) { foreach ($services as $service => $serviceInfo) {
// Get service active status // Get service active status
$activeCmd = "systemctl is-active " . escapeshellarg($service) . " 2>/dev/null"; $activeCmd = "systemctl is-active " . escapeshellarg($service) . " 2>/dev/null";
$activeStatus = trim(shell_exec($activeCmd)); $activeStatus = trim(shell_exec($activeCmd));
$isActive = ($activeStatus === 'active'); $isActive = ($activeStatus === 'active');
// Get service enabled status // Get service enabled status
$enabledCmd = "systemctl is-enabled " . escapeshellarg($service) . " 2>/dev/null"; $enabledCmd = "systemctl is-enabled " . escapeshellarg($service) . " 2>/dev/null";
$enabledStatus = trim(shell_exec($enabledCmd)); $enabledStatus = trim(shell_exec($enabledCmd));
$isEnabled = ($enabledStatus === 'enabled'); $isEnabled = ($enabledStatus === 'enabled');
// Clean up service name for display // Display name: explicit override if provided, otherwise auto-cleanup
$displayName = str_replace(['.timer', 'nebuleair-', '-data'], '', $service); if (isset($serviceInfo['display_name'])) {
$displayName = ucfirst(str_replace('-', ' ', $displayName)); $displayName = $serviceInfo['display_name'];
} else {
$displayName = str_replace(['.timer', '.service', 'nebuleair-', '-data'], '', $service);
$displayName = ucfirst(str_replace('-', ' ', $displayName));
}
$serviceStatus[] = [ $serviceStatus[] = [
'name' => $service, 'name' => $service,
'display_name' => $displayName, 'display_name' => $displayName,
@@ -1566,14 +1586,18 @@ if ($type == "restart_systemd_service") {
// Validate service name (security check) // Validate service name (security check)
$allowedServices = [ $allowedServices = [
'nebuleair-npm-data.timer', 'nebuleair-npm-data.timer',
'nebuleair-envea-data.timer', 'nebuleair-envea-data.timer',
'nebuleair-sara-data.timer', 'nebuleair-sara-data.timer',
'nebuleair-bme280-data.timer', 'nebuleair-bme280-data.timer',
'nebuleair-mppt-data.timer', 'nebuleair-mppt-data.timer',
'nebuleair-noise-data.timer',
'nebuleair-mhz19-data.timer', 'nebuleair-mhz19-data.timer',
'nebuleair-db-cleanup-data.timer' 'nebuleair-db-cleanup-data.timer',
'nebuleair-wifi-powersave.timer',
'nebuleair-cpu-power.service',
'rtc_save_to_db.service'
]; ];
if (!in_array($service, $allowedServices)) { if (!in_array($service, $allowedServices)) {
echo json_encode([ echo json_encode([
'success' => false, 'success' => false,
@@ -1581,7 +1605,7 @@ if ($type == "restart_systemd_service") {
]); ]);
exit; exit;
} }
try { try {
// Restart the service // Restart the service
$command = "sudo systemctl restart " . escapeshellarg($service) . " 2>&1"; $command = "sudo systemctl restart " . escapeshellarg($service) . " 2>&1";
@@ -1627,14 +1651,18 @@ if ($type == "toggle_systemd_service") {
// Validate service name (security check) // Validate service name (security check)
$allowedServices = [ $allowedServices = [
'nebuleair-npm-data.timer', 'nebuleair-npm-data.timer',
'nebuleair-envea-data.timer', 'nebuleair-envea-data.timer',
'nebuleair-sara-data.timer', 'nebuleair-sara-data.timer',
'nebuleair-bme280-data.timer', 'nebuleair-bme280-data.timer',
'nebuleair-mppt-data.timer', 'nebuleair-mppt-data.timer',
'nebuleair-noise-data.timer',
'nebuleair-mhz19-data.timer', 'nebuleair-mhz19-data.timer',
'nebuleair-db-cleanup-data.timer' 'nebuleair-db-cleanup-data.timer',
'nebuleair-wifi-powersave.timer',
'nebuleair-cpu-power.service',
'rtc_save_to_db.service'
]; ];
if (!in_array($service, $allowedServices)) { if (!in_array($service, $allowedServices)) {
echo json_encode([ echo json_encode([
'success' => false, 'success' => false,
@@ -1642,7 +1670,7 @@ if ($type == "toggle_systemd_service") {
]); ]);
exit; exit;
} }
try { try {
$enable = filter_var($enable, FILTER_VALIDATE_BOOLEAN); $enable = filter_var($enable, FILTER_VALIDATE_BOOLEAN);
$action = $enable ? 'enable' : 'disable'; $action = $enable ? 'enable' : 'disable';