Skip to content

Commit 603b811

Browse files
committed
dom0-update: In download mode, only send specifically requested packages to dom0
Save output of the package manager command. Then, if called with download action, parse out the requested packages and only send those to dom0. This fixes an issue where packages could be installed that were not intended or where packages could not be installed due to missing dependencies from packages not explicitly requested by the user. Fixes QubesOS/qubes-issues#10716
1 parent 2e5866f commit 603b811

1 file changed

Lines changed: 28 additions & 5 deletions

File tree

package-managers/qubes-download-dom0-updates.sh

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,15 +169,36 @@ fi
169169

170170
set -e
171171

172-
"${UPDATE_COMMAND[@]}" "${OPTS[@]}" "${PKGLIST[@]}"
172+
"${UPDATE_COMMAND[@]}" "${OPTS[@]}" "${PKGLIST[@]}" | tee "$DOM0_UPDATES_DIR/download.out"
173173

174+
# Collect rpms from various download locations into one directory
174175
find "$DOM0_UPDATES_DIR/var/cache" -name '*.rpm' -print0 2>/dev/null |\
175176
xargs -0 -r ln -f -t "$DOM0_UPDATES_DIR/packages/"
176177

177-
if ls "$DOM0_UPDATES_DIR"/packages/*.rpm > /dev/null 2>&1; then
178+
case "$UPDATE_ACTION" in
179+
download|upgrade|install)
180+
RPMS=$(
181+
grep '^ ' "$DOM0_UPDATES_DIR/download.out" |
182+
tail -n +2 |
183+
while read PKG ARCH VER REPO SIZE; do
184+
F="$PKG-${VER##*:}.$ARCH.rpm"
185+
if [ -f "$DOM0_UPDATES_DIR"/packages/"$F" ]; then
186+
echo "$F"
187+
else
188+
# Did not find package that was supposed to be downloaded... bail
189+
echo "Package $F requested but not downloaded" >&2
190+
exit 1
191+
fi
192+
done
193+
)
194+
;;
195+
esac
196+
197+
if [ -n "$RPMS" ]; then
178198
if [ -n "$SIGNATURE_REGEX" ]; then
179199
rpmkeys_error=0
180-
for pkg in "$DOM0_UPDATES_DIR"/packages/*.rpm; do
200+
for rpmfile in $RPMS; do
201+
pkg="$DOM0_UPDATES_DIR"/packages/"$rpmfile"
181202
rpmkeys_exit_code=0
182203
output="$(rpmkeys --root "$DOM0_UPDATES_DIR" --checksig "$pkg")" \
183204
|| rpmkeys_exit_code="$?"
@@ -201,11 +222,13 @@ if ls "$DOM0_UPDATES_DIR"/packages/*.rpm > /dev/null 2>&1; then
201222

202223
cmd="/usr/lib/qubes/qrexec-client-vm dom0 qubes.ReceiveUpdates /usr/lib/qubes/qfile-agent"
203224
qrexec_exit_code=0
204-
$cmd "$DOM0_UPDATES_DIR"/packages/*.rpm || { qrexec_exit_code=$? ; true; };
225+
rpmfiles=$(for rpmfile in $RPMS; do echo "$DOM0_UPDATES_DIR"/packages/"$rpmfile"; done)
226+
$cmd $rpmfiles || { qrexec_exit_code=$? ; true; };
205227
if [ ! "$qrexec_exit_code" = "0" ]; then
206-
echo "'$cmd $DOM0_UPDATES_DIR/packages/*.rpm' failed with exit code ${qrexec_exit_code}!" >&2
228+
echo "'$cmd $rpmfiles failed with exit code ${qrexec_exit_code}!" >&2
207229
exit "$qrexec_exit_code"
208230
fi
209231
else
210232
echo "No packages downloaded" >&2
211233
fi
234+
rm -f "$DOM0_UPDATES_DIR/download.out"

0 commit comments

Comments
 (0)