Compare commits

..

2 Commits

Author SHA1 Message Date
Christian Heusel
2609e386d4 WIP: run0 support
Signed-off-by: Christian Heusel <christian@heusel.eu>
2025-10-04 20:58:39 +02:00
Rafael Fontenelle
447f7b4117 Fix typo 2025-09-29 20:00:02 -03:00
7 changed files with 35 additions and 35 deletions

View File

@@ -14,7 +14,7 @@ Description
Build a PKGBUILD on a remote server using makechrootpkg. Requires a remote user Build a PKGBUILD on a remote server using makechrootpkg. Requires a remote user
that can run archbuild in a non-interactive manner, e.g. must be able to that can run archbuild in a non-interactive manner, e.g. must be able to
elevate permissions using passwordless sudo. elevate permissions using passwordless run0.
Options Options
------- -------

View File

@@ -3,7 +3,7 @@ pkgctl-auth(1)
Name Name
---- ----
pkgctl-auth - Authenticate with serivces like GitLab. pkgctl-auth - Authenticate with services like GitLab.
Synopsis Synopsis
-------- --------

View File

@@ -39,14 +39,6 @@ placed in the `$XDG_CONFIG_HOME`/nvchecker` directory. This keyfile is
used for providing the necessary authentication tokens required for used for providing the necessary authentication tokens required for
accessing the GitHub or GitLab API. accessing the GitHub or GitLab API.
Combiner Source
---------------
To utilize the combiner source, the `pkgbase` section must be declared as the
combiner source. Additionally, individual sections should be added using a
quoted table key consisting of the `pkgbase` followed by the stage name,
separated by double colons. For example: `["sudo:stage1"]`.
Options Options
------- -------

View File

@@ -15,7 +15,11 @@ check_root() {
local orig_argv=("$@") local orig_argv=("$@")
(( EUID == 0 )) && return (( EUID == 0 )) && return
if type -P sudo >/dev/null; then if type -P run0 >/dev/null; then
keepenv=",$keepenv"
command="run0 ${keepenv//,/ --setenv=}"
exec ${command} -- "${orig_argv[@]}"
elif type -P sudo >/dev/null; then
exec sudo --preserve-env="${keepenv}" -- "${orig_argv[@]}" exec sudo --preserve-env="${keepenv}" -- "${orig_argv[@]}"
else else
exec su root -c "$(printf ' %q' "${orig_argv[@]}")" exec su root -c "$(printf ' %q' "${orig_argv[@]}")"

View File

@@ -304,11 +304,6 @@ get_upstream_version() {
return 1 return 1
fi fi
if ! output=$(jq --raw-output --exit-status 'select(.name == "'"${pkgbase}"'")' <<< "${output}"); then
printf "failed to select pkgbase result from output"
return 1
fi
if ! upstream_version=$(jq --raw-output --exit-status '.version' <<< "${output}"); then if ! upstream_version=$(jq --raw-output --exit-status '.version' <<< "${output}"); then
printf "failed to select version from result" printf "failed to select version from result"
return 1 return 1
@@ -351,7 +346,7 @@ nvchecker_check_config() {
fi fi
# check if the config contains any section other than pkgbase # check if the config contains any section other than pkgbase
if [[ -n ${pkgbase} ]] && property=$(grep --max-count=1 --perl-regexp "^\\[(?!\"?${pkgbase//+/\\+}(:.+)?\"?\\]).+\\]" < "${config}"); then if [[ -n ${pkgbase} ]] && property=$(grep --max-count=1 --perl-regexp "^\\[(?!\"?${pkgbase//+/\\+}\"?\\]).+\\]" < "${config}"); then
printf "non-pkgbase section not supported in %s: %s" "${config}" "${property}" printf "non-pkgbase section not supported in %s: %s" "${config}" "${property}"
return 1 return 1
fi fi

View File

@@ -185,10 +185,18 @@ prepare_chroot() {
echo "$x" >>"$copydir/etc/makepkg.conf" echo "$x" >>"$copydir/etc/makepkg.conf"
done done
cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF # TODO(gromit): check if this rule is sane
builduser ALL = NOPASSWD: /usr/bin/pacman # TODO(gromit): this will require a full container
cat > "$copydir/etc/polkit-1/rules.d/10-systemd-nopasswd.rules" <<EOF
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units") {
if (subject.isInGroup("wheel")) {
return polkit.Result.YES;
}
}
});
EOF EOF
chmod 440 "$copydir/etc/sudoers.d/builduser-pacman" chmod 440 "$copydir/etc/polkit-1/rules.d/10-systemd-nopasswd.rules"
cat > "$copydir/etc/gitconfig" <<EOF cat > "$copydir/etc/gitconfig" <<EOF
[safe] [safe]
@@ -222,17 +230,14 @@ _chrootbuild() {
# shellcheck source=/dev/null # shellcheck source=/dev/null
. /etc/profile . /etc/profile
# Beware, there are some stupid arbitrary rules on how you can run0 --setenv=SOURCE_DATE_EPOCH \
# use "$" in arguments to commands with "sudo -i". ${foo} or --setenv=BUILDTOOL \
# ${1} is OK, but $foo or $1 isn't. --setenv=BUILDTOOLVER \
# https://bugzilla.sudo.ws/show_bug.cgi?id=765 --via-shell --chdir='~' \
sudo --preserve-env=SOURCE_DATE_EPOCH \ --user=builduser -- bash -c 'cd /startdir; makepkg "$@"' -bash "$@"
--preserve-env=BUILDTOOL \
--preserve-env=BUILDTOOLVER \
-iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@"
ret=$? ret=$?
case $ret in case $ret in
0|14) 0)
return 0;; return 0;;
*) *)
return $ret;; return $ret;;
@@ -243,7 +248,7 @@ _chrootnamcap() {
pacman -S --needed --noconfirm namcap pacman -S --needed --noconfirm namcap
for pkgfile in /startdir/PKGBUILD /pkgdest/*; do for pkgfile in /startdir/PKGBUILD /pkgdest/*; do
echo "Checking ${pkgfile##*/}" echo "Checking ${pkgfile##*/}"
sudo -u builduser namcap "$pkgfile" 2>&1 | tee "/logdest/${pkgfile##*/}-namcap.log" run0 --user=builduser -- namcap "$pkgfile" 2>&1 | tee "/logdest/${pkgfile##*/}-namcap.log"
done done
} }
@@ -252,8 +257,12 @@ download_sources() {
chown "$makepkg_user:" "$WORKDIR" chown "$makepkg_user:" "$WORKDIR"
# Ensure sources are downloaded # Ensure sources are downloaded
sudo -u "$makepkg_user" --preserve-env=GNUPGHOME,SSH_AUTH_SOCK \ run0 --user="$makepkg_user" \
env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \ --setenv=GNUPGHOME \
--setenv=SSH_AUTH_SOCK \
--setenv=SRCDEST="$SRCDEST" \
--setenv=BUILDDIR="$WORKDIR" \
--chdir=. -- \
makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o "${verifysource_args[@]}" || makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o "${verifysource_args[@]}" ||
die "Could not download sources." die "Could not download sources."
} }
@@ -400,7 +409,7 @@ if arch-nspawn "$copydir" \
"${nspawn_build_args[@]}" \ "${nspawn_build_args[@]}" \
/chrootbuild "${makepkg_args[@]}" /chrootbuild "${makepkg_args[@]}"
then then
mapfile -t pkgnames < <(sudo -u "$makepkg_user" bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"') mapfile -t pkgnames < <(run0 --user="$makepkg_user" -- bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"')
move_products move_products
else else
(( ret += 1 )) (( ret += 1 ))
@@ -453,7 +462,7 @@ else
done done
msg2 "Checking packages" msg2 "Checking packages"
sudo -u "$makepkg_user" checkpkg --rmdir --warn --makepkg-config "$copydir/etc/makepkg.conf" "${remotepkgs[@]/#file:\/\//}" run0 --user="$makepkg_user" -- checkpkg --rmdir --warn --makepkg-config "$copydir/etc/makepkg.conf" "${remotepkgs[@]/#file:\/\//}"
fi fi
true true
fi fi

View File

@@ -192,7 +192,7 @@ for p in "$@"; do
pkgfile=${pkgfile_remote#file://} pkgfile=${pkgfile_remote#file://}
if [[ ! -f ${pkgfile} ]]; then if [[ ! -f ${pkgfile} ]]; then
msg "Downloading package '%s' into pacman's cache" "${pkgfile}" msg "Downloading package '%s' into pacman's cache" "${pkgfile}"
sudo pacman -Swdd --noconfirm --logfile /dev/null "${p}" || exit 1 run0 -- pacman -Swdd --noconfirm --logfile /dev/null "${p}" || exit 1
pkgfile_remote=$(pacman -Sddp "${p}" 2>/dev/null) pkgfile_remote=$(pacman -Sddp "${p}" 2>/dev/null)
pkgfile="${pkgfile_remote#file://}" pkgfile="${pkgfile_remote#file://}"
fi fi