use clap::{Parser, Subcommand};
use commands::{setup, teardown};
use std::process;
use tonic::{Code, Status};
use netavark::dhcp_proxy::lib::g_rpc::{Lease, NetworkConfig};
use netavark::dhcp_proxy::proxy_conf::{DEFAULT_NETWORK_CONFIG, DEFAULT_UDS_PATH};
use netavark::error::NetavarkError;
pub mod commands;
#[derive(Parser, Debug)]
#[clap(version = env!("CARGO_PKG_VERSION"))]
struct Opts {
#[clap(short, long)]
uds: Option<String>,
#[clap(short, long)]
file: Option<String>,
#[clap(subcommand)]
subcmd: SubCommand,
}
#[derive(Subcommand, Debug)]
enum SubCommand {
Setup(setup::Setup),
Teardown(teardown::Teardown),
}
#[cfg(unix)]
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::builder().format_timestamp(None).init();
let opts = Opts::parse();
let file = opts
.file
.unwrap_or_else(|| DEFAULT_NETWORK_CONFIG.to_string());
let uds_path = opts.uds.unwrap_or_else(|| DEFAULT_UDS_PATH.to_string());
let input_config = NetworkConfig::load(&file)?;
let result = match opts.subcmd {
SubCommand::Setup(s) => s.exec(&uds_path, input_config).await,
SubCommand::Teardown(t) => t.exec(&uds_path, input_config).await,
};
let r = match result {
Ok(r) => r,
Err(e) => {
eprintln!("Error: {e}");
match e {
NetavarkError::DHCPProxy(status) => process_failure(status),
_ => process::exit(1),
}
}
};
let pp = ::serde_json::to_string_pretty(&r);
println!("{}", pp.unwrap_or_else(|_| "".to_string()));
Ok(())
}
fn process_failure(status: Status) -> Lease {
let mut rc: i32 = 1;
match status.code() {
Code::Unknown => {
rc = 155;
}
Code::InvalidArgument => {
rc = 156;
}
Code::DeadlineExceeded => {}
Code::NotFound => {
rc = 6;
}
_ => {}
}
process::exit(rc)
}