@@ -55,7 +55,6 @@ const START_FAILED_ERR_CODE: u32 = 2;
5555struct UpCommand {
5656 gateway_url : String ,
5757 enrollment_token : String ,
58- agent_name : String ,
5958 advertise_subnets : Vec < String > ,
6059}
6160
@@ -149,8 +148,6 @@ fn parse_up_command_args(args: &[String]) -> Result<UpCommand> {
149148
150149fn parse_up_command_args_with_reader < R : BufRead > ( args : & [ String ] , mut stdin_reader : R ) -> Result < UpCommand > {
151150 let mut gateway_url = None ;
152- let mut enrollment_token = None ;
153- let mut agent_name = None ;
154151 let mut enrollment_string = None ;
155152 let mut advertise_subnets = Vec :: new ( ) ;
156153
@@ -160,8 +157,6 @@ fn parse_up_command_args_with_reader<R: BufRead>(args: &[String], mut stdin_read
160157
161158 match arg {
162159 "--gateway" => gateway_url = Some ( parse_required_value ( args, & mut index, "--gateway" ) ?) ,
163- "--token" | "--enrollment-token" => enrollment_token = Some ( parse_required_value ( args, & mut index, arg) ?) ,
164- "--name" | "--agent-name" => agent_name = Some ( parse_required_value ( args, & mut index, arg) ?) ,
165160 "--enrollment-string" => enrollment_string = Some ( parse_required_value ( args, & mut index, arg) ?) ,
166161 "--advertise-routes" | "--advertise-subnets" => {
167162 advertise_subnets. extend ( parse_advertise_subnets ( & parse_required_value ( args, & mut index, arg) ?) )
@@ -172,37 +167,29 @@ fn parse_up_command_args_with_reader<R: BufRead>(args: &[String], mut stdin_read
172167 index += 1 ;
173168 }
174169
175- if let Some ( enrollment_string) = enrollment_string {
176- // A single hyphen means "read the enrollment string from stdin".
177- let enrollment_string = if enrollment_string == "-" {
178- let mut line = String :: new ( ) ;
179- stdin_reader
180- . read_line ( & mut line)
181- . context ( "failed to read enrollment string from stdin" ) ?;
182- let trimmed = line. trim ( ) . to_owned ( ) ;
183- if trimmed. is_empty ( ) {
184- bail ! ( "enrollment string read from stdin is empty" ) ;
185- }
186- trimmed
187- } else {
188- enrollment_string
189- } ;
190-
191- let claims = parse_enrollment_jwt ( & enrollment_string) ?;
192-
193- // The JWT itself is the Bearer token; the Gateway verifies the signature.
194- gateway_url. get_or_insert ( claims. jet_gw_url ) ;
195- enrollment_token. get_or_insert ( enrollment_string) ;
196-
197- if agent_name. is_none ( ) {
198- agent_name = claims. jet_agent_name ;
170+ let enrollment_string = enrollment_string. context ( "missing required --enrollment-string" ) ?;
171+
172+ // A single hyphen means "read the enrollment string from stdin".
173+ let enrollment_token = if enrollment_string == "-" {
174+ let mut line = String :: new ( ) ;
175+ stdin_reader
176+ . read_line ( & mut line)
177+ . context ( "failed to read enrollment string from stdin" ) ?;
178+ let trimmed = line. trim ( ) . to_owned ( ) ;
179+ if trimmed. is_empty ( ) {
180+ bail ! ( "enrollment string read from stdin is empty" ) ;
199181 }
200- }
182+ trimmed
183+ } else {
184+ enrollment_string
185+ } ;
186+
187+ let claims = parse_enrollment_jwt ( & enrollment_token) ?;
188+ gateway_url. get_or_insert ( claims. jet_gw_url ) ;
201189
202190 Ok ( UpCommand {
203191 gateway_url : gateway_url. context ( "missing required --gateway" ) ?,
204- enrollment_token : enrollment_token. context ( "missing required --token" ) ?,
205- agent_name : agent_name. context ( "missing required --name" ) ?,
192+ enrollment_token,
206193 advertise_subnets,
207194 } )
208195}
@@ -253,9 +240,8 @@ fn main() {
253240 let gateway_url = env:: args ( )
254241 . nth ( 2 )
255242 . expect ( "missing gateway URL (e.g., https://gateway.example.com:7171)" ) ;
256- let enrollment_token = env:: args ( ) . nth ( 3 ) . expect ( "missing enrollment token" ) ;
257- let agent_name = env:: args ( ) . nth ( 4 ) . expect ( "missing agent name" ) ;
258- let subnets_arg = env:: args ( ) . nth ( 5 ) . unwrap_or_default ( ) ;
243+ let enrollment_token = env:: args ( ) . nth ( 3 ) . expect ( "missing enrollment string" ) ;
244+ let subnets_arg = env:: args ( ) . nth ( 4 ) . unwrap_or_default ( ) ;
259245
260246 let advertise_subnets: Vec < String > = if subnets_arg. is_empty ( ) {
261247 Vec :: new ( )
@@ -265,13 +251,9 @@ fn main() {
265251
266252 let rt = tokio:: runtime:: Runtime :: new ( ) . expect ( "failed to create tokio runtime" ) ;
267253 rt. block_on ( async {
268- if let Err ( e) = devolutions_agent:: enrollment:: enroll_agent (
269- & gateway_url,
270- & enrollment_token,
271- & agent_name,
272- advertise_subnets,
273- )
274- . await
254+ if let Err ( e) =
255+ devolutions_agent:: enrollment:: enroll_agent ( & gateway_url, & enrollment_token, advertise_subnets)
256+ . await
275257 {
276258 eprintln ! ( "[ERROR] Enrollment failed: {e:#}" ) ;
277259 std:: process:: exit ( 1 ) ;
@@ -293,7 +275,6 @@ fn main() {
293275 devolutions_agent:: enrollment:: enroll_agent (
294276 & command. gateway_url ,
295277 & command. enrollment_token ,
296- & command. agent_name ,
297278 command. advertise_subnets ,
298279 )
299280 . await
@@ -320,14 +301,16 @@ mod tests {
320301 use super :: * ;
321302
322303 #[ test]
323- fn parse_up_command_args_uses_default_config_path ( ) {
304+ fn parse_up_command_args_accepts_advertise_routes ( ) {
305+ let jwt = make_jwt ( serde_json:: json!( {
306+ "exp" : 1_999_999_999i64 ,
307+ "jti" : "00000000-0000-0000-0000-000000000000" ,
308+ "jet_gw_url" : "https://gateway.example.com:7171" ,
309+ "jet_agent_name" : "site-a-agent" ,
310+ } ) ) ;
324311 let args = vec ! [
325- "--gateway" . to_owned( ) ,
326- "https://gateway.example.com:7171" . to_owned( ) ,
327- "--token" . to_owned( ) ,
328- "bootstrap-token" . to_owned( ) ,
329- "--name" . to_owned( ) ,
330- "site-a-agent" . to_owned( ) ,
312+ "--enrollment-string" . to_owned( ) ,
313+ jwt. clone( ) ,
331314 "--advertise-routes" . to_owned( ) ,
332315 "10.0.0.0/8,192.168.1.0/24" . to_owned( ) ,
333316 ] ;
@@ -338,22 +321,25 @@ mod tests {
338321 parsed,
339322 UpCommand {
340323 gateway_url: "https://gateway.example.com:7171" . to_owned( ) ,
341- enrollment_token: "bootstrap-token" . to_owned( ) ,
342- agent_name: "site-a-agent" . to_owned( ) ,
324+ enrollment_token: jwt,
343325 advertise_subnets: vec![ "10.0.0.0/8" . to_owned( ) , "192.168.1.0/24" . to_owned( ) ] ,
344326 }
345327 ) ;
346328 }
347329
348330 #[ test]
349- fn parse_up_command_args_accepts_aliases ( ) {
331+ fn parse_up_command_args_accepts_advertise_subnets_alias ( ) {
332+ let jwt = make_jwt ( serde_json:: json!( {
333+ "exp" : 1_999_999_999i64 ,
334+ "jti" : "00000000-0000-0000-0000-000000000000" ,
335+ "jet_gw_url" : "https://gateway.example.com:7171" ,
336+ "jet_agent_name" : "site-a-agent" ,
337+ } ) ) ;
350338 let args = vec ! [
351339 "--gateway" . to_owned( ) ,
352340 "https://gateway.example.com:7171" . to_owned( ) ,
353- "--enrollment-token" . to_owned( ) ,
354- "bootstrap-token" . to_owned( ) ,
355- "--agent-name" . to_owned( ) ,
356- "site-a-agent" . to_owned( ) ,
341+ "--enrollment-string" . to_owned( ) ,
342+ jwt,
357343 "--advertise-subnets" . to_owned( ) ,
358344 "10.0.0.0/8" . to_owned( ) ,
359345 ] ;
@@ -391,6 +377,22 @@ mod tests {
391377 assert_eq ! ( parsed. gateway_url, "https://gateway.example.com:7171" ) ;
392378 // The JWT itself is used as the Bearer token for /jet/tunnel/enroll.
393379 assert_eq ! ( parsed. enrollment_token, jwt) ;
394- assert_eq ! ( parsed. agent_name, "site-a-agent" ) ;
380+ }
381+
382+ #[ test]
383+ fn parse_up_command_args_rejects_split_inputs ( ) {
384+ for flag in [ "--name" , "--agent-name" , "--token" , "--enrollment-token" ] {
385+ let args = vec ! [ flag. to_owned( ) , "site-a-agent" . to_owned( ) ] ;
386+ let error = parse_up_command_args ( & args) . expect_err ( "argument should be rejected" ) ;
387+
388+ assert ! ( error. to_string( ) . contains( "unknown argument" ) ) ;
389+ }
390+ }
391+
392+ #[ test]
393+ fn parse_up_command_args_requires_enrollment_string ( ) {
394+ let args = Vec :: new ( ) ;
395+
396+ assert ! ( parse_up_command_args( & args) . is_err( ) ) ;
395397 }
396398}
0 commit comments