Рефакторинг под прод: nsenter-first транспорт, drift-aware reconcile, hardening daemon/lock/reboot/swap, расширенный status и build-скрипт

This commit is contained in:
2026-05-09 22:03:30 +05:00
parent d937f816bf
commit e7818054e8
16 changed files with 900 additions and 96 deletions
+75 -2
View File
@@ -1,7 +1,18 @@
use crate::{config::Config, docker, wg};
use crate::{config::Config, docker, traffic, wg};
use std::{fs, process::Command};
pub fn print_status(cfg: &Config) -> anyhow::Result<()> {
println!("System:");
let svc = Command::new("systemctl")
.args(["is-active", "awg2-harness"])
.output();
match svc {
Ok(out) if out.status.success() => println!(" service: active"),
Ok(_) => println!(" service: inactive"),
Err(_) => println!(" service: unknown"),
}
let target = match docker::discover_target(cfg) {
Ok(t) => t,
Err(e) => {
@@ -16,7 +27,11 @@ pub fn print_status(cfg: &Config) -> anyhow::Result<()> {
println!(" netns: {}", target.netns_path);
println!(" interface: {}", target.interface_name);
let peers = wg::discover_peers(&target.container_name, &cfg.amnezia.peer_ipv4_cidr)?;
let peers = wg::discover_peers(
target.container_pid,
&target.container_name,
&cfg.amnezia.peer_ipv4_cidr,
)?;
println!("Peers:");
println!(" total: {}", peers.len());
for p in peers {
@@ -29,12 +44,70 @@ pub fn print_status(cfg: &Config) -> anyhow::Result<()> {
println!(" ifb_name: {}", cfg.traffic.ifb_name);
println!(" class_start_id: {}", cfg.traffic.class_start_id);
println!("Traffic actual:");
match traffic::inspect_drift_summary(cfg) {
Ok(None) => println!(" drift: no"),
Ok(Some(reason)) => {
println!(" drift: yes");
println!(" reason: {}", reason);
}
Err(e) => println!(" drift: unknown ({e})"),
}
println!("Anti-torrent:");
println!(" enabled: {}", cfg.anti_torrent.enabled);
println!(
" max_connections_per_peer: {}",
cfg.anti_torrent.max_connections_per_peer
);
if cfg.anti_torrent.enabled {
let fw = Command::new("nsenter")
.args([
"-t",
&target.container_pid.to_string(),
"-n",
"--",
"nft",
"list",
"table",
"inet",
"awg2_harness",
])
.output();
match fw {
Ok(out) if out.status.success() => println!(" actual: table present"),
Ok(_) => println!(" actual: table missing or drift"),
Err(_) => println!(" actual: unable to inspect"),
}
}
let ct_count = Command::new("sysctl")
.args(["-n", "net.netfilter.nf_conntrack_count"])
.output()
.ok()
.map(|o| String::from_utf8_lossy(&o.stdout).trim().to_string())
.unwrap_or_else(|| "n/a".to_string());
let ct_max = Command::new("sysctl")
.args(["-n", "net.netfilter.nf_conntrack_max"])
.output()
.ok()
.map(|o| String::from_utf8_lossy(&o.stdout).trim().to_string())
.unwrap_or_else(|| "n/a".to_string());
println!("Conntrack:");
println!(" nf_conntrack_count: {}", ct_count);
println!(" nf_conntrack_max: {}", ct_max);
println!("Last actions:");
let last = fs::read_to_string("/run/awg2-harness/last_action.state").unwrap_or_default();
if last.trim().is_empty() {
println!(" no persisted state");
} else {
for line in last.lines() {
println!(" {}", line);
}
}
Ok(())
}