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