1

working on args

This commit is contained in:
Evan Pratten 2023-08-01 21:08:42 -04:00
parent 1e7b616701
commit 167394ff91
2 changed files with 68 additions and 36 deletions

View File

@ -1,8 +1,20 @@
//! Command line argument definitions //! Command line argument definitions
use std::path::PathBuf; use std::{net::Ipv6Addr, path::PathBuf, str::FromStr};
use clap::{Parser, Subcommand}; use clap::{Parser, Subcommand};
use ipnet::{Ipv4Net, Ipv6Net};
/// Shorthand for generating the well-known NAT64 prefix
macro_rules! wkp {
() => {
Ipv6Net::new(
Ipv6Addr::new(0x0064, 0xff9b, 0x000, 0x0000, 0x000, 0x0000, 0x000, 0x0000),
96,
)
.unwrap()
};
}
#[derive(Parser)] #[derive(Parser)]
#[command(author, version, about, long_about = None)] #[command(author, version, about, long_about = None)]
@ -17,9 +29,31 @@ pub struct Args {
#[derive(Subcommand)] #[derive(Subcommand)]
pub enum Commands { pub enum Commands {
/// Run protomask in NAT64 mode
Nat64 { Nat64 {
/// Path to the config file /// IPv6 prefix to listen for packets on
config_file: PathBuf, #[clap(short='l', long = "listen", default_value_t = wkp!(), value_parser = nat64_prefix_parser)]
listen_prefix: Ipv6Net,
/// Add an IPv4 prefix to the NAT pool
#[clap(long = "nat", required = true)]
nat_pool: Vec<Ipv4Net>,
},
/// Run protomask in Customer-side transLATor (CLAT) mode
///
/// CLAT mode will translate all native IPv4 traffic to IPv6 traffic.
Clat {
/// IPv6 prefix to use for source addressing
#[clap(long = "via", default_value_t = wkp!(), value_parser = nat64_prefix_parser)]
origin_prefix: Ipv6Net,
}, },
Clat {},
} }
fn nat64_prefix_parser(s: &str) -> Result<Ipv6Net, String> {
let net = Ipv6Net::from_str(s).map_err(|err| err.to_string())?;
if net.prefix_len() > 96 {
return Err("Prefix length must be 96 or less".to_owned());
}
Ok(net)
}

View File

@ -15,36 +15,34 @@ mod cli;
mod config; mod config;
mod logging; mod logging;
async fn run_nat(config_file: PathBuf) { // async fn run_nat(config_file: PathBuf) {
// Parse the config file // // Parse the config file
let config = Config::load(args.config_file).unwrap(); // let config = Config::load(args.config_file).unwrap();
// Currently, only a /96 is supported // // Currently, only a /96 is supported
if config.nat64_prefix.prefix_len() != 96 { // if config.nat64_prefix.prefix_len() != 96 {
log::error!("Only a /96 prefix is supported for the NAT64 prefix"); // log::error!("Only a /96 prefix is supported for the NAT64 prefix");
std::process::exit(1); // std::process::exit(1);
} // }
// Create the NAT64 instance // // Create the NAT64 instance
let mut nat64 = Nat64::new( // let mut nat64 = Nat64::new(
config.nat64_prefix, // config.nat64_prefix,
config.pool.prefixes.clone(), // config.pool.prefixes.clone(),
config // config
.pool // .pool
.static_map // .static_map
.iter() // .iter()
.map(|rule| (rule.v6, rule.v4)) // .map(|rule| (rule.v6, rule.v4))
.collect(), // .collect(),
config.pool.reservation_duration(), // config.pool.reservation_duration(),
) // )
.await // .await
.unwrap(); // .unwrap();
// // Handle packets
// nat64.run().await.unwrap();
// Handle packets // }
nat64.run().await.unwrap();
}
#[tokio::main] #[tokio::main]
pub async fn main() { pub async fn main() {
@ -54,11 +52,11 @@ pub async fn main() {
// Set up logging // Set up logging
enable_logger(args.verbose); enable_logger(args.verbose);
// Handle metrics requests // // Handle metrics requests
if let Some(bind_addr) = config.prom_bind_addr { // if let Some(bind_addr) = config.prom_bind_addr {
log::info!("Enabling metrics server on {}", bind_addr); // log::info!("Enabling metrics server on {}", bind_addr);
tokio::spawn(protomask::metrics::serve_metrics(bind_addr)); // tokio::spawn(protomask::metrics::serve_metrics(bind_addr));
} // }
} }