feat: bootstrap awg2 harness rust workspace and docs

This commit is contained in:
2026-05-09 02:17:25 +05:00
commit d937f816bf
47 changed files with 4195 additions and 0 deletions
+65
View File
@@ -0,0 +1,65 @@
use std::process::Command;
use crate::{config::Config, error::AppError};
#[derive(Debug, Clone)]
pub struct RuntimeTarget {
pub container_name: String,
pub container_id: String,
pub container_pid: u32,
pub netns_path: String,
pub interface_name: String,
}
pub fn discover_target(cfg: &Config) -> anyhow::Result<RuntimeTarget> {
let container_name = find_running_container(&cfg.amnezia.container_names)?;
let container_id = run_capture(&["docker", "inspect", "--format", "{{.Id}}", &container_name])?
.trim()
.to_string();
let pid_str = run_capture(&[
"docker",
"inspect",
"--format",
"{{.State.Pid}}",
&container_name,
])?;
let container_pid = pid_str.trim().parse::<u32>()?;
let netns_path = format!("/proc/{container_pid}/ns/net");
let interface_name = crate::iface::detect_interface(cfg, &container_name)?;
Ok(RuntimeTarget {
container_name,
container_id,
container_pid,
netns_path,
interface_name,
})
}
fn find_running_container(names: &[String]) -> anyhow::Result<String> {
let ps = run_capture(&["docker", "ps", "--format", "{{.Names}}"])?;
for name in names {
if ps.lines().any(|x| x.trim() == name) {
return Ok(name.clone());
}
}
Err(AppError::NotFound("amnezia container not running".to_string()).into())
}
pub fn run_capture(args: &[&str]) -> anyhow::Result<String> {
let (program, rest) = args
.split_first()
.ok_or_else(|| anyhow::anyhow!("empty command"))?;
let out = Command::new(program).args(rest).output()?;
if !out.status.success() {
return Err(AppError::Command(format!(
"{} {:?}: {}",
program,
rest,
String::from_utf8_lossy(&out.stderr)
))
.into());
}
Ok(String::from_utf8_lossy(&out.stdout).to_string())
}