@@ -17,7 +17,15 @@ CLEAN_OPTS=("${OPTS[@]}")
1717#  DNF verifies signatures implicitly, but yumdownloader does not.
1818SIGNATURE_REGEX=" " 
1919PKGLIST=()
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=
2129
2230export  LC_ALL=C
2331
@@ -37,32 +45,40 @@ while [ -n "$1" ]; do
3745            ;;
3846        --check-only)
3947            CHECK_ONLY=1
48+             UPDATE_ACTION=check-update
4049            ;;
4150        --action=* )
42-             YUM_ACTION =${1# --action=} 
51+             UPDATE_ACTION =${1# --action=} 
4352            ;;
4453        -* )
4554            #  we already add these options for DNF, and Yum doesn’t support them
4655            case  $1  in  (--best|--allowerasing) : ;; (* ) OPTS+=(" $1 "  );; esac 
4756            ;;
4857        * )
4958            PKGLIST+=( " ${1} "   )
50-             if  [ -z  " $YUM_ACTION  "   ];  then 
51-                 YUM_ACTION =install
59+             if  [ -z  " $UPDATE_ACTION  "   ];  then 
60+                 UPDATE_ACTION =install
5261            fi 
5362            ;;
5463    esac 
5564    shift 
5665done 
5766
58- if  [ -z  " $YUM_ACTION  "   ];  then 
59-     YUM_ACTION =upgrade
67+ if  [ -z  " $UPDATE_ACTION  "   ];  then 
68+     UPDATE_ACTION =upgrade
6069fi 
6170
6271if  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 
6479else 
65-     YUM=(yum -y)
80+     UPDATE_CMD=yum
81+     UPDATE_ARGUMENTS=(-y)
6682fi 
6783
6884if  !  [ -d  " $DOM0_UPDATES_DIR "   ];  then 
@@ -100,15 +116,15 @@ rpm --root=$DOM0_UPDATES_DIR --rebuilddb
100116
101117if  [ " $CLEAN "   =  " 1"   ];  then 
102118    #  shellcheck disable=SC2086
103-     " ${YUM [@]} "   " ${CLEAN_OPTS[@]} "  clean all 
119+     $UPDATE_CMD  clean all  " ${UPDATE_ARGUMENTS [@]} "   " ${CLEAN_OPTS[@]} " 
104120    rm -f " $DOM0_UPDATES_DIR "  /packages/* 
105121    rm -rf " $DOM0_UPDATES_DIR "  /var/cache/* 
106122fi 
107123
108124#  just check for updates, but don't download any package
109125if  [ ${# PKGLIST[@]}  -eq  0 ] &&  [ " $CHECK_ONLY "   =  " 1"   ];  then 
110126    #  shellcheck disable=SC2086
111-     UPDATES_FULL=$( " ${YUM [@]} "   " ${OPTS[@]} "  check-update ) 
127+     UPDATES_FULL=$( $UPDATE_CMD   $UPDATE_ACTION   " ${UPDATE_ARGUMENTS [@]} "   " ${OPTS[@]} " ) 
112128    check_update_retcode=$? 
113129    if  [ " $check_update_retcode "   -eq  1 ];  then 
114130        #  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
128144    fi 
129145fi 
130146
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[@]} "  )
142149
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)
177155
178156mkdir -p " $DOM0_UPDATES_DIR /packages" 
179157
180158set  -e
181159
182- " ${YUM_COMMAND [@]} "   " ${OPTS[@]} "   " ${PKGLIST[@]} " 
160+ " ${UPDATE_COMMAND [@]} "   " ${OPTS[@]} "   " ${PKGLIST[@]} " 
183161
184162find " $DOM0_UPDATES_DIR /var/cache"   -name ' *.rpm'   -print0 2> /dev/null | \
185163    xargs -0 -r ln -f -t " $DOM0_UPDATES_DIR /packages/" 
0 commit comments