aboutsummaryrefslogtreecommitdiff
path: root/src/deploy.rs
diff options
context:
space:
mode:
authorRoman Melnikov2023-09-12 12:15:07 +0200
committerGitHub2023-09-12 12:15:07 +0200
commit31c32fb2959103a796e07bbe47e0a5e287c343a8 (patch)
tree2a25e8e990de3ddd624a009ab94309ba06a982fc /src/deploy.rs
parentd0cfc042eba92eb206611c9e8784d41a2c053bab (diff)
parentf26e888c41d28107de9dbc5b4e1553c1dfcf83db (diff)
Merge pull request #231 from serokell/rvem/#201-dont-hardcode-profile-directory
[#201] Deduce profile directory during activation
Diffstat (limited to 'src/deploy.rs')
-rw-r--r--src/deploy.rs65
1 files changed, 50 insertions, 15 deletions
diff --git a/src/deploy.rs b/src/deploy.rs
index 574e9b2..41cd58b 100644
--- a/src/deploy.rs
+++ b/src/deploy.rs
@@ -9,11 +9,11 @@ use std::path::Path;
use thiserror::Error;
use tokio::process::Command;
-use crate::DeployDataDefsError;
+use crate::{DeployDataDefsError, ProfileInfo};
struct ActivateCommandData<'a> {
sudo: &'a Option<String>,
- profile_path: &'a str,
+ profile_info: &'a ProfileInfo,
closure: &'a str,
auto_rollback: bool,
temp_path: &'a Path,
@@ -37,8 +37,21 @@ fn build_activate_command(data: &ActivateCommandData) -> String {
}
self_activate_command = format!(
- "{} activate '{}' '{}' --temp-path '{}'",
- self_activate_command, data.closure, data.profile_path, data.temp_path.display()
+ "{} activate '{}' {} --temp-path '{}'",
+ self_activate_command,
+ data.closure,
+ match data.profile_info {
+ ProfileInfo::ProfilePath { profile_path } =>
+ format!("--profile-path '{}'", profile_path),
+ ProfileInfo::ProfileUserAndName {
+ profile_user,
+ profile_name,
+ } => format!(
+ "--profile-user {} --profile-name {}",
+ profile_user, profile_name
+ ),
+ },
+ data.temp_path.display()
);
self_activate_command = format!(
@@ -72,7 +85,9 @@ fn build_activate_command(data: &ActivateCommandData) -> String {
#[test]
fn test_activation_command_builder() {
let sudo = Some("sudo -u test".to_string());
- let profile_path = "/blah/profiles/test";
+ let profile_info = &ProfileInfo::ProfilePath {
+ profile_path: "/blah/profiles/test".to_string(),
+ };
let closure = "/nix/store/blah/etc";
let auto_rollback = true;
let dry_activate = false;
@@ -86,7 +101,7 @@ fn test_activation_command_builder() {
assert_eq!(
build_activate_command(&ActivateCommandData {
sudo: &sudo,
- profile_path,
+ profile_info,
closure,
auto_rollback,
temp_path,
@@ -97,7 +112,7 @@ fn test_activation_command_builder() {
dry_activate,
boot,
}),
- "sudo -u test /nix/store/blah/etc/activate-rs --debug-logs --log-dir /tmp/something.txt activate '/nix/store/blah/etc' '/blah/profiles/test' --temp-path '/tmp' --confirm-timeout 30 --magic-rollback --auto-rollback"
+ "sudo -u test /nix/store/blah/etc/activate-rs --debug-logs --log-dir /tmp/something.txt activate '/nix/store/blah/etc' --profile-path '/blah/profiles/test' --temp-path '/tmp' --confirm-timeout 30 --magic-rollback --auto-rollback"
.to_string(),
);
}
@@ -123,7 +138,9 @@ fn build_wait_command(data: &WaitCommandData) -> String {
self_activate_command = format!(
"{} wait '{}' --temp-path '{}'",
- self_activate_command, data.closure, data.temp_path.display(),
+ self_activate_command,
+ data.closure,
+ data.temp_path.display(),
);
if let Some(sudo_cmd) = &data.sudo {
@@ -157,7 +174,7 @@ fn test_wait_command_builder() {
struct RevokeCommandData<'a> {
sudo: &'a Option<String>,
closure: &'a str,
- profile_path: &'a str,
+ profile_info: ProfileInfo,
debug_logs: bool,
log_dir: Option<&'a str>,
}
@@ -173,7 +190,21 @@ fn build_revoke_command(data: &RevokeCommandData) -> String {
self_activate_command = format!("{} --log-dir {}", self_activate_command, log_dir);
}
- self_activate_command = format!("{} revoke '{}'", self_activate_command, data.profile_path);
+ self_activate_command = format!(
+ "{} revoke {}",
+ self_activate_command,
+ match &data.profile_info {
+ ProfileInfo::ProfilePath { profile_path } =>
+ format!("--profile-path '{}'", profile_path),
+ ProfileInfo::ProfileUserAndName {
+ profile_user,
+ profile_name,
+ } => format!(
+ "--profile-user {} --profile-name {}",
+ profile_user, profile_name
+ ),
+ }
+ );
if let Some(sudo_cmd) = &data.sudo {
self_activate_command = format!("{} {}", sudo_cmd, self_activate_command);
@@ -186,7 +217,9 @@ fn build_revoke_command(data: &RevokeCommandData) -> String {
fn test_revoke_command_builder() {
let sudo = Some("sudo -u test".to_string());
let closure = "/nix/store/blah/etc";
- let profile_path = "/nix/var/nix/per-user/user/profile";
+ let profile_info = ProfileInfo::ProfilePath {
+ profile_path: "/nix/var/nix/per-user/user/profile".to_string(),
+ };
let debug_logs = true;
let log_dir = Some("/tmp/something.txt");
@@ -194,11 +227,11 @@ fn test_revoke_command_builder() {
build_revoke_command(&RevokeCommandData {
sudo: &sudo,
closure,
- profile_path,
+ profile_info,
debug_logs,
log_dir
}),
- "sudo -u test /nix/store/blah/etc/activate-rs --debug-logs --log-dir /tmp/something.txt revoke '/nix/var/nix/per-user/user/profile'"
+ "sudo -u test /nix/store/blah/etc/activate-rs --debug-logs --log-dir /tmp/something.txt revoke --profile-path '/nix/var/nix/per-user/user/profile'"
.to_string(),
);
}
@@ -271,6 +304,8 @@ pub enum DeployProfileError {
#[error("Error confirming deployment: {0}")]
Confirm(#[from] ConfirmProfileError),
+ #[error("Deployment data invalid: {0}")]
+ InvalidDeployDataDefs(#[from] DeployDataDefsError),
}
pub async fn deploy_profile(
@@ -299,7 +334,7 @@ pub async fn deploy_profile(
let self_activate_command = build_activate_command(&ActivateCommandData {
sudo: &deploy_defs.sudo,
- profile_path: &deploy_defs.profile_path,
+ profile_info: &deploy_data.get_profile_info()?,
closure: &deploy_data.profile.profile_settings.path,
auto_rollback,
temp_path: temp_path,
@@ -439,7 +474,7 @@ pub async fn revoke(
let self_revoke_command = build_revoke_command(&RevokeCommandData {
sudo: &deploy_defs.sudo,
closure: &deploy_data.profile.profile_settings.path,
- profile_path: &deploy_data.get_profile_path()?,
+ profile_info: deploy_data.get_profile_info()?,
debug_logs: deploy_data.debug_logs,
log_dir: deploy_data.log_dir,
});