Add sudo_command option (#379)

This allows the user to specify the preferred sudo command to be used
instead of the command chosen by Sudo::detect
This commit is contained in:
Thomas de Queiroz Barros
2023-03-13 19:23:37 +00:00
committed by GitHub
parent 462016e51e
commit a3628d0d49
4 changed files with 21 additions and 3 deletions

View File

@@ -13,6 +13,9 @@
# Do not ask to retry failed steps (default: false)
#no_retry = true
# Sudo command to be used
#sudo_command = "sudo"
# Run `sudo -v` to cache credentials at the start of the run; this avoids a
# blocking password prompt in the middle of a possibly-unattended run.
#pre_sudo = false

View File

@@ -18,6 +18,7 @@ use tracing::debug;
use which_crate::which;
use crate::command::CommandExt;
use crate::sudo::SudoKind;
use super::utils::{editor, hostname};
@@ -293,6 +294,7 @@ pub struct Vim {
#[serde(deny_unknown_fields)]
/// Configuration file
pub struct ConfigFile {
sudo_command: Option<SudoKind>,
pre_sudo: Option<bool>,
pre_commands: Option<Commands>,
post_commands: Option<Commands>,
@@ -1017,6 +1019,10 @@ impl Config {
.unwrap_or(false)
}
pub fn sudo_command(&self) -> Option<SudoKind> {
self.config_file.sudo_command
}
/// If `true`, `sudo` should be called after `pre_commands` in order to elevate at the
/// start of the session (and not in the middle).
pub fn pre_sudo(&self) -> bool {

View File

@@ -107,7 +107,7 @@ For more information about this issue see https://askubuntu.com/questions/110969
let git = git::Git::new();
let mut git_repos = git::Repositories::new(&git);
let sudo = sudo::Sudo::detect();
let sudo = config.sudo_command().map_or_else(sudo::Sudo::detect, sudo::Sudo::new);
let run_type = executor::RunType::new(config.dry_run());
let ctx = execution_context::ExecutionContext::new(run_type, sudo, &git, &config, &base_dirs);

View File

@@ -4,6 +4,8 @@ use std::path::PathBuf;
use color_eyre::eyre::Context;
use color_eyre::eyre::Result;
use serde::Deserialize;
use strum::AsRefStr;
use crate::command::CommandExt;
use crate::execution_context::ExecutionContext;
@@ -31,6 +33,11 @@ impl Sudo {
.map(|(path, kind)| Self { path, kind })
}
/// Create Sudo from SudoKind, if found in the system
pub fn new(kind: SudoKind) -> Option<Self> {
which(kind.as_ref()).map(|path| Self { path, kind })
}
/// Elevate permissions with `sudo`.
///
/// This helps prevent blocking `sudo` prompts from stopping the run in the middle of a
@@ -100,8 +107,10 @@ impl Sudo {
}
}
#[derive(Clone, Copy, Debug)]
enum SudoKind {
#[derive(Clone, Copy, Debug, Deserialize, AsRefStr)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum SudoKind {
Doas,
Please,
Sudo,