def prepare_el8_userspace(overlayfs, userspace_dir, enabled_repos): overlay_target = os.path.join(overlayfs.merged, 'el8target') run(['rm', '-rf', userspace_dir]) run(['mkdir', '-p', userspace_dir]) run(['mkdir', '-p', overlay_target]) try: run(['mount', '--bind', userspace_dir, overlay_target]) repos_opt = [['--enablerepo', repo] for repo in enabled_repos] repos_opt = list(chain(*repos_opt)) preparetransaction.guard_container_call( overlayfs_info=overlayfs, cmd=[ 'dnf', 'install', '-y', '--nogpgcheck', '--setopt=module_platform_id=platform:el8', '--releasever', '8', '--installroot', '/el8target', '--disablerepo', '*' ] + repos_opt + _REQUIRED_PACKAGES, print_output=True ) finally: run(['umount', '-fl', overlay_target]) run(['mkdir', '-p', os.path.join(userspace_dir, 'artifacts')])
def update_rhel_subscription(self, overlayfs_info): sys_var = "" for msg in self.consume(OSReleaseFacts): if msg.variant_id: sys_var = msg.variant_id break # Make sure Subscription Manager OS Release is unset cmd = ['subscription-manager', 'release', '--unset'] _unused, error = preparetransaction.guard_container_call( overlayfs_info, cmd, guards=(preparetransaction.connection_guard(),) ) if error: error.summary = 'Cannot remove version preference.' return error var_prodcert = {'server': '230.pem'} if sys_var not in var_prodcert: return preparetransaction.ErrorData( summary="Failed to to retrieve Product Cert file.", details="Product cert file not available for System Variant '{}'.".format(sys_var)) prod_cert_path = self.get_file_path(var_prodcert[sys_var]) for path in ('/etc/pki/product-default', '/etc/pki/product'): if not os.path.isdir(path): continue existing_certs = [os.path.join(path, f) for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))] if not existing_certs: continue error = preparetransaction.copy_file_to_container(overlayfs_info, prod_cert_path, path) if error: return error # FIXME: it's removing all certs from /etc/pki/product - but we should remove only the # + EngID provided by a redhat-release-* rpm in the directory (Maybe another RH cert # + but we should not remove user's 3rd party certs (e.g. for custom repositories it # + would be problem later). Needs a little investigation here about the impact, even # + in the container. for cert in existing_certs: # FIXME: fails on insufficient permissions cmd = ['rm', '-f', cert] _unused, error = preparetransaction.guard_container_call(overlayfs_info, cmd) if error: return error cmd = ['subscription-manager', 'refresh'] _unused, error = preparetransaction.guard_container_call( overlayfs_info, cmd, guards=(preparetransaction.connection_guard(),) ) return error
def dnf_plugin_rpm_download(self, overlayfs_info): dnf_command = ['/usr/bin/dnf', 'rhel-upgrade', 'download'] # get list of repo IDs of target repositories that should be used for upgrade error = self._setup_target_repos(overlayfs_info) if error: return error if not self.target_repoids: return preparetransaction.ErrorData( summary='Cannot find any required target repository.', details='The list of available required repositories is empty.' ) debugsolver = True if os.environ.get('LEAPP_DEBUG', '0') == '1' else False yum_script_path = self.get_tool_path('handleyumconfig') cmd = ['--', '/bin/bash', '-c', yum_script_path] _unused, error = preparetransaction.guard_container_call( overlayfs_info, cmd) if error: return error error = preparetransaction.mount_dnf_cache(overlayfs_info) if error: return error data = next(self.consume(FilteredRpmTransactionTasks), FilteredRpmTransactionTasks()) plugin_data = { 'pkgs_info': { 'local_rpms': [pkg for pkg in data.local_rpms], 'to_install': [pkg for pkg in data.to_install], 'to_remove': [pkg for pkg in data.to_remove] }, 'dnf_conf': { 'allow_erasing': True, 'best': True, 'debugsolver': debugsolver, 'disable_repos': True, 'enable_repos': self.target_repoids, 'gpgcheck': False, 'platform_id': 'platform:el8', 'releasever': '8', 'test_flag': True, } } with open( os.path.join(overlayfs_info.merged, 'var', 'lib', 'leapp', 'dnf-plugin-data.txt'), 'w+') as data: json.dump(plugin_data, data) data.flush() copy_error = preparetransaction.copy_file_from_container( overlayfs_info, '/var/lib/leapp/dnf-plugin-data.txt', '/var/log/leapp/', 'dnf-plugin-data.txt', ) if copy_error: preparetransaction.produce_warning(copy_error) # FIXME: fails on insufficient permissions cmd = [ '--', '/bin/bash', '-c', ' '.join(dnf_command + ['/var/lib/leapp/dnf-plugin-data.txt']) ] _unused, error = preparetransaction.guard_container_call( overlayfs_info, cmd, guards=(preparetransaction.connection_guard(), preparetransaction.space_guard()), print_output=True) if os.environ.get('LEAPP_DEBUG', '0') == '1': # We want the debug data available where we would expect it usually. debug_data_path = '/var/log/leapp/dnf-debugdata/' # The debugdata is a folder generated by dnf when using the --debugsolver dnf option. We switch on the # debug_solver dnf config parameter in our rhel-upgrade dnf plugin when LEAPP_DEBUG env var set to 1. cmd = [ 'cp', '-a', os.path.join(overlayfs_info.merged, 'debugdata'), debug_data_path ] _unused, dbg_error = preparetransaction.guard_call(cmd) if dbg_error: preparetransaction.produce_warning( dbg_error, summary='Cannot copy new debugdata.') if error: umount_error = preparetransaction.umount_dnf_cache(overlayfs_info) if umount_error: preparetransaction.produce_error(umount_error) return error return preparetransaction.umount_dnf_cache(overlayfs_info)