Skip to content

Commit 31f3764

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

File tree

4 files changed

+76
-69
lines changed

4 files changed

+76
-69
lines changed
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: 9 additions & 69 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)
@@ -72,9 +70,9 @@ if type dnf >/dev/null 2>&1; then
7270
UPDATE_CMD=dnf
7371
UPDATE_ARGUMENTS+=(--noplugins -y)
7472
CLEAN_OPTS+=(--noplugins -y)
75-
"$UPDATE_CMD" "${OPTS[@]}" "$UPDATE_ACTION" --help | grep -q best && UPDATE_ARGUMENTS+=(--best)
76-
"$UPDATE_CMD" "${OPTS[@]}" "$UPDATE_ACTION" --help | grep -q allowerasing && UPDATE_ARGUMENTS+=(--allowerasing)
77-
if "$UPDATE_CMD" --version | grep -q dnf5 && [ "$CHECK_ONLY" = "1" ]; then
73+
"$UPDATE_CMD" "${OPTS[@]}" "$UPDATE_ACTION" --help 2>/dev/null | grep -q best && UPDATE_ARGUMENTS+=(--best)
74+
"$UPDATE_CMD" "${OPTS[@]}" "$UPDATE_ACTION" --help 2>/dev/null | grep -q allowerasing && UPDATE_ARGUMENTS+=(--allowerasing)
75+
if "$UPDATE_CMD" --version 2>/dev/null | grep -q dnf5 && [ "$CHECK_ONLY" = "1" ]; then
7876
UPDATE_ACTION=check-upgrade
7977
fi
8078
else
@@ -87,34 +85,12 @@ if ! [ -d "$DOM0_UPDATES_DIR" ]; then
8785
exit 1
8886
fi
8987

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

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

165141
"${UPDATE_COMMAND[@]}" "${OPTS[@]}" "${PKGLIST[@]}"
166142

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

rpm_spec/core-agent.spec.in

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

0 commit comments

Comments
 (0)