diff --git a/server/monitor-types/local-service.js b/server/monitor-types/local-service.js index 65183fda0..b15891ac0 100644 --- a/server/monitor-types/local-service.js +++ b/server/monitor-types/local-service.js @@ -9,40 +9,45 @@ class LocalServiceMonitorType extends MonitorType { /** * Check a local systemd service status. * Uses `systemctl is-running` to determine if the service is active. - * @param {object} monitor The monitor object containing serviceName. + * @param {object} monitor The monitor object containing monitor.local_service_name. * @param {object} heartbeat The heartbeat object to update. * @param {object} server The server object (unused in this specific check). * @returns {Promise} A promise that resolves with the updated heartbeat. - * @throws {Error} If the serviceName is invalid or the command execution fails. + * @throws {Error} If the monitor.local_service_name is invalid or the command execution fails. */ async check(monitor, heartbeat, server) { - // This is the name of the service to check e.g. "nginx.service" - const serviceName = monitor.local_service_name; - // Basic sanitization to prevent argument injection. // This regex allows for standard service names, including those with instances like "sshd@.service". - if (!serviceName || !/^[a-zA-Z0-9._\-@]+$/.test(serviceName)) { + if (!monitor.local_service_name || !/^[a-zA-Z0-9._\-@]+$/.test(monitor.local_service_name)) { heartbeat.status = DOWN; heartbeat.msg = "Invalid service name provided."; throw new Error(heartbeat.msg); } return new Promise((resolve, reject) => { - execFile("systemctl", [ "is-active", serviceName ], (error, stdout, stderr) => { + execFile("systemctl", [ "is-active", monitor.local_service_name ], (error, stdout, stderr) => { // systemctl is-active exits with 0 if the service is active, // and a non-zero code if it is inactive, failed, or not found. + // 1. Capture the raw output (prioritize stderr for errors) + let output = (stderr || stdout || "").toString().trim(); + + // 2. Truncate if too long to ~200 chars + if (output.length > 200) { + output = output.substring(0, 200) + "..."; + } + if (error) { - heartbeat.status = DOWN; // stderr often contains useful info like "service not found" - heartbeat.msg = stderr || stdout || `Service '${serviceName}' is not running.`; + // Use the truncated output, or a default fallback if empty + heartbeat.msg = stderr || stdout || `Service '${monitor.local_service_name}' is not running.`; reject(new Error(heartbeat.msg)); return; } // If there's no error, the service is running. heartbeat.status = UP; - heartbeat.msg = `Service '${serviceName}' is running.`; - resolve(heartbeat); + heartbeat.msg = `Service '${monitor.local_service_name}' is running.`; + resolve(); }); }); }