Skip to content

Commit a0d4c8a

Browse files
committed
updater: split qubes-download-dom0-updates.sh
Splitting the file allows for code reuse and improves readability
1 parent 8a5e873 commit a0d4c8a

4 files changed

Lines changed: 75 additions & 68 deletions

File tree

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#!/bin/bash
2+
3+
DOM0_UPDATES_DIR=/var/lib/qubes/dom0-updates
4+
5+
if ! [ -d "$DOM0_UPDATES_DIR" ]; then
6+
echo "Dom0 updates dir does not exists: $DOM0_UPDATES_DIR" >&2
7+
exit 1
8+
fi
9+
10+
mkdir -p "$DOM0_UPDATES_DIR/packages"
11+
12+
set -e
13+
14+
find "$DOM0_UPDATES_DIR/var/cache" -name '*.rpm' -print0 2>/dev/null |\
15+
xargs -0 -r ln -f -t "$DOM0_UPDATES_DIR/packages/"
16+
17+
if ls "$DOM0_UPDATES_DIR"/packages/*.rpm > /dev/null 2>&1; then
18+
cmd="/usr/lib/qubes/qrexec-client-vm dom0 qubes.ReceiveUpdates /usr/lib/qubes/qfile-agent"
19+
qrexec_exit_code=0
20+
$cmd "$DOM0_UPDATES_DIR"/packages/*.rpm || { qrexec_exit_code=$? ; true; };
21+
if [ ! "$qrexec_exit_code" = "0" ]; then
22+
echo "'$cmd $DOM0_UPDATES_DIR/packages/*.rpm' failed with exit code ${qrexec_exit_code}!" >&2
23+
exit "$qrexec_exit_code"
24+
fi
25+
else
26+
echo "No packages downloaded" >&2
27+
fi
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/bin/bash
2+
3+
DOM0_UPDATES_DIR=/var/lib/qubes/dom0-updates
4+
5+
if ! [ -d "$DOM0_UPDATES_DIR" ]; then
6+
echo "Dom0 updates dir does not exists: $DOM0_UPDATES_DIR" >&2
7+
exit 1
8+
fi
9+
10+
mkdir -p $DOM0_UPDATES_DIR/etc
11+
12+
# remove converted sqlite db if legacy db is newer, to force conversion again
13+
# legacy db could be only in the /var/lib/rpm location, but sqlite could be in any
14+
if [ -e "$DOM0_UPDATES_DIR/var/lib/rpm/rpmdb.sqlite" ] && \
15+
[ "$DOM0_UPDATES_DIR/var/lib/rpm/Packages" -nt "$DOM0_UPDATES_DIR/var/lib/rpm/rpmdb.sqlite" ]; then
16+
rm -f -- "$DOM0_UPDATES_DIR/var/lib/rpm/rpmdb.sqlite"*
17+
elif [ -e "$DOM0_UPDATES_DIR/usr/lib/sysimage/rpm/rpmdb.sqlite" ] && \
18+
[ "$DOM0_UPDATES_DIR/var/lib/rpm/Packages" -nt "$DOM0_UPDATES_DIR/usr/lib/sysimage/rpm/rpmdb.sqlite" ]; then
19+
# remove the whole directory, to make the logic below happy
20+
rm -rf -- "$DOM0_UPDATES_DIR/usr/lib/sysimage/rpm"
21+
fi
22+
23+
# Check if we need to copy rpmdb somewhere else
24+
DOM0_DBPATH=/var/lib/rpm
25+
if [ -d "$DOM0_UPDATES_DIR/usr/lib/sysimage/rpm" ] && ! [ -L "$DOM0_UPDATES_DIR/usr/lib/sysimage/rpm" ]; then
26+
DOM0_DBPATH=/usr/lib/sysimage/rpm
27+
fi
28+
DBPATH=$(rpm --eval '%{_dbpath}')
29+
if [ ! "$DBPATH" = "$DOM0_DBPATH" ]; then
30+
mkdir -p "$DOM0_UPDATES_DIR$DBPATH"
31+
rm -rf -- "$DOM0_UPDATES_DIR$DBPATH"
32+
cp -r "$DOM0_UPDATES_DIR$DOM0_DBPATH" "$DOM0_UPDATES_DIR$DBPATH"
33+
fi
34+
# Rebuild rpm database in case of different rpm version
35+
rm -f -- "$DOM0_UPDATES_DIR$DBPATH"/__*
36+
rpm --root=$DOM0_UPDATES_DIR --rebuilddb
37+
38+
exit 0

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

Lines changed: 8 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ fi
1414
# DNF uses /etc/yum.repos.d, even when --installroot is specified
1515
OPTS+=("--setopt=reposdir=$DOM0_UPDATES_DIR/etc/yum.repos.d")
1616
CLEAN_OPTS=("${OPTS[@]}")
17-
# DNF verifies signatures implicitly, but yumdownloader does not.
18-
SIGNATURE_REGEX=""
1917
PKGLIST=()
2018

2119
# Executable (yum or dnf)
@@ -76,8 +74,8 @@ if type dnf >/dev/null 2>&1 || type dnf5 >/dev/null 2>&1; then
7674
fi
7775
UPDATE_ARGUMENTS+=(--noplugins -y)
7876
CLEAN_OPTS+=(--noplugins -y)
79-
"$UPDATE_CMD" "${OPTS[@]}" "$UPDATE_ACTION" --help | grep -q best && UPDATE_ARGUMENTS+=(--best)
80-
"$UPDATE_CMD" "${OPTS[@]}" "$UPDATE_ACTION" --help | grep -q allowerasing && UPDATE_ARGUMENTS+=(--allowerasing)
77+
"$UPDATE_CMD" "${OPTS[@]}" "$UPDATE_ACTION" --help 2>/dev/null | grep -q best && UPDATE_ARGUMENTS+=(--best)
78+
"$UPDATE_CMD" "${OPTS[@]}" "$UPDATE_ACTION" --help 2>/dev/null | grep -q allowerasing && UPDATE_ARGUMENTS+=(--allowerasing)
8179
if [ "$UPDATE_CMD" = "dnf5" ] && [ "$CHECK_ONLY" = "1" ]; then
8280
UPDATE_ACTION=check-upgrade
8381
fi
@@ -91,34 +89,12 @@ if ! [ -d "$DOM0_UPDATES_DIR" ]; then
9189
exit 1
9290
fi
9391

94-
mkdir -p $DOM0_UPDATES_DIR/etc
95-
96-
# remove converted sqlite db if legacy db is newer, to force conversion again
97-
# legacy db could be only in the /var/lib/rpm location, but sqlite could be in any
98-
if [ -e "$DOM0_UPDATES_DIR/var/lib/rpm/rpmdb.sqlite" ] && \
99-
[ "$DOM0_UPDATES_DIR/var/lib/rpm/Packages" -nt "$DOM0_UPDATES_DIR/var/lib/rpm/rpmdb.sqlite" ]; then
100-
rm -f -- "$DOM0_UPDATES_DIR/var/lib/rpm/rpmdb.sqlite"*
101-
elif [ -e "$DOM0_UPDATES_DIR/usr/lib/sysimage/rpm/rpmdb.sqlite" ] && \
102-
[ "$DOM0_UPDATES_DIR/var/lib/rpm/Packages" -nt "$DOM0_UPDATES_DIR/usr/lib/sysimage/rpm/rpmdb.sqlite" ]; then
103-
# remove the whole directory, to make the logic below happy
104-
rm -rf -- "$DOM0_UPDATES_DIR/usr/lib/sysimage/rpm"
92+
"$(dirname "$0")/qubes-download-dom0-updates-init.sh" ; RETCODE=$?
93+
if [ $RETCODE -ne 0 ]; then
94+
echo "qubes-download-dom0-updates-init.sh failed with exit code ${RETCODE}!" >&2
95+
exit $RETCODE
10596
fi
10697

107-
# Check if we need to copy rpmdb somewhere else
108-
DOM0_DBPATH=/var/lib/rpm
109-
if [ -d "$DOM0_UPDATES_DIR/usr/lib/sysimage/rpm" ] && ! [ -L "$DOM0_UPDATES_DIR/usr/lib/sysimage/rpm" ]; then
110-
DOM0_DBPATH=/usr/lib/sysimage/rpm
111-
fi
112-
DBPATH=$(rpm --eval '%{_dbpath}')
113-
if [ ! "$DBPATH" = "$DOM0_DBPATH" ]; then
114-
mkdir -p "$DOM0_UPDATES_DIR$DBPATH"
115-
rm -rf -- "$DOM0_UPDATES_DIR$DBPATH"
116-
cp -r "$DOM0_UPDATES_DIR$DOM0_DBPATH" "$DOM0_UPDATES_DIR$DBPATH"
117-
fi
118-
# Rebuild rpm database in case of different rpm version
119-
rm -f -- "$DOM0_UPDATES_DIR$DBPATH"/__*
120-
rpm --root=$DOM0_UPDATES_DIR --rebuilddb
121-
12298
if [ "$CLEAN" = "1" ]; then
12399
# shellcheck disable=SC2086
124100
$UPDATE_CMD clean all "${CLEAN_OPTS[@]}"
@@ -168,41 +144,5 @@ set -e
168144

169145
"${UPDATE_COMMAND[@]}" "${OPTS[@]}" "${PKGLIST[@]}"
170146

171-
find "$DOM0_UPDATES_DIR/var/cache" -name '*.rpm' -print0 2>/dev/null |\
172-
xargs -0 -r ln -f -t "$DOM0_UPDATES_DIR/packages/"
173-
174-
if ls "$DOM0_UPDATES_DIR"/packages/*.rpm > /dev/null 2>&1; then
175-
if [ -n "$SIGNATURE_REGEX" ]; then
176-
rpmkeys_error=0
177-
for pkg in "$DOM0_UPDATES_DIR"/packages/*.rpm; do
178-
rpmkeys_exit_code=0
179-
output="$(rpmkeys --root "$DOM0_UPDATES_DIR" --checksig "$pkg")" \
180-
|| rpmkeys_exit_code="$?"
181-
if [ ! "$rpmkeys_exit_code" = "0" ]; then
182-
echo "ERROR: could not verify $pkg" >&2
183-
rpmkeys_error=1
184-
rm "$pkg"
185-
elif ! echo "$output" |grep -Pq "$SIGNATURE_REGEX"; then
186-
echo "ERROR: missing or invalid signature for $pkg" >&2
187-
rpmkeys_error=1
188-
rm "$pkg"
189-
else
190-
echo "Successfully verified $pkg" >&2
191-
fi
192-
done
193-
if [ ! "$rpmkeys_error" = "0" ]; then
194-
echo "ERROR: could not verify one or more packages" >&2
195-
exit 1
196-
fi
197-
fi
198-
199-
cmd="/usr/lib/qubes/qrexec-client-vm dom0 qubes.ReceiveUpdates /usr/lib/qubes/qfile-agent"
200-
qrexec_exit_code=0
201-
$cmd "$DOM0_UPDATES_DIR"/packages/*.rpm || { qrexec_exit_code=$? ; true; };
202-
if [ ! "$qrexec_exit_code" = "0" ]; then
203-
echo "'$cmd $DOM0_UPDATES_DIR/packages/*.rpm' failed with exit code ${qrexec_exit_code}!" >&2
204-
exit "$qrexec_exit_code"
205-
fi
206-
else
207-
echo "No packages downloaded" >&2
208-
fi
147+
"$(dirname "$0")/qubes-download-dom0-updates-finish.sh" ; RETCODE=$?
148+
exit $RETCODE

rpm_spec/core-agent.spec.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,8 @@ rm -f %{name}-%{version}
11281128
%dir %attr(0775,root,qubes) /var/lib/qubes/dom0-updates
11291129
/usr/lib/qubes/qvm-template-repo-query
11301130
/usr/lib/qubes/qubes-download-dom0-updates.sh
1131+
/usr/lib/qubes/qubes-download-dom0-updates-init.sh
1132+
/usr/lib/qubes/qubes-download-dom0-updates-finish.sh
11311133
%dir /usr/lib/qubes/dnf-plugins
11321134
/usr/lib/qubes/dnf-plugins/downloadurl.py
11331135

0 commit comments

Comments
 (0)