mod challenge;
mod gamebox;
use std::collections::HashMap;
use anyhow::Result;
use bollard::{
Docker,
network::CreateNetworkOptions,
query_parameters::{RemoveContainerOptions, StopContainerOptions},
secret::Ipam,
};
pub use challenge::{ChallengeMeta, DockerMeta, FlagMeta};
pub use gamebox::{GameBoxConfig, GameBoxMeta};
pub async fn stop_and_remove(docker: &bollard::Docker, identifier: &str) -> Result<()> {
let stop_options = StopContainerOptions {
t: 0.into(), ..Default::default()
};
let container_name = identifier;
if let Err(e) = docker
.stop_container(container_name, Some(stop_options))
.await
{
println!(
"⚠️ 停止容器 {} 时提示: {} (可能是已经停止了)",
identifier, e
);
}
let remove_options = RemoveContainerOptions {
v: true, force: true, link: false,
};
match docker
.remove_container(container_name, Some(remove_options))
.await
{
Ok(_) => println!("🗑️ 容器 {} 已彻底清理", identifier),
Err(e) => {
eprintln!("❌ 删除容器 {} 时出错: {}", identifier, e);
}
}
Ok(())
}
pub async fn remove_and_create_bridge_net(
docker: &Docker,
bridge_name: String,
cidr: String,
) -> anyhow::Result<()> {
let _ = docker.remove_network(&bridge_name).await;
let mut network_options = HashMap::new();
network_options.insert(
"com.docker.network.bridge.name".to_string(),
bridge_name.clone(),
);
#[allow(deprecated)] let conf = CreateNetworkOptions {
name: bridge_name,
driver: "bridge".to_string(),
internal: true,
check_duplicate: true,
ipam: Ipam {
config: Some(vec![bollard::secret::IpamConfig {
subnet: cidr.into(),
..Default::default()
}]),
..Default::default()
},
options: network_options,
..Default::default()
};
docker.create_network(conf).await?;
Ok(())
}