Skip to content
Merged
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
37 changes: 12 additions & 25 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ license = "MIT"
[dependencies]
dhcproto = { version = "0.15.0", features = ["serde"] }
anyhow = "1.0"
argh = "=0.1.7"
argh_derive = "=0.1.7"
argh = "0.1"
argh_derive = "0.1"
crossbeam-channel = "0.5.15"
ctrlc = "3.5.2"
mac_address = "1.1.8"
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,16 @@ This software is a personal project and should be considered beta. I use the bas

## Installation

You can install with (use `--locked` because `argh` has been broken in a recent version)
You can install with

```
cargo install dhcpm --locked
cargo install dhcpm
```

To include the rhai scripting feature, add

```
cargo install dhcpm --features "script" --locked
cargo install dhcpm --features "script"
```

## Use
Expand Down
14 changes: 8 additions & 6 deletions src/decline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use argh::FromArgs;
use dhcproto::v4;
use mac_address::MacAddress;

use crate::opts::{self, parse_mac, parse_opts, parse_params};
use crate::opts::{self, parse_mac, parse_opts, ParamList};

#[derive(FromArgs, PartialEq, Eq, Debug, Clone)]
/// Send a DECLINE msg
Expand Down Expand Up @@ -44,8 +44,8 @@ pub struct DeclineArgs {
#[argh(option, short = 'o', from_str_fn(parse_opts))]
pub opt: Vec<v4::DhcpOption>,
/// params to include: [default: None]
#[argh(option, from_str_fn(parse_params), default = "Vec::new()")]
pub params: Vec<v4::OptionCode>,
#[argh(option, default = "ParamList::default()")]
pub params: ParamList,
}

impl Default for DeclineArgs {
Expand All @@ -60,7 +60,7 @@ impl Default for DeclineArgs {
subnet_select: None,
relay_link: None,
opt: Vec::new(),
params: Vec::new(),
params: ParamList::default(),
}
}
}
Expand All @@ -81,7 +81,7 @@ impl DeclineArgs {
self.chaddr.bytes().to_vec(),
));
msg.opts_mut()
.insert(v4::DhcpOption::ParameterRequestList(self.params.clone()));
.insert(v4::DhcpOption::ParameterRequestList(self.params.0.clone()));
// insert manually entered opts
for opt in &self.opt {
msg.opts_mut().insert(opt.clone());
Expand Down Expand Up @@ -225,6 +225,8 @@ pub mod decline_mod {
#[rhai_fn(global, set = "params")]
pub fn set_params(args: &mut DeclineArgs, params: String) {
trace!(?params, "setting params");
args.params = crate::opts::parse_params(&params).expect("failed to parse params");
args.params = crate::opts::ParamList(
crate::opts::parse_params(&params).expect("failed to parse params"),
);
}
}
12 changes: 7 additions & 5 deletions src/discover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use argh::FromArgs;
use dhcproto::v4;
use mac_address::MacAddress;

use crate::opts::{self, parse_mac, parse_opts, parse_params};
use crate::opts::{self, parse_mac, parse_opts, ParamList};

#[derive(FromArgs, PartialEq, Eq, Debug, Clone)]
/// Send a DISCOVER msg
Expand Down Expand Up @@ -38,8 +38,8 @@ pub struct DiscoverArgs {
#[argh(option, short = 'o', from_str_fn(parse_opts))]
pub opt: Vec<v4::DhcpOption>,
/// params to include: [default: 1,3,6,15 (Subnet, Router, DnsServer, DomainName]
#[argh(option, from_str_fn(parse_params), default = "opts::default_params()")]
pub params: Vec<v4::OptionCode>,
#[argh(option, default = "opts::default_params()")]
pub params: ParamList,
}

impl Default for DiscoverArgs {
Expand Down Expand Up @@ -77,7 +77,7 @@ impl DiscoverArgs {
));
// insert parse params
msg.opts_mut()
.insert(v4::DhcpOption::ParameterRequestList(self.params.clone()));
.insert(v4::DhcpOption::ParameterRequestList(self.params.0.clone()));
// insert manually entered opts
for opt in &self.opt {
msg.opts_mut().insert(opt.clone());
Expand Down Expand Up @@ -197,6 +197,8 @@ pub mod discover_mod {
#[rhai_fn(global, set = "params")]
pub fn set_params(args: &mut DiscoverArgs, params: String) {
trace!(?params, "setting params");
args.params = crate::opts::parse_params(&params).expect("failed to parse params");
args.params = crate::opts::ParamList(
crate::opts::parse_params(&params).expect("failed to parse params"),
);
}
}
14 changes: 7 additions & 7 deletions src/inforeq.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use argh::FromArgs;
use dhcproto::v6;
use mac_address::MacAddress;

use crate::opts::{self, parse_mac, v6::parse_params};
use crate::opts::{self, parse_mac, v6::ParamList as V6ParamList};

#[derive(FromArgs, PartialEq, Eq, Debug, Clone)]
/// Send a INFORMATION-REQUEST msg (dhcpv6)
Expand All @@ -17,17 +17,17 @@ pub struct InformationReqArgs {
)]
pub chaddr: MacAddress,
/// params to include: [default: 23,24,39,59]
#[argh(option, from_str_fn(parse_params), default = "default_opts()")]
pub params: Vec<v6::OptionCode>,
#[argh(option, default = "default_opts()")]
pub params: V6ParamList,
}

