diff --git a/SOURCES/leapp-repository-0.16.0-elevate.patch b/SOURCES/leapp-repository-0.16.0-elevate.patch index 07dc469..f3bd54a 100644 --- a/SOURCES/leapp-repository-0.16.0-elevate.patch +++ b/SOURCES/leapp-repository-0.16.0-elevate.patch @@ -1,5 +1,5 @@ diff --git a/README.md b/README.md -index 4de458b..9975f06 100644 +index 4de458b..c82651d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,61 @@ @@ -83,7 +83,7 @@ index 4de458b..9975f06 100644 - When filing an issue, include: - Steps to reproduce the issue - *All files in /var/log/leapp* -@@ -25,7 +88,613 @@ +@@ -25,7 +88,638 @@ Then you may attach only the `leapp-logs.tgz` file. ### Where can I seek help? @@ -191,14 +191,39 @@ index 4de458b..9975f06 100644 +Required fields: + +- action: what action to perform on the listed package -+- 0 - present -+- 1 - removed -+- 2 - deprecated -+- 3 - replaced -+- 4 - split -+- 5 - merged -+- 6 - moved to new repository -+- 7 - renamed ++ - 0 - present ++ - keep the packages in `in_packageset` to make sure the repo they're in on the target system gets enabled ++ - additional behaviour present, see below ++ - 1 - removed ++ - remove all packages in `in_packageset` ++ - 2 - deprecated ++ - keep the packages in `in_packageset` to make sure the repo they're in on the target system gets enabled ++ - 3 - replaced ++ - remove all packages in `in_packageset` ++ - install parts of the `out_packageset` that are not present on the system ++ - keep the packages from `out_packageset` that are already installed ++ - 4 - split ++ - install parts of the `out_packageset` that are not present on the system ++ - keep the present `out_packageset` ++ - remove packages from `in_packageset` that are not present in `out_packageset` ++ - in case of package X being split to Y and Z, package X will be removed ++ - in case of package X being split to X and Y, package X will **not** be removed ++ - 5 - merged ++ - same as `split` ++ - additional behaviour present, see below ++ - 6 - moved to new repository ++ - keep the package to make sure the repo it's in on the target system gets enabled ++ - nothing is done to `in_packageset` as it always contains one package - the same as the "out" package ++ - 7 - renamed ++ - remove the `in_packageset` and install the `out_packageset` if not installed ++ - if already installed, keep the `out_packageset` as-is ++ - 8 - reinstalled ++ - reinstall the `in_packageset` package during the upgrade transaction ++ - mostly useful for packages that have the same version string between major versions, and thus won't be upgraded automatically ++ - Additional notes: ++ - any event except `present` is ignored if any of packages in `in_packageset` are marked for removal ++ - any event except `merged` is ignored if any of packages in `in_packageset` are neither installed nor marked for installation ++ - for `merged` events it is sufficient to have at least one package from `in_packageset` are either installed or marked for installation +- arches: what system architectures the listed entry relates to +- id: entry ID, must be unique +- in_packageset: set of packages on the old system @@ -835,6 +860,15 @@ index 75ffa6a..379d480 100644 + for position, report in enumerate(inhibitors, start=1): + logger.error('{idx:5}. Inhibitor: {title}'.format(idx=position, title=report['title'])) + logger.info('Consult the pre-upgrade report for details and possible remediation.') +diff --git a/etc/leapp/transaction/to_reinstall b/etc/leapp/transaction/to_reinstall +new file mode 100644 +index 0000000..c6694a8 +--- /dev/null ++++ b/etc/leapp/transaction/to_reinstall +@@ -0,0 +1,3 @@ ++### List of packages (each on new line) to be reinstalled to the upgrade transaction ++### Useful for packages that have identical version strings but contain binary changes between major OS versions ++### Packages that aren't installed will be skipped diff --git a/packaging/leapp-repository.spec b/packaging/leapp-repository.spec index af4b31d..0d8f6c8 100644 --- a/packaging/leapp-repository.spec @@ -1752,10 +1786,10 @@ index 14bd6e3..f6adacf 100755 # This should not happen as /etc/initrd-release is supposed to have API # stability, but check is better than broken system. diff --git a/repos/system_upgrade/common/actors/efibootorderfix/finalization/actor.py b/repos/system_upgrade/common/actors/efibootorderfix/finalization/actor.py -index f42909f..171fdd2 100644 +index f42909f..2728cb4 100644 --- a/repos/system_upgrade/common/actors/efibootorderfix/finalization/actor.py +++ b/repos/system_upgrade/common/actors/efibootorderfix/finalization/actor.py -@@ -1,17 +1,101 @@ +@@ -1,17 +1,102 @@ +import os +import re + @@ -1793,6 +1827,7 @@ index f42909f..171fdd2 100644 + 'Oracle Linux Server': 'redhat', + 'Red Hat Enterprise Linux': 'redhat', + 'Rocky Linux': 'rocky', ++ 'Scientific Linux': 'redhat', + 'CloudLinux': 'centos', + } + @@ -1861,6 +1896,41 @@ index f42909f..171fdd2 100644 + + if not has_grub_cfg: + run(['/sbin/grub2-mkconfig', '-o', grub_cfg_path]) +diff --git a/repos/system_upgrade/common/actors/filterrpmtransactionevents/actor.py b/repos/system_upgrade/common/actors/filterrpmtransactionevents/actor.py +index e0d89d9..52f93ef 100644 +--- a/repos/system_upgrade/common/actors/filterrpmtransactionevents/actor.py ++++ b/repos/system_upgrade/common/actors/filterrpmtransactionevents/actor.py +@@ -32,6 +32,7 @@ class FilterRpmTransactionTasks(Actor): + to_remove = set() + to_keep = set() + to_upgrade = set() ++ to_reinstall = set() + modules_to_enable = {} + modules_to_reset = {} + for event in self.consume(RpmTransactionTasks, PESRpmTransactionTasks): +@@ -39,13 +40,14 @@ class FilterRpmTransactionTasks(Actor): + to_install.update(event.to_install) + to_remove.update(installed_pkgs.intersection(event.to_remove)) + to_keep.update(installed_pkgs.intersection(event.to_keep)) ++ to_reinstall.update(installed_pkgs.intersection(event.to_reinstall)) + modules_to_enable.update({'{}:{}'.format(m.name, m.stream): m for m in event.modules_to_enable}) + modules_to_reset.update({'{}:{}'.format(m.name, m.stream): m for m in event.modules_to_reset}) + + to_remove.difference_update(to_keep) + + # run upgrade for the rest of RH signed pkgs which we do not have rule for +- to_upgrade = installed_pkgs - (to_install | to_remove) ++ to_upgrade = installed_pkgs - (to_install | to_remove | to_reinstall) + + self.produce(FilteredRpmTransactionTasks( + local_rpms=list(local_rpms), +@@ -53,5 +55,6 @@ class FilterRpmTransactionTasks(Actor): + to_remove=list(to_remove), + to_keep=list(to_keep), + to_upgrade=list(to_upgrade), ++ to_reinstall=list(to_reinstall), + modules_to_reset=list(modules_to_reset.values()), + modules_to_enable=list(modules_to_enable.values()))) diff --git a/repos/system_upgrade/common/actors/ipuworkflowconfig/libraries/ipuworkflowconfig.py b/repos/system_upgrade/common/actors/ipuworkflowconfig/libraries/ipuworkflowconfig.py index edf978f..7fea4ec 100644 --- a/repos/system_upgrade/common/actors/ipuworkflowconfig/libraries/ipuworkflowconfig.py @@ -1935,10 +2005,25 @@ index fadf76b..7ef2664 100644 + if pesfile[:-len(pes_json_suffix)] in active_vendors: + pes_events_scanner(VENDORS_DIR, pesfile) diff --git a/repos/system_upgrade/common/actors/peseventsscanner/libraries/peseventsscanner.py b/repos/system_upgrade/common/actors/peseventsscanner/libraries/peseventsscanner.py -index 1be2caa..072de17 100644 +index 1be2caa..aca8a72 100644 --- a/repos/system_upgrade/common/actors/peseventsscanner/libraries/peseventsscanner.py +++ b/repos/system_upgrade/common/actors/peseventsscanner/libraries/peseventsscanner.py -@@ -138,19 +138,26 @@ def _get_repositories_mapping(target_pesids): +@@ -59,12 +59,14 @@ class Action(IntEnum): + MERGED = 5 + MOVED = 6 + RENAMED = 7 ++ REINSTALLED = 8 + + + class Task(IntEnum): + KEEP = 0 + INSTALL = 1 + REMOVE = 2 ++ REINSTALL = 3 + + def past(self): + return ['kept', 'installed', 'removed'][self] +@@ -138,19 +140,26 @@ def _get_repositories_mapping(target_pesids): :return: Dictionary with all repositories mapped. """ @@ -1975,7 +2060,15 @@ index 1be2caa..072de17 100644 # NOTE: We have to calculate expected target repositories # like in the setuptargetrepos actor. It's planned to handle this in different # way in future... -@@ -324,7 +331,7 @@ def parse_pes_events(json_data): +@@ -233,6 +242,7 @@ def get_transaction_configuration(): + transaction_configuration.to_install.extend(tasks.to_install) + transaction_configuration.to_remove.extend(tasks.to_remove) + transaction_configuration.to_keep.extend(tasks.to_keep) ++ transaction_configuration.to_reinstall.extend(tasks.to_reinstall) + return transaction_configuration + + +@@ -324,7 +334,7 @@ def parse_pes_events(json_data): :return: List of Event tuples, where each event contains event type and input/output pkgs """ data = json.loads(json_data) @@ -1984,6 +2077,135 @@ index 1be2caa..072de17 100644 raise ValueError('Found PES data with invalid structure') return list(chain(*[parse_entry(entry) for entry in data['packageinfo']])) +@@ -565,6 +575,13 @@ def process_events(releases, events, installed_pkgs): + if event.action in [Action.RENAMED, Action.REPLACED, Action.REMOVED]: + add_packages_to_tasks(current, event.in_pkgs, Task.REMOVE) + ++ if event.action == Action.REINSTALLED: ++ # These packages have the same version string but differ in contents. ++ # noarch packages will most likely work fine after the upgrade, but ++ # the others may break due to library/binary incompatibilities. ++ # This is why we mark them for reinstallation. ++ add_packages_to_tasks(current, event.in_pkgs, Task.REINSTALL) ++ + do_not_remove = set() + for package in current[Task.REMOVE]: + if package in tasks[Task.KEEP]: +@@ -572,6 +589,11 @@ def process_events(releases, events, installed_pkgs): + '{p} :: {r} to be kept / currently removed - removing package'.format( + p=package[0], r=current[Task.REMOVE][package])) + del tasks[Task.KEEP][package] ++ if package in tasks[Task.REINSTALL]: ++ api.current_logger().warning( ++ '{p} :: {r} to be reinstalled / currently removed - removing package'.format( ++ p=package[0], r=current[Task.REMOVE][package])) ++ del tasks[Task.REINSTALL][package] + elif package in tasks[Task.INSTALL]: + api.current_logger().warning( + '{p} :: {r} to be installed / currently removed - ignoring tasks'.format( +@@ -599,6 +621,11 @@ def process_events(releases, events, installed_pkgs): + '{p} :: {r} to be removed / currently kept - keeping package'.format( + p=package[0], r=current[Task.KEEP][package])) + del tasks[Task.REMOVE][package] ++ if package in tasks[Task.REINSTALL]: ++ api.current_logger().warning( ++ '{p} :: {r} to be reinstalled / currently kept - keeping package'.format( ++ p=package[0], r=current[Task.KEEP][package])) ++ del tasks[Task.REINSTALL][package] + + for key in Task: # noqa: E1133; pylint: disable=not-an-iterable + for package in current[key]: +@@ -610,7 +637,9 @@ def process_events(releases, events, installed_pkgs): + + map_repositories(tasks[Task.INSTALL]) + map_repositories(tasks[Task.KEEP]) ++ map_repositories(tasks[Task.REINSTALL]) + filter_out_pkgs_in_blacklisted_repos(tasks[Task.INSTALL]) ++ filter_out_pkgs_in_blacklisted_repos(tasks[Task.REINSTALL]) + resolve_conflicting_requests(tasks) + + return tasks +@@ -689,15 +718,24 @@ def resolve_conflicting_requests(tasks): + -> without this function, sip would reside in both [Task.KEEP] and [Task.REMOVE], causing a dnf conflict + """ + pkgs_in_conflict = set() +- for pkg in list(tasks[Task.INSTALL].keys()) + list(tasks[Task.KEEP].keys()): ++ preserve_keys = ( ++ list(tasks[Task.INSTALL].keys()) ++ + list(tasks[Task.KEEP].keys()) ++ + list(tasks[Task.REINSTALL].keys()) ++ ) ++ ++ for pkg in preserve_keys: + if pkg in tasks[Task.REMOVE]: + pkgs_in_conflict.add(pkg) + del tasks[Task.REMOVE][pkg] + + if pkgs_in_conflict: +- api.current_logger().debug('The following packages were marked to be kept/installed and removed at the same' +- ' time. Leapp will upgrade them.\n{}'.format( +- '\n'.join(sorted(pkg[0] for pkg in pkgs_in_conflict)))) ++ api.current_logger().debug( ++ "The following packages were marked to be kept/installed/reinstalled" ++ " and removed at the same time. Leapp will upgrade them.\n{}".format( ++ "\n".join(sorted(pkg[0] for pkg in pkgs_in_conflict)) ++ ) ++ ) + + + def get_repositories_blacklisted(): +@@ -773,7 +811,7 @@ def add_output_pkgs_to_transaction_conf(transaction_configuration, events): + message = 'The following target system packages will not be installed:\n' + + for event in events: +- if event.action in (Action.SPLIT, Action.MERGED, Action.REPLACED, Action.RENAMED): ++ if event.action in (Action.SPLIT, Action.MERGED, Action.REPLACED, Action.RENAMED, Action.REINSTALLED): + if all([pkg.name in transaction_configuration.to_remove for pkg in event.in_pkgs]): + transaction_configuration.to_remove.extend(pkg.name for pkg in event.out_pkgs) + message += ( +@@ -800,6 +838,7 @@ def filter_out_transaction_conf_pkgs(tasks, transaction_configuration): + """ + do_not_keep = [p for p in tasks[Task.KEEP] if p[0] in transaction_configuration.to_remove] + do_not_install = [p for p in tasks[Task.INSTALL] if p[0] in transaction_configuration.to_remove] ++ do_not_reinstall = [p for p in tasks[Task.REINSTALL] if p[0] in transaction_configuration.to_remove] + do_not_remove = [p for p in tasks[Task.REMOVE] if p[0] in transaction_configuration.to_install + or p[0] in transaction_configuration.to_keep] + +@@ -813,6 +852,12 @@ def filter_out_transaction_conf_pkgs(tasks, transaction_configuration): + api.current_logger().debug('The following packages will not be installed because of the' + ' /etc/leapp/transaction/to_remove transaction configuration file:' + '\n- ' + '\n- '.join(p[0] for p in sorted(do_not_install))) ++ if do_not_reinstall: ++ for pkg in do_not_reinstall: ++ tasks[Task.REINSTALL].pop(pkg) ++ api.current_logger().debug('The following packages will not be reinstalled because of the' ++ ' /etc/leapp/transaction/to_remove transaction configuration file:' ++ '\n- ' + '\n- '.join(p[0] for p in sorted(do_not_reinstall))) + if do_not_remove: + for pkg in do_not_remove: + tasks[Task.REMOVE].pop(pkg) +@@ -837,17 +882,20 @@ def produce_messages(tasks): + # Type casting to list to be Py2&Py3 compatible as on Py3 keys() returns dict_keys(), not a list + to_install_pkgs = sorted(tasks[Task.INSTALL].keys()) + to_remove_pkgs = sorted(tasks[Task.REMOVE].keys()) ++ to_reinstall_pkgs = sorted(tasks[Task.REINSTALL].keys()) + to_enable_repos = sorted(set(tasks[Task.INSTALL].values()) | set(tasks[Task.KEEP].values())) + +- if to_install_pkgs or to_remove_pkgs: ++ if to_install_pkgs or to_remove_pkgs or to_reinstall_pkgs: + enabled_modules = _get_enabled_modules() + modules_to_enable = [Module(name=p[1][0], stream=p[1][1]) for p in to_install_pkgs if p[1]] + modules_to_reset = enabled_modules + to_install_pkg_names = [p[0] for p in to_install_pkgs] + to_remove_pkg_names = [p[0] for p in to_remove_pkgs] ++ to_reinstall_pkg_names = [p[0] for p in to_reinstall_pkgs] + + api.produce(PESRpmTransactionTasks(to_install=to_install_pkg_names, + to_remove=to_remove_pkg_names, ++ to_reinstall=to_reinstall_pkg_names, + modules_to_enable=modules_to_enable, + modules_to_reset=modules_to_reset)) + diff --git a/repos/system_upgrade/common/actors/peseventsscanner/tests/unit_test_peseventsscanner.py b/repos/system_upgrade/common/actors/peseventsscanner/tests/unit_test_peseventsscanner.py index f4b02e9..c22165e 100644 --- a/repos/system_upgrade/common/actors/peseventsscanner/tests/unit_test_peseventsscanner.py @@ -2000,7 +2222,7 @@ index f4b02e9..c22165e 100644 def test_pes_data_not_found(monkeypatch): def read_or_fetch_mocked(filename, directory="/etc/leapp/files", service=None, allow_empty=False): diff --git a/repos/system_upgrade/common/actors/redhatsignedrpmscanner/actor.py b/repos/system_upgrade/common/actors/redhatsignedrpmscanner/actor.py -index 01f6df3..badb888 100644 +index 01f6df3..9a4990e 100644 --- a/repos/system_upgrade/common/actors/redhatsignedrpmscanner/actor.py +++ b/repos/system_upgrade/common/actors/redhatsignedrpmscanner/actor.py @@ -1,27 +1,67 @@ @@ -2096,7 +2318,7 @@ index 01f6df3..badb888 100644 def is_gpg_pubkey(pkg): """Check if gpg-pubkey pkg exists or LEAPP_DEVEL_RPMS_ALL_SIGNED=1 -@@ -44,15 +84,15 @@ class RedHatSignedRpmScanner(Actor): +@@ -44,15 +84,30 @@ class RedHatSignedRpmScanner(Actor): gpg-pubkey is not signed as it would require another package to verify its signature """ @@ -2114,10 +2336,25 @@ index 01f6df3..badb888 100644 """Whitelist the katello package.""" - return pkg.name.startswith('katello-ca-consumer') + return pkg.name.startswith("katello-ca-consumer") ++ ++ def has_cpanel_prefix(pkg): ++ """ ++ Whitelist the cPanel packages. ++ A side effect of the cPanel's deployment method is that its packages both have no ++ PGP signature and aren't associated with any package repository. ++ They do, however, have a specific naming scheme that can be used to include them into ++ the upgrade process. ++ """ ++ ++ # NOTE: if another case like this and the above katello occurs, consider adding a ++ # mechanism (a third-party extension) to do this in a way that allows extending it to ++ # other configurations. ++ # A separate file for the "vendors.d" folder with package name wildcards? ++ return pkg.name.startswith("cpanel-") def is_azure_pkg(pkg): """Whitelist Azure config package.""" -@@ -68,16 +108,24 @@ class RedHatSignedRpmScanner(Actor): +@@ -68,16 +123,25 @@ class RedHatSignedRpmScanner(Actor): for pkg in rpm_pkgs.items: if any( [ @@ -2125,6 +2362,7 @@ index 01f6df3..badb888 100644 + has_vendorsig(pkg), is_gpg_pubkey(pkg), has_katello_prefix(pkg), ++ has_cpanel_prefix(pkg), is_azure_pkg(pkg), ] ): @@ -2335,6 +2573,54 @@ index 3c0b04b..3480432 100644 @pytest.fixture def adjust_cwd(): previous_cwd = os.getcwd() +diff --git a/repos/system_upgrade/common/actors/rpmtransactionconfigtaskscollector/libraries/rpmtransactionconfigtaskscollector.py b/repos/system_upgrade/common/actors/rpmtransactionconfigtaskscollector/libraries/rpmtransactionconfigtaskscollector.py +index 05797f5..e6f7803 100644 +--- a/repos/system_upgrade/common/actors/rpmtransactionconfigtaskscollector/libraries/rpmtransactionconfigtaskscollector.py ++++ b/repos/system_upgrade/common/actors/rpmtransactionconfigtaskscollector/libraries/rpmtransactionconfigtaskscollector.py +@@ -18,21 +18,37 @@ def load_tasks_file(path, logger): + return [] + + ++def filter_out(installed_rpm_names, to_filter, debug_msg): ++ # These are the packages that aren't installed on the system. ++ filtered_ok = [pkg for pkg in to_filter if pkg not in installed_rpm_names] ++ ++ # And these ones are the ones that are. ++ filtered_out = list(set(to_filter) - set(filtered_ok)) ++ if filtered_out: ++ api.current_logger().debug( ++ debug_msg + ++ '\n- ' + '\n- '.join(filtered_out) ++ ) ++ # We may want to use either of the two sets. ++ return filtered_ok, filtered_out ++ ++ + def load_tasks(base_dir, logger): + # Loads configuration files to_install, to_keep, and to_remove from the given base directory + rpms = next(api.consume(InstalledRedHatSignedRPM)) + rpm_names = [rpm.name for rpm in rpms.items] ++ + to_install = load_tasks_file(os.path.join(base_dir, 'to_install'), logger) ++ install_debug_msg = 'The following packages from "to_install" file will be ignored as they are already installed:' + # we do not want to put into rpm transaction what is already installed (it will go to "to_upgrade" bucket) +- to_install_filtered = [pkg for pkg in to_install if pkg not in rpm_names] ++ to_install_filtered, _ = filter_out(rpm_names, to_install, install_debug_msg) + +- filtered = set(to_install) - set(to_install_filtered) +- if filtered: +- api.current_logger().debug( +- 'The following packages from "to_install" file will be ignored as they are already installed:' +- '\n- ' + '\n- '.join(filtered)) ++ to_reinstall = load_tasks_file(os.path.join(base_dir, 'to_reinstall'), logger) ++ reinstall_debug_msg = 'The following packages from "to_reinstall" file will be ignored as they are not installed:' ++ _, to_reinstall_filtered = filter_out(rpm_names, to_reinstall, reinstall_debug_msg) + + return RpmTransactionTasks( + to_install=to_install_filtered, ++ to_reinstall=to_reinstall_filtered, + to_keep=load_tasks_file(os.path.join(base_dir, 'to_keep'), logger), + to_remove=load_tasks_file(os.path.join(base_dir, 'to_remove'), logger)) diff --git a/repos/system_upgrade/common/actors/scancustomrepofile/actor.py b/repos/system_upgrade/common/actors/scancustomrepofile/actor.py index d46018f..bb49b4e 100644 --- a/repos/system_upgrade/common/actors/scancustomrepofile/actor.py @@ -3049,6 +3335,27 @@ index 0000000..ba27cbb + # self.produce(vendor_repomap_collection) + # for repomap in vendor_repomap_collection.maps: + # self.produce(repomap) +diff --git a/repos/system_upgrade/common/files/rhel_upgrade.py b/repos/system_upgrade/common/files/rhel_upgrade.py +index 62221a7..f5b4c70 100644 +--- a/repos/system_upgrade/common/files/rhel_upgrade.py ++++ b/repos/system_upgrade/common/files/rhel_upgrade.py +@@ -171,6 +171,7 @@ class RhelUpgradeCommand(dnf.cli.Command): + to_install = self.plugin_data['pkgs_info']['to_install'] + to_remove = self.plugin_data['pkgs_info']['to_remove'] + to_upgrade = self.plugin_data['pkgs_info']['to_upgrade'] ++ to_reinstall = self.plugin_data['pkgs_info']['to_reinstall'] + + # Modules to enable + self._process_entities(entities=[modules_to_enable], op=module_base.enable, entity_name='Module stream') +@@ -181,6 +182,8 @@ class RhelUpgradeCommand(dnf.cli.Command): + self._process_entities(entities=to_install, op=self.base.install, entity_name='Package') + # Packages to be upgraded + self._process_entities(entities=to_upgrade, op=self.base.upgrade, entity_name='Package') ++ # Packages to be reinstalled ++ self._process_entities(entities=to_reinstall, op=self.base.reinstall, entity_name='Package') + + self.base.distro_sync() + diff --git a/repos/system_upgrade/common/libraries/config/version.py b/repos/system_upgrade/common/libraries/config/version.py index 03f3cd4..2ab78ea 100644 --- a/repos/system_upgrade/common/libraries/config/version.py @@ -3065,7 +3372,7 @@ index 03f3cd4..2ab78ea 100644 diff --git a/repos/system_upgrade/common/libraries/dnfplugin.py b/repos/system_upgrade/common/libraries/dnfplugin.py -index 4010e9f..fdb8e66 100644 +index 4010e9f..09085c0 100644 --- a/repos/system_upgrade/common/libraries/dnfplugin.py +++ b/repos/system_upgrade/common/libraries/dnfplugin.py @@ -4,6 +4,8 @@ import json @@ -3077,7 +3384,15 @@ index 4010e9f..fdb8e66 100644 from leapp.exceptions import StopActorExecutionError from leapp.libraries.common import dnfconfig, guards, mounting, overlaygen, rhsm, utils from leapp.libraries.common.config.version import get_target_major_version, get_target_version -@@ -213,10 +215,17 @@ def _transaction(context, stage, target_repoids, tasks, plugin_info, test=False, +@@ -85,6 +87,7 @@ def build_plugin_data(target_repoids, debug, test, tasks, on_aws): + 'to_install': tasks.to_install, + 'to_remove': tasks.to_remove, + 'to_upgrade': tasks.to_upgrade, ++ 'to_reinstall': tasks.to_reinstall, + 'modules_to_enable': ['{}:{}'.format(m.name, m.stream) for m in tasks.modules_to_enable], + }, + 'dnf_conf': { +@@ -213,10 +216,17 @@ def _transaction(context, stage, target_repoids, tasks, plugin_info, test=False, message='Failed to execute dnf. Reason: {}'.format(str(e)) ) except CalledProcessError as e: @@ -3297,6 +3612,18 @@ index c187333..ea6a75d 100644 mapping = fields.List(fields.Model(RepoMapEntry), default=[]) repositories = fields.List(fields.Model(PESIDRepositoryEntry), default=[]) + vendor = fields.Nullable(fields.String()) +diff --git a/repos/system_upgrade/common/models/rpmtransactiontasks.py b/repos/system_upgrade/common/models/rpmtransactiontasks.py +index 7e2870d..05d4e94 100644 +--- a/repos/system_upgrade/common/models/rpmtransactiontasks.py ++++ b/repos/system_upgrade/common/models/rpmtransactiontasks.py +@@ -10,6 +10,7 @@ class RpmTransactionTasks(Model): + to_keep = fields.List(fields.String(), default=[]) + to_remove = fields.List(fields.String(), default=[]) + to_upgrade = fields.List(fields.String(), default=[]) ++ to_reinstall = fields.List(fields.String(), default=[]) + modules_to_enable = fields.List(fields.Model(Module), default=[]) + modules_to_reset = fields.List(fields.Model(Module), default=[]) + diff --git a/repos/system_upgrade/common/models/targetrepositories.py b/repos/system_upgrade/common/models/targetrepositories.py index 3604772..33f5dc8 100644 --- a/repos/system_upgrade/common/models/targetrepositories.py @@ -3584,3 +3911,56 @@ index 0cb9081..7a962b7 100644 + error = 'Failed to open sshd_config: {}'.format(str(err)) + api.current_logger().error(error) + return +diff --git a/repos/system_upgrade/el7toel8/actors/updateyumvars/actor.py b/repos/system_upgrade/el7toel8/actors/updateyumvars/actor.py +new file mode 100644 +index 0000000..6252fba +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/updateyumvars/actor.py +@@ -0,0 +1,18 @@ ++from leapp.actors import Actor ++from leapp.libraries.actor import updateyumvars ++from leapp.tags import ThirdPartyApplicationsPhaseTag, IPUWorkflowTag ++ ++ ++class UpdateYumVars(Actor): ++ """ ++ Update the files corresponding to the current major ++ OS version in the /etc/yum/vars folder. ++ """ ++ ++ name = 'update_yum_vars' ++ consumes = () ++ produces = () ++ tags = (ThirdPartyApplicationsPhaseTag, IPUWorkflowTag) ++ ++ def process(self): ++ updateyumvars.vars_update() +diff --git a/repos/system_upgrade/el7toel8/actors/updateyumvars/libraries/updateyumvars.py b/repos/system_upgrade/el7toel8/actors/updateyumvars/libraries/updateyumvars.py +new file mode 100644 +index 0000000..b77f784 +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/updateyumvars/libraries/updateyumvars.py +@@ -0,0 +1,23 @@ ++import os ++ ++from leapp.libraries.stdlib import api ++ ++VAR_FOLDER = "/etc/yum/vars" ++ ++ ++def vars_update(): ++ """ Iterate through and modify the variables. """ ++ if not os.path.isdir(VAR_FOLDER): ++ api.current_logger().debug( ++ "The {} directory doesn't exist. Nothing to do.".format(VAR_FOLDER) ++ ) ++ return ++ ++ for varfile_name in os.listdir(VAR_FOLDER): ++ # cp_centos_major_version contains the current OS' major version. ++ if varfile_name == 'cp_centos_major_version': ++ varfile_path = os.path.join(VAR_FOLDER, varfile_name) ++ ++ with open(varfile_path, 'w') as varfile: ++ # Overwrite the value from outdated "7". ++ varfile.write('8') diff --git a/SPECS/leapp-repository.spec b/SPECS/leapp-repository.spec index 9bda910..9bd9a9c 100644 --- a/SPECS/leapp-repository.spec +++ b/SPECS/leapp-repository.spec @@ -43,7 +43,7 @@ py2_byte_compile "%1" "%2"} Epoch: 1 Name: leapp-repository Version: 0.16.0 -Release: 6%{?dist}.elevate.5 +Release: 6%{?dist}.elevate.6 Summary: Repositories for leapp License: ASL 2.0