diff options
author | notgne2 | 2021-01-24 18:53:42 -0700 |
---|---|---|
committer | notgne2 | 2021-01-24 18:53:42 -0700 |
commit | b35fccfd67945d029906c217a6302928e849a3eb (patch) | |
tree | bbc503f06540f8ee953cd0a1f0b44c11f3722a68 /src/utils/push.rs | |
parent | fc77473568cfcb86245c4cf45b59d7b86e049a5c (diff) | |
parent | a33127ad4144282696b061af61c188e75ee49452 (diff) |
Merge branch 'master' into notgne2/document-hostname-dot
Diffstat (limited to 'src/utils/push.rs')
-rw-r--r-- | src/utils/push.rs | 174 |
1 files changed, 0 insertions, 174 deletions
diff --git a/src/utils/push.rs b/src/utils/push.rs deleted file mode 100644 index 503e062..0000000 --- a/src/utils/push.rs +++ /dev/null @@ -1,174 +0,0 @@ -// SPDX-FileCopyrightText: 2020 Serokell <https://serokell.io/> -// -// SPDX-License-Identifier: MPL-2.0 - -use std::process::Stdio; -use tokio::process::Command; -use std::path::Path; - -use thiserror::Error; - -#[derive(Error, Debug)] -pub enum PushProfileError { - #[error("Failed to calculate activate bin path from deploy bin path: {0}")] - DeployPathToActivatePathError(#[from] super::DeployPathToActivatePathError), - #[error("Failed to run Nix build command: {0}")] - BuildError(std::io::Error), - #[error("Nix build command resulted in a bad exit code: {0:?}")] - BuildExitError(Option<i32>), - #[error("Activation script deploy-rs-activate does not exist in profile.\n\ - Did you forget to use deploy-rs#lib.<...>.activate.<...> on your profile path?")] - DeployRsActivateDoesntExist, - #[error("Activation script activate-rs does not exist in profile.\n\ - Is there a mismatch in deploy-rs used in the flake you're deploying and deploy-rs command you're running?")] - ActivateRsDoesntExist, - #[error("Failed to run Nix sign command: {0}")] - SignError(std::io::Error), - #[error("Nix sign command resulted in a bad exit code: {0:?}")] - SignExitError(Option<i32>), - #[error("Failed to run Nix copy command: {0}")] - CopyError(std::io::Error), - #[error("Nix copy command resulted in a bad exit code: {0:?}")] - CopyExitError(Option<i32>), -} - -pub async fn push_profile( - supports_flakes: bool, - check_sigs: bool, - repo: &str, - deploy_data: &super::DeployData<'_>, - deploy_defs: &super::DeployDefs, - keep_result: bool, - result_path: Option<&str>, - extra_build_args: &[String], -) -> Result<(), PushProfileError> { - info!( - "Building profile `{}` for node `{}`", - deploy_data.profile_name, deploy_data.node_name - ); - - let mut build_c = if supports_flakes { - Command::new("nix") - } else { - Command::new("nix-build") - }; - - let mut build_command = if supports_flakes { - build_c.arg("build").arg(format!( - "{}#deploy.nodes.\"{}\".profiles.\"{}\".path", - repo, deploy_data.node_name, deploy_data.profile_name - )) - } else { - build_c.arg(&repo).arg("-A").arg(format!( - "deploy.nodes.\"{}\".profiles.\"{}\".path", - deploy_data.node_name, deploy_data.profile_name - )) - }; - - build_command = match (keep_result, supports_flakes) { - (true, _) => { - let result_path = result_path.unwrap_or("./.deploy-gc"); - - build_command.arg("--out-link").arg(format!( - "{}/{}/{}", - result_path, deploy_data.node_name, deploy_data.profile_name - )) - } - (false, false) => build_command.arg("--no-out-link"), - (false, true) => build_command.arg("--no-link"), - }; - - for extra_arg in extra_build_args { - build_command = build_command.arg(extra_arg); - } - - let build_exit_status = build_command - // Logging should be in stderr, this just stops the store path from printing for no reason - .stdout(Stdio::null()) - .status() - .await - .map_err(PushProfileError::BuildError)?; - - match build_exit_status.code() { - Some(0) => (), - a => return Err(PushProfileError::BuildExitError(a)), - }; - - if ! Path::new(format!("{}/deploy-rs-activate", deploy_data.profile.profile_settings.path).as_str()).exists() { - return Err(PushProfileError::DeployRsActivateDoesntExist); - } - - if ! Path::new(format!("{}/activate-rs", deploy_data.profile.profile_settings.path).as_str()).exists() { - return Err(PushProfileError::ActivateRsDoesntExist); - } - - - - if let Ok(local_key) = std::env::var("LOCAL_KEY") { - info!( - "Signing key present! Signing profile `{}` for node `{}`", - deploy_data.profile_name, deploy_data.node_name - ); - - let sign_exit_status = Command::new("nix") - .arg("sign-paths") - .arg("-r") - .arg("-k") - .arg(local_key) - .arg(&deploy_data.profile.profile_settings.path) - .status() - .await - .map_err(PushProfileError::SignError)?; - - match sign_exit_status.code() { - Some(0) => (), - a => return Err(PushProfileError::SignExitError(a)), - }; - } - - debug!( - "Copying profile `{}` to node `{}`", - deploy_data.profile_name, deploy_data.node_name - ); - - let mut copy_command_ = Command::new("nix"); - let mut copy_command = copy_command_.arg("copy"); - - if deploy_data.merged_settings.fast_connection != Some(true) { - copy_command = copy_command.arg("--substitute-on-destination"); - } - - if !check_sigs { - copy_command = copy_command.arg("--no-check-sigs"); - } - - let ssh_opts_str = deploy_data - .merged_settings - .ssh_opts - // This should provide some extra safety, but it also breaks for some reason, oh well - // .iter() - // .map(|x| format!("'{}'", x)) - // .collect::<Vec<String>>() - .join(" "); - - let hostname = match deploy_data.cmd_overrides.hostname { - Some(ref x) => x, - None => &deploy_data.node.node_settings.hostname, - }; - - let copy_exit_status = copy_command - .arg("--to") - .arg(format!("ssh://{}@{}", deploy_defs.ssh_user, hostname)) - .arg(&deploy_data.profile.profile_settings.path) - .env("NIX_SSHOPTS", ssh_opts_str) - .status() - .await - .map_err(PushProfileError::CopyError)?; - - match copy_exit_status.code() { - Some(0) => (), - a => return Err(PushProfileError::CopyExitError(a)), - }; - - Ok(()) -} |