diff --git a/0034-Add-a-migration-progress-check-interface-for-SMC.patch b/0034-Add-a-migration-progress-check-interface-for-SMC.patch new file mode 100644 index 0000000000000000000000000000000000000000..27169d34addcf1ec322b402e890042f874a357cc --- /dev/null +++ b/0034-Add-a-migration-progress-check-interface-for-SMC.patch @@ -0,0 +1,2418 @@ +From 9b56ab94fd7fc75630714f3ec776c4cae27aba9f Mon Sep 17 00:00:00 2001 +From: Weisson +Date: Thu, 3 Nov 2022 16:00:40 +0800 +Subject: [PATCH] Add a migration progress check interface for SMC. + +Signed-off-by: Bo Ren +Signed-off-by: Zhao Mingyue +Signed-off-by: Weisson +--- + .../actors/addupgradebootentry/actor.py | 39 ++++--- + .../libraries/addupgradebootentry.py | 1 + + .../el7toel8/actors/authselectapply/actor.py | 80 +++++++------ + .../libraries/authselectapply.py | 1 + + .../actors/checkleftoverpackages/actor.py | 58 ++++----- + .../libraries/checkleftoverpackages.py | 1 + + .../actors/cloud/grubenvtofile/actor.py | 12 +- + .../grubenvtofile/libraries/grubenvtofile.py | 1 + + .../actors/createresumeservice/actor.py | 71 +++++------ + .../libraries/createresumeservice.py | 1 + + .../actors/cupsfiltersmigrate/actor.py | 6 +- + .../libraries/cupsfiltersmigrate.py | 1 + + .../actors/dnfpackagedownload/actor.py | 30 ++--- + .../libraries/dnfpackagedownload.py | 1 + + .../actors/dnfupgradetransaction/actor.py | 49 ++++---- + .../libraries/dnfupgradetransaction.py | 1 + + .../firewalldupdatelockdownwhitelist/actor.py | 30 ++--- + .../firewalldupdatelockdownwhitelist.py | 1 + + .../actor.py | 6 +- + .../forcedefaultboottotargetkernelversion.py | 1 + + .../actors/initramdiskgenerator/actor.py | 6 +- + .../libraries/initramdiskgenerator.py | 1 + + .../el7toel8/actors/initrdinclude/actor.py | 6 +- + .../initrdinclude/libraries/initrdinclude.py | 1 + + .../actors/kernelcmdlineconfig/actor.py | 28 +++-- + .../libraries/kernelcmdlineconfig.py | 1 + + .../el7toel8/actors/migratebrltty/actor.py | 44 +++---- + .../migratebrltty/libraries/migratebrltty.py | 1 + + .../el7toel8/actors/migratentp/actor.py | 8 +- + .../actors/migratentp/libraries/migratentp.py | 1 + + .../el7toel8/actors/migratesendmail/actor.py | 34 +++--- + .../libraries/migratesendmail.py | 1 + + .../actors/multipathconfupdate/actor.py | 16 ++- + .../libraries/multipathconfupdate.py | 1 + + .../networkmanagerupdateconfig/actor.py | 25 ++-- + .../libraries/networkmanagerupdateconfig.py | 1 + + .../networkmanagerupdateconnections/actor.py | 25 ++-- + .../networkmanagerupdateconnections.py | 1 + + .../networkmanagerupdateservice/actor.py | 35 +++--- + .../libraries/networkmanagerupdateservice.py | 1 + + .../actors/persistentnetnamesconfig/actor.py | 6 +- + .../libraries/persistentnetnamesconfig.py | 1 + + .../persistentnetnamesinitramfs/actor.py | 6 +- + .../libraries/persistentnetnamesinitramfs.py | 1 + + .../actors/preparepythonworkround/actor.py | 6 +- + .../libraries/preparepythonworkround.py | 1 + + .../el7toel8/actors/prepareyumconfig/actor.py | 6 +- + .../libraries/prepareyumconfig.py | 1 + + .../el7toel8/actors/progresstrigger/actor.py | 26 +++++ + .../libraries/progresstrigger.py | 1 + + .../el7toel8/actors/progressupdater/actor.py | 59 ++++++++++ + .../libraries/progressupdater.py | 1 + + .../el7toel8/actors/quaggatofrr/actor.py | 12 +- + .../quaggatofrr/libraries/quaggatofrr.py | 1 + + .../el7toel8/actors/removebootfiles/actor.py | 6 +- + .../libraries/removebootfiles.py | 1 + + .../actors/removeleftoverpackages/actor.py | 69 ++++++----- + .../libraries/removeleftoverpackages.py | 1 + + .../actors/removeoldpammodulesapply/actor.py | 22 ++-- + .../libraries/removeoldpammodulesapply.py | 1 + + .../actors/removeresumeservice/actor.py | 37 +++--- + .../libraries/removeresumeservice.py | 1 + + .../actors/reportleftoverpackages/actor.py | 86 +++++++------- + .../libraries/reportleftoverpackages.py | 1 + + .../actors/sanebackendsmigrate/actor.py | 6 +- + .../libraries/sanebackendsmigrate.py | 1 + + .../scaninstalledtargetkernelversion/actor.py | 6 +- + .../scaninstalledtargetkernelversion.py | 1 + + .../actors/scheduleselinuxrelabeling/actor.py | 57 ++++----- + .../libraries/scheduleselinuxrelabeling.py | 1 + + .../el7toel8/actors/sctpconfigupdate/actor.py | 6 +- + .../libraries/sctpconfigupdate.py | 1 + + .../actors/setpermissiveselinux/actor.py | 32 ++--- + .../libraries/setpermissiveselinux.py | 1 + + .../el7toel8/actors/smcconclusion/actor.py | 19 +++ + .../smcconclusion/libraries/smcconclusion.py | 1 + + .../actors/spamassassinconfigupdate/actor.py | 14 ++- + .../libraries/spamassassinconfigupdate.py | 1 + + .../actors/updateetcsysconfigkernel/actor.py | 6 +- + .../libraries/updateetcsysconfigkernel.py | 1 + + .../el7toel8/actors/updategrubcore/actor.py | 18 +-- + .../libraries/updategrubcore.py | 1 + + .../el7toel8/actors/vimmigrate/actor.py | 6 +- + .../actors/vimmigrate/libraries/vimmigrate.py | 1 + + .../actors/vsftpdconfigupdate/actor.py | 12 +- + .../libraries/vsftpdconfigupdate.py | 1 + + .../actors/ziplconverttoblscfg/actor.py | 110 +++++++++--------- + .../libraries/ziplconverttoblscfg.py | 1 + + .../el7toel8/libraries/smc_macros.py | 110 ++++++++++++++++++ + .../el7toel8/tags/summaryphase.py | 5 + + .../el7toel8/workflows/inplace_upgrade.py | 9 ++ + 91 files changed, 929 insertions(+), 480 deletions(-) + create mode 100644 repos/system_upgrade/el7toel8/actors/authselectapply/libraries/authselectapply.py + create mode 100644 repos/system_upgrade/el7toel8/actors/checkleftoverpackages/libraries/checkleftoverpackages.py + create mode 100644 repos/system_upgrade/el7toel8/actors/createresumeservice/libraries/createresumeservice.py + create mode 100644 repos/system_upgrade/el7toel8/actors/dnfpackagedownload/libraries/dnfpackagedownload.py + create mode 100644 repos/system_upgrade/el7toel8/actors/dnfupgradetransaction/libraries/dnfupgradetransaction.py + create mode 100644 repos/system_upgrade/el7toel8/actors/forcedefaultboottotargetkernelversion/libraries/forcedefaultboottotargetkernelversion.py + create mode 100644 repos/system_upgrade/el7toel8/actors/initramdiskgenerator/libraries/initramdiskgenerator.py + create mode 100644 repos/system_upgrade/el7toel8/actors/networkmanagerupdateconfig/libraries/networkmanagerupdateconfig.py + create mode 100644 repos/system_upgrade/el7toel8/actors/networkmanagerupdateconnections/libraries/networkmanagerupdateconnections.py + create mode 100644 repos/system_upgrade/el7toel8/actors/networkmanagerupdateservice/libraries/networkmanagerupdateservice.py + create mode 100644 repos/system_upgrade/el7toel8/actors/persistentnetnamesinitramfs/libraries/persistentnetnamesinitramfs.py + create mode 100644 repos/system_upgrade/el7toel8/actors/preparepythonworkround/libraries/preparepythonworkround.py + create mode 100644 repos/system_upgrade/el7toel8/actors/prepareyumconfig/libraries/prepareyumconfig.py + create mode 100644 repos/system_upgrade/el7toel8/actors/progresstrigger/actor.py + create mode 100644 repos/system_upgrade/el7toel8/actors/progresstrigger/libraries/progresstrigger.py + create mode 100644 repos/system_upgrade/el7toel8/actors/progressupdater/actor.py + create mode 100644 repos/system_upgrade/el7toel8/actors/progressupdater/libraries/progressupdater.py + create mode 100644 repos/system_upgrade/el7toel8/actors/removeleftoverpackages/libraries/removeleftoverpackages.py + create mode 100644 repos/system_upgrade/el7toel8/actors/removeresumeservice/libraries/removeresumeservice.py + create mode 100644 repos/system_upgrade/el7toel8/actors/reportleftoverpackages/libraries/reportleftoverpackages.py + create mode 100644 repos/system_upgrade/el7toel8/actors/scaninstalledtargetkernelversion/libraries/scaninstalledtargetkernelversion.py + create mode 100644 repos/system_upgrade/el7toel8/actors/scheduleselinuxrelabeling/libraries/scheduleselinuxrelabeling.py + create mode 100644 repos/system_upgrade/el7toel8/actors/sctpconfigupdate/libraries/sctpconfigupdate.py + create mode 100644 repos/system_upgrade/el7toel8/actors/smcconclusion/actor.py + create mode 100644 repos/system_upgrade/el7toel8/actors/smcconclusion/libraries/smcconclusion.py + create mode 100644 repos/system_upgrade/el7toel8/actors/ziplconverttoblscfg/libraries/ziplconverttoblscfg.py + create mode 100644 repos/system_upgrade/el7toel8/libraries/smc_macros.py + create mode 100644 repos/system_upgrade/el7toel8/tags/summaryphase.py + +diff --git a/repos/system_upgrade/el7toel8/actors/addupgradebootentry/actor.py b/repos/system_upgrade/el7toel8/actors/addupgradebootentry/actor.py +index 8248a28..1040723 100644 +--- a/repos/system_upgrade/el7toel8/actors/addupgradebootentry/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/addupgradebootentry/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.addupgradebootentry import smc_macros + import os + + from leapp.actors import Actor +@@ -20,20 +21,24 @@ class AddUpgradeBootEntry(Actor): + tags = (IPUWorkflowTag, InterimPreparationPhaseTag) + + def process(self): +- grub_config_error_detected = next(self.consume(GrubConfigError), GrubConfigError()).error_detected +- if grub_config_error_detected: +- fix_grub_config_error('/etc/default/grub') +- +- configs = None +- ff = next(self.consume(FirmwareFacts), None) +- if not ff: +- raise StopActorExecutionError( +- 'Could not identify system firmware', +- details={'details': 'Actor did not receive FirmwareFacts message.'} +- ) +- +- # related to issue with hybrid BIOS and UEFI images +- # https://bugzilla.redhat.com/show_bug.cgi?id=1667028 +- if ff.firmware == 'bios' and os.path.ismount('/boot/efi') and os.path.isfile('/boot/efi/EFI/redhat/grub.cfg'): +- configs = ['/boot/grub2/grub.cfg', '/boot/efi/EFI/redhat/grub.cfg'] +- add_boot_entry(configs) ++ try: ++ grub_config_error_detected = next(self.consume(GrubConfigError), GrubConfigError()).error_detected ++ if grub_config_error_detected: ++ ++ fix_grub_config_error('/etc/default/grub') ++ ++ configs = None ++ ff = next(self.consume(FirmwareFacts), None) ++ if not ff: ++ raise StopActorExecutionError( ++ 'Could not identify system firmware', ++ details={'details': 'Actor did not receive FirmwareFacts message.'} ++ ) ++ ++ # related to issue with hybrid BIOS and UEFI images ++ # https://bugzilla.redhat.com/show_bug.cgi?id=1667028 ++ if ff.firmware == 'bios' and os.path.ismount('/boot/efi') and os.path.isfile('/boot/efi/EFI/redhat/grub.cfg'): ++ configs = ['/boot/grub2/grub.cfg', '/boot/efi/EFI/redhat/grub.cfg'] ++ add_boot_entry(configs) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/addupgradebootentry/libraries/addupgradebootentry.py b/repos/system_upgrade/el7toel8/actors/addupgradebootentry/libraries/addupgradebootentry.py +index 4270bd8..6e8679b 100644 +--- a/repos/system_upgrade/el7toel8/actors/addupgradebootentry/libraries/addupgradebootentry.py ++++ b/repos/system_upgrade/el7toel8/actors/addupgradebootentry/libraries/addupgradebootentry.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + import os + import re + +diff --git a/repos/system_upgrade/el7toel8/actors/authselectapply/actor.py b/repos/system_upgrade/el7toel8/actors/authselectapply/actor.py +index 2916b89..db13d38 100644 +--- a/repos/system_upgrade/el7toel8/actors/authselectapply/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/authselectapply/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.authselectapply import smc_macros + from leapp.actors import Actor + from leapp.libraries.stdlib import run, CalledProcessError + from leapp.models import Authselect, AuthselectDecision +@@ -27,46 +28,51 @@ class AuthselectApply(Actor): + tags = (IPUWorkflowTag, ApplicationsPhaseTag) + + def process(self): +- model = next(self.consume(Authselect)) +- decision = next(self.consume(AuthselectDecision)) ++ try: ++ model = next(self.consume(Authselect)) ++ decision = next(self.consume(AuthselectDecision)) + +- if not decision.confirmed or model.profile is None: +- return ++ if not decision.confirmed or model.profile is None: ++ return + +- command = ['authselect', 'select', '--force', model.profile] + model.features ++ command = ['authselect', 'select', '--force', model.profile] + model.features ++ ++ try: ++ run(command) ++ except CalledProcessError as err: ++ create_report([ # pylint: disable-msg=too-many-arguments ++ reporting.Title('Authselect call failed'), ++ reporting.Summary(str(err)), ++ reporting.Severity(reporting.Severity.MEDIUM), ++ reporting.Tags([ ++ reporting.Tags.AUTHENTICATION, ++ reporting.Tags.SECURITY, ++ reporting.Tags.TOOLS ++ ]), ++ reporting.Flags([ ++ reporting.Flags.FAILURE ++ ]) ++ ] + resources) # pylint: disable-msg=too-many-arguments ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(err))) ++ return ++ ++ try: ++ run(['systemctl', 'enable', 'oddjobd.service']) ++ except (OSError, CalledProcessError) as e: ++ self.log.warning('Error enabling oddjobd.service: {}'.format(e)) ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) + +- try: +- run(command) +- except CalledProcessError as err: + create_report([ # pylint: disable-msg=too-many-arguments +- reporting.Title('Authselect call failed'), +- reporting.Summary(str(err)), +- reporting.Severity(reporting.Severity.MEDIUM), ++ reporting.Title('System was converted to authselect.'), ++ reporting.Summary( ++ 'System was converted to authselect with the ' ++ 'following call: "{}"'.format(' '.join(command)) ++ ), + reporting.Tags([ +- reporting.Tags.AUTHENTICATION, +- reporting.Tags.SECURITY, +- reporting.Tags.TOOLS +- ]), +- reporting.Flags([ +- reporting.Flags.FAILURE +- ]) ++ reporting.Tags.AUTHENTICATION, ++ reporting.Tags.SECURITY, ++ reporting.Tags.TOOLS ++ ]) + ] + resources) # pylint: disable-msg=too-many-arguments +- return +- +- try: +- run(['systemctl', 'enable', 'oddjobd.service']) +- except (OSError, CalledProcessError) as e: +- self.log.warning('Error enabling oddjobd.service: {}'.format(e)) +- +- create_report([ # pylint: disable-msg=too-many-arguments +- reporting.Title('System was converted to authselect.'), +- reporting.Summary( +- 'System was converted to authselect with the ' +- 'following call: "{}"'.format(' '.join(command)) +- ), +- reporting.Tags([ +- reporting.Tags.AUTHENTICATION, +- reporting.Tags.SECURITY, +- reporting.Tags.TOOLS +- ]) +- ] + resources) # pylint: disable-msg=too-many-arguments ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/authselectapply/libraries/authselectapply.py b/repos/system_upgrade/el7toel8/actors/authselectapply/libraries/authselectapply.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/authselectapply/libraries/authselectapply.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/checkleftoverpackages/actor.py b/repos/system_upgrade/el7toel8/actors/checkleftoverpackages/actor.py +index 0c53950..71487b3 100644 +--- a/repos/system_upgrade/el7toel8/actors/checkleftoverpackages/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/checkleftoverpackages/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.checkleftoverpackages import smc_macros + from leapp.actors import Actor + from leapp.libraries.common.rpms import get_installed_rpms + from leapp.models import LeftoverPackages, TransactionCompleted, InstalledUnsignedRPM, RPM +@@ -17,30 +18,33 @@ class CheckLeftoverPackages(Actor): + tags = (RPMUpgradePhaseTag, IPUWorkflowTag) + + def process(self): +- LEAPP_PACKAGES = ['leapp', 'leapp-repository', 'snactor', 'leapp-repository-deps-el8', 'leapp-deps-el8', +- 'python2-leapp'] +- installed_rpms = get_installed_rpms() +- if not installed_rpms: +- return +- +- to_remove = LeftoverPackages() +- unsigned = [pkg.name for pkg in next(self.consume(InstalledUnsignedRPM), InstalledUnsignedRPM()).items] +- +- for rpm in installed_rpms: +- rpm = rpm.strip() +- if not rpm: +- continue +- name, version, release, epoch, packager, arch, pgpsig = rpm.split('|') +- +- if 'el7' in release and name not in set(unsigned + LEAPP_PACKAGES): +- to_remove.items.append(RPM( +- name=name, +- version=version, +- epoch=epoch, +- packager=packager, +- arch=arch, +- release=release, +- pgpsig=pgpsig +- )) +- +- self.produce(to_remove) ++ try: ++ LEAPP_PACKAGES = ['leapp', 'leapp-repository', 'snactor', 'leapp-repository-deps-el8', 'leapp-deps-el8', ++ 'python2-leapp'] ++ installed_rpms = get_installed_rpms() ++ if not installed_rpms: ++ return ++ ++ to_remove = LeftoverPackages() ++ unsigned = [pkg.name for pkg in next(self.consume(InstalledUnsignedRPM), InstalledUnsignedRPM()).items] ++ ++ for rpm in installed_rpms: ++ rpm = rpm.strip() ++ if not rpm: ++ continue ++ name, version, release, epoch, packager, arch, pgpsig = rpm.split('|') ++ ++ if 'el7' in release and name not in set(unsigned + LEAPP_PACKAGES): ++ to_remove.items.append(RPM( ++ name=name, ++ version=version, ++ epoch=epoch, ++ packager=packager, ++ arch=arch, ++ release=release, ++ pgpsig=pgpsig ++ )) ++ ++ self.produce(to_remove) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/checkleftoverpackages/libraries/checkleftoverpackages.py b/repos/system_upgrade/el7toel8/actors/checkleftoverpackages/libraries/checkleftoverpackages.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/checkleftoverpackages/libraries/checkleftoverpackages.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/cloud/grubenvtofile/actor.py b/repos/system_upgrade/el7toel8/actors/cloud/grubenvtofile/actor.py +index d5b96a7..c312718 100644 +--- a/repos/system_upgrade/el7toel8/actors/cloud/grubenvtofile/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/cloud/grubenvtofile/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.grubenvtofile import smc_macros + from leapp.actors import Actor + from leapp.models import HybridImage + from leapp.tags import FinalizationPhaseTag, IPUWorkflowTag +@@ -22,7 +23,10 @@ class GrubenvToFile(Actor): + tags = (FinalizationPhaseTag, IPUWorkflowTag) + + def process(self): +- grubenv_msg = next(self.consume(HybridImage), None) +- +- if grubenv_msg and grubenv_msg.detected: +- grubenv_to_file() ++ try: ++ grubenv_msg = next(self.consume(HybridImage), None) ++ ++ if grubenv_msg and grubenv_msg.detected: ++ grubenv_to_file() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/cloud/grubenvtofile/libraries/grubenvtofile.py b/repos/system_upgrade/el7toel8/actors/cloud/grubenvtofile/libraries/grubenvtofile.py +index 72b7038..3609a1b 100644 +--- a/repos/system_upgrade/el7toel8/actors/cloud/grubenvtofile/libraries/grubenvtofile.py ++++ b/repos/system_upgrade/el7toel8/actors/cloud/grubenvtofile/libraries/grubenvtofile.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + from leapp.libraries.stdlib import api, run, CalledProcessError + + +diff --git a/repos/system_upgrade/el7toel8/actors/createresumeservice/actor.py b/repos/system_upgrade/el7toel8/actors/createresumeservice/actor.py +index 3019c61..bc6ce59 100644 +--- a/repos/system_upgrade/el7toel8/actors/createresumeservice/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/createresumeservice/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.createresumeservice import smc_macros + import shutil + import os + +@@ -21,37 +22,41 @@ class CreateSystemdResumeService(Actor): + tags = (FinalizationPhaseTag, IPUWorkflowTag) + + def process(self): +- service_name = 'leapp_resume.service' +- systemd_dir = '/etc/systemd/system' +- +- service_templ_fpath = self.get_file_path(service_name) +- shutil.copyfile(service_templ_fpath, os.path.join(systemd_dir, service_name)) +- +- service_path = '/etc/systemd/system/{}'.format(service_name) +- symlink_path = '/etc/systemd/system/default.target.wants/{}'.format(service_name) +- +- # in case nothing is enabled in the default target, the directory does not exist +- try: +- os.mkdir(os.path.join(systemd_dir, 'default.target.wants')) +- except OSError: +- pass +- + try: +- os.symlink(service_path, symlink_path) +- except OSError as e: +- raise StopActorExecutionError( +- 'Could not create a symlink to enable {}'.format(service_name), +- details={"details": str(e)}) +- +- create_report([ +- reporting.Title('Leapp resume systemd service enabled'), +- reporting.Summary( +- '{} enabled as oneshot systemd service to resume Leapp execution ' +- 'after reboot.'.format(service_name) +- ), +- reporting.Severity(reporting.Severity.INFO), +- reporting.Tags([reporting.Tags.UPGRADE_PROCESS]), +- reporting.RelatedResource('file', service_path), +- reporting.RelatedResource('file', symlink_path), +- reporting.RelatedResource('service', service_name) +- ]) ++ service_name = 'leapp_resume.service' ++ systemd_dir = '/etc/systemd/system' ++ ++ service_templ_fpath = self.get_file_path(service_name) ++ shutil.copyfile(service_templ_fpath, os.path.join(systemd_dir, service_name)) ++ ++ service_path = '/etc/systemd/system/{}'.format(service_name) ++ symlink_path = '/etc/systemd/system/default.target.wants/{}'.format(service_name) ++ ++ # in case nothing is enabled in the default target, the directory does not exist ++ try: ++ os.mkdir(os.path.join(systemd_dir, 'default.target.wants')) ++ except OSError as e: ++ pass ++ ++ try: ++ os.symlink(service_path, symlink_path) ++ except OSError as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg="Actor %s fails : %s" % (self.__class__.__name__, str(e))) ++ raise StopActorExecutionError( ++ 'Could not create a symlink to enable {}'.format(service_name), ++ details={"details": str(e)}) ++ ++ create_report([ ++ reporting.Title('Leapp resume systemd service enabled'), ++ reporting.Summary( ++ '{} enabled as oneshot systemd service to resume Leapp execution ' ++ 'after reboot.'.format(service_name) ++ ), ++ reporting.Severity(reporting.Severity.INFO), ++ reporting.Tags([reporting.Tags.UPGRADE_PROCESS]), ++ reporting.RelatedResource('file', service_path), ++ reporting.RelatedResource('file', symlink_path), ++ reporting.RelatedResource('service', service_name) ++ ]) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg="Actor %s fails : %s" % (self.__class__.__name__, str(e))) +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/createresumeservice/libraries/createresumeservice.py b/repos/system_upgrade/el7toel8/actors/createresumeservice/libraries/createresumeservice.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/createresumeservice/libraries/createresumeservice.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/cupsfiltersmigrate/actor.py b/repos/system_upgrade/el7toel8/actors/cupsfiltersmigrate/actor.py +index 53fb41c..3e3c9d1 100644 +--- a/repos/system_upgrade/el7toel8/actors/cupsfiltersmigrate/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/cupsfiltersmigrate/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.cupsfiltersmigrate import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import cupsfiltersmigrate + from leapp.models import InstalledRedHatSignedRPM +@@ -26,4 +27,7 @@ class CupsfiltersMigrate(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- cupsfiltersmigrate.update_cups_browsed() ++ try: ++ cupsfiltersmigrate.update_cups_browsed() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/cupsfiltersmigrate/libraries/cupsfiltersmigrate.py b/repos/system_upgrade/el7toel8/actors/cupsfiltersmigrate/libraries/cupsfiltersmigrate.py +index b63ae51..02cdc3b 100644 +--- a/repos/system_upgrade/el7toel8/actors/cupsfiltersmigrate/libraries/cupsfiltersmigrate.py ++++ b/repos/system_upgrade/el7toel8/actors/cupsfiltersmigrate/libraries/cupsfiltersmigrate.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + from leapp.libraries.common.rpms import has_package + from leapp.libraries.stdlib import api + from leapp.models import InstalledRedHatSignedRPM +diff --git a/repos/system_upgrade/el7toel8/actors/dnfpackagedownload/actor.py b/repos/system_upgrade/el7toel8/actors/dnfpackagedownload/actor.py +index 8e29faa..d8cf907 100644 +--- a/repos/system_upgrade/el7toel8/actors/dnfpackagedownload/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/dnfpackagedownload/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.dnfpackagedownload import smc_macros + from leapp.actors import Actor + from leapp.libraries.common import dnfplugin + from leapp.models import ( +@@ -34,16 +35,19 @@ class DnfPackageDownload(Actor): + tags = (IPUWorkflowTag, DownloadPhaseTag) + + def process(self): +- xfs_info = next(self.consume(XFSPresence), XFSPresence()) +- storage_info = next(self.consume(StorageInfo), StorageInfo()) +- used_repos = self.consume(UsedTargetRepositories) +- plugin_info = list(self.consume(DNFPluginTask)) +- tasks = next(self.consume(FilteredRpmTransactionTasks), FilteredRpmTransactionTasks()) +- target_userspace_info = next(self.consume(TargetUserSpaceInfo), None) +- rhui_info = next(self.consume(RHUIInfo), None) +- on_aws = bool(rhui_info and rhui_info.provider == 'aws') +- +- dnfplugin.perform_rpm_download( +- tasks=tasks, used_repos=used_repos, target_userspace_info=target_userspace_info, +- xfs_info=xfs_info, storage_info=storage_info, plugin_info=plugin_info, on_aws=on_aws +- ) ++ try: ++ xfs_info = next(self.consume(XFSPresence), XFSPresence()) ++ storage_info = next(self.consume(StorageInfo), StorageInfo()) ++ used_repos = self.consume(UsedTargetRepositories) ++ plugin_info = list(self.consume(DNFPluginTask)) ++ tasks = next(self.consume(FilteredRpmTransactionTasks), FilteredRpmTransactionTasks()) ++ target_userspace_info = next(self.consume(TargetUserSpaceInfo), None) ++ rhui_info = next(self.consume(RHUIInfo), None) ++ on_aws = bool(rhui_info and rhui_info.provider == 'aws') ++ ++ dnfplugin.perform_rpm_download( ++ tasks=tasks, used_repos=used_repos, target_userspace_info=target_userspace_info, ++ xfs_info=xfs_info, storage_info=storage_info, plugin_info=plugin_info, on_aws=on_aws ++ ) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/dnfpackagedownload/libraries/dnfpackagedownload.py b/repos/system_upgrade/el7toel8/actors/dnfpackagedownload/libraries/dnfpackagedownload.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/dnfpackagedownload/libraries/dnfpackagedownload.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/dnfupgradetransaction/actor.py b/repos/system_upgrade/el7toel8/actors/dnfupgradetransaction/actor.py +index 73e5a83..8d9d28c 100644 +--- a/repos/system_upgrade/el7toel8/actors/dnfupgradetransaction/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/dnfupgradetransaction/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.dnfupgradetransaction import smc_macros + import shutil + + from leapp.actors import Actor +@@ -36,25 +37,29 @@ class DnfUpgradeTransaction(Actor): + tags = (RPMUpgradePhaseTag, IPUWorkflowTag) + + def process(self): +- src_rhsm_info = next(self.consume(RHSMInfo), None) +- if src_rhsm_info: +- for prod_cert in src_rhsm_info.existing_product_certificates: +- run(['rm', '-f', prod_cert]) +- +- used_repos = self.consume(UsedTargetRepositories) +- storage_info = next(self.consume(StorageInfo), None) +- plugin_info = list(self.consume(DNFPluginTask)) +- tasks = next(self.consume(FilteredRpmTransactionTasks), FilteredRpmTransactionTasks()) +- target_userspace_info = next(self.consume(TargetUserSpaceInfo), None) +- +- dnfplugin.perform_transaction_install( +- tasks=tasks, used_repos=used_repos, storage_info=storage_info, target_userspace_info=target_userspace_info, +- plugin_info=plugin_info +- ) +- self.produce(TransactionCompleted()) +- userspace = next(self.consume(TargetUserSpaceInfo), None) +- if userspace: +- try: +- shutil.rmtree(userspace.path) +- except EnvironmentError: +- self.log.info("Failed to remove temporary userspace - error ignored", exc_info=True) ++ try: ++ src_rhsm_info = next(self.consume(RHSMInfo), None) ++ if src_rhsm_info: ++ for prod_cert in src_rhsm_info.existing_product_certificates: ++ run(['rm', '-f', prod_cert]) ++ ++ used_repos = self.consume(UsedTargetRepositories) ++ storage_info = next(self.consume(StorageInfo), None) ++ plugin_info = list(self.consume(DNFPluginTask)) ++ tasks = next(self.consume(FilteredRpmTransactionTasks), FilteredRpmTransactionTasks()) ++ target_userspace_info = next(self.consume(TargetUserSpaceInfo), None) ++ ++ dnfplugin.perform_transaction_install( ++ tasks=tasks, used_repos=used_repos, storage_info=storage_info, target_userspace_info=target_userspace_info, ++ plugin_info=plugin_info ++ ) ++ self.produce(TransactionCompleted()) ++ userspace = next(self.consume(TargetUserSpaceInfo), None) ++ if userspace: ++ try: ++ shutil.rmtree(userspace.path) ++ except EnvironmentError as e: ++ self.log.info("Failed to remove temporary userspace - error ignored", exc_info=True) ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/dnfupgradetransaction/libraries/dnfupgradetransaction.py b/repos/system_upgrade/el7toel8/actors/dnfupgradetransaction/libraries/dnfupgradetransaction.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/dnfupgradetransaction/libraries/dnfupgradetransaction.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/firewalldupdatelockdownwhitelist/actor.py b/repos/system_upgrade/el7toel8/actors/firewalldupdatelockdownwhitelist/actor.py +index 129d077..165ea32 100644 +--- a/repos/system_upgrade/el7toel8/actors/firewalldupdatelockdownwhitelist/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/firewalldupdatelockdownwhitelist/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.firewalldupdatelockdownwhitelist import smc_macros + import xml.etree.ElementTree as ElementTree + + from leapp.actors import Actor +@@ -24,16 +25,19 @@ class FirewalldUpdateLockdownWhitelist(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- for facts in self.consume(FirewalldFacts): +- if facts.firewall_config_command: +- tree = ElementTree.parse('/etc/firewalld/lockdown-whitelist.xml') +- root = tree.getroot() +- +- need_write = firewalldupdatelockdownwhitelist.updateFirewallConfigCommand( +- root, +- facts.firewall_config_command +- ) +- +- if need_write: +- tree.write('/etc/firewalld/lockdown-whitelist.xml') +- self.log.info('Updated lockdown whitelist') ++ try: ++ for facts in self.consume(FirewalldFacts): ++ if facts.firewall_config_command: ++ tree = ElementTree.parse('/etc/firewalld/lockdown-whitelist.xml') ++ root = tree.getroot() ++ ++ need_write = firewalldupdatelockdownwhitelist.updateFirewallConfigCommand( ++ root, ++ facts.firewall_config_command ++ ) ++ ++ if need_write: ++ tree.write('/etc/firewalld/lockdown-whitelist.xml') ++ self.log.info('Updated lockdown whitelist') ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/firewalldupdatelockdownwhitelist/libraries/firewalldupdatelockdownwhitelist.py b/repos/system_upgrade/el7toel8/actors/firewalldupdatelockdownwhitelist/libraries/firewalldupdatelockdownwhitelist.py +index 1241778..34f352d 100644 +--- a/repos/system_upgrade/el7toel8/actors/firewalldupdatelockdownwhitelist/libraries/firewalldupdatelockdownwhitelist.py ++++ b/repos/system_upgrade/el7toel8/actors/firewalldupdatelockdownwhitelist/libraries/firewalldupdatelockdownwhitelist.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + def updateFirewallConfigCommand(root, old_command): + changed = False + +diff --git a/repos/system_upgrade/el7toel8/actors/forcedefaultboottotargetkernelversion/actor.py b/repos/system_upgrade/el7toel8/actors/forcedefaultboottotargetkernelversion/actor.py +index 732fba0..aeeb5d8 100644 +--- a/repos/system_upgrade/el7toel8/actors/forcedefaultboottotargetkernelversion/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/forcedefaultboottotargetkernelversion/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.forcedefaultboottotargetkernelversion import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import forcedefaultboot + from leapp.models import InstalledTargetKernelVersion +@@ -19,4 +20,7 @@ class ForceDefaultBootToTargetKernelVersion(Actor): + tags = (FinalizationPhaseTag, IPUWorkflowTag) + + def process(self): +- forcedefaultboot.process() ++ try: ++ forcedefaultboot.process() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/forcedefaultboottotargetkernelversion/libraries/forcedefaultboottotargetkernelversion.py b/repos/system_upgrade/el7toel8/actors/forcedefaultboottotargetkernelversion/libraries/forcedefaultboottotargetkernelversion.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/forcedefaultboottotargetkernelversion/libraries/forcedefaultboottotargetkernelversion.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/initramdiskgenerator/actor.py b/repos/system_upgrade/el7toel8/actors/initramdiskgenerator/actor.py +index d53c048..0456308 100644 +--- a/repos/system_upgrade/el7toel8/actors/initramdiskgenerator/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/initramdiskgenerator/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.initramdiskgenerator import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import initramgen + from leapp.models import (BootContent, RequiredUpgradeInitramPackages, TargetUserSpaceInfo, UpgradeDracutModule, +@@ -21,4 +22,7 @@ class InitramDiskGenerator(Actor): + tags = (IPUWorkflowTag, InterimPreparationPhaseTag) + + def process(self): +- initramgen.process() ++ try: ++ initramgen.process() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/initramdiskgenerator/libraries/initramdiskgenerator.py b/repos/system_upgrade/el7toel8/actors/initramdiskgenerator/libraries/initramdiskgenerator.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/initramdiskgenerator/libraries/initramdiskgenerator.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/initrdinclude/actor.py b/repos/system_upgrade/el7toel8/actors/initrdinclude/actor.py +index beb0fd9..65277f2 100644 +--- a/repos/system_upgrade/el7toel8/actors/initrdinclude/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/initrdinclude/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.initrdinclude import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import initrdinclude + from leapp.models import InitrdIncludes, InstalledTargetKernelVersion +@@ -15,4 +16,7 @@ class InitrdInclude(Actor): + tags = (FinalizationPhaseTag, IPUWorkflowTag) + + def process(self): +- initrdinclude.process() ++ try: ++ initrdinclude.process() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/initrdinclude/libraries/initrdinclude.py b/repos/system_upgrade/el7toel8/actors/initrdinclude/libraries/initrdinclude.py +index 0453c99..d9defed 100644 +--- a/repos/system_upgrade/el7toel8/actors/initrdinclude/libraries/initrdinclude.py ++++ b/repos/system_upgrade/el7toel8/actors/initrdinclude/libraries/initrdinclude.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + from leapp.exceptions import StopActorExecutionError + from leapp.libraries.stdlib import api, CalledProcessError, run + from leapp.models import InitrdIncludes, InstalledTargetKernelVersion +diff --git a/repos/system_upgrade/el7toel8/actors/kernelcmdlineconfig/actor.py b/repos/system_upgrade/el7toel8/actors/kernelcmdlineconfig/actor.py +index dff52f0..13a4481 100644 +--- a/repos/system_upgrade/el7toel8/actors/kernelcmdlineconfig/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/kernelcmdlineconfig/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.kernelcmdlineconfig import smc_macros + import os + + from leapp.actors import Actor +@@ -18,15 +19,18 @@ class KernelCmdlineConfig(Actor): + tags = (FinalizationPhaseTag, IPUWorkflowTag) + + def process(self): +- +- configs = None +- ff = next(self.consume(FirmwareFacts), None) +- if not ff: +- raise StopActorExecutionError( +- 'Could not identify system firmware', +- details={'details': 'Actor did not receive FirmwareFacts message.'} +- ) +- +- if ff.firmware == 'bios' and os.path.ismount('/boot/efi'): +- configs = ['/boot/grub2/grub.cfg', '/boot/efi/EFI/redhat/grub.cfg'] +- kernelcmdlineconfig.process(configs) ++ try: ++ ++ configs = None ++ ff = next(self.consume(FirmwareFacts), None) ++ if not ff: ++ raise StopActorExecutionError( ++ 'Could not identify system firmware', ++ details={'details': 'Actor did not receive FirmwareFacts message.'} ++ ) ++ ++ if ff.firmware == 'bios' and os.path.ismount('/boot/efi'): ++ configs = ['/boot/grub2/grub.cfg', '/boot/efi/EFI/redhat/grub.cfg'] ++ kernelcmdlineconfig.process(configs) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py b/repos/system_upgrade/el7toel8/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py +index 1b680d3..cbd1e8c 100644 +--- a/repos/system_upgrade/el7toel8/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py ++++ b/repos/system_upgrade/el7toel8/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + from leapp.exceptions import StopActorExecutionError + from leapp.libraries import stdlib + from leapp.libraries.common.config import architecture +diff --git a/repos/system_upgrade/el7toel8/actors/migratebrltty/actor.py b/repos/system_upgrade/el7toel8/actors/migratebrltty/actor.py +index 6d740e0..367df78 100644 +--- a/repos/system_upgrade/el7toel8/actors/migratebrltty/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/migratebrltty/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.migratebrltty import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import migratebrltty + from leapp.models import BrlttyMigrationDecision +@@ -17,23 +18,26 @@ class MigrateBrltty(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- for decision in self.consume(BrlttyMigrationDecision): +- report_summary = '' +- migratebrltty.migrate_file(decision.migrate_file, decision.migrate_bt, decision.migrate_espeak) +- if decision.migrate_bt: +- report_summary = 'Unsupported aliases for bluetooth devices (\'bth:\' and \'bluez:\') was ' +- report_summary += 'renamed to \'bluetooth:\' in {}' +- report_summary = report_summary.format(', '.join(decision.migrate_file)) +- if decision.migrate_espeak: +- if report_summary: +- report_summary += '\n' +- report_summary += 'eSpeak speech driver was switched to eSpeak-NG in {}' +- report_summary = report_summary.format(', '.join(decision.migrate_file)) +- if decision.migrate_bt or decision.migrate_espeak: +- create_report([ +- reporting.Title('brltty configuration files migrated'), +- reporting.Summary(report_summary), +- reporting.Severity(reporting.Severity.LOW), +- reporting.Tags([reporting.Tags.TOOLS, reporting.Tags.ACCESSIBILITY]), +- reporting.RelatedResource('package', 'brltty') +- ]) ++ try: ++ for decision in self.consume(BrlttyMigrationDecision): ++ report_summary = '' ++ migratebrltty.migrate_file(decision.migrate_file, decision.migrate_bt, decision.migrate_espeak) ++ if decision.migrate_bt: ++ report_summary = 'Unsupported aliases for bluetooth devices (\'bth:\' and \'bluez:\') was ' ++ report_summary += 'renamed to \'bluetooth:\' in {}' ++ report_summary = report_summary.format(', '.join(decision.migrate_file)) ++ if decision.migrate_espeak: ++ if report_summary: ++ report_summary += '\n' ++ report_summary += 'eSpeak speech driver was switched to eSpeak-NG in {}' ++ report_summary = report_summary.format(', '.join(decision.migrate_file)) ++ if decision.migrate_bt or decision.migrate_espeak: ++ create_report([ ++ reporting.Title('brltty configuration files migrated'), ++ reporting.Summary(report_summary), ++ reporting.Severity(reporting.Severity.LOW), ++ reporting.Tags([reporting.Tags.TOOLS, reporting.Tags.ACCESSIBILITY]), ++ reporting.RelatedResource('package', 'brltty') ++ ]) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/migratebrltty/libraries/migratebrltty.py b/repos/system_upgrade/el7toel8/actors/migratebrltty/libraries/migratebrltty.py +index 3c18a55..a3e2e6a 100644 +--- a/repos/system_upgrade/el7toel8/actors/migratebrltty/libraries/migratebrltty.py ++++ b/repos/system_upgrade/el7toel8/actors/migratebrltty/libraries/migratebrltty.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + import re + import shutil + +diff --git a/repos/system_upgrade/el7toel8/actors/migratentp/actor.py b/repos/system_upgrade/el7toel8/actors/migratentp/actor.py +index 704f3db..1fcd669 100644 +--- a/repos/system_upgrade/el7toel8/actors/migratentp/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/migratentp/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.migratentp import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor.migratentp import migrate_ntp + from leapp.models import Report, NtpMigrationDecision +@@ -15,5 +16,8 @@ class MigrateNtp(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- for decision in self.consume(NtpMigrationDecision): +- migrate_ntp(decision.migrate_services, decision.config_tgz64) ++ try: ++ for decision in self.consume(NtpMigrationDecision): ++ migrate_ntp(decision.migrate_services, decision.config_tgz64) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/migratentp/libraries/migratentp.py b/repos/system_upgrade/el7toel8/actors/migratentp/libraries/migratentp.py +index 4bba6f5..3b3ace3 100644 +--- a/repos/system_upgrade/el7toel8/actors/migratentp/libraries/migratentp.py ++++ b/repos/system_upgrade/el7toel8/actors/migratentp/libraries/migratentp.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + import base64 + import io + import tarfile +diff --git a/repos/system_upgrade/el7toel8/actors/migratesendmail/actor.py b/repos/system_upgrade/el7toel8/actors/migratesendmail/actor.py +index 63c2b88..1b8f398 100644 +--- a/repos/system_upgrade/el7toel8/actors/migratesendmail/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/migratesendmail/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.migratesendmail import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import migratesendmail + from leapp.models import SendmailMigrationDecision +@@ -17,18 +18,21 @@ class MigrateSendmail(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- decision = next(self.consume(SendmailMigrationDecision), None) +- if not decision or not decision.migrate_files: +- return +- +- for f in decision.migrate_files: +- migratesendmail.migrate_file(f) +- list_separator_fmt = '\n - ' +- create_report([ +- reporting.Title('sendmail configuration files migrated'), +- reporting.Summary( +- 'Uncompressed IPv6 addresses in {}'.format(list_separator_fmt.join(decision.migrate_files)) +- ), +- reporting.Severity(reporting.Severity.LOW), +- reporting.Tags([reporting.Tags.SERVICES, reporting.Tags.EMAIL]) +- ]) ++ try: ++ decision = next(self.consume(SendmailMigrationDecision), None) ++ if not decision or not decision.migrate_files: ++ return ++ ++ for f in decision.migrate_files: ++ migratesendmail.migrate_file(f) ++ list_separator_fmt = '\n - ' ++ create_report([ ++ reporting.Title('sendmail configuration files migrated'), ++ reporting.Summary( ++ 'Uncompressed IPv6 addresses in {}'.format(list_separator_fmt.join(decision.migrate_files)) ++ ), ++ reporting.Severity(reporting.Severity.LOW), ++ reporting.Tags([reporting.Tags.SERVICES, reporting.Tags.EMAIL]) ++ ]) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/migratesendmail/libraries/migratesendmail.py b/repos/system_upgrade/el7toel8/actors/migratesendmail/libraries/migratesendmail.py +index b2665f8..a0c0fd6 100644 +--- a/repos/system_upgrade/el7toel8/actors/migratesendmail/libraries/migratesendmail.py ++++ b/repos/system_upgrade/el7toel8/actors/migratesendmail/libraries/migratesendmail.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + import ipaddress + import os + import re +diff --git a/repos/system_upgrade/el7toel8/actors/multipathconfupdate/actor.py b/repos/system_upgrade/el7toel8/actors/multipathconfupdate/actor.py +index 3f36878..6655bf4 100644 +--- a/repos/system_upgrade/el7toel8/actors/multipathconfupdate/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/multipathconfupdate/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.multipathconfupdate import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import multipathconfupdate + from leapp.models import MultipathConfFacts +@@ -21,9 +22,12 @@ class MultipathConfUpdate(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- facts = next(self.consume(MultipathConfFacts), None) +- if facts is None: +- self.log.debug('Skipping execution. No MultipathConfFacts has ' +- 'been produced') +- return +- multipathconfupdate.update_configs(facts) ++ try: ++ facts = next(self.consume(MultipathConfFacts), None) ++ if facts is None: ++ self.log.debug('Skipping execution. No MultipathConfFacts has ' ++ 'been produced') ++ return ++ multipathconfupdate.update_configs(facts) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/multipathconfupdate/libraries/multipathconfupdate.py b/repos/system_upgrade/el7toel8/actors/multipathconfupdate/libraries/multipathconfupdate.py +index b03127b..50a72c3 100644 +--- a/repos/system_upgrade/el7toel8/actors/multipathconfupdate/libraries/multipathconfupdate.py ++++ b/repos/system_upgrade/el7toel8/actors/multipathconfupdate/libraries/multipathconfupdate.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + import re + + from leapp.libraries.common import multipathutil +diff --git a/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconfig/actor.py b/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconfig/actor.py +index 47ab4ea..6b693ac 100644 +--- a/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconfig/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconfig/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.networkmanagerupdateconfig import smc_macros + from leapp.actors import Actor + from leapp.models import NetworkManagerConfig + from leapp.tags import ApplicationsPhaseTag, IPUWorkflowTag +@@ -25,13 +26,17 @@ class NetworkManagerUpdateConfig(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- for nm_config in self.consume(NetworkManagerConfig): +- self.log.info('Consuming dhcp={}'.format(nm_config.dhcp)) +- if nm_config.dhcp == '': +- try: +- with open(snippet_path, 'w') as f: +- f.write(snippet_data) +- self.log.info('Written the following to {}:\n{}\n'.format(snippet_path, snippet_data)) +- except IOError as e: +- self.log.warning('Write error: {}'.format(e)) +- break ++ try: ++ for nm_config in self.consume(NetworkManagerConfig): ++ self.log.info('Consuming dhcp={}'.format(nm_config.dhcp)) ++ if nm_config.dhcp == '': ++ try: ++ with open(snippet_path, 'w') as f: ++ f.write(snippet_data) ++ self.log.info('Written the following to {}:\n{}\n'.format(snippet_path, snippet_data)) ++ except IOError as e: ++ self.log.warning('Write error: {}'.format(e)) ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) ++ break ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconfig/libraries/networkmanagerupdateconfig.py b/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconfig/libraries/networkmanagerupdateconfig.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconfig/libraries/networkmanagerupdateconfig.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconnections/actor.py b/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconnections/actor.py +index 5998889..45103db 100644 +--- a/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconnections/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconnections/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.networkmanagerupdateconnections import smc_macros + from leapp.actors import Actor + from leapp.libraries.stdlib import CalledProcessError, run + from leapp.models import NetworkManagerConfig +@@ -20,15 +21,19 @@ class NetworkManagerUpdateConnections(Actor): + tags = (FirstBootPhaseTag, IPUWorkflowTag) + + def process(self): +- for nm_config in self.consume(NetworkManagerConfig): +- if nm_config.dhcp != '' and nm_config.dhcp != 'dhclient': +- self.log.info('DHCP client is "{}", nothing to do'.format(nm_config.dhcp)) +- return ++ try: ++ for nm_config in self.consume(NetworkManagerConfig): ++ if nm_config.dhcp != '' and nm_config.dhcp != 'dhclient': ++ self.log.info('DHCP client is "{}", nothing to do'.format(nm_config.dhcp)) ++ return + +- try: +- r = run(['/usr/bin/python3', 'tools/nm-update-client-ids.py'])['stdout'] +- self.log.info('Updated client-ids: {}'.format(r)) +- except (OSError, CalledProcessError) as e: +- self.log.warning('Error calling nm-update-client-ids script: {}'.format(e)) ++ try: ++ r = run(['/usr/bin/python3', 'tools/nm-update-client-ids.py'])['stdout'] ++ self.log.info('Updated client-ids: {}'.format(r)) ++ except (OSError, CalledProcessError) as e: ++ self.log.warning('Error calling nm-update-client-ids script: {}'.format(e)) ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) + +- break ++ break ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconnections/libraries/networkmanagerupdateconnections.py b/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconnections/libraries/networkmanagerupdateconnections.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/networkmanagerupdateconnections/libraries/networkmanagerupdateconnections.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/networkmanagerupdateservice/actor.py b/repos/system_upgrade/el7toel8/actors/networkmanagerupdateservice/actor.py +index cb581df..6cd1119 100644 +--- a/repos/system_upgrade/el7toel8/actors/networkmanagerupdateservice/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/networkmanagerupdateservice/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.networkmanagerupdateservice import smc_macros + from leapp.actors import Actor + from leapp.libraries.stdlib import CalledProcessError, run + from leapp.tags import ApplicationsPhaseTag, IPUWorkflowTag +@@ -22,23 +23,27 @@ class NetworkManagerUpdateService(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- nm_enabled = self.unit_enabled('NetworkManager.service') +- nmwo_enabled = self.unit_enabled('NetworkManager-wait-online.service') +- self.log_services_state('initial', nm_enabled, nmwo_enabled) +- +- if not nm_enabled and nmwo_enabled: +- self.log.info('Disabling NetworkManager-wait-online.service') +- +- try: +- run(['systemctl', 'disable', 'NetworkManager-wait-online.service']) +- except (OSError, CalledProcessError) as e: +- self.log.warning('Error disabling NetworkManager-wait-online.service: {}'.format(e)) +- return +- ++ try: + nm_enabled = self.unit_enabled('NetworkManager.service') + nmwo_enabled = self.unit_enabled('NetworkManager-wait-online.service') +- self.log_services_state('after upgrade', nm_enabled, nmwo_enabled) +- ++ self.log_services_state('initial', nm_enabled, nmwo_enabled) ++ ++ if not nm_enabled and nmwo_enabled: ++ self.log.info('Disabling NetworkManager-wait-online.service') ++ ++ try: ++ run(['systemctl', 'disable', 'NetworkManager-wait-online.service']) ++ except (OSError, CalledProcessError) as e: ++ self.log.warning('Error disabling NetworkManager-wait-online.service: {}'.format(e)) ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) ++ return ++ ++ nm_enabled = self.unit_enabled('NetworkManager.service') ++ nmwo_enabled = self.unit_enabled('NetworkManager-wait-online.service') ++ self.log_services_state('after upgrade', nm_enabled, nmwo_enabled) ++ ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) + def log_services_state(self, detail, nm, nmwo): + self.log.info('Services state ({}):'.format(detail)) + self.log.info(' - NetworkManager : {}'.format('enabled' if nm else 'disabled')) +diff --git a/repos/system_upgrade/el7toel8/actors/networkmanagerupdateservice/libraries/networkmanagerupdateservice.py b/repos/system_upgrade/el7toel8/actors/networkmanagerupdateservice/libraries/networkmanagerupdateservice.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/networkmanagerupdateservice/libraries/networkmanagerupdateservice.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/persistentnetnamesconfig/actor.py b/repos/system_upgrade/el7toel8/actors/persistentnetnamesconfig/actor.py +index 7f746a9..a7f7a29 100644 +--- a/repos/system_upgrade/el7toel8/actors/persistentnetnamesconfig/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/persistentnetnamesconfig/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.persistentnetnamesconfig import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import persistentnetnamesconfig + from leapp.models import ( +@@ -24,4 +25,7 @@ class PersistentNetNamesConfig(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- persistentnetnamesconfig.process() ++ try: ++ persistentnetnamesconfig.process() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py b/repos/system_upgrade/el7toel8/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py +index db0f212..e069de4 100644 +--- a/repos/system_upgrade/el7toel8/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py ++++ b/repos/system_upgrade/el7toel8/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + import errno + import os + import re +diff --git a/repos/system_upgrade/el7toel8/actors/persistentnetnamesinitramfs/actor.py b/repos/system_upgrade/el7toel8/actors/persistentnetnamesinitramfs/actor.py +index 2757c68..7516a9f 100644 +--- a/repos/system_upgrade/el7toel8/actors/persistentnetnamesinitramfs/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/persistentnetnamesinitramfs/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.persistentnetnamesinitramfs import smc_macros + from leapp.actors import Actor + from leapp.libraries.common import persistentnetnames + from leapp.models import PersistentNetNamesFactsInitramfs +@@ -17,4 +18,7 @@ class PersistentNetNamesInitramfs(Actor): + tags = (LateTestsPhaseTag, IPUWorkflowTag) + + def process(self): +- self.produce(PersistentNetNamesFactsInitramfs(interfaces=list(persistentnetnames.interfaces()))) ++ try: ++ self.produce(PersistentNetNamesFactsInitramfs(interfaces=list(persistentnetnames.interfaces()))) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/persistentnetnamesinitramfs/libraries/persistentnetnamesinitramfs.py b/repos/system_upgrade/el7toel8/actors/persistentnetnamesinitramfs/libraries/persistentnetnamesinitramfs.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/persistentnetnamesinitramfs/libraries/persistentnetnamesinitramfs.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/preparepythonworkround/actor.py b/repos/system_upgrade/el7toel8/actors/preparepythonworkround/actor.py +index 94e772d..1238b70 100644 +--- a/repos/system_upgrade/el7toel8/actors/preparepythonworkround/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/preparepythonworkround/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.preparepythonworkround import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor.workaround import apply_python3_workaround + from leapp.tags import IPUWorkflowTag, RPMUpgradePhaseTag +@@ -19,4 +20,7 @@ class PreparePythonWorkround(Actor): + tags = (IPUWorkflowTag, RPMUpgradePhaseTag) + + def process(self): +- apply_python3_workaround() ++ try: ++ apply_python3_workaround() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/preparepythonworkround/libraries/preparepythonworkround.py b/repos/system_upgrade/el7toel8/actors/preparepythonworkround/libraries/preparepythonworkround.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/preparepythonworkround/libraries/preparepythonworkround.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/prepareyumconfig/actor.py b/repos/system_upgrade/el7toel8/actors/prepareyumconfig/actor.py +index c30ab6d..d1cf630 100644 +--- a/repos/system_upgrade/el7toel8/actors/prepareyumconfig/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/prepareyumconfig/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.prepareyumconfig import smc_macros + from leapp.actors import Actor + from leapp.libraries.common import utils + from leapp.tags import IPUWorkflowTag, PreparationPhaseTag +@@ -19,4 +20,7 @@ class Prepareyumconfig(Actor): + tags = (IPUWorkflowTag, PreparationPhaseTag) + + def process(self): +- utils.apply_yum_workaround() ++ try: ++ utils.apply_yum_workaround() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/prepareyumconfig/libraries/prepareyumconfig.py b/repos/system_upgrade/el7toel8/actors/prepareyumconfig/libraries/prepareyumconfig.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/prepareyumconfig/libraries/prepareyumconfig.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/progresstrigger/actor.py b/repos/system_upgrade/el7toel8/actors/progresstrigger/actor.py +new file mode 100644 +index 0000000..f545b4e +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/progresstrigger/actor.py +@@ -0,0 +1,26 @@ ++from leapp.workflows import get_workflows ++from leapp.actors import Actor ++from leapp import tags ++from leapp.libraries.actor.progresstrigger import smc_macros ++ ++ ++class ProgressTrigger(Actor): ++ """ ++ Trigger a progress recored. ++ """ ++ ++ name = 'progress_trigger' ++ consumes = () ++ produces = () ++ tags = (tags.IPUWorkflowTag, tags.ConfigurationCollectionPhaseTag, ) ++ ++ def process(self): ++ current = smc_macros.get_current_workflow() ++ all_phases = smc_macros.get_phases_from_workflow(current) ++ phase = all_phases[0] ++ progress = 1.0 / len(all_phases) * 100 ++ progress_info = phase.name ++ err_no = 0 ++ err_msg = "running" ++ ++ smc_macros.init_progress_infomation(progress, progress_info, err_no, err_msg) +diff --git a/repos/system_upgrade/el7toel8/actors/progresstrigger/libraries/progresstrigger.py b/repos/system_upgrade/el7toel8/actors/progresstrigger/libraries/progresstrigger.py +new file mode 100644 +index 0000000..daf6477 +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/progresstrigger/libraries/progresstrigger.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +diff --git a/repos/system_upgrade/el7toel8/actors/progressupdater/actor.py b/repos/system_upgrade/el7toel8/actors/progressupdater/actor.py +new file mode 100644 +index 0000000..b87e2cd +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/progressupdater/actor.py +@@ -0,0 +1,59 @@ ++from leapp.workflows import get_workflows ++from leapp.actors import Actor ++from leapp.libraries.actor.progressupdater import smc_macros ++ ++from leapp import tags ++import time ++ ++ ++class ProgressUpdater(Actor): ++ """ ++ Report current migration state. ++ """ ++ ++ name = 'progress_updater' ++ consumes = () ++ produces = () ++ ++ phase = 1 ++ tags = ( ++ tags.IPUWorkflowTag, ++ tags.ApplicationsPhaseTag, ++ tags.ChecksPhaseTag, ++ tags.ConfigurationSynchronizationPhaseTag, ++ tags.DownloadPhaseTag, ++ tags.FactsPhaseTag, ++ tags.FinalizationPhaseTag, ++ tags.FirstBootPhaseTag, ++ tags.InitRamStartPhaseTag, ++ tags.InterimPreparationPhaseTag, ++ tags.LateTestsPhaseTag, ++ tags.PreparationPhaseTag, ++ tags.RPMUpgradePhaseTag, ++ tags.ReportPhaseTag, ++ tags.TargetTransactionChecksPhaseTag, ++ tags.TargetTransactionFactsPhaseTag, ++ tags.ThirdPartyApplicationsPhaseTag ++ ) ++ ++ ++ def process(self): ++ current = smc_macros.get_current_workflow() ++ all_phases = smc_macros.get_phases_from_workflow(current) ++ ++ state = smc_macros.load_log_status() ++ last_phase = state['ProgressInfo'] ++ ++ for i, phase in enumerate(all_phases): ++ if phase.name == last_phase: ++ i += 1 ++ current_phase = all_phases[i] ++ break ++ ++ progress = int((float(current_phase.get_index()) - all_phases[0].get_index() + 1) / len(all_phases) * 100) ++ progress_info = current_phase.name ++ err_no = 0 ++ err_msg = "running" if progress < 100 else "done" ++ ++ smc_macros.update_progress_infomation(progress, progress_info, err_no, err_msg) ++ +diff --git a/repos/system_upgrade/el7toel8/actors/progressupdater/libraries/progressupdater.py b/repos/system_upgrade/el7toel8/actors/progressupdater/libraries/progressupdater.py +new file mode 100644 +index 0000000..daf6477 +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/progressupdater/libraries/progressupdater.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +diff --git a/repos/system_upgrade/el7toel8/actors/quaggatofrr/actor.py b/repos/system_upgrade/el7toel8/actors/quaggatofrr/actor.py +index 212b5b5..51d34b7 100644 +--- a/repos/system_upgrade/el7toel8/actors/quaggatofrr/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/quaggatofrr/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.quaggatofrr import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor.quaggatofrr import process_facts + from leapp.models import QuaggaToFrrFacts +@@ -17,7 +18,10 @@ class QuaggaToFrr(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- quagga_facts = next(self.consume(QuaggaToFrrFacts), None) +- +- if quagga_facts: +- process_facts(quagga_facts) ++ try: ++ quagga_facts = next(self.consume(QuaggaToFrrFacts), None) ++ ++ if quagga_facts: ++ process_facts(quagga_facts) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/quaggatofrr/libraries/quaggatofrr.py b/repos/system_upgrade/el7toel8/actors/quaggatofrr/libraries/quaggatofrr.py +index e2b82a2..f299051 100644 +--- a/repos/system_upgrade/el7toel8/actors/quaggatofrr/libraries/quaggatofrr.py ++++ b/repos/system_upgrade/el7toel8/actors/quaggatofrr/libraries/quaggatofrr.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + import os + import re + import shutil +diff --git a/repos/system_upgrade/el7toel8/actors/removebootfiles/actor.py b/repos/system_upgrade/el7toel8/actors/removebootfiles/actor.py +index 76aab8d..420f637 100644 +--- a/repos/system_upgrade/el7toel8/actors/removebootfiles/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/removebootfiles/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.removebootfiles import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor.removebootfiles import remove_boot_files + from leapp.models import BootContent +@@ -18,4 +19,7 @@ class RemoveBootFiles(Actor): + tags = (IPUWorkflowTag, PreparationPhaseTag) + + def process(self): +- remove_boot_files() ++ try: ++ remove_boot_files() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/removebootfiles/libraries/removebootfiles.py b/repos/system_upgrade/el7toel8/actors/removebootfiles/libraries/removebootfiles.py +index adcf544..93c0387 100644 +--- a/repos/system_upgrade/el7toel8/actors/removebootfiles/libraries/removebootfiles.py ++++ b/repos/system_upgrade/el7toel8/actors/removebootfiles/libraries/removebootfiles.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + import os + + from leapp.libraries.stdlib import api +diff --git a/repos/system_upgrade/el7toel8/actors/removeleftoverpackages/actor.py b/repos/system_upgrade/el7toel8/actors/removeleftoverpackages/actor.py +index b01599a..3f5c4dd 100644 +--- a/repos/system_upgrade/el7toel8/actors/removeleftoverpackages/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/removeleftoverpackages/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.removeleftoverpackages import smc_macros + from leapp.actors import Actor + from leapp.libraries import stdlib + from leapp.libraries.common import rhsm +@@ -21,36 +22,40 @@ class RemoveLeftoverPackages(Actor): + tags = (RPMUpgradePhaseTag, IPUWorkflowTag, ExperimentalTag) + + def process(self): +- leftover_packages = next(self.consume(LeftoverPackages), LeftoverPackages()) +- if not leftover_packages.items: +- self.log.info('No leftover packages, skipping...') +- return +- +- installed_rpms = get_installed_rpms() +- +- to_remove = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in leftover_packages.items] +- cmd = ['dnf', 'remove', '-y', '--noautoremove'] + to_remove +- if rhsm.skip_rhsm(): +- # ensure we don't use suscription-manager when it should be skipped +- cmd += ['--disableplugin', 'subscription-manager'] + try: +- stdlib.run(cmd) +- except stdlib.CalledProcessError: +- error = 'Failed to remove packages: {}'.format(', '.join(to_remove)) +- self.log.error(error) +- return +- +- removed_packages = RemovedPackages() +- removed = list(set(installed_rpms) - set(get_installed_rpms())) +- for pkg in removed: +- name, version, release, epoch, packager, arch, pgpsig = pkg.split('|') +- removed_packages.items.append(RPM( +- name=name, +- version=version, +- epoch=epoch, +- packager=packager, +- arch=arch, +- release=release, +- pgpsig=pgpsig +- )) +- self.produce(removed_packages) ++ leftover_packages = next(self.consume(LeftoverPackages), LeftoverPackages()) ++ if not leftover_packages.items: ++ self.log.info('No leftover packages, skipping...') ++ return ++ ++ installed_rpms = get_installed_rpms() ++ ++ to_remove = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in leftover_packages.items] ++ cmd = ['dnf', 'remove', '-y', '--noautoremove'] + to_remove ++ if rhsm.skip_rhsm(): ++ # ensure we don't use suscription-manager when it should be skipped ++ cmd += ['--disableplugin', 'subscription-manager'] ++ try: ++ stdlib.run(cmd) ++ except stdlib.CalledProcessError: ++ error = 'Failed to remove packages: {}'.format(', '.join(to_remove)) ++ self.log.error(error) ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(error))) ++ return ++ ++ removed_packages = RemovedPackages() ++ removed = list(set(installed_rpms) - set(get_installed_rpms())) ++ for pkg in removed: ++ name, version, release, epoch, packager, arch, pgpsig = pkg.split('|') ++ removed_packages.items.append(RPM( ++ name=name, ++ version=version, ++ epoch=epoch, ++ packager=packager, ++ arch=arch, ++ release=release, ++ pgpsig=pgpsig ++ )) ++ self.produce(removed_packages) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/removeleftoverpackages/libraries/removeleftoverpackages.py b/repos/system_upgrade/el7toel8/actors/removeleftoverpackages/libraries/removeleftoverpackages.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/removeleftoverpackages/libraries/removeleftoverpackages.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/removeoldpammodulesapply/actor.py b/repos/system_upgrade/el7toel8/actors/removeoldpammodulesapply/actor.py +index 60f6761..69ab3a8 100644 +--- a/repos/system_upgrade/el7toel8/actors/removeoldpammodulesapply/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/removeoldpammodulesapply/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.removeoldpammodulesapply import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor.removeoldpammodulesapply import comment_modules, read_file + from leapp.libraries.common.pam import PAM +@@ -17,12 +18,15 @@ class RemoveOldPAMModulesApply(Actor): + tags = (IPUWorkflowTag, PreparationPhaseTag) + + def process(self): +- for model in self.consume(RemovedPAMModules): +- for path in PAM.files: +- content = read_file(path) +- if not content: # Nothing to do if no content? +- continue +- +- with open(path, 'w') as f: +- f.write(comment_modules(model.modules, content)) +- break ++ try: ++ for model in self.consume(RemovedPAMModules): ++ for path in PAM.files: ++ content = read_file(path) ++ if not content: # Nothing to do if no content? ++ continue ++ ++ with open(path, 'w') as f: ++ f.write(comment_modules(model.modules, content)) ++ break ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/removeoldpammodulesapply/libraries/removeoldpammodulesapply.py b/repos/system_upgrade/el7toel8/actors/removeoldpammodulesapply/libraries/removeoldpammodulesapply.py +index 8fd3e13..bdc1105 100644 +--- a/repos/system_upgrade/el7toel8/actors/removeoldpammodulesapply/libraries/removeoldpammodulesapply.py ++++ b/repos/system_upgrade/el7toel8/actors/removeoldpammodulesapply/libraries/removeoldpammodulesapply.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + import os + import re + +diff --git a/repos/system_upgrade/el7toel8/actors/removeresumeservice/actor.py b/repos/system_upgrade/el7toel8/actors/removeresumeservice/actor.py +index c69816d..752003e 100644 +--- a/repos/system_upgrade/el7toel8/actors/removeresumeservice/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/removeresumeservice/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.removeresumeservice import smc_macros + import os + import errno + +@@ -21,20 +22,24 @@ class RemoveSystemdResumeService(Actor): + tags = (FirstBootPhaseTag.After, IPUWorkflowTag) + + def process(self): +- service_name = 'leapp_resume.service' +- if os.path.isfile('/etc/systemd/system/{}'.format(service_name)): +- run(['systemctl', 'disable', service_name]) +- try: +- os.unlink('/etc/systemd/system/{}'.format(service_name)) +- os.unlink('/etc/systemd/system/default.target.wants/{}'.format(service_name)) +- except OSError as e: +- if e.errno != errno.ENOENT: +- raise ++ try: ++ service_name = 'leapp_resume.service' ++ if os.path.isfile('/etc/systemd/system/{}'.format(service_name)): ++ run(['systemctl', 'disable', service_name]) ++ try: ++ os.unlink('/etc/systemd/system/{}'.format(service_name)) ++ os.unlink('/etc/systemd/system/default.target.wants/{}'.format(service_name)) ++ except OSError as e: ++ if e.errno != errno.ENOENT: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) ++ raise + +- create_report([ +- reporting.Title('"{}" service deleted'.format(service_name)), +- reporting.Summary( +- '"{}" was taking care of resuming upgrade process ' +- 'after the first reboot.'.format(service_name)), +- reporting.Tags([reporting.Tags.UPGRADE_PROCESS]), +- ]) ++ create_report([ ++ reporting.Title('"{}" service deleted'.format(service_name)), ++ reporting.Summary( ++ '"{}" was taking care of resuming upgrade process ' ++ 'after the first reboot.'.format(service_name)), ++ reporting.Tags([reporting.Tags.UPGRADE_PROCESS]), ++ ]) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/removeresumeservice/libraries/removeresumeservice.py b/repos/system_upgrade/el7toel8/actors/removeresumeservice/libraries/removeresumeservice.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/removeresumeservice/libraries/removeresumeservice.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/reportleftoverpackages/actor.py b/repos/system_upgrade/el7toel8/actors/reportleftoverpackages/actor.py +index 9efec79..543496f 100644 +--- a/repos/system_upgrade/el7toel8/actors/reportleftoverpackages/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/reportleftoverpackages/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.reportleftoverpackages import smc_macros + from leapp.actors import Actor + from leapp.models import LeftoverPackages, RemovedPackages + from leapp.reporting import Report, create_report +@@ -19,44 +20,47 @@ class ReportLeftoverPackages(Actor): + tags = (RPMUpgradePhaseTag, IPUWorkflowTag) + + def process(self): +- removed_packages = next(self.consume(RemovedPackages), None) +- leftover_packages = next(self.consume(LeftoverPackages), LeftoverPackages()) +- to_remove = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in leftover_packages.items] +- +- if removed_packages: +- title = 'Leftover RHEL 7 packages have been removed' +- +- if removed_packages.items: +- removed = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in removed_packages.items] +- create_report([ +- reporting.Title(title), +- reporting.Summary('Following packages have been removed:\n{}'.format('\n'.join(removed))), +- reporting.Severity(reporting.Severity.HIGH), +- reporting.Tags([reporting.Tags.SANITY]), +- ] + [reporting.RelatedResource('package', pkg.name) for pkg in removed_packages.items]) +- else: +- summary = ('Following packages have been removed:\n' +- '{}\n' +- 'Dependent packages may have been removed as well, please check that you are not missing ' +- 'any packages.\n'.format('\n'.join(to_remove))) +- +- create_report([ +- reporting.Title(title), +- reporting.Summary(summary), +- reporting.Severity(reporting.Severity.HIGH), +- reporting.Tags([reporting.Tags.SANITY]), +- ] + [reporting.RelatedResource('package', pkg.name) for pkg in leftover_packages.items]) +- return +- +- if not leftover_packages.items: +- self.log.info('No leftover packages, skipping...') +- return +- +- summary = 'Following RHEL 7 packages have not been upgraded:\n{}\n'.format('\n'.join(to_remove)) +- summary += 'Please remove these packages to keep your system in supported state.\n' +- create_report([ +- reporting.Title('Some RHEL 7 packages have not been upgraded'), +- reporting.Summary(summary), +- reporting.Severity(reporting.Severity.HIGH), +- reporting.Tags([reporting.Tags.SANITY]), +- ] + [reporting.RelatedResource('package', pkg.name) for pkg in leftover_packages.items]) ++ try: ++ removed_packages = next(self.consume(RemovedPackages), None) ++ leftover_packages = next(self.consume(LeftoverPackages), LeftoverPackages()) ++ to_remove = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in leftover_packages.items] ++ ++ if removed_packages: ++ title = 'Leftover RHEL 7 packages have been removed' ++ ++ if removed_packages.items: ++ removed = ['-'.join([pkg.name, pkg.version, pkg.release]) for pkg in removed_packages.items] ++ create_report([ ++ reporting.Title(title), ++ reporting.Summary('Following packages have been removed:\n{}'.format('\n'.join(removed))), ++ reporting.Severity(reporting.Severity.HIGH), ++ reporting.Tags([reporting.Tags.SANITY]), ++ ] + [reporting.RelatedResource('package', pkg.name) for pkg in removed_packages.items]) ++ else: ++ summary = ('Following packages have been removed:\n' ++ '{}\n' ++ 'Dependent packages may have been removed as well, please check that you are not missing ' ++ 'any packages.\n'.format('\n'.join(to_remove))) ++ ++ create_report([ ++ reporting.Title(title), ++ reporting.Summary(summary), ++ reporting.Severity(reporting.Severity.HIGH), ++ reporting.Tags([reporting.Tags.SANITY]), ++ ] + [reporting.RelatedResource('package', pkg.name) for pkg in leftover_packages.items]) ++ return ++ ++ if not leftover_packages.items: ++ self.log.info('No leftover packages, skipping...') ++ return ++ ++ summary = 'Following RHEL 7 packages have not been upgraded:\n{}\n'.format('\n'.join(to_remove)) ++ summary += 'Please remove these packages to keep your system in supported state.\n' ++ create_report([ ++ reporting.Title('Some RHEL 7 packages have not been upgraded'), ++ reporting.Summary(summary), ++ reporting.Severity(reporting.Severity.HIGH), ++ reporting.Tags([reporting.Tags.SANITY]), ++ ] + [reporting.RelatedResource('package', pkg.name) for pkg in leftover_packages.items]) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/reportleftoverpackages/libraries/reportleftoverpackages.py b/repos/system_upgrade/el7toel8/actors/reportleftoverpackages/libraries/reportleftoverpackages.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/reportleftoverpackages/libraries/reportleftoverpackages.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/sanebackendsmigrate/actor.py b/repos/system_upgrade/el7toel8/actors/sanebackendsmigrate/actor.py +index edb1f62..0d781bc 100644 +--- a/repos/system_upgrade/el7toel8/actors/sanebackendsmigrate/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/sanebackendsmigrate/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.sanebackendsmigrate import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import sanebackendsmigrate + from leapp.models import InstalledRedHatSignedRPM +@@ -18,4 +19,7 @@ class SanebackendsMigrate(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- sanebackendsmigrate.update_sane() ++ try: ++ sanebackendsmigrate.update_sane() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/sanebackendsmigrate/libraries/sanebackendsmigrate.py b/repos/system_upgrade/el7toel8/actors/sanebackendsmigrate/libraries/sanebackendsmigrate.py +index 243a787..65aff89 100644 +--- a/repos/system_upgrade/el7toel8/actors/sanebackendsmigrate/libraries/sanebackendsmigrate.py ++++ b/repos/system_upgrade/el7toel8/actors/sanebackendsmigrate/libraries/sanebackendsmigrate.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + from leapp.libraries.common.rpms import has_package + from leapp.libraries.stdlib import api + from leapp.models import InstalledRedHatSignedRPM +diff --git a/repos/system_upgrade/el7toel8/actors/scaninstalledtargetkernelversion/actor.py b/repos/system_upgrade/el7toel8/actors/scaninstalledtargetkernelversion/actor.py +index 2c57f0f..7b9f4ec 100644 +--- a/repos/system_upgrade/el7toel8/actors/scaninstalledtargetkernelversion/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/scaninstalledtargetkernelversion/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.scaninstalledtargetkernelversion import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import scankernel + from leapp.models import InstalledTargetKernelVersion, TransactionCompleted +@@ -20,4 +21,7 @@ class ScanInstalledTargetKernelVersion(Actor): + tags = (RPMUpgradePhaseTag, IPUWorkflowTag) + + def process(self): +- scankernel.process() ++ try: ++ scankernel.process() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/scaninstalledtargetkernelversion/libraries/scaninstalledtargetkernelversion.py b/repos/system_upgrade/el7toel8/actors/scaninstalledtargetkernelversion/libraries/scaninstalledtargetkernelversion.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/scaninstalledtargetkernelversion/libraries/scaninstalledtargetkernelversion.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/scheduleselinuxrelabeling/actor.py b/repos/system_upgrade/el7toel8/actors/scheduleselinuxrelabeling/actor.py +index 729a6da..5c3a652 100644 +--- a/repos/system_upgrade/el7toel8/actors/scheduleselinuxrelabeling/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/scheduleselinuxrelabeling/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.scheduleselinuxrelabeling import smc_macros + from leapp.actors import Actor + from leapp.tags import FinalizationPhaseTag, IPUWorkflowTag + from leapp.models import SelinuxRelabelDecision +@@ -23,29 +24,33 @@ class ScheduleSeLinuxRelabeling(Actor): + tags = (FinalizationPhaseTag, IPUWorkflowTag) + + def process(self): +- for decision in self.consume(SelinuxRelabelDecision): +- if decision.set_relabel: +- try: +- with open('/.autorelabel', 'w'): +- pass +- create_report([ +- reporting.Title('SElinux scheduled for relabelling'), +- reporting.Summary( +- '/.autorelabel file touched on root in order to schedule SElinux relabelling.'), +- reporting.Severity(reporting.Severity.INFO), +- reporting.Tags(COMMON_REPORT_TAGS), +- ] + related) +- +- except EnvironmentError as e: +- # FIXME: add an "action required" flag later +- create_report([ +- reporting.Title('Could not schedule SElinux for relabelling'), +- reporting.Summary('/.autorelabel file could not be created: {}.'.format(e)), +- reporting.Severity(reporting.Severity.HIGH), +- reporting.Tags(COMMON_REPORT_TAGS), +- reporting.Remediation( +- hint='Please set autorelabelling manually after the upgrade.' +- ), +- reporting.Flags([reporting.Flags.FAILURE]) +- ] + related) +- self.log.critical('Could not schedule SElinux for relabelling: %s.' % e) ++ try: ++ for decision in self.consume(SelinuxRelabelDecision): ++ if decision.set_relabel: ++ try: ++ with open('/.autorelabel', 'w'): ++ pass ++ create_report([ ++ reporting.Title('SElinux scheduled for relabelling'), ++ reporting.Summary( ++ '/.autorelabel file touched on root in order to schedule SElinux relabelling.'), ++ reporting.Severity(reporting.Severity.INFO), ++ reporting.Tags(COMMON_REPORT_TAGS), ++ ] + related) ++ ++ except EnvironmentError as e: ++ # FIXME: add an "action required" flag later ++ create_report([ ++ reporting.Title('Could not schedule SElinux for relabelling'), ++ reporting.Summary('/.autorelabel file could not be created: {}.'.format(e)), ++ reporting.Severity(reporting.Severity.HIGH), ++ reporting.Tags(COMMON_REPORT_TAGS), ++ reporting.Remediation( ++ hint='Please set autorelabelling manually after the upgrade.' ++ ), ++ reporting.Flags([reporting.Flags.FAILURE]) ++ ] + related) ++ self.log.critical('Could not schedule SElinux for relabelling: %s.' % e) ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/scheduleselinuxrelabeling/libraries/scheduleselinuxrelabeling.py b/repos/system_upgrade/el7toel8/actors/scheduleselinuxrelabeling/libraries/scheduleselinuxrelabeling.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/scheduleselinuxrelabeling/libraries/scheduleselinuxrelabeling.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/sctpconfigupdate/actor.py b/repos/system_upgrade/el7toel8/actors/sctpconfigupdate/actor.py +index b6628b5..0341ba5 100644 +--- a/repos/system_upgrade/el7toel8/actors/sctpconfigupdate/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/sctpconfigupdate/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.sctpconfigupdate import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import sctpupdate + from leapp.models import SCTPConfig +@@ -18,4 +19,7 @@ class SCTPConfigUpdate(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- sctpupdate.perform_update() ++ try: ++ sctpupdate.perform_update() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/sctpconfigupdate/libraries/sctpconfigupdate.py b/repos/system_upgrade/el7toel8/actors/sctpconfigupdate/libraries/sctpconfigupdate.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/sctpconfigupdate/libraries/sctpconfigupdate.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/actors/setpermissiveselinux/actor.py b/repos/system_upgrade/el7toel8/actors/setpermissiveselinux/actor.py +index d6a1bd2..469aa6f 100644 +--- a/repos/system_upgrade/el7toel8/actors/setpermissiveselinux/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/setpermissiveselinux/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.setpermissiveselinux import smc_macros + from leapp.actors import Actor + from leapp.tags import FinalizationPhaseTag, IPUWorkflowTag + from leapp.models import SelinuxPermissiveDecision +@@ -20,17 +21,20 @@ class SetPermissiveSelinux(Actor): + tags = (FinalizationPhaseTag, IPUWorkflowTag) + + def process(self): +- for decision in self.consume(SelinuxPermissiveDecision): +- if decision.set_permissive: +- success, err_msg = selinux_set_permissive() +- if not success: +- # FIXME: add an "action required" flag later +- create_report([ +- reporting.Title('Could not set SElinux into permissive mode'), +- reporting.Summary('{}'.format(err_msg)), +- reporting.Severity(reporting.Severity.HIGH), +- reporting.Tags([reporting.Tags.SELINUX, reporting.Tags.SECURITY]), +- reporting.Flags([reporting.Flags.FAILURE]), +- reporting.RelatedResource('file', '/etc/selinux/config') +- ]) +- self.log.critical('Could not set SElinux into permissive mode: %s.' % err_msg) ++ try: ++ for decision in self.consume(SelinuxPermissiveDecision): ++ if decision.set_permissive: ++ success, err_msg = selinux_set_permissive() ++ if not success: ++ # FIXME: add an "action required" flag later ++ create_report([ ++ reporting.Title('Could not set SElinux into permissive mode'), ++ reporting.Summary('{}'.format(err_msg)), ++ reporting.Severity(reporting.Severity.HIGH), ++ reporting.Tags([reporting.Tags.SELINUX, reporting.Tags.SECURITY]), ++ reporting.Flags([reporting.Flags.FAILURE]), ++ reporting.RelatedResource('file', '/etc/selinux/config') ++ ]) ++ self.log.critical('Could not set SElinux into permissive mode: %s.' % err_msg) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/setpermissiveselinux/libraries/setpermissiveselinux.py b/repos/system_upgrade/el7toel8/actors/setpermissiveselinux/libraries/setpermissiveselinux.py +index d046cae..3f8d0af 100644 +--- a/repos/system_upgrade/el7toel8/actors/setpermissiveselinux/libraries/setpermissiveselinux.py ++++ b/repos/system_upgrade/el7toel8/actors/setpermissiveselinux/libraries/setpermissiveselinux.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + from leapp.libraries.stdlib import CalledProcessError, run + + +diff --git a/repos/system_upgrade/el7toel8/actors/smcconclusion/actor.py b/repos/system_upgrade/el7toel8/actors/smcconclusion/actor.py +new file mode 100644 +index 0000000..85bbb14 +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/smcconclusion/actor.py +@@ -0,0 +1,19 @@ ++from leapp.actors import Actor ++from leapp import tags ++ ++from leapp.libraries.actor.smcconclusion import smc_macros ++ ++ ++class SmcConclusion(Actor): ++ """ ++ SMC interface. Since migration has reached this phase, ++ we believe all is well. ++ """ ++ ++ name = 'smc_conclusion' ++ consumes = () ++ produces = () ++ tags = (tags.IPUWorkflowTag, tags.SummaryPhaseTag, ) ++ ++ def process(self): ++ smc_macros.update_progress_infomation(100.0, "Migration Summary.", 0, "ok") +diff --git a/repos/system_upgrade/el7toel8/actors/smcconclusion/libraries/smcconclusion.py b/repos/system_upgrade/el7toel8/actors/smcconclusion/libraries/smcconclusion.py +new file mode 100644 +index 0000000..daf6477 +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/smcconclusion/libraries/smcconclusion.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +diff --git a/repos/system_upgrade/el7toel8/actors/spamassassinconfigupdate/actor.py b/repos/system_upgrade/el7toel8/actors/spamassassinconfigupdate/actor.py +index 30cdd8a..409f0ce 100644 +--- a/repos/system_upgrade/el7toel8/actors/spamassassinconfigupdate/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/spamassassinconfigupdate/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.spamassassinconfigupdate import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import spamassassinconfigupdate + from leapp.models import SpamassassinFacts +@@ -24,8 +25,11 @@ class SpamassassinConfigUpdate(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- facts = next(self.consume(SpamassassinFacts), None) +- if facts: +- spamassassinconfigupdate.migrate_configs(facts) +- else: +- self.log.debug('Skipping execution - no SpamassassinFacts message has been produced.') ++ try: ++ facts = next(self.consume(SpamassassinFacts), None) ++ if facts: ++ spamassassinconfigupdate.migrate_configs(facts) ++ else: ++ self.log.debug('Skipping execution - no SpamassassinFacts message has been produced.') ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/spamassassinconfigupdate/libraries/spamassassinconfigupdate.py b/repos/system_upgrade/el7toel8/actors/spamassassinconfigupdate/libraries/spamassassinconfigupdate.py +index 5711d55..06709e0 100644 +--- a/repos/system_upgrade/el7toel8/actors/spamassassinconfigupdate/libraries/spamassassinconfigupdate.py ++++ b/repos/system_upgrade/el7toel8/actors/spamassassinconfigupdate/libraries/spamassassinconfigupdate.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + from leapp.libraries.actor import ( + spamassassinconfigupdate_backup, + spamassassinconfigupdate_spamc, +diff --git a/repos/system_upgrade/el7toel8/actors/updateetcsysconfigkernel/actor.py b/repos/system_upgrade/el7toel8/actors/updateetcsysconfigkernel/actor.py +index 8536dc6..d93cbf8 100644 +--- a/repos/system_upgrade/el7toel8/actors/updateetcsysconfigkernel/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/updateetcsysconfigkernel/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.updateetcsysconfigkernel import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import updateetcsysconfigkernel + from leapp.tags import PreparationPhaseTag, IPUWorkflowTag +@@ -17,4 +18,7 @@ class UpdateEtcSysconfigKernel(Actor): + tags = (PreparationPhaseTag, IPUWorkflowTag) + + def process(self): +- updateetcsysconfigkernel.update_kernel_config('/etc/sysconfig/kernel') ++ try: ++ updateetcsysconfigkernel.update_kernel_config('/etc/sysconfig/kernel') ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/updateetcsysconfigkernel/libraries/updateetcsysconfigkernel.py b/repos/system_upgrade/el7toel8/actors/updateetcsysconfigkernel/libraries/updateetcsysconfigkernel.py +index 34216c3..5715e44 100644 +--- a/repos/system_upgrade/el7toel8/actors/updateetcsysconfigkernel/libraries/updateetcsysconfigkernel.py ++++ b/repos/system_upgrade/el7toel8/actors/updateetcsysconfigkernel/libraries/updateetcsysconfigkernel.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + from leapp.libraries.stdlib import run + + +diff --git a/repos/system_upgrade/el7toel8/actors/updategrubcore/actor.py b/repos/system_upgrade/el7toel8/actors/updategrubcore/actor.py +index e9a2d92..dc7e0da 100644 +--- a/repos/system_upgrade/el7toel8/actors/updategrubcore/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/updategrubcore/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.updategrubcore import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor.updategrubcore import update_grub_core + from leapp.libraries.common import grub +@@ -19,10 +20,13 @@ class UpdateGrubCore(Actor): + tags = (RPMUpgradePhaseTag, IPUWorkflowTag) + + def process(self): +- ff = next(self.consume(FirmwareFacts), None) +- if ff and ff.firmware == 'bios': +- grub_dev = grub.get_grub_device() +- if grub_dev: +- update_grub_core(grub_dev) +- else: +- api.current_logger().warning('Leapp could not detect GRUB on {}'.format(grub_dev)) ++ try: ++ ff = next(self.consume(FirmwareFacts), None) ++ if ff and ff.firmware == 'bios': ++ grub_dev = grub.get_grub_device() ++ if grub_dev: ++ update_grub_core(grub_dev) ++ else: ++ api.current_logger().warning('Leapp could not detect GRUB on {}'.format(grub_dev)) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/updategrubcore/libraries/updategrubcore.py b/repos/system_upgrade/el7toel8/actors/updategrubcore/libraries/updategrubcore.py +index 6e3726b..16a6280 100644 +--- a/repos/system_upgrade/el7toel8/actors/updategrubcore/libraries/updategrubcore.py ++++ b/repos/system_upgrade/el7toel8/actors/updategrubcore/libraries/updategrubcore.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + from leapp.libraries.stdlib import api, run, CalledProcessError, config + from leapp.exceptions import StopActorExecution + from leapp import reporting +diff --git a/repos/system_upgrade/el7toel8/actors/vimmigrate/actor.py b/repos/system_upgrade/el7toel8/actors/vimmigrate/actor.py +index 7ac50d1..8320ec6 100644 +--- a/repos/system_upgrade/el7toel8/actors/vimmigrate/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/vimmigrate/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.vimmigrate import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import vimmigrate + from leapp.models import InstalledRedHatSignedRPM +@@ -16,4 +17,7 @@ class VimMigrate(Actor): + tags = (ApplicationsPhaseTag, IPUWorkflowTag) + + def process(self): +- vimmigrate.update_vim() ++ try: ++ vimmigrate.update_vim() ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/vimmigrate/libraries/vimmigrate.py b/repos/system_upgrade/el7toel8/actors/vimmigrate/libraries/vimmigrate.py +index 4c40322..db8494e 100644 +--- a/repos/system_upgrade/el7toel8/actors/vimmigrate/libraries/vimmigrate.py ++++ b/repos/system_upgrade/el7toel8/actors/vimmigrate/libraries/vimmigrate.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + from leapp.libraries.common.rpms import has_package + from leapp.libraries.stdlib import api + from leapp.models import InstalledRedHatSignedRPM +diff --git a/repos/system_upgrade/el7toel8/actors/vsftpdconfigupdate/actor.py b/repos/system_upgrade/el7toel8/actors/vsftpdconfigupdate/actor.py +index 09cb37c..b00d8ab 100644 +--- a/repos/system_upgrade/el7toel8/actors/vsftpdconfigupdate/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/vsftpdconfigupdate/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.vsftpdconfigupdate import smc_macros + from leapp.actors import Actor + from leapp.libraries.actor import vsftpdconfigupdate + from leapp.models import VsftpdFacts +@@ -27,7 +28,10 @@ class VsftpdConfigUpdate(Actor): + + def process(self): + try: +- vsftpd_facts = next(self.consume(VsftpdFacts)) +- except StopIteration: +- return +- vsftpdconfigupdate.migrate_configs(vsftpd_facts) ++ try: ++ vsftpd_facts = next(self.consume(VsftpdFacts)) ++ except StopIteration: ++ return ++ vsftpdconfigupdate.migrate_configs(vsftpd_facts) ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/vsftpdconfigupdate/libraries/vsftpdconfigupdate.py b/repos/system_upgrade/el7toel8/actors/vsftpdconfigupdate/libraries/vsftpdconfigupdate.py +index 645774f..616f325 100644 +--- a/repos/system_upgrade/el7toel8/actors/vsftpdconfigupdate/libraries/vsftpdconfigupdate.py ++++ b/repos/system_upgrade/el7toel8/actors/vsftpdconfigupdate/libraries/vsftpdconfigupdate.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.common import smc_macros + import re + + from leapp.libraries.common.vsftpdutils import get_default_config_hash, \ +diff --git a/repos/system_upgrade/el7toel8/actors/ziplconverttoblscfg/actor.py b/repos/system_upgrade/el7toel8/actors/ziplconverttoblscfg/actor.py +index 9067c54..fa4d8b1 100644 +--- a/repos/system_upgrade/el7toel8/actors/ziplconverttoblscfg/actor.py ++++ b/repos/system_upgrade/el7toel8/actors/ziplconverttoblscfg/actor.py +@@ -1,3 +1,4 @@ ++from leapp.libraries.actor.ziplconverttoblscfg import smc_macros + import os + import filecmp + +@@ -21,57 +22,62 @@ class ZiplConvertToBLSCFG(Actor): + tags = (IPUWorkflowTag, PreparationPhaseTag) + + def process(self): +- if not architecture.matches_architecture(architecture.ARCH_S390X): +- return +- userspace = next(self.consume(TargetUserSpaceInfo), None) +- if not userspace: +- # actually this should not happen, but in such case, we want to still +- # rather continue even if we boot into the old kernel, but in such +- # case, people will have to do manual actions. +- # NOTE: it is really just hypothetical +- self.log_error( +- 'TargetUserSpaceInfo is missing. Cannot execute zipl-switch-to-blscfg' +- ' to convert the zipl configuration to BLS.' +- ) +- raise StopActorExecutionError('GENERAL FAILURE: Input data for the actor are missing.') ++ try: ++ if not architecture.matches_architecture(architecture.ARCH_S390X): ++ return ++ userspace = next(self.consume(TargetUserSpaceInfo), None) ++ if not userspace: ++ # actually this should not happen, but in such case, we want to still ++ # rather continue even if we boot into the old kernel, but in such ++ # case, people will have to do manual actions. ++ # NOTE: it is really just hypothetical ++ self.log_error( ++ 'TargetUserSpaceInfo is missing. Cannot execute zipl-switch-to-blscfg' ++ ' to convert the zipl configuration to BLS.' ++ ) ++ raise StopActorExecutionError('GENERAL FAILURE: Input data for the actor are missing.') + +- # replace the original boot directory inside the container by the host one +- # - as we cannot use zipl* pointing anywhere else than default directory +- # - no, --bls-directory is not solution +- with mounting.BindMount(source='/boot', target=os.path.join(userspace.path, 'boot')): +- userspace_zipl_conf = os.path.join(userspace.path, 'etc', 'zipl.conf') +- if os.path.exists(userspace_zipl_conf): +- os.remove(userspace_zipl_conf) +- with mounting.NullMount(target=userspace.path) as userspace: +- with userspace.nspawn() as context: +- context.copy_to('/etc/zipl.conf', '/etc/zipl.conf') +- # zipl needs this one as well +- context.copy_to('/etc/machine-id', '/etc/machine-id') +- try: +- context.call(['/usr/sbin/zipl-switch-to-blscfg']) +- if filecmp.cmp('/etc/zipl.conf', userspace_zipl_conf): +- # When the files are same, zipl failed - see the switch script +- raise OSError('Failed to convert the ZIPL configuration to BLS.') +- context.copy_from('/etc/zipl.conf', '/etc/zipl.conf') +- except OSError as e: +- self.log.error('Could not call zipl-switch-to-blscfg command.', +- exc_info=True) +- raise StopActorExecutionError( +- message='Failed to execute zipl-switch-to-blscfg.', +- details={'details': str(e)} +- ) +- except CalledProcessError as e: +- self.log.error('zipl-switch-to-blscfg execution failed,', +- exc_info=True) +- raise StopActorExecutionError( +- message='zipl-switch-to-blscfg execution failed with non zero exit code.', +- details={'details': str(e), 'stdout': e.stdout, 'stderr': e.stderr} +- ) ++ # replace the original boot directory inside the container by the host one ++ # - as we cannot use zipl* pointing anywhere else than default directory ++ # - no, --bls-directory is not solution ++ with mounting.BindMount(source='/boot', target=os.path.join(userspace.path, 'boot')): ++ userspace_zipl_conf = os.path.join(userspace.path, 'etc', 'zipl.conf') ++ if os.path.exists(userspace_zipl_conf): ++ os.remove(userspace_zipl_conf) ++ with mounting.NullMount(target=userspace.path) as userspace: ++ with userspace.nspawn() as context: ++ context.copy_to('/etc/zipl.conf', '/etc/zipl.conf') ++ # zipl needs this one as well ++ context.copy_to('/etc/machine-id', '/etc/machine-id') ++ try: ++ context.call(['/usr/sbin/zipl-switch-to-blscfg']) ++ if filecmp.cmp('/etc/zipl.conf', userspace_zipl_conf): ++ # When the files are same, zipl failed - see the switch script ++ raise OSError('Failed to convert the ZIPL configuration to BLS.') ++ context.copy_from('/etc/zipl.conf', '/etc/zipl.conf') ++ except OSError as e: ++ self.log.error('Could not call zipl-switch-to-blscfg command.', ++ exc_info=True) ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) ++ raise StopActorExecutionError( ++ message='Failed to execute zipl-switch-to-blscfg.', ++ details={'details': str(e)} ++ ) ++ except CalledProcessError as e: ++ self.log.error('zipl-switch-to-blscfg execution failed,', ++ exc_info=True) ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) ++ raise StopActorExecutionError( ++ message='zipl-switch-to-blscfg execution failed with non zero exit code.', ++ details={'details': str(e), 'stdout': e.stdout, 'stderr': e.stderr} ++ ) + +- # FIXME: we do not want to continue anymore, but we should clean +- # better. +- # NOTE: Basically, just removal of the /boot/loader dir content inside +- # could be enough, but we cannot remove /boot/loader because of boom +- # - - if we remove it, we will remove the snapshot as well +- # - - on the other hand, we should't keep it there if zipl +- # - - has not been converted to BLS ++ # FIXME: we do not want to continue anymore, but we should clean ++ # better. ++ # NOTE: Basically, just removal of the /boot/loader dir content inside ++ # could be enough, but we cannot remove /boot/loader because of boom ++ # - - if we remove it, we will remove the snapshot as well ++ # - - on the other hand, we should't keep it there if zipl ++ # - - has not been converted to BLS ++ except Exception as e: ++ smc_macros.update_progress_infomation(progress=None, progress_info=None, err_no=1, err_msg='Actor %s fails : %s' % (self.__class__.__name__, str(e))) +diff --git a/repos/system_upgrade/el7toel8/actors/ziplconverttoblscfg/libraries/ziplconverttoblscfg.py b/repos/system_upgrade/el7toel8/actors/ziplconverttoblscfg/libraries/ziplconverttoblscfg.py +new file mode 100644 +index 0000000..bc3ba4a +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/actors/ziplconverttoblscfg/libraries/ziplconverttoblscfg.py +@@ -0,0 +1 @@ ++from leapp.libraries.common import smc_macros +\ No newline at end of file +diff --git a/repos/system_upgrade/el7toel8/libraries/smc_macros.py b/repos/system_upgrade/el7toel8/libraries/smc_macros.py +new file mode 100644 +index 0000000..e7488bf +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/libraries/smc_macros.py +@@ -0,0 +1,110 @@ ++import json ++import os ++import time ++import shutil ++from leapp.workflows import get_workflows ++ ++ ++JSON_STATE_PATH = "/var/tmp/state.json" ++MIGRATION_JSON_STATE_PATH = "/var/lib/leapp/el8userspace/" + JSON_STATE_PATH ++ ++def load_log_status(path=JSON_STATE_PATH): ++ if status_log_exists(path): ++ with open(path, "r") as f: ++ state = json.load(f) ++ return state ++ else: ++ return None ++ ++ ++def status_log_exists(path=JSON_STATE_PATH): ++ return os.path.exists(path) ++ ++ ++def init_progress_infomation(progress, progress_info, err_no, err_msg=None, path=JSON_STATE_PATH, migration_path=MIGRATION_JSON_STATE_PATH): ++ state = { ++ "Progress": int(progress), ++ "ProgressInfo": progress_info, ++ "ErrorCode": err_no, ++ "ErrorMsg": err_msg, ++ "Timestamp": int(time.time()) ++ } ++ ++ state["Timestamp"] = int(time.time()) ++ ++ with open(path, "w") as f: ++ json.dump(state, f) ++ ++ migration_directory = migration_path.rpartition('state.json')[0] ++ if not os.path.exists(migration_directory): ++ os.makedirs(migration_directory) ++ ++ with open(migration_path, "w") as f: ++ json.dump(state, f) ++ ++ ++def update_progress_infomation(progress=None, progress_info=None, err_no=None, err_msg=None, path=JSON_STATE_PATH, migration_path=MIGRATION_JSON_STATE_PATH): ++ if not os.path.exists(path): ++ state_directory = path.rpartition('state.json')[0] ++ if not os.path.exists(state_directory): ++ os.makedirs(state_directory) ++ shutil.copyfile(migration_path, path) ++ elif not os.path.exists(migration_path): ++ migration_directory = migration_path.rpartition('state.json')[0] ++ if not os.path.exists(migration_directory): ++ os.makedirs(migration_directory) ++ shutil.copyfile(path, migration_path) ++ else: ++ state_stat = os.stat(path) ++ migration_state_stat = os.stat(migration_path) ++ ++ if state_stat.st_mtime > migration_state_stat.st_mtime: ++ shutil.copyfile(path, migration_path) ++ else: ++ shutil.copyfile(migration_path, path) ++ ++ state = load_log_status(path) ++ assert state is not None, 'state file lost.' ++ ++ if int(state["ErrorCode"]) != 0: ++ return ++ ++ if progress is not None: ++ state["Progress"] = int(progress) ++ if progress_info is not None: ++ state["ProgressInfo"] = progress_info ++ if err_no is not None: ++ state["ErrorCode"] = err_no ++ if err_msg is not None: ++ state["ErrorMsg"] = err_msg ++ ++ state["Timestamp"] = int(time.time()) ++ ++ with open(path, "w") as f: ++ json.dump(state, f) ++ with open(migration_path, "w") as f: ++ json.dump(state, f) ++ ++ ++def get_current_workflow(): ++ current_workflow = None ++ for workflow in get_workflows(): ++ if workflow.name == 'InplaceUpgrade': ++ current_workflow = workflow ++ return current_workflow ++ ++ ++def get_tags_from_workflow(workflow): ++ tags = [] ++ for phase in workflow.phases: ++ tags += [phase.filter.phase] ++ ++ return tags ++ ++ ++def get_phases_from_workflow(workflow): ++ phases = [] ++ for phase in workflow.phases: ++ phases += [phase] ++ phases.sort(key=lambda item: item.get_index()) ++ return phases +diff --git a/repos/system_upgrade/el7toel8/tags/summaryphase.py b/repos/system_upgrade/el7toel8/tags/summaryphase.py +new file mode 100644 +index 0000000..3171c50 +--- /dev/null ++++ b/repos/system_upgrade/el7toel8/tags/summaryphase.py +@@ -0,0 +1,5 @@ ++from leapp.tags import Tag ++ ++ ++class SummaryPhaseTag(Tag): ++ name = 'summary_phase' +diff --git a/repos/system_upgrade/el7toel8/workflows/inplace_upgrade.py b/repos/system_upgrade/el7toel8/workflows/inplace_upgrade.py +index c0dd27e..3a9536c 100644 +--- a/repos/system_upgrade/el7toel8/workflows/inplace_upgrade.py ++++ b/repos/system_upgrade/el7toel8/workflows/inplace_upgrade.py +@@ -244,3 +244,12 @@ class IPUWorkflow(Workflow): + policies = Policies(Policies.Errors.FailPhase, + Policies.Retry.Phase) + flags = Flags() ++ ++ class Summaries(Phase): ++ """Actions to summaries the result of migration.""" ++ ++ name = 'Summaries' ++ filter = TagFilter(tags.SummaryPhaseTag) ++ policies = Policies(Policies.Errors.FailPhase, ++ Policies.Retry.Phase) ++ flags = Flags() +-- +2.31.1 + diff --git a/leapp-repository.spec b/leapp-repository.spec index 1f1360b73f50f550fdc1b275d429fa5db1d839c9..b9bc2cf81b5e89701078cf6cde4a112e14c792fe 100644 --- a/leapp-repository.spec +++ b/leapp-repository.spec @@ -11,7 +11,7 @@ }\ py2_byte_compile "%1" "%2"} -%define anolis_release 9 +%define anolis_release 10 Name: leapp-repository Version: 0.13.0 @@ -59,6 +59,7 @@ Patch30: 0030-fix-subprocess-check_output-method-for-backup-service-confi Patch31: 0031-Deal-with-EPEL-repositories-create-by-user-mannally.patch Patch32: 0032-Keep-PermitRootLogin-authentication-behavior-after-m.patch Patch33: 0033-Read-the-driver-list-supported-by-ANCK.patch +Patch34: 0034-Add-a-migration-progress-check-interface-for-SMC.patch BuildArch: noarch BuildRequires: python-devel @@ -181,6 +182,9 @@ done; # no files here %changelog +* Fri Nov 18 2022 Weisson - 0.13.0-2.10 +- Add a migration progress check interface for SMC. + * Thu Nov 15 2022 Bitao Hu - 0.13.0-2.9 - Read the driver list supported by ANCK to determine driver compatibility problem, when migrating to Anolis8 with ANCK.