@@ -34,6 +34,8 @@ pub enum ResolveTargetError {
34
34
ProfileNotFound ( String , String , String ) ,
35
35
#[ error( "Profile was provided without a node name for repo `{0}`" ) ]
36
36
ProfileWithoutNode ( String ) ,
37
+ #[ error( "Deployment data invalid: {0}" ) ]
38
+ InvalidDeployDataError ( #[ from] DeployDataError ) ,
37
39
}
38
40
39
41
impl < ' a > Target {
@@ -70,7 +72,7 @@ impl<'a> Target {
70
72
node_,
71
73
profile_,
72
74
hostname,
73
- ) ;
75
+ ) ? ;
74
76
vec ! [ d]
75
77
} )
76
78
} else {
@@ -257,12 +259,18 @@ pub struct DeployData<'a> {
257
259
pub repo : String ,
258
260
pub node_name : String ,
259
261
pub profile_name : String ,
260
- pub node : & ' a settings:: Node ,
261
- pub profile : & ' a settings:: Profile ,
262
+
262
263
pub hostname : Option < & ' a str > ,
263
264
264
265
pub flags : & ' a Flags ,
266
+ pub node : & ' a settings:: Node ,
267
+ pub profile : & ' a settings:: Profile ,
265
268
pub merged_settings : settings:: GenericSettings ,
269
+
270
+ pub ssh_user : String ,
271
+ pub temp_path : String ,
272
+ pub profile_path : String ,
273
+ pub sudo : Option < String > ,
266
274
}
267
275
268
276
#[ derive( Error , Debug ) ]
@@ -330,7 +338,7 @@ impl<'a> DeployData<'a> {
330
338
node : & ' a settings:: Node ,
331
339
profile : & ' a settings:: Profile ,
332
340
hostname : Option < & ' a str > ,
333
- ) -> DeployData < ' a > {
341
+ ) -> Result < DeployData < ' a > , DeployDataError > {
334
342
let mut merged_settings = cmd_settings. clone ( ) ;
335
343
merged_settings. merge ( profile. generic_settings . clone ( ) ) ;
336
344
merged_settings. merge ( node. generic_settings . clone ( ) ) ;
@@ -339,33 +347,59 @@ impl<'a> DeployData<'a> {
339
347
// if let Some(ref ssh_opts) = cmd_overrides.ssh_opts {
340
348
// merged_settings.ssh_opts = ssh_opts.split(' ').map(|x| x.to_owned()).collect();
341
349
// }
350
+ let temp_path = match merged_settings. temp_path {
351
+ Some ( ref x) => x. to_owned ( ) ,
352
+ None => "/tmp" . to_string ( ) ,
353
+ } ;
354
+ let profile_user = match merged_settings. user {
355
+ Some ( ref x) => x. to_owned ( ) ,
356
+ None => match merged_settings. ssh_user {
357
+ Some ( ref x) => x. to_owned ( ) ,
358
+ None => {
359
+ return Err ( DeployDataError :: NoProfileUser ( profile_name, node_name) )
360
+ }
361
+ } ,
362
+ } ;
363
+ let profile_path = match profile. profile_settings . profile_path {
364
+ None => format ! ( "/nix/var/nix/profiles/{}" , match & profile_user[ ..] {
365
+ "root" => profile_name. to_owned( ) ,
366
+ _ => format!( "per-user/{}/{}" , profile_user, profile_name) ,
367
+ } ) ,
368
+ Some ( ref x) => x. to_owned ( ) ,
369
+ } ;
370
+ let ssh_user = match merged_settings. ssh_user {
371
+ Some ( ref u) => u. to_owned ( ) ,
372
+ None => whoami:: username ( ) ,
373
+ } ;
374
+ let sudo = match merged_settings. user {
375
+ Some ( ref user) if user != & ssh_user => Some ( format ! ( "sudo -u {}" , user) ) ,
376
+ _ => None ,
377
+ } ;
342
378
343
- DeployData {
379
+ Ok ( DeployData {
344
380
repo,
345
381
node_name,
346
382
profile_name,
347
383
node,
348
384
profile,
349
385
hostname,
386
+ ssh_user,
387
+ temp_path,
388
+ profile_path,
389
+ sudo,
350
390
flags,
351
391
merged_settings,
352
- }
392
+ } )
353
393
}
354
394
355
395
pub fn defs ( & ' a self ) -> Result < DeployDefs , DeployDataError > {
356
396
let ssh_user = match self . merged_settings . ssh_user {
357
397
Some ( ref u) => u. clone ( ) ,
358
398
None => whoami:: username ( ) ,
359
399
} ;
360
-
361
400
let profile_user = self . get_profile_user ( ) ?;
362
-
363
401
let profile_path = self . get_profile_path ( ) ?;
364
-
365
- let sudo: Option < String > = match self . merged_settings . user {
366
- Some ( ref user) if user != & ssh_user => Some ( format ! ( "sudo -u {}" , user) ) ,
367
- _ => None ,
368
- } ;
402
+ let sudo = self . sudo ( ) ?;
369
403
370
404
Ok ( DeployDefs {
371
405
ssh_user,
@@ -375,6 +409,28 @@ impl<'a> DeployData<'a> {
375
409
} )
376
410
}
377
411
412
+ pub fn sudo ( & ' a self ) -> Result < Option < String > , DeployDataError > {
413
+ let ssh_user = match self . merged_settings . ssh_user {
414
+ Some ( ref u) => u. clone ( ) ,
415
+ None => whoami:: username ( ) ,
416
+ } ;
417
+ Ok (
418
+ match self . merged_settings . user {
419
+ Some ( ref user) if user != & ssh_user => Some ( format ! ( "sudo -u {}" , user) ) ,
420
+ _ => None ,
421
+ }
422
+ )
423
+ }
424
+
425
+ pub fn temp_path ( & ' a self ) -> Result < String , DeployDataError > {
426
+ Ok (
427
+ match self . merged_settings . temp_path {
428
+ Some ( ref x) => x. to_owned ( ) ,
429
+ None => "/tmp" . to_string ( ) ,
430
+ }
431
+ )
432
+ }
433
+
378
434
pub fn ssh_uri ( & ' a self ) -> Result < String , DeployDataError > {
379
435
380
436
let hostname = match self . hostname {
@@ -404,8 +460,8 @@ impl<'a> DeployData<'a> {
404
460
Ok ( format ! ( "{}@{}" , ssh_user, hostname) )
405
461
}
406
462
407
- pub fn ssh_opts ( & ' a self ) -> impl Iterator < Item = & String > {
408
- self . merged_settings . ssh_opts . iter ( )
463
+ pub fn ssh_opts ( & ' a self ) -> Result < impl Iterator < Item = & String > , DeployDataError > {
464
+ Ok ( self . merged_settings . ssh_opts . iter ( ) )
409
465
}
410
466
411
467
pub fn get_profile_path ( & ' a self ) -> Result < String , DeployDataError > {
0 commit comments