Private
Public Access
1
0

fix: implement actual system reboot via shutdown/systemctl commands

- Fix reboot_system() to use shutdown -r +N for delayed reboots
- Fix patches handler to call reboot_system() instead of just logging
- Add CAP_SYS_BOOT capability to systemd service for LXC reboot support
- Remove unused warn import from packages/mod.rs
- Bump version to 0.3.1
This commit is contained in:
2026-05-03 01:37:22 +00:00
parent 2e00f1a160
commit 3e037f2648
7 changed files with 67 additions and 13 deletions

View File

@ -139,7 +139,22 @@ pub async fn apply_patches(
),
)
.await;
// In production, would trigger actual reboot via system handler
// Trigger actual reboot via system handler
match backend_clone.reboot_system(request.reboot_delay_seconds) {
Ok(_) => {
let _ = job_manager_clone
.add_job_log(
&job_id_clone,
"Reboot command executed".to_string(),
)
.await;
}
Err(e) => {
let _ = job_manager_clone
.add_job_log(&job_id_clone, format!("Reboot failed: {}", e))
.await;
}
}
}
}
Err(e) => {

View File

@ -6,7 +6,7 @@
use anyhow::{Context, Result};
use serde::{Deserialize, Serialize};
use std::process::Command;
use tracing::{info, warn};
use tracing::info;
/// Package status
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
@ -466,17 +466,27 @@ impl PackageManagerBackend for AptBackend {
fn reboot_system(&self, delay_seconds: u64) -> Result<()> {
if delay_seconds > 0 {
info!("Scheduling reboot in {} seconds", delay_seconds);
// In production, would use systemd shutdown scheduler
warn!("Delayed reboot not fully implemented - would use systemd in production");
// Use shutdown command for delayed reboot (converts seconds to minutes, minimum 1)
let delay_minutes = std::cmp::max(1u64, delay_seconds.div_ceil(60));
info!(
"Scheduling system reboot in {} minutes (requested {} seconds)",
delay_minutes, delay_seconds
);
Command::new("shutdown")
.args(["-r", &format!("+{}", delay_minutes)])
.status()
.context("Failed to schedule delayed reboot")?;
info!("System reboot scheduled in {} minutes", delay_minutes);
} else {
// Immediate reboot using systemctl
info!("Initiating immediate system reboot");
Command::new("systemctl")
.arg("reboot")
.status()
.context("Failed to execute reboot command")?;
info!("System reboot initiated");
}
Command::new("systemctl")
.arg("reboot")
.status()
.context("Failed to execute reboot command")?;
info!("System reboot initiated");
Ok(())
}
}