Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RHELC-332] checks to see if C2R is the latest version #415

Merged
merged 5 commits into from
Jul 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 86 additions & 2 deletions convert2rhel/checks.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,14 @@
import itertools
import logging
import os
import os.path
import re
import tempfile

from convert2rhel import grub, pkgmanager
import rpm

from convert2rhel import __version__ as convert2rhel_version
from convert2rhel import grub, pkgmanager, utils
from convert2rhel.pkghandler import (
call_yum_cmd,
compare_package_versions,
Expand All @@ -32,7 +37,7 @@
from convert2rhel.repo import get_hardcoded_repofiles_dir
from convert2rhel.systeminfo import system_info
from convert2rhel.toolopts import tool_opts
from convert2rhel.utils import ask_to_continue, get_file_content, run_subprocess
from convert2rhel.utils import ask_to_continue, get_file_content, run_subprocess, store_content_to_file


logger = logging.getLogger(__name__)
Expand All @@ -53,6 +58,7 @@
def perform_pre_checks():
"""Early checks after system facts should be added here."""

check_convert2rhel_latest()
check_efi()
check_tainted_kmods()
check_readonly_mounts()
Expand All @@ -67,6 +73,84 @@ def perform_pre_ponr_checks():
ensure_compatibility_of_kmods()


def check_convert2rhel_latest():
"""Make sure that we are running the latest version of convert2rhel"""
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"""Make sure that we are running the latest version of convert2rhel"""
"""Make sure that we are running the latest downstream version of convert2rhel."""

Copy link
Member

@bocekm bocekm Jul 21, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, add this log message here:

logger.task("Prepare: Checking if this is the latest version of convert2rhel")

Copy link
Member

@bocekm bocekm Jul 21, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And, skip the check if the internet connection is not available to prevent bloated log messages like:

19:19:29         out: [07/20/2022 19:19:29] DEBUG - Calling command 'repoquery --releasever=7 --setopt=reposdir=/var/lib/convert2rhel/convert2rhel_repo.DiUuQs convert2rhel'
19:19:30         out: WARNING - Couldn't check if this is the latest version of convert2rhel
19:19:30         out: repoquery failed 1, failure: repodata/repomd.xml from convert2rhel: [Errno 256] No more mirrors to try.
19:19:30         out: https://cdn.redhat.com/content/public/convert2rhel/7/x86_64/os/repodata/repomd.xml: [Errno 14] curl#7 - "Failed connect to cdn.redhat.com:443; Connection refused"
19:19:30         out: https://cdn.redhat.com/content/public/convert2rhel/7/x86_64/os/repodata/repomd.xml: [Errno 14] curl#7 - "Failed connect to cdn.redhat.com:443; Connection refused"
19:19:30         out: https://cdn.redhat.com/content/public/convert2rhel/7/x86_64/os/repodata/repomd.xml: [Errno 14] curl#7 - "Failed connect to cdn.redhat.com:443; Connection refused"
19:19:30         out: https://cdn.redhat.com/content/public/convert2rhel/7/x86_64/os/repodata/repomd.xml: [Errno 14] curl#7 - "Failed connect to cdn.redhat.com:443; Connection refused"
19:19:30         out: https://cdn.redhat.com/content/public/convert2rhel/7/x86_64/os/repodata/repomd.xml: [Errno 14] curl#7 - "Failed connect to cdn.redhat.com:443; Connection refused"
19:19:30         out: https://cdn.redhat.com/content/public/convert2rhel/7/x86_64/os/repodata/repomd.xml: [Errno 14] curl#7 - "Failed connect to cdn.redhat.com:443; Connection refused"
19:19:30         out: https://cdn.redhat.com/content/public/convert2rhel/7/x86_64/os/repodata/repomd.xml: [Errno 14] curl#7 - "Failed connect to cdn.redhat.com:443; Connection refused"
19:19:30         out: https://cdn.redhat.com/content/public/convert2rhel/7/x86_64/os/repodata/repomd.xml: [Errno 14] curl#7 - "Failed connect to cdn.redhat.com:443; Connection refused"
19:19:30         out: https://cdn.redhat.com/content/public/convert2rhel/7/x86_64/os/repodata/repomd.xml: [Errno 14] curl#7 - "Failed connect to cdn.redhat.com:443; Connection refused"
19:19:30         out: https://cdn.redhat.com/content/public/convert2rhel/7/x86_64/os/repodata/repomd.xml: [Errno 14] curl#7 - "Failed connect to cdn.redhat.com:443; Connection refused"

Thanks, @r0x0d, for spotting that.

gpg_path = os.path.join(utils.DATA_DIR, "gpg-keys", "RPM-GPG-KEY-redhat-release")
ssl_cert_path = os.path.join(utils.DATA_DIR, "redhat-uep.pem")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
ssl_cert_path = os.path.join(utils.DATA_DIR, "redhat-uep.pem")
# The SSL certificate of the https://cdn.redhat.com/ server
ssl_cert_path = os.path.join(utils.DATA_DIR, "redhat-uep.pem")

repo_content = (
Copy link
Member

@bocekm bocekm Jul 12, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this constant to the module level.

"[convert2rhel]\n"
"name=Convert2RHEL Repository\n"
"baseurl=https://cdn.redhat.com/content/public/convert2rhel/$releasever/x86_64/os/\n"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"baseurl=https://cdn.redhat.com/content/public/convert2rhel/$releasever/x86_64/os/\n"
"baseurl=https://cdn.redhat.com/content/public/convert2rhel/$releasever/$basearch/os/\n"

Let's not hardcode this one architecture. We might be adding more in the future.

"gpgcheck=1\n"
"enabled=1\n"
"sslcacert=%s\n"
"gpgkey=file://%s\n" % (ssl_cert_path, gpg_path)
)

cmd = [
"repoquery",
"--releasever=%s" % system_info.version.major,
]

repo_dir = tempfile.mkdtemp(prefix="convert2rhel_repo.", dir=utils.TMP_DIR)
utils.mkdir_p(repo_dir)
repo_path = os.path.join(repo_dir, "convert2rhel.repo")
store_content_to_file(filename=repo_path, content=repo_content)

cmd.append("--setopt=reposdir=%s" % repo_dir)
cmd.append("convert2rhel")

raw_output_convert2rhel_versions, return_code = run_subprocess(cmd, print_output=False)

if return_code != 0:
logger.warning(
"Couldn't check if this is the latest version of convert2rhel\n"
"repoquery failed %s, %s" % (return_code, raw_output_convert2rhel_versions)
Comment on lines +107 to +108
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"Couldn't check if this is the latest version of convert2rhel\n"
"repoquery failed %s, %s" % (return_code, raw_output_convert2rhel_versions)
"Couldn't check if this is the latest version of convert2rhel.\n"
"Repoquery failed with the following output:\n%s" % raw_output_convert2rhel_versions

I don't think a return code is important for the user. Return codes are not even mentioned in the repoquery man page. The output should be enough.

)
return

PKG_NEVR = r"\b(\S+)-(?:([0-9]+):)?(\S+)-(\S+)\b"
r0x0d marked this conversation as resolved.
Show resolved Hide resolved
convert2rhel_versions = re.findall(PKG_NEVR, raw_output_convert2rhel_versions, re.MULTILINE)
latest_version = ("0", "0.00", "0")

for package_version in convert2rhel_versions:
# rpm.lableCompare(pkg1, pkg2) compare two kernel version strings and return
# -1 if str2 is greater then str1, 0 if they are equal, 1 if str1 is greater the str2
ver_compare = rpm.labelCompare(package_version[1:], latest_version)
Andrew-ang9 marked this conversation as resolved.
Show resolved Hide resolved
if ver_compare > 0:
latest_version = package_version[1:]

# After the for loop latest_version will have the epoch ,version, and release ex:("0" "0.26" "1.el7") information from convert2rhel yum repo.
# the release for latest_verion will be "1.el7" and the relase for convert2rhel_version will be hard coded as "0" below,
# therefore when the versions are the same the latest_version's release field will cause it to evaluate as later
ver_compare = rpm.labelCompare(("0", convert2rhel_version, "0"), ("0", latest_version[1], "0"))
Venefilyn marked this conversation as resolved.
Show resolved Hide resolved
Copy link
Member

@bocekm bocekm Jul 12, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
ver_compare = rpm.labelCompare(("0", convert2rhel_version, "0"), ("0", latest_version[1], "0"))
ver_compare = rpm.labelCompare(("0", installed_convert2rhel_version, "0"), ("0", latest_available_version[1], "0"))

Naming of variables could be better. It's difficult for the code reader to tell the difference between convert2rhel_version, latest_version, convert2rhel_versions without looking at how are they being set.

if ver_compare < 0:
Copy link
Member

@bocekm bocekm Jul 12, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does this magic number/condition mean? It's unnecessarily difficult to understand.

This should be either wrapped in a function with a descriptive name (like is_latest_version_installed(latest_available_version)) or at the very least have a comment under it describing the meaning of what does the ver_compare < 0 and else: mean. That would be handy anyways because one can get easily lost in the nested elses below.

if "CONVERT2RHEL_UNSUPPORTED_VERSION" in os.environ:
logger.warning(
"You are currently running %s and the latest version of convert2rhel is %s.\n"
"'CONVERT2RHEL_UNSUPPORTED_VERSION' environment detected, continuing conversion"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"'CONVERT2RHEL_UNSUPPORTED_VERSION' environment detected, continuing conversion"
"'CONVERT2RHEL_UNSUPPORTED_VERSION' environment variable detected, continuing conversion."

% (convert2rhel_version, latest_version[1])
)

else:
if int(system_info.version.major) <= 6:
logger.warning(
"You are currently running %s and the latest version of convert2rhel is %s.\n"
"Only the latest version is supported for conversion." % (convert2rhel_version, latest_version[1])
Copy link
Member

@bocekm bocekm Jul 12, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"Only the latest version is supported for conversion." % (convert2rhel_version, latest_version[1])
"We encourage you to update to the latest version." % (convert2rhel_version, latest_version[1])

I'd not use the word supported here as Red Hat does not support convert2rhel on RHEL 6-like systems.

)

else:
logger.critical(
"You are currently running %s and the latest version of convert2rhel is %s.\n"
"Only the latest version is supported for conversion. If you want to ignore"
" this you can set 'CONVERT2RHEL_UNSUPPORTED_VERSION' to continue"
Copy link
Member

@bocekm bocekm Jul 12, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
" this you can set 'CONVERT2RHEL_UNSUPPORTED_VERSION' to continue"
" this check, set the environment variable 'CONVERT2RHEL_UNSUPPORTED_VERSION=1' to continue."

What is CONVERT2RHEL_UNSUPPORTED_VERSION? The user does not know where (in some config file?) or to what value to set it (export CONVERT2RHEL_UNSUPPORTED_VERSION won't work).

% (convert2rhel_version, latest_version[1])
)

else:
logger.debug("Latest available convert2rhel version is installed.\n" "Continuing conversion.")


def check_efi():
"""Inhibit the conversion when we are not able to handle UEFI."""
logger.task("Prepare: Checking the firmware interface type (BIOS/UEFI)")
Expand Down
119 changes: 119 additions & 0 deletions convert2rhel/data/version-independent/redhat-uep.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
-----BEGIN CERTIFICATE-----
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
iRZpyzOZmeineJvhrJZ4Tvs=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGejCCBGKgAwIBAgIJAJGKz8qFAAAIMA0GCSqGSIb3DQEBDAUAMIGwMQswCQYD
VQQGEwJVUzEXMBUGA1UECAwOTm9ydGggQ2Fyb2xpbmExEDAOBgNVBAcMB1JhbGVp
Z2gxFjAUBgNVBAoMDVJlZCBIYXQsIEluYy4xGDAWBgNVBAsMD1JlZCBIYXQgTmV0
d29yazEeMBwGA1UEAwwVRW50aXRsZW1lbnQgTWFzdGVyIENBMSQwIgYJKoZIhvcN
AQkBFhVjYS1zdXBwb3J0QHJlZGhhdC5jb20wHhcNMTgwOTEyMTgxMzIxWhcNMzAw
MzE1MTgxMzIxWjCBsTELMAkGA1UEBhMCVVMxFzAVBgNVBAgMDk5vcnRoIENhcm9s
aW5hMRYwFAYDVQQKDA1SZWQgSGF0LCBJbmMuMRgwFgYDVQQLDA9SZWQgSGF0IE5l
dHdvcmsxMTAvBgNVBAMMKFJlZCBIYXQgRW50aXRsZW1lbnQgT3BlcmF0aW9ucyBB
dXRob3JpdHkxJDAiBgkqhkiG9w0BCQEWFWNhLXN1cHBvcnRAcmVkaGF0LmNvbTCC
AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALsmiohDnNvIpBMZVJR5pbP6
GrE5B4doUmvTeR4XJ5C66uvFTwuGTVigNXAL+0UWf9r2AwxKEPCy65h7fLbyK4W7
/xEZPVsamQYDHpyBwlkPkJ3WhHneqQWC8bKkv8Iqu08V+86biCDDAh6uP0SiAz7a
NGaLEnOe5L9WNfsYyNwrG+2AfiLy/1LUtmmg5dc6Ln7R+uv0PZJ5J2iUbiT6lMz3
v73zAxuEjiDNurZzxzHSSEYzw0W1eO6zM4F26gcOuH2BHemPMjHi+c1OnheaafDE
HQJTNgECz5Xe7WGdZwOyn9a8GtMvm0PAhGVyp7RAWxxfoU1B794cBb66IKKjliJQ
5DKoqyxD9qJbMF8U4Kd1ZIVB0Iy2WEaaqCFMIi3xtlWVUNku5x21ewMmJvwjnWZA
tUeKQUFwIXqSjuOoZDu80H6NQb+4dnRSjWlx/m7HPk75m0zErshpB2HSKUnrs4wR
i7GsWDDcqBus7eLMwUZPvDNVcLQu/2Y4DUHNbJbn7+DwEqi5D0heC+dyY8iS45gp
I/yhVvq/GfKL+dqjaNaE4CorJJA5qJ9f383Ol/aub+aJeBahCBNuVa2daA9Bo3BA
dnL7KkILPFyCcEhQITnu70Qn9sQlwYcRoYF2LWAm9DtLrBT0Y0w7wQHh8vNhwEQ7
k5G87WpwzcC8y6ePR0vFAgMBAAGjgZMwgZAwHQYDVR0OBBYEFMRJeFZFnR4sYWDD
ZktYBTcvAyJ7MB8GA1UdIwQYMBaAFIhLpkXERuyP1s+m9hrPJjyQzH8XMAwGA1Ud
EwQFMAMBAf8wCwYDVR0PBAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIBBjAgBgNVHREE
GTAXgRVjYS1zdXBwb3J0QHJlZGhhdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAGKk
q5Ab0AC7SOCYq9up5z0twbe+gI72cm854+VhcxafnLP2/4nH6nQauKLKEFLI8+fV
RAwYxm1f5nuEiaTvjPE0umYdgMlpEJQeGdW/+/DotDaOon1G6bSMEKFvaKcBHKqa
kBxQ29trwMG2WN8qZ7/H3XzBvLZ+JrYr01vDSV0P4tcBFOytbMZeJr4xmfxiqWxp
VUM9eGf6z+ngXyth8lohxGd9MMXwsaPdvM+wptp3AQpq5wFPWyfJqCd6uBxu09k1
ns3Y/sya2GHqDK4bUW6gCHO13gkYviTCIBLAlX7PDeK5nYVcq8HvTLU9+H9BFGix
YGDdHphz7i5qO/gLLLcfKhENP6jtbe8i6nwqeDzj+DMy38iMWNYFVWn1OrBaQMtf
wlVfyRJij9SfyiUAVFld1RoPAN/haf1VmF/0dGrOigibYijqnHvDJffMUND/sbk8
df6O6VYjvLLlwry4W4dHiLLA7NAHGtkUv2g1+oH1lQIfRG+PvZhWz4pGT1AlzfwD
aXUfX2X+Bo9tYr9BGy5Li1pLGLvfw+an7cBAbBaw8+HhAHt+Vm4F03KX/bHlge0a
fMYK6FoA/xQSaZ6IPm4HfPSMvhboguVG+/AZQN4/UxjDleoEz8b0CWYafcJRRZch
BdxBjTy7JLf3j0HCbenZQF83wwtrSmiTOTK1tLsm
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
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
Kg6Ay0rrsi4nw1JHue2GvdjdfVOaWSWC
-----END CERTIFICATE-----
Loading