feat: bootstrap awg2 harness rust workspace and docs
This commit is contained in:
@@ -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())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user