From d9f3bc54378b1ba1e49aee01eacabfbb3774262e Mon Sep 17 00:00:00 2001 From: Lluis Campos Date: Mon, 31 Jan 2022 14:30:53 +0100 Subject: [PATCH 1/5] MEN-5410: Modify Debian packages installation for new repositories Changelog: Download and install Debian packages taking into account the target OS. Now downloads.mender.io serves four distributions: the two latests releases for Debian and Ubuntu. Probe /etc/os-release to figure out the correct package to install, and fallback to Debian Buster packages which was the previous default. Signed-off-by: Lluis Campos (cherry picked from commit b19680413f59ca403006c077f4bea10249b22c40) --- configs/mender_convert_config | 6 +++++- mender-convert-modify | 24 +++++++++++++++--------- modules/probe.sh | 23 +++++++++++++++++++++++ 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/configs/mender_convert_config b/configs/mender_convert_config index 4357caf..31cb651 100644 --- a/configs/mender_convert_config +++ b/configs/mender_convert_config @@ -146,10 +146,14 @@ MENDER_ADDON_CONFIGURE_VERSION="latest" # what you are doing. MENDER_STORAGE_URL="https://downloads.mender.io" -# Mender APT repo, containing binary files, do not modify this unless you know +# Mender APT repo url, containing binary files, do not modify this unless you know # what you are doing. MENDER_APT_REPO_URL="${MENDER_STORAGE_URL}/repos/debian" +# Mender APT repo available distributions, do not modify this unless you know +# what you are doing. +MENDER_APT_REPO_DISTS="debian/buster debian/bullseye ubuntu/bionic ubuntu/focal" + # Mender GitHub organization URL prefix MENDER_GITHUB_ORG="https://github.com/mendersoftware" diff --git a/mender-convert-modify b/mender-convert-modify index 2d876ce..085105a 100755 --- a/mender-convert-modify +++ b/mender-convert-modify @@ -102,17 +102,23 @@ mkdir -p work/deb-packages log_info "Installing Mender client and related files" deb_arch=$(probe_debian_arch_name) +deb_distro=$(probe_debian_distro_name) +deb_codename=$(probe_debian_distro_codename) +if ! [[ "$MENDER_APT_REPO_DISTS" == *"${deb_distro}/${deb_codename}"* ]]; then + deb_distro="debian" + deb_codename="buster" +fi if [ "${MENDER_CLIENT_INSTALL}" = "y" ]; then log_info "Installing Mender client version ${MENDER_CLIENT_VERSION}" if [ "${MENDER_CLIENT_VERSION}" = "latest" ]; then - deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "stable" "mender-client") + deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/stable" "mender-client") elif [ "${MENDER_CLIENT_VERSION}" = "master" ]; then - deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "experimental" "mender-client") + deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/experimental" "mender-client") else - DEBIAN_REVISION="-1" + DEBIAN_REVISION="-1+${deb_distro}+${deb_codename}" deb_name=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "mender-client" "${MENDER_CLIENT_VERSION}${DEBIAN_REVISION}") fi @@ -133,11 +139,11 @@ if [ "${MENDER_ADDON_CONNECT_INSTALL}" = "y" ]; then log_info "Installing Mender Connect addon" if [ "${MENDER_ADDON_CONNECT_VERSION}" = "latest" ]; then - deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "stable" "mender-connect") + deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/stable" "mender-connect") elif [ "${MENDER_ADDON_CONNECT_VERSION}" = "master" ]; then - deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "experimental" "mender-connect") + deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/experimental" "mender-connect") else - DEBIAN_REVISION="-1" + DEBIAN_REVISION="-1+${deb_distro}+${deb_codename}" deb_name=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "mender-connect" "${MENDER_ADDON_CONNECT_VERSION}${DEBIAN_REVISION}") fi @@ -152,11 +158,11 @@ if [ "${MENDER_ADDON_CONFIGURE_INSTALL}" = "y" ]; then log_info "Installing Mender Configure addon" if [ "${MENDER_ADDON_CONFIGURE_VERSION}" = "latest" ]; then - deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "stable" "mender-configure") + deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/stable" "mender-configure") elif [ "${MENDER_ADDON_CONFIGURE_VERSION}" = "master" ]; then - deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "experimental" "mender-configure") + deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/experimental" "mender-configure") else - DEBIAN_REVISION="-1" + DEBIAN_REVISION="-1+${deb_distro}+${deb_codename}" deb_name=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "mender-configure" "${MENDER_ADDON_CONFIGURE_VERSION}${DEBIAN_REVISION}") fi diff --git a/modules/probe.sh b/modules/probe.sh index 4a71aab..e90902a 100644 --- a/modules/probe.sh +++ b/modules/probe.sh @@ -97,6 +97,29 @@ probe_debian_arch_name() { echo "${deb_arch}" } +# Prints Debian distro name based on ID from /etc/os-release +# +# Special handling for raspbian, where ID_LIKE is used instead +# +# No input parameters and these work on the assumption that boot and root parts +# are mounted at work/boot and work/rootfs +probe_debian_distro_name() { + distro_name="$(. work/rootfs/etc/os-release && echo "$ID")" + if [[ "$distro_name" == "raspbian" ]]; then + distro_name="$(. work/rootfs/etc/os-release && echo "$ID_LIKE")" + fi + echo "${distro_name}" +} + +# Prints Debian distro codename based on VERSION_CODENAME from /etc/os-release +# +# No input parameters and these work on the assumption that boot and root parts +# are mounted at work/boot and work/rootfs +probe_debian_distro_codename() { + distro_codename="$(. work/rootfs/etc/os-release && echo "$VERSION_CODENAME")" + echo "${distro_codename}" +} + # Prints GRUB EFI target name depending on target architecture # # This is what the file name should be when put on target boot part. From 01db0d73829e25923bdc9a0a932f163a81d8178a Mon Sep 17 00:00:00 2001 From: Lluis Campos Date: Mon, 31 Jan 2022 14:40:01 +0100 Subject: [PATCH 2/5] mender_convert_config: Refactor deb packages install into a function Do not repeat yourself... Changelog: None Signed-off-by: Lluis Campos (cherry picked from commit 423686a44b761d105026f9a1243b2b51b12e52a7) --- mender-convert-modify | 52 ++++--------------------------------------- modules/deb.sh | 39 +++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 49 deletions(-) diff --git a/mender-convert-modify b/mender-convert-modify index 085105a..f5f2fb4 100755 --- a/mender-convert-modify +++ b/mender-convert-modify @@ -97,36 +97,14 @@ mkdir -p work/rootfs sudo mount ${boot_part} work/boot sudo mount ${root_part} work/rootfs -mkdir -p work/deb-packages - log_info "Installing Mender client and related files" -deb_arch=$(probe_debian_arch_name) -deb_distro=$(probe_debian_distro_name) -deb_codename=$(probe_debian_distro_codename) -if ! [[ "$MENDER_APT_REPO_DISTS" == *"${deb_distro}/${deb_codename}"* ]]; then - deb_distro="debian" - deb_codename="buster" -fi - if [ "${MENDER_CLIENT_INSTALL}" = "y" ]; then - log_info "Installing Mender client version ${MENDER_CLIENT_VERSION}" - - if [ "${MENDER_CLIENT_VERSION}" = "latest" ]; then - deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/stable" "mender-client") - elif [ "${MENDER_CLIENT_VERSION}" = "master" ]; then - deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/experimental" "mender-client") - else - DEBIAN_REVISION="-1+${deb_distro}+${deb_codename}" - deb_name=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "mender-client" "${MENDER_CLIENT_VERSION}${DEBIAN_REVISION}") - fi - - deb_extract_package "work/deb-packages/${deb_name}" "work/rootfs/" + deb_get_and_install_pacakge mender-client "${MENDER_CLIENT_VERSION}" # Save installed client version for tests in Yocto variable format - testscfg_add "PREFERRED_VERSION_mender-client" "$(echo ${deb_name} | sed -r 's/.*_([0-9]+\.[0-9]+\.[0-9]+).*/\1/')" - + testscfg_add "PREFERRED_VERSION_mender-client" "$(echo ${DEB_NAME} | sed -r 's/.*_([0-9]+\.[0-9]+\.[0-9]+).*/\1/')" fi if [ "${MENDER_ENABLE_SYSTEMD}" == "y" ]; then @@ -135,38 +113,16 @@ if [ "${MENDER_ENABLE_SYSTEMD}" == "y" ]; then fi if [ "${MENDER_ADDON_CONNECT_INSTALL}" = "y" ]; then - log_info "Installing Mender Connect addon" - - if [ "${MENDER_ADDON_CONNECT_VERSION}" = "latest" ]; then - deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/stable" "mender-connect") - elif [ "${MENDER_ADDON_CONNECT_VERSION}" = "master" ]; then - deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/experimental" "mender-connect") - else - DEBIAN_REVISION="-1+${deb_distro}+${deb_codename}" - deb_name=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "mender-connect" "${MENDER_ADDON_CONNECT_VERSION}${DEBIAN_REVISION}") - fi - - deb_extract_package "work/deb-packages/${deb_name}" "work/rootfs/" + deb_get_and_install_pacakge mender-connect "${MENDER_ADDON_CONNECT_VERSION}" run_and_log_cmd "sudo ln -sf /lib/systemd/system/mender-connect.service \ work/rootfs/etc/systemd/system/multi-user.target.wants/mender-connect.service" fi if [ "${MENDER_ADDON_CONFIGURE_INSTALL}" = "y" ]; then - log_info "Installing Mender Configure addon" - - if [ "${MENDER_ADDON_CONFIGURE_VERSION}" = "latest" ]; then - deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/stable" "mender-configure") - elif [ "${MENDER_ADDON_CONFIGURE_VERSION}" = "master" ]; then - deb_name=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/experimental" "mender-configure") - else - DEBIAN_REVISION="-1+${deb_distro}+${deb_codename}" - deb_name=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "mender-configure" "${MENDER_ADDON_CONFIGURE_VERSION}${DEBIAN_REVISION}") - fi - - deb_extract_package "work/deb-packages/${deb_name}" "work/rootfs/" + deb_get_and_install_pacakge mender-configure "${MENDER_ADDON_CONFIGURE_VERSION}" fi # Do this unconditionally even if not installing add-ons. The reason is that if diff --git a/modules/deb.sh b/modules/deb.sh index 5729962..c250753 100644 --- a/modules/deb.sh +++ b/modules/deb.sh @@ -1,5 +1,5 @@ # -# Copyright 2020 Northern.tech AS +# Copyright 2022 Northern.tech AS # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ # limitations under the License. source modules/log.sh +source modules/probe.sh . # Download of latest deb package for the given distribution of an APT repository # @@ -111,3 +112,39 @@ function deb_extract_package() { log_info "Successfully installed $(basename ${deb_package}) into ${dest_dir}" } + +# Download and install the binary files of a deb package into work/deb-packages +# This is the main entry point of deb.sh +# Defines variable DEB_NAME with the actual filename installed +# +# $1 - Package name +# $2 - Package version +# +function deb_get_and_install_pacakge() { + if [[ $# -ne 2 ]]; then + log_fatal "deb_get_and_install_pacakge() requires 2 arguments" + fi + local package="$1" + local version="$2" + + mkdir -p work/deb-packages + + local deb_arch=$(probe_debian_arch_name) + local deb_distro=$(probe_debian_distro_name) + local deb_codename=$(probe_debian_distro_codename) + if ! [[ "$MENDER_APT_REPO_DISTS" == *"${deb_distro}/${deb_codename}"* ]]; then + deb_distro="debian" + deb_codename="buster" + fi + + DEB_NAME="" + if [ "${version}" = "latest" ]; then + DEB_NAME=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/stable" "${package}") + elif [ "${version}" = "master" ]; then + DEB_NAME=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/experimental" "${package}") + else + local debian_version="-1+${deb_distro}+${deb_codename}" + DEB_NAME=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${package}" "${version}${debian_version}") + fi + deb_extract_package "work/deb-packages/${DEB_NAME}" "work/rootfs/" +} From 28908fb30fda08a5b9ab27d7db8c944e4fd089a9 Mon Sep 17 00:00:00 2001 From: Lluis Campos Date: Mon, 31 Jan 2022 20:40:36 +0100 Subject: [PATCH 3/5] MEN-5410: Fallback to old version strings when package is missing Otherwise won't be possible to install old versions published with the old schema. Amends commit b196804 Changelog: None Signed-off-by: Lluis Campos (cherry picked from commit 766f2a9c2bcf0f98bf55d69134b50bd937cf8190) --- modules/deb.sh | 19 ++++++++++++++++--- modules/run.sh | 20 ++++++++++++++++++-- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/modules/deb.sh b/modules/deb.sh index c250753..28572f6 100644 --- a/modules/deb.sh +++ b/modules/deb.sh @@ -82,11 +82,17 @@ function deb_from_repo_pool_get() { local -r deb_package_path="pool/${component}/${initial}/${package}/${package}_${version}_${architecture}.deb" local -r filename=$(basename $deb_package_path) - run_and_log_cmd "wget -Nq ${repo_url}/${deb_package_path} -P ${download_dir}" + run_and_log_cmd_noexit "wget -Nq ${repo_url}/${deb_package_path} -P ${download_dir}" + local exit_code=$? rm -f /tmp/Packages - log_info "Successfully downloaded ${filename}" - echo ${filename} + if [[ ${exit_code} -ne 0 ]]; then + log_warn "Could not download ${filename}" + echo "" + else + log_info "Successfully downloaded ${filename}" + echo ${filename} + fi } # Extract the binary files of a deb package into a directory @@ -145,6 +151,13 @@ function deb_get_and_install_pacakge() { else local debian_version="-1+${deb_distro}+${deb_codename}" DEB_NAME=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${package}" "${version}${debian_version}") + if [[ -z "${DEB_NAME}" ]]; then + local debian_version_fallback="-1" + DEB_NAME=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${package}" "${version}${debian_version_fallback}") + if [[ -z "${DEB_NAME}" ]]; then + log_fatal "Specified version for ${package} cannot be found, tried ${version}${debian_version} and ${version}${debian_version_fallback}" + fi + fi fi deb_extract_package "work/deb-packages/${DEB_NAME}" "work/rootfs/" } diff --git a/modules/run.sh b/modules/run.sh index a52efd3..93f9159 100644 --- a/modules/run.sh +++ b/modules/run.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Copyright 2019 Northern.tech AS +# Copyright 2022 Northern.tech AS # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Run a command, capture output and log it +# Run a command, capture and log output, and exit on non-zero return code # # $1 - command to run function run_and_log_cmd() { @@ -31,3 +31,19 @@ function run_and_log_cmd() { exit ${exit_code} fi } + +# Run a command, capture and log output, and return the command's return code +# +# $1 - command to run +function run_and_log_cmd_noexit() { + local -r cmd="${1}" + local -r position="(${BASH_SOURCE[1]}:${BASH_LINENO[0]}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }" + local exit_code=0 + output="$({ eval ${cmd}; } 2>&1)" || exit_code=$? + local log_msg="Running: ${position} \n\r\n\r\t${cmd}" + if [[ "${output}" != "" ]]; then + log_msg="${log_msg}\n\t${output}\n" + fi + log_debug "${log_msg}" + return ${exit_code} +} From 4d03cb0c0f26ed4bcac2d739cf4a98e681f84f11 Mon Sep 17 00:00:00 2001 From: Lluis Campos Date: Mon, 31 Jan 2022 20:59:53 +0100 Subject: [PATCH 4/5] MEN-5410: URL encode '+' also on pool downloads Now the packages from tags will also contain this character. Same fix as in ed5da386. Changelog: None Signed-off-by: Lluis Campos (cherry picked from commit 6a72ff4cae337278dadceb7d18e7ef1c0d43ff18) --- modules/deb.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/deb.sh b/modules/deb.sh index 28572f6..229eee3 100644 --- a/modules/deb.sh +++ b/modules/deb.sh @@ -82,7 +82,8 @@ function deb_from_repo_pool_get() { local -r deb_package_path="pool/${component}/${initial}/${package}/${package}_${version}_${architecture}.deb" local -r filename=$(basename $deb_package_path) - run_and_log_cmd_noexit "wget -Nq ${repo_url}/${deb_package_path} -P ${download_dir}" + local -r deb_package_url=$(echo ${repo_url}/${deb_package_path} | sed 's/+/%2B/g') + run_and_log_cmd_noexit "wget -Nq ${deb_package_url} -P ${download_dir}" local exit_code=$? rm -f /tmp/Packages From 7005e533a272838fdb29d9108cac0fa37057f842 Mon Sep 17 00:00:00 2001 From: Lluis Campos Date: Tue, 1 Feb 2022 10:09:47 +0100 Subject: [PATCH 5/5] Fix installation of user specified versions for mender-configure add-on It has been broken since the introduction of mender-configure. This add-on is architecture independent, so when downloading the .deb directly from the pool we need to look for "all" suffix instead of the target architecture. This worked fine for "latest" and "master" versions because the filename for these were resolved via repository's Packages. Changelog: title Signed-off-by: Lluis Campos (cherry picked from commit d460de3c80e120792bb1c0987f591ef9e89b49b1) --- mender-convert-modify | 2 +- modules/deb.sh | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/mender-convert-modify b/mender-convert-modify index f5f2fb4..f7d39f1 100755 --- a/mender-convert-modify +++ b/mender-convert-modify @@ -122,7 +122,7 @@ fi if [ "${MENDER_ADDON_CONFIGURE_INSTALL}" = "y" ]; then log_info "Installing Mender Configure addon" - deb_get_and_install_pacakge mender-configure "${MENDER_ADDON_CONFIGURE_VERSION}" + deb_get_and_install_pacakge mender-configure "${MENDER_ADDON_CONFIGURE_VERSION}" "true" fi # Do this unconditionally even if not installing add-ons. The reason is that if diff --git a/modules/deb.sh b/modules/deb.sh index 229eee3..346de7e 100644 --- a/modules/deb.sh +++ b/modules/deb.sh @@ -126,13 +126,15 @@ function deb_extract_package() { # # $1 - Package name # $2 - Package version +# $3 - Arch independent (optional, default "false") # function deb_get_and_install_pacakge() { - if [[ $# -ne 2 ]]; then - log_fatal "deb_get_and_install_pacakge() requires 2 arguments" + if ! [[ $# -eq 2 || $# -eq 3 ]]; then + log_fatal "deb_get_and_install_pacakge() requires 2 or 3 arguments" fi local package="$1" local version="$2" + local arch_indep="${3:-false}" mkdir -p work/deb-packages @@ -150,11 +152,19 @@ function deb_get_and_install_pacakge() { elif [ "${version}" = "master" ]; then DEB_NAME=$(deb_from_repo_dist_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${deb_distro}/${deb_codename}/experimental" "${package}") else + # On direct downloads, the architecture suffix will be "all" for arch independent packages + local pool_arch="" + if [[ "$arch_indep" == "true" ]]; then + pool_arch="all" + else + pool_arch="$deb_arch" + fi + local debian_version="-1+${deb_distro}+${deb_codename}" - DEB_NAME=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${package}" "${version}${debian_version}") + DEB_NAME=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${pool_arch} "${package}" "${version}${debian_version}") if [[ -z "${DEB_NAME}" ]]; then local debian_version_fallback="-1" - DEB_NAME=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${deb_arch} "${package}" "${version}${debian_version_fallback}") + DEB_NAME=$(deb_from_repo_pool_get "work/deb-packages" ${MENDER_APT_REPO_URL} ${pool_arch} "${package}" "${version}${debian_version_fallback}") if [[ -z "${DEB_NAME}" ]]; then log_fatal "Specified version for ${package} cannot be found, tried ${version}${debian_version} and ${version}${debian_version_fallback}" fi