Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions client-core/examples/add_cidr.rs
Original file line number Diff line number Diff line change
@@ -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 <interface>")?;

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(())
}
4 changes: 2 additions & 2 deletions client-core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
17 changes: 11 additions & 6 deletions client-core/src/rest_client.rs
Original file line number Diff line number Diff line change
@@ -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};
Expand Down Expand Up @@ -27,6 +27,16 @@ impl<'a> RestClient<'a> {
Self { agent, server }
}

pub fn create_cidr(&self, cidr_contents: &CidrContents) -> Result<Cidr, RestError> {
let cidr = self.http_form("POST", "/admin/cidrs", cidr_contents)?;
Ok(cidr)
}

pub fn get_cidrs(&self) -> Result<Vec<Cidr>, RestError> {
let cidrs = self.http("GET", "/admin/cidrs")?;
Ok(cidrs)
}

pub fn create_peer(&self, peer_contents: &PeerContents) -> Result<Peer, RestError> {
let peer = self.http_form("POST", "/admin/peers", peer_contents)?;
Ok(peer)
Expand All @@ -37,11 +47,6 @@ impl<'a> RestClient<'a> {
Ok(peers)
}

pub fn get_cidrs(&self) -> Result<Vec<Cidr>, RestError> {
let cidrs = self.http("GET", "/admin/cidrs")?;
Ok(cidrs)
}

#[allow(clippy::result_large_err)]
/// Perform a `verb` HTTP request at the given `endpoint`.
///
Expand Down
4 changes: 2 additions & 2 deletions client/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Cidr> = rest_client.http("GET", "/admin/cidrs")?;
let cidrs: Vec<Cidr> = 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!(
"
Expand Down
6 changes: 1 addition & 5 deletions shared/src/prompts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,7 @@ pub fn add_cidr(cidrs: &[Cidr], request: &AddCidrOpts) -> Result<Option<CidrCont
input("CIDR", Prefill::None)?
};

let cidr_request = CidrContents {
name: name.to_string(),
cidr,
parent: Some(parent_cidr.id),
};
let cidr_request = CidrContents::new(name.to_string(), cidr, parent_cidr);

Ok(
if request.yes || confirm(&format!("Create CIDR \"{}\"?", cidr_request.name))? {
Expand Down
10 changes: 10 additions & 0 deletions shared/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,16 @@ pub struct CidrContents {
pub parent: Option<i64>,
}

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;

Expand Down
Loading