Skip to content

Commit

Permalink
Add CLI parameters for disable/enable peer
Browse files Browse the repository at this point in the history
  • Loading branch information
linuskendall committed Feb 22, 2023
1 parent 0dc92de commit c402798
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 30 deletions.
29 changes: 23 additions & 6 deletions client/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use shared::{
AddCidrOpts, AddDeleteAssociationOpts, AddPeerOpts, Association, AssociationContents, Cidr,
CidrTree, DeleteCidrOpts, Endpoint, EndpointContents, InstallOpts, Interface, IoErrorContext,
ListenPortOpts, NatOpts, NetworkOpts, OverrideEndpointOpts, Peer, RedeemContents,
RenamePeerOpts, State, WrappedIoError, REDEEM_TRANSITION_WAIT,
RenamePeerOpts, EnableDisablePeerOpts, State, WrappedIoError, REDEEM_TRANSITION_WAIT,
};
use std::{
fmt, io,
Expand Down Expand Up @@ -212,10 +212,20 @@ enum Command {
},

/// Disable an enabled peer
DisablePeer { interface: Interface },
DisablePeer {
interface: Interface,

#[clap(flatten)]
sub_opts: EnableDisablePeerOpts,
},

/// Enable a disabled peer
EnablePeer { interface: Interface },
EnablePeer {
interface: Interface,

#[clap(flatten)]
sub_opts: EnableDisablePeerOpts,
},

/// Add an association between CIDRs
AddAssociation {
Expand Down Expand Up @@ -813,6 +823,7 @@ fn rename_peer(
fn enable_or_disable_peer(
interface: &InterfaceName,
opts: &Opts,
sub_opts: EnableDisablePeerOpts,
enable: bool,
) -> Result<(), Error> {
let InterfaceConfig { server, .. } =
Expand All @@ -822,7 +833,7 @@ fn enable_or_disable_peer(
log::info!("Fetching peers.");
let peers: Vec<Peer> = api.http("GET", "/admin/peers")?;

if let Some(peer) = prompts::enable_or_disable_peer(&peers[..], enable)? {
if let Some(peer) = prompts::enable_or_disable_peer(&peers[..], &sub_opts, enable)? {
let Peer { id, mut contents } = peer;
contents.is_disabled = !enable;
api.http_form("PUT", &format!("/admin/peers/{id}"), contents)?;
Expand Down Expand Up @@ -1251,8 +1262,14 @@ fn run(opts: &Opts) -> Result<(), Error> {
sub_opts,
} => delete_cidr(&interface, opts, sub_opts)?,
Command::ListCidrs { interface, tree } => list_cidrs(&interface, opts, tree)?,
Command::DisablePeer { interface } => enable_or_disable_peer(&interface, opts, false)?,
Command::EnablePeer { interface } => enable_or_disable_peer(&interface, opts, true)?,
Command::DisablePeer {
interface,
sub_opts,
} => enable_or_disable_peer(&interface, opts, sub_opts, false)?,
Command::EnablePeer {
interface,
sub_opts,
} => enable_or_disable_peer(&interface, opts, sub_opts, true)?,
Command::AddAssociation {
interface,
sub_opts,
Expand Down
27 changes: 19 additions & 8 deletions server/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use rusqlite::Connection;
use serde::{Deserialize, Serialize};
use shared::{
get_local_addrs, AddCidrOpts, AddPeerOpts, DeleteCidrOpts, Endpoint, IoErrorContext,
NetworkOpts, PeerContents, RenamePeerOpts, INNERNET_PUBKEY_HEADER,
NetworkOpts, PeerContents, RenamePeerOpts, EnableDisablePeerOpts, INNERNET_PUBKEY_HEADER,
};
use std::{
collections::{HashMap, VecDeque},
Expand Down Expand Up @@ -96,10 +96,20 @@ enum Command {
},

/// Disable an enabled peer
DisablePeer { interface: Interface },
DisablePeer {
interface: Interface,

#[clap(flatten)]
args: EnableDisablePeerOpts,
},

/// Enable a disabled peer
EnablePeer { interface: Interface },
EnablePeer {
interface: Interface,

#[clap(flatten)]
args: EnableDisablePeerOpts,
},

/// Rename an existing peer.
RenamePeer {
Expand Down Expand Up @@ -270,11 +280,11 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
} => serve(*interface, &conf, routing).await?,
Command::AddPeer { interface, args } => add_peer(&interface, &conf, args, opts.network)?,
Command::RenamePeer { interface, args } => rename_peer(&interface, &conf, args)?,
Command::DisablePeer { interface } => {
enable_or_disable_peer(&interface, &conf, false, opts.network)?
Command::DisablePeer { interface, args } => {
enable_or_disable_peer(&interface, &conf, false, opts.network, args)?
},
Command::EnablePeer { interface } => {
enable_or_disable_peer(&interface, &conf, true, opts.network)?
Command::EnablePeer { interface, args } => {
enable_or_disable_peer(&interface, &conf, true, opts.network, args)?
},
Command::AddCidr { interface, args } => add_cidr(&interface, &conf, args)?,
Command::DeleteCidr { interface, args } => delete_cidr(&interface, &conf, args)?,
Expand Down Expand Up @@ -382,14 +392,15 @@ fn enable_or_disable_peer(
conf: &ServerConfig,
enable: bool,
network: NetworkOpts,
opts: EnableDisablePeerOpts,
) -> Result<(), Error> {
let conn = open_database_connection(interface, conf)?;
let peers = DatabasePeer::list(&conn)?
.into_iter()
.map(|dp| dp.inner)
.collect::<Vec<_>>();

if let Some(peer) = prompts::enable_or_disable_peer(&peers[..], enable)? {
if let Some(peer) = prompts::enable_or_disable_peer(&peers[..], &opts, enable)? {
let mut db_peer = DatabasePeer::get(&conn, peer.id)?;
db_peer.update(
&conn,
Expand Down
42 changes: 26 additions & 16 deletions shared/src/prompts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::{
interface_config::{InterfaceConfig, InterfaceInfo, ServerInfo},
AddCidrOpts, AddDeleteAssociationOpts, AddPeerOpts, Association, Cidr, CidrContents, CidrTree,
DeleteCidrOpts, Endpoint, Error, Hostname, IpNetExt, ListenPortOpts, OverrideEndpointOpts,
Peer, PeerContents, RenamePeerOpts, PERSISTENT_KEEPALIVE_INTERVAL_SECS,
Peer, PeerContents, RenamePeerOpts, EnableDisablePeerOpts, PERSISTENT_KEEPALIVE_INTERVAL_SECS,
};
use anyhow::anyhow;
use colored::*;
Expand Down Expand Up @@ -396,28 +396,38 @@ pub fn rename_peer(

/// Presents a selection and confirmation of eligible peers for either disabling or enabling,
/// and returns back the ID of the selected peer.
pub fn enable_or_disable_peer(peers: &[Peer], enable: bool) -> Result<Option<Peer>, Error> {
pub fn enable_or_disable_peer(peers: &[Peer], args: &EnableDisablePeerOpts, enable: bool) -> Result<Option<Peer>, Error> {
let enabled_peers: Vec<_> = peers
.iter()
.filter(|peer| enable && peer.is_disabled || !enable && !peer.is_disabled)
.collect();

let peer_selection: Vec<_> = enabled_peers
.iter()
.map(|peer| format!("{} ({})", &peer.name, &peer.ip))
.collect();
let (index, _) = select(
&format!("Peer to {}able", if enable { "en" } else { "dis" }),
&peer_selection,
)?;
let peer = enabled_peers[index];
let peer = if let Some(ref name) = args.name {
enabled_peers
.into_iter()
.find(|p| &p.name == name)
.ok_or_else(|| anyhow!("Peer '{}' does not exist", name))?
.clone()
} else {
let peer_selection: Vec<_> = enabled_peers
.iter()
.map(|peer| format!("{} ({})", &peer.name, &peer.ip))
.collect();
let (index, _) = select(
&format!("Peer to {}able", if enable { "en" } else { "dis" }),
&peer_selection,
)?;
enabled_peers[index].clone()
};

Ok(
if confirm(&format!(
"{}able peer {}?",
if enable { "En" } else { "Dis" },
peer.name.yellow()
))? {
if args.yes
|| confirm(&format!(
"{}able peer {}?",
if enable { "En" } else { "Dis" },
peer.name.yellow()
))?
{
Some(peer.clone())
} else {
None
Expand Down
12 changes: 12 additions & 0 deletions shared/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,18 @@ pub struct RenamePeerOpts {
pub yes: bool,
}


#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct EnableDisablePeerOpts {
/// Name of peer to enable/disable
#[clap(long)]
pub name: Option<Hostname>,

/// Bypass confirmation
#[clap(long)]
pub yes: bool,
}

#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct AddCidrOpts {
/// The CIDR name (eg. 'engineers')
Expand Down

0 comments on commit c402798

Please sign in to comment.