Private
Public Access
1
0

fix: detect socket activation for service status healthy logic
Some checks failed
CI/CD Pipeline / Code Format (push) Failing after 2s
CI/CD Pipeline / Clippy Lints (push) Successful in 38s
CI/CD Pipeline / Unit Tests (push) Successful in 47s
CI/CD Pipeline / Build Debian Package (push) Has been skipped
CI/CD Pipeline / Build Debian Package (Ubuntu 22.04) (push) Has been skipped
CI/CD Pipeline / Build RPM Package (push) Has been skipped
CI/CD Pipeline / Build Alpine Package (push) Has been skipped
CI/CD Pipeline / Build Arch Package (push) Has been skipped
CI/CD Pipeline / Security Audit (push) Successful in 5s

This commit is contained in:
2026-05-05 16:25:59 +00:00
parent a7b48a59cc
commit 4b32db0d26
3 changed files with 31 additions and 1 deletions

View File

@ -1,6 +1,6 @@
[package]
name = "linux-patch-api"
version = "0.3.8"
version = "0.3.9"
edition = "2021"
authors = ["Echo <echo@moon-dragon.us>"]
description = "Secure remote package management API for Linux systems"

8
debian/changelog vendored
View File

@ -1,3 +1,11 @@
linux-patch-api (0.3.9-1) unstable; urgency=low
* Fix socket activation detection for service status healthy logic
* When service is inactive but enabled, check if .socket unit is active
* Mark service healthy if socket is listening (e.g., ssh.socket for ssh.service)
-- Echo <echo@moon-dragon.us> Mon, 05 May 2026 11:25:00 -0500
linux-patch-api (0.3.8-1) unstable; urgency=low
* Add GET /api/v1/system/services/{name} endpoint for service health checks

View File

@ -568,6 +568,28 @@ fn get_systemd_service_status(name: &str) -> Result<Option<ServiceStatus>> {
let healthy = active_state == "active" && sub_state == "running";
// Check for socket activation: if service is inactive but enabled,
// check if the corresponding .socket unit is active (listening)
let healthy = if !healthy && active_state == "inactive" && unit_file_state == "enabled" {
let socket_name = format!("{}.socket", name.trim_end_matches(".service"));
if let Ok(socket_output) = Command::new("systemctl")
.args(["show", &socket_name, "--property=ActiveState", "--no-pager"])
.output()
{
let socket_stdout = String::from_utf8_lossy(&socket_output.stdout);
if socket_stdout.contains("ActiveState=active") {
true
} else {
healthy
}
} else {
healthy
}
} else {
healthy
};
Ok(Some(ServiceStatus {
name: id,
display_name: description,