diff --git a/client-core/examples/add_cidr.rs b/client-core/examples/add_cidr.rs new file mode 100644 index 00000000..b0a2da42 --- /dev/null +++ b/client-core/examples/add_cidr.rs @@ -0,0 +1,30 @@ +use anyhow::{Context, Error}; +use env_logger::Env; +use innernet_client_core::{ + interface::{InterfaceConfig, InterfaceName}, + rest_client::RestClient, + CidrContents, DEFAULT_CONFIG_DIR, +}; +use std::{env, path::Path}; + +fn main() -> Result<(), Error> { + env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); + + let config_dir = Path::new(DEFAULT_CONFIG_DIR); + let interface = env::args().nth(1).context("Usage: add_cidr ")?; + + let interface: InterfaceName = interface.parse()?; + let interface_config = InterfaceConfig::from_interface(config_dir, &interface)?; + let rest_client = RestClient::new(&interface_config.server); + let cidrs = rest_client.get_cidrs()?; + + let name = "example".to_owned(); + let cidr = "10.49.65.0/24".parse()?; + let parent = &cidrs[0]; + + let cidr_contents = CidrContents::new(name, cidr, parent); + let cidr = rest_client.create_cidr(&cidr_contents)?; + dbg!(&cidr); + + Ok(()) +} diff --git a/client-core/src/lib.rs b/client-core/src/lib.rs index ca963308..25779dbb 100644 --- a/client-core/src/lib.rs +++ b/client-core/src/lib.rs @@ -3,8 +3,8 @@ //! This is a work in progress but the final goal is to match the `innernet` CLI API surface. pub use innernet_shared::{ - interface_config::PeerInvitation, Cidr, CidrTree, Endpoint, HostsOpts, NatOpts, NetworkOpts, - Peer, WrappedIoError, DEFAULT_HOSTS_PATH, + interface_config::PeerInvitation, Cidr, CidrContents, CidrTree, Endpoint, HostsOpts, NatOpts, + NetworkOpts, Peer, WrappedIoError, DEFAULT_HOSTS_PATH, }; pub use wireguard_control::Backend; diff --git a/client-core/src/rest_client.rs b/client-core/src/rest_client.rs index fb4b5372..29df6d86 100644 --- a/client-core/src/rest_client.rs +++ b/client-core/src/rest_client.rs @@ -1,5 +1,5 @@ use innernet_shared::{ - interface_config::ServerInfo, Cidr, Peer, PeerContents, INNERNET_PUBKEY_HEADER, + interface_config::ServerInfo, Cidr, CidrContents, Peer, PeerContents, INNERNET_PUBKEY_HEADER, }; use serde::{de::DeserializeOwned, Serialize}; use std::{io, time::Duration}; @@ -27,6 +27,16 @@ impl<'a> RestClient<'a> { Self { agent, server } } + pub fn create_cidr(&self, cidr_contents: &CidrContents) -> Result { + let cidr = self.http_form("POST", "/admin/cidrs", cidr_contents)?; + Ok(cidr) + } + + pub fn get_cidrs(&self) -> Result, RestError> { + let cidrs = self.http("GET", "/admin/cidrs")?; + Ok(cidrs) + } + pub fn create_peer(&self, peer_contents: &PeerContents) -> Result { let peer = self.http_form("POST", "/admin/peers", peer_contents)?; Ok(peer) @@ -37,11 +47,6 @@ impl<'a> RestClient<'a> { Ok(peers) } - pub fn get_cidrs(&self) -> Result, RestError> { - let cidrs = self.http("GET", "/admin/cidrs")?; - Ok(cidrs) - } - #[allow(clippy::result_large_err)] /// Perform a `verb` HTTP request at the given `endpoint`. /// diff --git a/client/src/main.rs b/client/src/main.rs index 6c49b998..a16f4b1b 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -453,11 +453,11 @@ fn add_cidr(interface: &InterfaceName, opts: &Opts, sub_opts: AddCidrOpts) -> Re InterfaceConfig::from_interface(&opts.config_dir, interface)?; log::info!("Fetching CIDRs"); let rest_client = RestClient::new(&server); - let cidrs: Vec = rest_client.http("GET", "/admin/cidrs")?; + let cidrs: Vec = rest_client.get_cidrs()?; if let Some(cidr_request) = prompts::add_cidr(&cidrs, &sub_opts)? { log::info!("Creating CIDR..."); - let cidr: Cidr = rest_client.http_form("POST", "/admin/cidrs", cidr_request)?; + let cidr: Cidr = rest_client.create_cidr(&cidr_request)?; eprintdoc!( " diff --git a/shared/src/prompts.rs b/shared/src/prompts.rs index 2d5a2c40..a5133aa6 100644 --- a/shared/src/prompts.rs +++ b/shared/src/prompts.rs @@ -96,11 +96,7 @@ pub fn add_cidr(cidrs: &[Cidr], request: &AddCidrOpts) -> Result, } +impl CidrContents { + pub fn new(name: String, cidr: IpNet, parent: &Cidr) -> Self { + Self { + name, + cidr, + parent: Some(parent.id), + } + } +} + impl Deref for CidrContents { type Target = IpNet;