From c463e64205130ca98f7153e58a79412e9beda882 Mon Sep 17 00:00:00 2001 From: Crimson Date: Tue, 12 May 2026 13:15:14 +0500 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20runtime-=D0=B1=D0=B0=D0=B3=D0=B8=20firewal?= =?UTF-8?q?l=20policy=20=D0=B8=20=D0=BF=D0=B0=D1=80=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=20swapon=20=D0=B4=D0=BB=D1=8F=20Debian=2013?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- traffic_core/src/firewall.rs | 5 +---- traffic_core/src/swap.rs | 30 +++++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/traffic_core/src/firewall.rs b/traffic_core/src/firewall.rs index 8a70b69..6c671c7 100644 --- a/traffic_core/src/firewall.rs +++ b/traffic_core/src/firewall.rs @@ -153,7 +153,7 @@ fn build_host_firewall_batch_script(cfg: &Config, policy: &str) -> String { let mut batch = String::new(); batch.push_str(&format!("add table inet {HOST_FW_TABLE}\n")); batch.push_str(&format!( - "add chain inet {HOST_FW_TABLE} input {{ type filter hook input priority filter; policy accept; }}\n" + "add chain inet {HOST_FW_TABLE} input {{ type filter hook input priority filter; policy {policy}; }}\n" )); batch.push_str(&format!( "add rule inet {HOST_FW_TABLE} input iif \"lo\" accept\n" @@ -180,9 +180,6 @@ fn build_host_firewall_batch_script(cfg: &Config, policy: &str) -> String { "add rule inet {HOST_FW_TABLE} input ip6 nexthdr icmpv6 accept\n" )); } - batch.push_str(&format!( - "set chain inet {HOST_FW_TABLE} input {{ policy {policy}; }}\n" - )); batch } diff --git a/traffic_core/src/swap.rs b/traffic_core/src/swap.rs index 7b597a4..a47b655 100644 --- a/traffic_core/src/swap.rs +++ b/traffic_core/src/swap.rs @@ -159,15 +159,27 @@ fn parse_swapon_output(raw: &str) -> anyhow::Result> { continue; } let parts: Vec<&str> = t.split_whitespace().collect(); - if parts.len() != 4 { + if parts.len() < 4 { anyhow::bail!("malformed swapon row: {t}"); } let size_bytes = parts[2] .parse::() .map_err(|_| anyhow::anyhow!("malformed swapon size: {}", parts[2]))?; - let priority = parts[3] + + // Debian 13/util-linux may include USED and UUID despite the requested + // output set. Accept both the old 4-column form: + // NAME TYPE SIZE PRIO + // and the observed 5/6-column form: + // NAME TYPE SIZE USED PRIO [UUID] + let priority_index = if parts.len() >= 5 && parts[4].parse::().is_ok() { + 4 + } else { + 3 + }; + + let priority = parts[priority_index] .parse::() - .map_err(|_| anyhow::anyhow!("malformed swapon priority: {}", parts[3]))?; + .map_err(|_| anyhow::anyhow!("malformed swapon priority: {}", parts[priority_index]))?; out.push(ActiveSwap { name: PathBuf::from(parts[0]), kind: parts[1].to_string(), @@ -518,6 +530,18 @@ mod tests { assert_eq!(got.len(), 2); } + #[test] + fn parse_swapon_debian13_columns_with_used_prio_uuid() { + let got = parse_swapon_output( + "/swapfile file 2147479552 0 1 c8db470e-b8fb-414a-8537-8fa405ebeadf\n", + ) + .expect("parse"); + assert_eq!(got.len(), 1); + assert_eq!(got[0].name, PathBuf::from("/swapfile")); + assert_eq!(got[0].size_bytes, 2147479552); + assert_eq!(got[0].priority, 1); + } + #[test] fn parse_swapon_rejects_malformed_size() { let err = parse_swapon_output("/swapfile file abc 1\n");