From 5ecf8300ef423fdb4b32b369497741d9f07270c1 Mon Sep 17 00:00:00 2001 From: Roey Darwish Dror Date: Sat, 9 Apr 2022 16:29:55 +0300 Subject: [PATCH] Execute-elevated (#892) * Introduce the execute elevated method (fix #885) * fmt * Fix nix with doas * Bad import --- src/execution_context.rs | 22 ++++++++++++++++++++-- src/steps/os/linux.rs | 6 +----- src/steps/os/unix.rs | 11 ++--------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/execution_context.rs b/src/execution_context.rs index d4fad21e..6fe89e7a 100644 --- a/src/execution_context.rs +++ b/src/execution_context.rs @@ -1,9 +1,11 @@ #![allow(dead_code)] -use crate::config::Config; use crate::executor::RunType; use crate::git::Git; +use crate::utils::require_option; +use crate::{config::Config, executor::Executor}; +use anyhow::Result; use directories::BaseDirs; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; pub struct ExecutionContext<'a> { run_type: RunType, @@ -30,6 +32,22 @@ impl<'a> ExecutionContext<'a> { } } + pub fn execute_elevated(&self, command: &Path, interactive: bool) -> Result { + let sudo = require_option(self.sudo.clone(), "Sudo is required for this operation".into())?; + let mut cmd = self.run_type.execute(&sudo); + + if sudo.ends_with("sudo") { + cmd.arg("--preserve-env=DIFFPROG"); + } + + if interactive { + cmd.arg("-i"); + } + + cmd.arg(command); + Ok(cmd) + } + pub fn run_type(&self) -> RunType { self.run_type } diff --git a/src/steps/os/linux.rs b/src/steps/os/linux.rs index f569f31b..5d97072c 100644 --- a/src/steps/os/linux.rs +++ b/src/steps/os/linux.rs @@ -547,11 +547,7 @@ pub fn run_config_update(ctx: &ExecutionContext) -> Result<()> { } print_separator("Configuration update"); - ctx.run_type() - .execute(sudo) - .arg("--preserve-env=DIFFPROG") - .arg(pacdiff) - .check_run()?; + ctx.execute_elevated(&pacdiff, false)?.check_run()?; } Ok(()) diff --git a/src/steps/os/unix.rs b/src/steps/os/unix.rs index a062033b..a8bc9d01 100644 --- a/src/steps/os/unix.rs +++ b/src/steps/os/unix.rs @@ -5,7 +5,7 @@ use crate::execution_context::ExecutionContext; #[cfg(target_os = "macos")] use crate::executor::CommandExt; use crate::executor::{Executor, ExecutorExitStatus, RunType}; -use crate::terminal::{print_separator, print_warning}; +use crate::terminal::print_separator; use crate::utils::{require, require_option, PathExt}; use crate::Step; use anyhow::Result; @@ -232,14 +232,7 @@ pub fn run_nix(ctx: &ExecutionContext) -> Result<()> { let run_type = ctx.run_type(); if multi_user { - if let Some(sudo) = ctx.sudo() { - run_type - .execute(&sudo) - .args(&["-i", "nix", "upgrade-nix"]) - .check_run()?; - } else { - print_warning("Need sudo to upgrade Nix"); - } + ctx.execute_elevated(&nix, true)?.arg("upgrade-nix").check_run()?; } else { run_type.execute(&nix).arg("upgrade-nix").check_run()?; }