From d9fc436ee12309efad415452437f0704fc6f64db Mon Sep 17 00:00:00 2001 From: Evan Cameron Date: Wed, 20 May 2026 19:43:27 -0400 Subject: [PATCH 1/2] update argh --- Cargo.lock | 37 ++++++++++++------------------------- Cargo.toml | 4 ++-- README.md | 6 +++--- src/decline.rs | 12 ++++++------ src/discover.rs | 10 +++++----- src/inforeq.rs | 14 +++++++------- src/inform.rs | 10 +++++----- src/main.rs | 6 +++--- src/opts.rs | 40 +++++++++++++++++++++++++++++++++++++--- src/release.rs | 10 +++++----- src/request.rs | 10 +++++----- 11 files changed, 90 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5cd1dca..34ce8d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,9 +30,9 @@ checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "argh" -version = "0.1.7" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb41d85d92dfab96cb95ab023c265c5e4261bb956c0fb49ca06d90c570f1958" +checksum = "211818e820cda9ca6f167a64a5c808837366a6dfd807157c64c1304c486cd033" dependencies = [ "argh_derive", "argh_shared", @@ -40,22 +40,24 @@ dependencies = [ [[package]] name = "argh_derive" -version = "0.1.7" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be69f70ef5497dd6ab331a50bd95c6ac6b8f7f17a7967838332743fbd58dc3b5" +checksum = "c442a9d18cef5dde467405d27d461d080d68972d6d0dfd0408265b6749ec427d" dependencies = [ "argh_shared", - "heck 0.3.3", "proc-macro2", "quote", - "syn 1.0.96", + "syn 2.0.117", ] [[package]] name = "argh_shared" -version = "0.1.13" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a464143cc82dedcdc3928737445362466b7674b5db4e2eb8e869846d6d84f4f6" +checksum = "e5ade012bac4db278517a0132c8c10c6427025868dca16c801087c28d5a411f1" +dependencies = [ + "serde", +] [[package]] name = "autocfg" @@ -317,15 +319,6 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "heck" version = "0.5.0" @@ -1173,12 +1166,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - [[package]] name = "unicode-xid" version = "0.2.6" @@ -1431,7 +1418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" dependencies = [ "anyhow", - "heck 0.5.0", + "heck", "wit-parser", ] @@ -1442,7 +1429,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", - "heck 0.5.0", + "heck", "indexmap", "prettyplease", "syn 2.0.117", diff --git a/Cargo.toml b/Cargo.toml index 1ecee11..e2c59e0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/README.md b/README.md index b7c5f47..dd6ddcc 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/src/decline.rs b/src/decline.rs index ab95e22..cf4f0d4 100644 --- a/src/decline.rs +++ b/src/decline.rs @@ -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 @@ -44,8 +44,8 @@ pub struct DeclineArgs { #[argh(option, short = 'o', from_str_fn(parse_opts))] pub opt: Vec, /// params to include: [default: None] - #[argh(option, from_str_fn(parse_params), default = "Vec::new()")] - pub params: Vec, + #[argh(option, default = "ParamList::default()")] + pub params: ParamList, } impl Default for DeclineArgs { @@ -60,7 +60,7 @@ impl Default for DeclineArgs { subnet_select: None, relay_link: None, opt: Vec::new(), - params: Vec::new(), + params: ParamList::default(), } } } @@ -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()); @@ -225,6 +225,6 @@ 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(¶ms).expect("failed to parse params"); + args.params = crate::opts::ParamList(crate::opts::parse_params(¶ms).expect("failed to parse params")); } } diff --git a/src/discover.rs b/src/discover.rs index 32f655a..36222bb 100644 --- a/src/discover.rs +++ b/src/discover.rs @@ -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 @@ -38,8 +38,8 @@ pub struct DiscoverArgs { #[argh(option, short = 'o', from_str_fn(parse_opts))] pub opt: Vec, /// 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, + #[argh(option, default = "opts::default_params()")] + pub params: ParamList, } impl Default for DiscoverArgs { @@ -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()); @@ -197,6 +197,6 @@ 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(¶ms).expect("failed to parse params"); + args.params = crate::opts::ParamList(crate::opts::parse_params(¶ms).expect("failed to parse params")); } } diff --git a/src/inforeq.rs b/src/inforeq.rs index b87f444..cbf4605 100644 --- a/src/inforeq.rs +++ b/src/inforeq.rs @@ -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) @@ -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, + #[argh(option, default = "default_opts()")] + pub params: V6ParamList, } -pub fn default_opts() -> Vec { - 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 { @@ -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 diff --git a/src/inform.rs b/src/inform.rs index 53f772a..67bf834 100644 --- a/src/inform.rs +++ b/src/inform.rs @@ -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 @@ -41,8 +41,8 @@ pub struct InformArgs { #[argh(option, short = 'o', from_str_fn(parse_opts))] pub opt: Vec, /// 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, + #[argh(option, default = "opts::default_params()")] + pub params: ParamList, } impl Default for InformArgs { @@ -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()); @@ -200,6 +200,6 @@ 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(¶ms).expect("failed to parse params"); + args.params = crate::opts::ParamList(crate::opts::parse_params(¶ms).expect("failed to parse params")); } } diff --git a/src/main.rs b/src/main.rs index a985ffc..a3f11eb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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::{ @@ -379,8 +379,8 @@ pub struct DoraArgs { #[argh(option, short = 'o', from_str_fn(parse_opts))] pub opt: Vec, /// 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, + #[argh(option, default = "opts::default_params()")] + pub params: ParamList, } impl DoraArgs { diff --git a/src/opts.rs b/src/opts.rs index a9f7e49..b482044 100644 --- a/src/opts.rs +++ b/src/opts.rs @@ -114,13 +114,30 @@ fn write_opt(code: u8, opt: Vec) -> Result { Ok(v4::DhcpOption::decode(&mut Decoder::new(&buf))?) } -pub fn default_params() -> Vec { - vec![ +#[derive(Default, Debug, Clone, PartialEq, Eq)] +pub struct ParamList(pub Vec); + +impl std::str::FromStr for ParamList { + type Err = String; + fn from_str(s: &str) -> Result { + parse_params(s).map(ParamList) + } +} + +impl std::ops::Deref for ParamList { + type Target = Vec; + 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, String> { @@ -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); + + impl std::str::FromStr for ParamList { + type Err = String; + fn from_str(s: &str) -> Result { + parse_params(s).map(ParamList) + } + } + + impl std::ops::Deref for ParamList { + type Target = Vec; + fn deref(&self) -> &Self::Target { + &self.0 + } + } + pub fn parse_params(params: &str) -> Result, String> { params .split(',') diff --git a/src/release.rs b/src/release.rs index 4061f02..d922edf 100644 --- a/src/release.rs +++ b/src/release.rs @@ -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 RELEASE msg @@ -41,8 +41,8 @@ pub struct ReleaseArgs { #[argh(option, short = 'o', from_str_fn(parse_opts))] pub opt: Vec, /// 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, + #[argh(option, default = "opts::default_params()")] + pub params: ParamList, } impl Default for ReleaseArgs { @@ -77,7 +77,7 @@ impl ReleaseArgs { 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()); @@ -203,6 +203,6 @@ pub mod release_mod { #[rhai_fn(global, set = "params")] pub fn set_params(args: &mut ReleaseArgs, params: String) { trace!(?params, "setting params"); - args.params = crate::opts::parse_params(¶ms).expect("failed to parse params"); + args.params = crate::opts::ParamList(crate::opts::parse_params(¶ms).expect("failed to parse params")); } } diff --git a/src/request.rs b/src/request.rs index a0cbd03..033bc9d 100644 --- a/src/request.rs +++ b/src/request.rs @@ -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 REQUEST msg @@ -44,8 +44,8 @@ pub struct RequestArgs { #[argh(option, short = 'o', from_str_fn(parse_opts))] pub opt: Vec, /// 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, + #[argh(option, default = "opts::default_params()")] + pub params: ParamList, } impl Default for RequestArgs { @@ -86,7 +86,7 @@ impl RequestArgs { )); // 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()); @@ -229,6 +229,6 @@ pub mod request_mod { #[rhai_fn(global, set = "params")] pub fn set_params(args: &mut RequestArgs, params: String) { trace!(?params, "setting params"); - args.params = crate::opts::parse_params(¶ms).expect("failed to parse params"); + args.params = crate::opts::ParamList(crate::opts::parse_params(¶ms).expect("failed to parse params")); } } From 4eab141e313644e4973a2f6cf7a6a3a67dd570b8 Mon Sep 17 00:00:00 2001 From: Evan Cameron Date: Wed, 20 May 2026 19:44:29 -0400 Subject: [PATCH 2/2] fmt --- src/decline.rs | 4 +++- src/discover.rs | 4 +++- src/inform.rs | 4 +++- src/release.rs | 4 +++- src/request.rs | 4 +++- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/decline.rs b/src/decline.rs index cf4f0d4..7d32a77 100644 --- a/src/decline.rs +++ b/src/decline.rs @@ -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::ParamList(crate::opts::parse_params(¶ms).expect("failed to parse params")); + args.params = crate::opts::ParamList( + crate::opts::parse_params(¶ms).expect("failed to parse params"), + ); } } diff --git a/src/discover.rs b/src/discover.rs index 36222bb..901065e 100644 --- a/src/discover.rs +++ b/src/discover.rs @@ -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::ParamList(crate::opts::parse_params(¶ms).expect("failed to parse params")); + args.params = crate::opts::ParamList( + crate::opts::parse_params(¶ms).expect("failed to parse params"), + ); } } diff --git a/src/inform.rs b/src/inform.rs index 67bf834..3bec9fd 100644 --- a/src/inform.rs +++ b/src/inform.rs @@ -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::ParamList(crate::opts::parse_params(¶ms).expect("failed to parse params")); + args.params = crate::opts::ParamList( + crate::opts::parse_params(¶ms).expect("failed to parse params"), + ); } } diff --git a/src/release.rs b/src/release.rs index d922edf..e695a86 100644 --- a/src/release.rs +++ b/src/release.rs @@ -203,6 +203,8 @@ pub mod release_mod { #[rhai_fn(global, set = "params")] pub fn set_params(args: &mut ReleaseArgs, params: String) { trace!(?params, "setting params"); - args.params = crate::opts::ParamList(crate::opts::parse_params(¶ms).expect("failed to parse params")); + args.params = crate::opts::ParamList( + crate::opts::parse_params(¶ms).expect("failed to parse params"), + ); } } diff --git a/src/request.rs b/src/request.rs index 033bc9d..809596a 100644 --- a/src/request.rs +++ b/src/request.rs @@ -229,6 +229,8 @@ pub mod request_mod { #[rhai_fn(global, set = "params")] pub fn set_params(args: &mut RequestArgs, params: String) { trace!(?params, "setting params"); - args.params = crate::opts::ParamList(crate::opts::parse_params(¶ms).expect("failed to parse params")); + args.params = crate::opts::ParamList( + crate::opts::parse_params(¶ms).expect("failed to parse params"), + ); } }