@@ -17,7 +17,15 @@ CLEAN_OPTS=("${OPTS[@]}")
17
17
# DNF verifies signatures implicitly, but yumdownloader does not.
18
18
SIGNATURE_REGEX=" "
19
19
PKGLIST=()
20
- YUM_ACTION=
20
+
21
+ # Executable (yum or dnf)
22
+ UPDATE_CMD=
23
+ # Action (install, search, upgrade, ...)
24
+ UPDATE_ACTION=
25
+ # Arguments (--downloadonly, -y, --refresh, ...)
26
+ UPDATE_ARGUMENTS=()
27
+ # Finall fakeroot command to be executed
28
+ UPDATE_COMMAND=
21
29
22
30
export LC_ALL=C
23
31
@@ -37,32 +45,40 @@ while [ -n "$1" ]; do
37
45
;;
38
46
--check-only)
39
47
CHECK_ONLY=1
48
+ UPDATE_ACTION=check-update
40
49
;;
41
50
--action=* )
42
- YUM_ACTION =${1# --action=}
51
+ UPDATE_ACTION =${1# --action=}
43
52
;;
44
53
-* )
45
54
# we already add these options for DNF, and Yum doesn’t support them
46
55
case $1 in (--best|--allowerasing) : ;; (* ) OPTS+=(" $1 " );; esac
47
56
;;
48
57
* )
49
58
PKGLIST+=( " ${1} " )
50
- if [ -z " $YUM_ACTION " ]; then
51
- YUM_ACTION =install
59
+ if [ -z " $UPDATE_ACTION " ]; then
60
+ UPDATE_ACTION =install
52
61
fi
53
62
;;
54
63
esac
55
64
shift
56
65
done
57
66
58
- if [ -z " $YUM_ACTION " ]; then
59
- YUM_ACTION =upgrade
67
+ if [ -z " $UPDATE_ACTION " ]; then
68
+ UPDATE_ACTION =upgrade
60
69
fi
61
70
62
71
if type dnf > /dev/null 2>&1 ; then
63
- YUM=(dnf --best --allowerasing --noplugins -y)
72
+ UPDATE_CMD=dnf
73
+ UPDATE_ARGUMENTS+=(--noplugins -y)
74
+ " $UPDATE_CMD " " $UPDATE_ACTION " --help | grep -q best && UPDATE_ARGUMENTS+=(--best)
75
+ " $UPDATE_CMD " " $UPDATE_ACTION " --help | grep -q allowerasing && UPDATE_ARGUMENTS+=(--allowerasing)
76
+ if " $UPDATE_CMD " --version | grep -q dnf5 && [ " $CHECK_ONLY " = " 1" ]; then
77
+ UPDATE_ACTION=check-upgrade
78
+ fi
64
79
else
65
- YUM=(yum -y)
80
+ UPDATE_CMD=yum
81
+ UPDATE_ARGUMENTS=(-y)
66
82
fi
67
83
68
84
if ! [ -d " $DOM0_UPDATES_DIR " ]; then
@@ -100,15 +116,15 @@ rpm --root=$DOM0_UPDATES_DIR --rebuilddb
100
116
101
117
if [ " $CLEAN " = " 1" ]; then
102
118
# shellcheck disable=SC2086
103
- " ${YUM [@]} " " ${CLEAN_OPTS[@]} " clean all
119
+ $UPDATE_CMD clean all " ${UPDATE_ARGUMENTS [@]} " " ${CLEAN_OPTS[@]} "
104
120
rm -f " $DOM0_UPDATES_DIR " /packages/*
105
121
rm -rf " $DOM0_UPDATES_DIR " /var/cache/*
106
122
fi
107
123
108
124
# just check for updates, but don't download any package
109
125
if [ ${# PKGLIST[@]} -eq 0 ] && [ " $CHECK_ONLY " = " 1" ]; then
110
126
# shellcheck disable=SC2086
111
- UPDATES_FULL=$( " ${YUM [@]} " " ${OPTS[@]} " check-update )
127
+ UPDATES_FULL=$( $UPDATE_CMD $UPDATE_ACTION " ${UPDATE_ARGUMENTS [@]} " " ${OPTS[@]} " )
112
128
check_update_retcode=$?
113
129
if [ " $check_update_retcode " -eq 1 ]; then
114
130
# Exit here if yum have reported an error. Exit code 100 isn't an
@@ -128,58 +144,20 @@ if [ ${#PKGLIST[@]} -eq 0 ] && [ "$CHECK_ONLY" = "1" ]; then
128
144
fi
129
145
fi
130
146
131
- # now, we will download something
132
- YUM_COMMAND=(fakeroot " ${YUM[@]} " " $YUM_ACTION " --downloadonly)
133
- # check for --downloadonly option - if not supported (Debian), fallback to
134
- # yumdownloader
135
- if ! " ${YUM[@]} " --help | grep -q downloadonly; then
136
- if dpkg --compare-versions \
137
- " $( dpkg-query --show --showformat=' ${version}' rpm) " gt 4.14; then
138
- SIGNATURE_REGEX=" ^[A-Za-z0-9._+-/]{1,128}\.rpm: digests signatures OK$"
139
- else
140
- SIGNATURE_REGEX=" ^[A-Za-z0-9._+-/]{1,128}\.rpm: [a-z0-9() ]* (pgp|gpg) [a-z0-9 ]* OK$"
141
- fi
147
+ # now, we will download something (or perform search, list or other tasks)
148
+ UPDATE_COMMAND=(fakeroot " $UPDATE_CMD " " $UPDATE_ACTION " " ${UPDATE_ARGUMENTS[@]} " )
142
149
143
- # setup environment for yumdownloader to be happy
144
- if [ ! -e " $DOM0_UPDATES_DIR /etc/yum.conf" ]; then
145
- ln -nsf dnf/dnf.conf " $DOM0_UPDATES_DIR /etc/yum.conf"
146
- fi
147
- if [ " $YUM_ACTION " = " install" ]; then
148
- YUM_COMMAND=(yumdownloader " --destdir=$DOM0_UPDATES_DIR /packages" --resolve)
149
- elif [ " $YUM_ACTION " = " upgrade" ]; then
150
- # shellcheck disable=SC2086
151
- UPDATES_FULL=$( " ${YUM[@]} " " ${OPTS[@]} " check-update " ${PKGLIST[@]} " )
152
- check_update_retcode=$?
153
- UPDATES_FULL=$( echo " $UPDATES_FULL " | grep -v " ^Loaded plugins:\|^Last metadata\|^$" )
154
- mapfile -t PKGLIST < <( echo " $UPDATES_FULL " | grep -v " ^Obsoleting\|Could not" | cut -f 1 -d ' ' )
155
- if [ " $check_update_retcode " -eq 0 ]; then
156
- # exit code 0 means no updates available - regardless of stdout messages
157
- echo " No new updates available" >&2
158
- exit 0
159
- fi
160
- YUM_COMMAND=(yumdownloader " --destdir=$DOM0_UPDATES_DIR /packages" --resolve)
161
- elif [ " $YUM_ACTION " == " list" ] || [ " $YUM_ACTION " == " search" ]; then
162
- # those actions do not download any package, so lack of --downloadonly is irrelevant
163
- YUM_COMMAND=(" ${YUM[@]} " -- " $YUM_ACTION " )
164
- elif [ " $YUM_ACTION " == " reinstall" ]; then
165
- # this is just approximation of 'reinstall' action...
166
- mapfile -t PKGLIST < <( rpm " --root=$DOM0_UPDATES_DIR " -q " ${PKGLIST[@]} " )
167
- YUM_COMMAND=(yumdownloader " --destdir=$DOM0_UPDATES_DIR /packages" --resolve)
168
- else
169
- echo " ERROR: yum version installed in VM $( hostname) does not suppport --downloadonly option" >&2
170
- echo " ERROR: only 'install' and 'upgrade' actions supported ($YUM_ACTION not)" >&2
171
- if [ " $GUI " = 1 ]; then
172
- zenity --error --text=" yum version too old for '$YUM_ACTION ' action, see console for details"
173
- fi
174
- exit 1
175
- fi
176
- fi
150
+ # DNF4 supported --downloadonly option for all actions. DNF5 fails for list,
151
+ # search, info and similar actions if --downloadonly is specified. The below
152
+ # condition is a smart way to check if --downloadonly option is applicable to
153
+ # the action.
154
+ " $UPDATE_CMD " " $UPDATE_ACTION " --help | grep -q downloadonly && UPDATE_COMMAND+=(--downloadonly)
177
155
178
156
mkdir -p " $DOM0_UPDATES_DIR /packages"
179
157
180
158
set -e
181
159
182
- " ${YUM_COMMAND [@]} " " ${OPTS[@]} " " ${PKGLIST[@]} "
160
+ " ${UPDATE_COMMAND [@]} " " ${OPTS[@]} " " ${PKGLIST[@]} "
183
161
184
162
find " $DOM0_UPDATES_DIR /var/cache" -name ' *.rpm' -print0 2> /dev/null | \
185
163
xargs -0 -r ln -f -t " $DOM0_UPDATES_DIR /packages/"
0 commit comments