Исправлены runtime-баги firewall policy и парсера swapon для Debian 13
This commit is contained in:
@@ -153,7 +153,7 @@ fn build_host_firewall_batch_script(cfg: &Config, policy: &str) -> String {
|
|||||||
let mut batch = String::new();
|
let mut batch = String::new();
|
||||||
batch.push_str(&format!("add table inet {HOST_FW_TABLE}\n"));
|
batch.push_str(&format!("add table inet {HOST_FW_TABLE}\n"));
|
||||||
batch.push_str(&format!(
|
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!(
|
batch.push_str(&format!(
|
||||||
"add rule inet {HOST_FW_TABLE} input iif \"lo\" accept\n"
|
"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"
|
"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
|
batch
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -159,15 +159,27 @@ fn parse_swapon_output(raw: &str) -> anyhow::Result<Vec<ActiveSwap>> {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let parts: Vec<&str> = t.split_whitespace().collect();
|
let parts: Vec<&str> = t.split_whitespace().collect();
|
||||||
if parts.len() != 4 {
|
if parts.len() < 4 {
|
||||||
anyhow::bail!("malformed swapon row: {t}");
|
anyhow::bail!("malformed swapon row: {t}");
|
||||||
}
|
}
|
||||||
let size_bytes = parts[2]
|
let size_bytes = parts[2]
|
||||||
.parse::<u64>()
|
.parse::<u64>()
|
||||||
.map_err(|_| anyhow::anyhow!("malformed swapon size: {}", parts[2]))?;
|
.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::<i32>().is_ok() {
|
||||||
|
4
|
||||||
|
} else {
|
||||||
|
3
|
||||||
|
};
|
||||||
|
|
||||||
|
let priority = parts[priority_index]
|
||||||
.parse::<i32>()
|
.parse::<i32>()
|
||||||
.map_err(|_| anyhow::anyhow!("malformed swapon priority: {}", parts[3]))?;
|
.map_err(|_| anyhow::anyhow!("malformed swapon priority: {}", parts[priority_index]))?;
|
||||||
out.push(ActiveSwap {
|
out.push(ActiveSwap {
|
||||||
name: PathBuf::from(parts[0]),
|
name: PathBuf::from(parts[0]),
|
||||||
kind: parts[1].to_string(),
|
kind: parts[1].to_string(),
|
||||||
@@ -518,6 +530,18 @@ mod tests {
|
|||||||
assert_eq!(got.len(), 2);
|
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]
|
#[test]
|
||||||
fn parse_swapon_rejects_malformed_size() {
|
fn parse_swapon_rejects_malformed_size() {
|
||||||
let err = parse_swapon_output("/swapfile file abc 1\n");
|
let err = parse_swapon_output("/swapfile file abc 1\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user