[arch-projects] [DEVTOOLS][PATCH] Switch to root when started as regular user

Sébastien Luttringer seblu at seblu.net
Tue Jan 7 19:15:37 EST 2014


In collaborative builder machine, these scripts are often allowed to become root
via sudo. This patch avoid to prefix them by sudo each time or call su.
---
 arch-nspawn.in   |  2 +-
 archbuild.in     |  4 +---
 lib/common.sh    | 13 +++++++++++++
 makechrootpkg.in |  2 +-
 mkarchroot.in    |  3 ++-
 5 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/arch-nspawn.in b/arch-nspawn.in
index 6900382..4436a0e 100644
--- a/arch-nspawn.in
+++ b/arch-nspawn.in
@@ -37,8 +37,8 @@ while getopts 'hC:M:c:' arg; do
 done
 shift $(($OPTIND - 1))
 
-(( $EUID != 0 )) && die 'This script must be run as root.'
 (( $# < 1 )) && die 'You must specify a directory.'
+check_root "$0" "$@"
 
 working_dir=$(readlink -f "$1")
 shift 1
diff --git a/archbuild.in b/archbuild.in
index b1c96f9..ae2f511 100644
--- a/archbuild.in
+++ b/archbuild.in
@@ -40,9 +40,7 @@ done
 # Pass all arguments after -- right to makepkg
 makechrootpkg_args+=("${@:$OPTIND}")
 
-if (( EUID )); then
-	die 'This script must be run as root.'
-fi
+check_root "$0" "$@"
 
 if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then
 	msg "Creating chroot for [${repo}] (${arch})..."
diff --git a/lib/common.sh b/lib/common.sh
index cb9db76..75cf2e0 100644
--- a/lib/common.sh
+++ b/lib/common.sh
@@ -228,3 +228,16 @@ find_cached_package() {
 			return 1
 	esac
 }
+
+##
+#  usage : check_root ("$0" "$@")
+##
+check_root() {
+	(( EUID == 0 )) && return
+	if type -P sudo >/dev/null; then
+		exec sudo -- "$@"
+	else
+		exec su root -c "$(printf '%q' "$@")"
+	fi
+	die 'This script must be run as root.'
+}
diff --git a/makechrootpkg.in b/makechrootpkg.in
index d03b703..a9510f4 100644
--- a/makechrootpkg.in
+++ b/makechrootpkg.in
@@ -82,7 +82,7 @@ while getopts 'hcur:I:l:nTD:d:' arg; do
 	esac
 done
 
-(( EUID != 0 )) && die 'This script must be run as root.'
+check_root "$0" "$@"
 
 [[ ! -f PKGBUILD && -z "${install_pkgs[*]}" ]] && die 'This must be run in a directory containing a PKGBUILD.'
 
diff --git a/mkarchroot.in b/mkarchroot.in
index 7cdb274..fb472bc 100644
--- a/mkarchroot.in
+++ b/mkarchroot.in
@@ -35,9 +35,10 @@ while getopts 'hC:M:c:' arg; do
 done
 shift $(($OPTIND - 1))
 
-(( $EUID != 0 )) && die 'This script must be run as root.'
 (( $# < 2 )) && die 'You must specify a directory and one or more packages.'
 
+check_root "$0" "$@"
+
 working_dir="$(readlink -f $1)"
 shift 1
 
-- 
Sébastien "Seblu" Luttringer



More information about the arch-projects mailing list