pub fn default_opts() -> Vec<v6::OptionCode> {
vec![
pub fn default_opts() -> V6ParamList {
V6ParamList(vec![
v6::OptionCode::DomainNameServers,
v6::OptionCode::DomainSearchList,
v6::OptionCode::Unknown(39),
v6::OptionCode::Unknown(59),
]
])
}

impl Default for InformationReqArgs {
Expand All @@ -44,7 +44,7 @@ impl InformationReqArgs {
let mut msg = v6::Message::new(v6::MessageType::InformationRequest);

msg.opts_mut().insert(v6::DhcpOption::ORO(v6::ORO {
opts: self.params.clone(),
opts: self.params.0.clone(),
}));

msg
Expand Down
12 changes: 7 additions & 5 deletions src/inform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use argh::FromArgs;
use dhcproto::v4;
use mac_address::MacAddress;

use crate::opts::{self, parse_mac, parse_opts, parse_params};
use crate::opts::{self, parse_mac, parse_opts, ParamList};

#[derive(FromArgs, PartialEq, Eq, Debug, Clone)]
/// Send an INFORM msg
Expand Down Expand Up @@ -41,8 +41,8 @@ pub struct InformArgs {
#[argh(option, short = 'o', from_str_fn(parse_opts))]
pub opt: Vec<v4::DhcpOption>,
/// params to include: [default: 1,3,6,15 (Subnet, Router, DnsServer, DomainName]
#[argh(option, from_str_fn(parse_params), default = "opts::default_params()")]
pub params: Vec<v4::OptionCode>,
#[argh(option, default = "opts::default_params()")]
pub params: ParamList,
}

impl Default for InformArgs {
Expand Down Expand Up @@ -77,7 +77,7 @@ impl InformArgs {
self.chaddr.bytes().to_vec(),
));
msg.opts_mut()
.insert(v4::DhcpOption::ParameterRequestList(self.params.clone()));
.insert(v4::DhcpOption::ParameterRequestList(self.params.0.clone()));
// insert manually entered opts
for opt in &self.opt {
msg.opts_mut().insert(opt.clone());
Expand Down Expand Up @@ -200,6 +200,8 @@ pub mod inform_mod {
#[rhai_fn(global, set = "params")]
pub fn set_params(args: &mut InformArgs, params: String) {
trace!(?params, "setting params");
args.params = crate::opts::parse_params(&params).expect("failed to parse params");
args.params = crate::opts::ParamList(
crate::opts::parse_params(&params).expect("failed to parse params"),
);
}
}
6 changes: 3 additions & 3 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ mod runner;
#[cfg(feature = "script")]
mod script;

use opts::{parse_mac, parse_opts, parse_params};
use opts::{parse_mac, parse_opts, ParamList};
use runner::TimeoutRunner;

use crate::{
Expand Down Expand Up @@ -379,8 +379,8 @@ pub struct DoraArgs {
#[argh(option, short = 'o', from_str_fn(parse_opts))]
pub opt: Vec<v4::DhcpOption>,
/// params to include: [default: 1,3,6,15 (Subnet, Router, DnsServer, DomainName]
#[argh(option, from_str_fn(parse_params), default = "opts::default_params()")]
pub params: Vec<v4::OptionCode>,
#[argh(option, default = "opts::default_params()")]
pub params: ParamList,
}

impl DoraArgs {
Expand Down
40 changes: 37 additions & 3 deletions src/opts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,13 +114,30 @@ fn write_opt(code: u8, opt: Vec<u8>) -> Result<v4::DhcpOption> {
Ok(v4::DhcpOption::decode(&mut Decoder::new(&buf))?)
}

pub fn default_params() -> Vec<v4::OptionCode> {
vec![
#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub struct ParamList(pub Vec<v4::OptionCode>);

impl std::str::FromStr for ParamList {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
parse_params(s).map(ParamList)
}
}

impl std::ops::Deref for ParamList {
type Target = Vec<v4::OptionCode>;
fn deref(&self) -> &Self::Target {
&self.0
}
}

pub fn default_params() -> ParamList {
ParamList(vec![
v4::OptionCode::SubnetMask,
v4::OptionCode::Router,
v4::OptionCode::DomainNameServer,
v4::OptionCode::DomainName,
]
])
}

pub fn parse_params(params: &str) -> Result<Vec<v4::OptionCode>, String> {
Expand Down Expand Up @@ -165,6 +182,23 @@ pub fn params_to_str(params: &[v4::OptionCode]) -> String {
pub mod v6 {
use dhcproto::v6;

#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub struct ParamList(pub Vec<v6::OptionCode>);

impl std::str::FromStr for ParamList {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
parse_params(s).map(ParamList)
}
}

impl std::ops::Deref for ParamList {
type Target = Vec<v6::OptionCode>;
fn deref(&self) -> &Self::Target {
&self.0
}
}

pub fn parse_params(params: &str) -> Result<Vec<v6::OptionCode>, String> {
params
.split(',')
Expand Down
Loading
Loading