From 9c0dd087c3a4f25fe1e9ee682487f348b13f274d Mon Sep 17 00:00:00 2001 From: Ana Hobden Date: Wed, 9 Nov 2022 09:56:28 -0800 Subject: [PATCH] Check if running as root during install and uninstall --- src/cli/mod.rs | 4 ++++ src/cli/subcommand/install.rs | 8 +++++++- src/cli/subcommand/plan.rs | 4 ++-- src/cli/subcommand/uninstall.rs | 10 ++++++++-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 44b704b..6b4cfd6 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -40,3 +40,7 @@ impl CommandExecute for HarmonicCli { } } } + +pub fn is_root() -> bool { + nix::unistd::getuid() == nix::unistd::Uid::from_raw(0) +} diff --git a/src/cli/subcommand/install.rs b/src/cli/subcommand/install.rs index 38f1fc8..7c310ac 100644 --- a/src/cli/subcommand/install.rs +++ b/src/cli/subcommand/install.rs @@ -1,6 +1,6 @@ use std::{path::PathBuf, process::ExitCode}; -use crate::BuiltinPlanner; +use crate::{cli::is_root, BuiltinPlanner}; use clap::{ArgAction, Parser}; use eyre::{eyre, WrapErr}; @@ -43,6 +43,12 @@ impl CommandExecute for Install { explain, } = self; + if !is_root() { + return Err(eyre!( + "`harmonic install` must be run as `root`, try `sudo harmonic install`" + )); + } + let mut plan = match &plan { Some(plan_path) => { let install_plan_string = tokio::fs::read_to_string(&plan_path) diff --git a/src/cli/subcommand/plan.rs b/src/cli/subcommand/plan.rs index 41c3796..5a3d894 100644 --- a/src/cli/subcommand/plan.rs +++ b/src/cli/subcommand/plan.rs @@ -9,11 +9,11 @@ use crate::cli::CommandExecute; /// Plan an install that can be repeated on an identical host later #[derive(Debug, Parser)] -#[command(args_conflicts_with_subcommands = true, arg_required_else_help = true)] +#[command(arg_required_else_help = true)] pub struct Plan { #[clap(subcommand)] pub planner: Option, - #[clap(env = "HARMONIC_PLAN")] + #[clap(env = "HARMONIC_PLAN", default_value = "/dev/stdout")] pub output: PathBuf, } diff --git a/src/cli/subcommand/uninstall.rs b/src/cli/subcommand/uninstall.rs index af242d7..4a3ddf7 100644 --- a/src/cli/subcommand/uninstall.rs +++ b/src/cli/subcommand/uninstall.rs @@ -1,8 +1,8 @@ use std::{path::PathBuf, process::ExitCode}; -use crate::InstallPlan; +use crate::{cli::is_root, InstallPlan}; use clap::{ArgAction, Parser}; -use eyre::WrapErr; +use eyre::{eyre, WrapErr}; use crate::{cli::CommandExecute, interaction}; @@ -37,6 +37,12 @@ impl CommandExecute for Uninstall { explain, } = self; + if !is_root() { + return Err(eyre!( + "`harmonic install` must be run as `root`, try `sudo harmonic install`" + )); + } + let install_receipt_string = tokio::fs::read_to_string(receipt) .await .wrap_err("Reading receipt")?;