1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
use std::borrow::Cow;
use std::path::PathBuf;
pub mod data;
pub mod deploy;
pub mod push;
macro_rules! good_panic {
($($tts:tt)*) => {{
error!($($tts)*);
std::process::exit(1);
}}
}
pub struct DeployData<'a> {
pub sudo: Option<String>,
pub ssh_user: Cow<'a, str>,
pub profile_user: Cow<'a, str>,
pub profile_path: String,
pub current_exe: PathBuf,
}
pub async fn make_deploy_data<'a>(
profile_name: &str,
node_name: &str,
merged_settings: &'a data::GenericSettings,
) -> Result<DeployData<'a>, Box<dyn std::error::Error>> {
let ssh_user: Cow<str> = match &merged_settings.ssh_user {
Some(u) => u.into(),
None => whoami::username().into(),
};
let profile_user: Cow<str> = match &merged_settings.user {
Some(x) => x.into(),
None => match &merged_settings.ssh_user {
Some(x) => x.into(),
None => good_panic!(
"Neither user nor sshUser set for profile `{}` of node `{}`",
profile_name,
node_name
),
},
};
let profile_path = match &profile_user[..] {
"root" => format!("/nix/var/nix/profiles/{}", profile_name),
_ => format!(
"/nix/var/nix/profiles/per-user/{}/{}",
profile_user, profile_name
),
};
let sudo: Option<String> = match merged_settings.user {
Some(ref user) if user != &ssh_user => Some(format!("sudo -u {}", user)),
_ => None,
};
let current_exe = std::env::current_exe().expect("Expected to find current executable path");
if !current_exe.starts_with("/nix/store/") {
good_panic!("The deploy binary must be in the Nix store");
}
Ok(DeployData {
sudo,
ssh_user,
profile_user,
profile_path,
current_exe,
})
}
|