diff --git a/SOURCES/9800-rpmostreepayload-Rework-remote-add-handling.patch b/SOURCES/9800-rpmostreepayload-Rework-remote-add-handling.patch new file mode 100644 index 0000000..260736c --- /dev/null +++ b/SOURCES/9800-rpmostreepayload-Rework-remote-add-handling.patch @@ -0,0 +1,98 @@ +diff -uNrp anaconda-21.48.22.121.orig/pyanaconda/packaging/rpmostreepayload.py anaconda-21.48.22.121/pyanaconda/packaging/rpmostreepayload.py +--- anaconda-21.48.22.121.orig/pyanaconda/packaging/rpmostreepayload.py 2017-06-21 12:44:34.000000000 +0000 ++++ anaconda-21.48.22.121/pyanaconda/packaging/rpmostreepayload.py 2017-08-23 02:28:23.121006339 +0000 +@@ -142,24 +142,25 @@ class RPMOSTreePayload(ArchivePayload): + ["admin", "--sysroot=" + iutil.getTargetPhysicalRoot(), + "init-fs", iutil.getTargetPhysicalRoot()]) + +- repo_arg = "--repo=" + iutil.getTargetPhysicalRoot() + '/ostree/repo' ++ self._sysroot_path = Gio.File.new_for_path(iutil.getTargetPhysicalRoot()) ++ sysroot = OSTree.Sysroot.new(self._sysroot_path) ++ sysroot.load(cancellable) ++ repo = sysroot.get_repo(None)[1] ++ # We don't support resuming from interrupted installs ++ repo.set_disable_fsync(True) ++ ++ self._remoteOptions = {} + +- # Store this for use in postInstall too, where we need to +- # undo/redo this step. +- self._base_remote_args = ["remote", "add"] ++ # Handle variations in pykickstart + if ((hasattr(ostreesetup, 'noGpg') and ostreesetup.noGpg) or + (hasattr(ostreesetup, 'nogpg') and ostreesetup.nogpg)): +- self._base_remote_args.append("--set=gpg-verify=false") +- self._base_remote_args.extend([ostreesetup.remote, +- ostreesetup.url]) +- self._safeExecWithRedirect("ostree", [repo_arg] + self._base_remote_args) ++ self._remoteOptions['gpg-verify'] = GLib.Variant('b', False) + +- self._sysroot_path = sysroot_path = Gio.File.new_for_path(iutil.getTargetPhysicalRoot()) +- sysroot = OSTree.Sysroot.new(sysroot_path) +- sysroot.load(cancellable) ++ repo.remote_change(None, OSTree.RepoRemoteChange.ADD_IF_NOT_EXISTS, ++ ostreesetup.remote, ostreesetup.url, ++ GLib.Variant('a{sv}', self._remoteOptions), ++ cancellable) + +- repo = sysroot.get_repo(None)[1] +- repo.set_disable_fsync(True) + progressQ.send_message(_("Starting pull of %(branchName)s from %(source)s") % \ + {"branchName": ostreesetup.ref, "source": ostreesetup.remote}) + +@@ -192,6 +193,14 @@ class RPMOSTreePayload(ArchivePayload): + log.info("ostree pull: " + (progress.get_status() or "")) + progressQ.send_message(_("Preparing deployment of %s") % (ostreesetup.ref, )) + ++ # Now that we have the data pulled, delete the remote for now. ++ # This will allow a remote configuration defined in the tree ++ # (if any) to override what's in the kickstart. Otherwise, ++ # we'll re-add it in post. Ideally, ostree would support a ++ # pull without adding a remote, but that would get quite ++ # complex. ++ repo.remote_delete(self.data.ostreesetup.remote, None) ++ + self._safeExecWithRedirect("ostree", + ["admin", "--sysroot=" + iutil.getTargetPhysicalRoot(), + "os-init", ostreesetup.osname]) +@@ -348,20 +357,30 @@ class RPMOSTreePayload(ArchivePayload): + from gi.repository import OSTree + cancellable = None + +- # Reload this data - we couldn't keep it open across +- # the remounts happening. + sysroot = OSTree.Sysroot.new(self._sysroot_path) + sysroot.load(cancellable) + repo = sysroot.get_repo(None)[1] + +- # This is an ugly hack - we didn't have /etc/ostree/remotes.d, +- # so the remote went into /ostree/repo/config. But we want it +- # in /etc, so delete that remote, then re-add it to +- # /etc/ostree/remotes.d, executing ostree inside the sysroot +- # so that it understands it's a "system repository" and should +- # modify /etc. +- repo.remote_delete(self.data.ostreesetup.remote, None) +- self._safeExecWithRedirect("ostree", self._base_remote_args, root=iutil.getSysroot()) ++ # CentOS specific patch (for now) - pull the remote config from usr/etc if it exists. ++ # The OSTree handling here was buggy in that it wasn't looking in the sysroot ++ # for existing remotes. ++ default_remote_path = iutil.getSysroot() + '/usr/etc/ostree/remotes.d/' + self.data.ostreesetup.osname + '.conf' ++ if os.path.isfile(default_remote_path): ++ destpath = iutil.getSysroot() + '/etc/ostree/remotes.d/' + os.path.basename(default_remote_path) ++ self._safeExecWithRedirect('cp', ['-r', '-p', default_remote_path, destpath]) ++ else: ++ # Following up on the "remote delete" above, we removed the ++ # remote from /ostree/repo/config. But we want it in /etc, so ++ # re-add it to /etc/ostree/remotes.d, using the sysroot path. ++ # ++ # However, we ignore the case where the remote already exists, ++ # which occurs when the content itself provides the remote ++ # config file. ++ repo.remote_change(Gio.File.new_for_path(iutil.getSysroot()), ++ OSTree.RepoRemoteChange.ADD_IF_NOT_EXISTS, ++ self.data.ostreesetup.remote, self.data.ostreesetup.url, ++ GLib.Variant('a{sv}', self._remoteOptions), ++ cancellable) + + boot = iutil.getSysroot() + '/boot' + diff --git a/SOURCES/anaconda-centos-add-centos-install-class.patch b/SOURCES/anaconda-centos-add-centos-install-class.patch index 89d64b5..208a851 100644 --- a/SOURCES/anaconda-centos-add-centos-install-class.patch +++ b/SOURCES/anaconda-centos-add-centos-install-class.patch @@ -1,7 +1,19 @@ -diff -uNr anaconda-19.31.79__orig/pyanaconda/installclasses/centos.py anaconda-19.31.79/pyanaconda/installclasses/centos.py ---- anaconda-19.31.79__orig/pyanaconda/installclasses/centos.py 1970-01-01 01:00:00.000000000 +0100 -+++ anaconda-19.31.79/pyanaconda/installclasses/centos.py 2014-06-16 22:47:16.033891088 +0100 -@@ -0,0 +1,88 @@ +diff -uNr anaconda-21.48.22.56__orig/pyanaconda/installclasses/fedora.py anaconda-21.48.22.56/pyanaconda/installclasses/fedora.py +--- anaconda-21.48.22.56__orig/pyanaconda/installclasses/fedora.py 2015-10-22 17:34:02.000000000 +0100 ++++ anaconda-21.48.22.56/pyanaconda/installclasses/fedora.py 2015-12-07 16:40:33.122000000 +0000 +@@ -25,7 +25,7 @@ + class FedoraBaseInstallClass(BaseInstallClass): + name = "Fedora" + sortPriority = 10000 +- if productName.startswith("Red Hat "): ++ if productName.startswith("Red Hat ") or productName.startswith("CentOS"): + hidden = True + + _l10n_domain = "anaconda" +diff -uNr anaconda-21.48.22.56__orig/pyanaconda/installclasses/centos.py anaconda-21.48.22.56/pyanaconda/installclasses/centos.py +--- anaconda-21.48.22.56__orig/pyanaconda/installclasses/centos.py 1970-01-01 01:00:00.000000000 +0100 ++++ anaconda-21.48.22.56/pyanaconda/installclasses/centos.py 2015-12-07 16:52:11.157000000 +0000 +@@ -0,0 +1,97 @@ +# +# rhel.py +# @@ -22,83 +34,80 @@ diff -uNr anaconda-19.31.79__orig/pyanaconda/installclasses/centos.py anaconda-1 +# + +from pyanaconda.installclass import BaseInstallClass -+from pyanaconda.constants import * -+from pyanaconda.product import * ++from pyanaconda.product import productName +from pyanaconda import network +from pyanaconda import nm -+import types -+ -+class InstallClass(BaseInstallClass): -+ # name has underscore used for mnemonics, strip if you dont need it -+ id = "centos" -+ name = N_("CentOS Linux") -+ sortPriority = 25000 -+ if productName.startswith("Red Hat ") or productName.startswith("Fedora "): -+ hidden = 1 ++from pyanaconda.kickstart import getAvailableDiskSpace ++from blivet.partspec import PartSpec ++from blivet.platform import platform ++from blivet.devicelibs import swap ++from blivet.size import Size + ++class RHELBaseInstallClass(BaseInstallClass): ++ name = "CentOS Linux" ++ sortPriority = 20001 ++ if not productName.startswith("CentOS"): ++ hidden = True + defaultFS = "xfs" + + bootloaderTimeoutDefault = 5 -+ bootloaderExtraArgs = [] + -+ ignoredPackages = ["ntfsprogs", "reiserfs-utils"] ++ ignoredPackages = ["ntfsprogs", "reiserfs-utils", "hfsplus-tools"] + + installUpdates = False + + _l10n_domain = "comps" + -+ efi_dir = "redhat" ++ efi_dir = "centos" ++ ++ help_placeholder = "CentOSPlaceholder.html" ++ help_placeholder_with_links = "CentOSPlaceholderWithLinks.html" + + def configure(self, anaconda): + BaseInstallClass.configure(self, anaconda) -+ BaseInstallClass.setDefaultPartitioning(self, anaconda.storage) ++ self.setDefaultPartitioning(anaconda.storage) + -+ # Set first boot policy regarding ONBOOT value -+ # (i.e. which network devices should be activated automatically after reboot) -+ # After switch root we set ONBOOT=no as default for all devices not activated -+ # in initramfs. Here, at the end of installation, we check and modify it eventually. + def setNetworkOnbootDefault(self, ksdata): -+ # if there is no device to be autoactivated after reboot -+ for devName in nm.nm_devices(): -+ if nm.nm_device_type_is_wifi(devName): -+ continue -+ try: -+ onboot = nm.nm_device_setting_value(devName, "connection", "autoconnect") -+ except nm.SettingsNotFoundError: -+ continue -+ if not onboot == False: -+ return -+ -+ # set ONBOOT=yes for the device used during installation -+ # (ie for majority of cases the one having the default route) -+ devName = network.default_route_device() -+ if not devName: ++ if any(nd.onboot for nd in ksdata.network.network if nd.device): + return -+ if nm.nm_device_type_is_wifi(devName): ++ # choose the device used during installation ++ # (ie for majority of cases the one having the default route) ++ dev = network.default_route_device() \ ++ or network.default_route_device(family="inet6") ++ if not dev: + return -+ ifcfg_path = network.find_ifcfg_file_of_device(devName, root_path=ROOT_PATH) -+ if not ifcfg_path: ++ # ignore wireless (its ifcfgs would need to be handled differently) ++ if nm.nm_device_type_is_wifi(dev): + return -+ ifcfg = network.IfcfgFile(ifcfg_path) -+ ifcfg.read() -+ ifcfg.set(('ONBOOT', 'yes')) -+ ifcfg.write() -+ for nd in ksdata.network.network: -+ if nd.device == devName: -+ nd.onboot = True -+ break ++ network.update_onboot_value(dev, "yes", ksdata) + + def __init__(self): + BaseInstallClass.__init__(self) -diff -uNr anaconda-19.31.79__orig/pyanaconda/installclasses/fedora.py anaconda-19.31.79/pyanaconda/installclasses/fedora.py ---- anaconda-19.31.79__orig/pyanaconda/installclasses/fedora.py 2014-04-29 01:45:59.000000000 +0100 -+++ anaconda-19.31.79/pyanaconda/installclasses/fedora.py 2014-06-16 22:57:40.525890315 +0100 -@@ -31,7 +31,7 @@ - id = "fedora" - name = N_("_Fedora") - sortPriority = 10000 -- if productName.startswith("Red Hat "): -+ if productName.startswith("Red Hat ") or productName.startswith("CentOS"): - hidden = 1 - - _l10n_domain = "anaconda" ++ ++class RHELAtomicInstallClass(RHELBaseInstallClass): ++ name = "CentOS Atomic Host" ++ sortPriority=21001 ++ hidden = not productName.startswith(("CentOS Atomic Host", "CentOS Linux Atomic")) ++ ++ def setDefaultPartitioning(self, storage): ++ autorequests = [PartSpec(mountpoint="/", fstype=storage.defaultFSType, ++ size=Size("1GiB"), maxSize=Size("3GiB"), grow=True, lv=True)] ++ ++ bootreqs = platform.setDefaultPartitioning() ++ if bootreqs: ++ autorequests.extend(bootreqs) ++ ++ disk_space = getAvailableDiskSpace(storage) ++ swp = swap.swapSuggestion(disk_space=disk_space) ++ autorequests.append(PartSpec(fstype="swap", size=swp, grow=False, ++ lv=True, encrypted=True)) ++ ++ for autoreq in autorequests: ++ if autoreq.fstype is None: ++ if autoreq.mountpoint == "/boot": ++ autoreq.fstype = storage.defaultBootFSType ++ autoreq.size = Size("300MiB") ++ else: ++ autoreq.fstype = storage.defaultFSType ++ ++ storage.autoPartitionRequests = autorequests diff --git a/SOURCES/anaconda-centos-bootfs-default-to-xfs.patch b/SOURCES/anaconda-centos-bootfs-default-to-xfs.patch index 31432af..b03ef3a 100644 --- a/SOURCES/anaconda-centos-bootfs-default-to-xfs.patch +++ b/SOURCES/anaconda-centos-bootfs-default-to-xfs.patch @@ -1,7 +1,7 @@ -diff -uNr anaconda-19.31.79__orig/pyanaconda/bootloader.py anaconda-19.31.79/pyanaconda/bootloader.py ---- anaconda-19.31.79__orig/pyanaconda/bootloader.py 2014-04-29 01:45:59.000000000 +0100 -+++ anaconda-19.31.79/pyanaconda/bootloader.py 2014-06-30 17:19:19.197386280 +0100 -@@ -1404,7 +1404,7 @@ +diff -uNr anaconda-21.48.22.56__orig/pyanaconda/bootloader.py anaconda-21.48.22.56/pyanaconda/bootloader.py +--- anaconda-21.48.22.56__orig/pyanaconda/bootloader.py 2015-10-29 14:23:19.000000000 +0000 ++++ anaconda-21.48.22.56/pyanaconda/bootloader.py 2015-12-07 17:23:41.013000000 +0000 +@@ -1411,7 +1411,7 @@ @property def stage2_format_types(self): @@ -10,7 +10,7 @@ diff -uNr anaconda-19.31.79__orig/pyanaconda/bootloader.py anaconda-19.31.79/pya return ["xfs", "ext4", "ext3", "ext2", "btrfs"] else: return ["ext4", "ext3", "ext2", "btrfs", "xfs"] -@@ -2063,7 +2063,7 @@ +@@ -2105,7 +2105,7 @@ @property def stage2_format_types(self): diff --git a/SOURCES/anaconda-centos-disable-mirrors.patch b/SOURCES/anaconda-centos-disable-mirrors.patch index fb5b2eb..f0d58ae 100644 --- a/SOURCES/anaconda-centos-disable-mirrors.patch +++ b/SOURCES/anaconda-centos-disable-mirrors.patch @@ -1,15 +1,33 @@ -diff -uNr anaconda-19.31.79__orig/pyanaconda/packaging/yumpayload.py anaconda-19.31.79/pyanaconda/packaging/yumpayload.py ---- anaconda-19.31.79__orig/pyanaconda/packaging/yumpayload.py 2014-04-29 01:45:59.000000000 +0100 -+++ anaconda-19.31.79/pyanaconda/packaging/yumpayload.py 2014-07-02 14:36:15.360488588 +0100 -@@ -428,7 +428,10 @@ +diff -uNrp anaconda-21.48.22.121.orig/pyanaconda/packaging/yumpayload.py anaconda-21.48.22.121/pyanaconda/packaging/yumpayload.py +--- anaconda-21.48.22.121.orig/pyananconda/packaging/yumpayload.py 2017-08-31 16:28:06.672265889 +0000 ++++ anaconda-21.48.22.121/pyanaconda/packaging/yumpayload.py 2017-08-31 16:28:38.812826778 +0000 +@@ -41,6 +41,7 @@ import sys + import time + import hashlib + from pyanaconda.iutil import execReadlines, ipmi_abort ++from pyanaconda.product import productName + from pyanaconda.simpleconfig import simple_replace + from functools import wraps + from urlgrabber.grabber import URLGrabber, URLGrabError +@@ -519,12 +519,16 @@ reposdir=%s @property def mirrorEnabled(self): with _yum_lock: -- return "fastestmirror" in self._yum.plugins._plugins +- # yum initializes with plugins disabled, and when plugins are disabled +- # _yum.plugins is a DummyYumPlugins object, which has no useful attributes. +- if hasattr(self._yum.plugins, "_plugins"): +- return "fastestmirror" in self._yum.plugins._plugins ++ # we just skip this on CentOS since we cant support it yet + if productName.startswith("CentOS"): -+ return 0 -+ else: -+ return "fastestmirror" in self._yum.plugins._plugins - ++ return False + else: +- return False ++ # yum initializes with plugins disabled, and when plugins are disabled ++ # _yum.plugins is a DummyYumPlugins object, which has no useful attributes. ++ if hasattr(self._yum.plugins, "_plugins"): ++ return "fastestmirror" in self._yum.plugins._plugins ++ else: ++ return False + def getRepo(self, repo_id): - """ Return the yum repo object. """ + """Return the yum repo object.""" diff --git a/SOURCES/anaconda-centos-help-text.patch b/SOURCES/anaconda-centos-help-text.patch new file mode 100644 index 0000000..329bfe9 --- /dev/null +++ b/SOURCES/anaconda-centos-help-text.patch @@ -0,0 +1,18 @@ +diff -uNr anaconda-21.48.22.56__orig/data/help/en-US/CentOSPlaceholder.html anaconda-21.48.22.56/data/help/en-US/CentOSPlaceholder.html +--- anaconda-21.48.22.56__orig/data/help/en-US/CentOSPlaceholder.html 1970-01-01 01:00:00.000000000 +0100 ++++ anaconda-21.48.22.56/data/help/en-US/CentOSPlaceholder.html 2015-12-07 17:07:05.017000000 +0000 +@@ -0,0 +1,5 @@ ++
++...is not yet available for this screen.
++You can check out the CentOS Linux resouces online at https://wiki.centos.org/InstallerHelp.
++ +diff -uNr anaconda-21.48.22.56__orig/data/help/en-US/CentOSPlaceholderWithLinks.html anaconda-21.48.22.56/data/help/en-US/CentOSPlaceholderWithLinks.html +--- anaconda-21.48.22.56__orig/data/help/en-US/CentOSPlaceholderWithLinks.html 1970-01-01 01:00:00.000000000 +0100 ++++ anaconda-21.48.22.56/data/help/en-US/CentOSPlaceholderWithLinks.html 2015-12-07 17:09:47.845000000 +0000 +@@ -0,0 +1,5 @@ ++ ++...is not yet available for this screen.
++You can check out the CentOS Linux resouces online at https://wiki.centos.org/InstallerHelp.
++ diff --git a/SOURCES/anaconda-centos-skip-retry-if-not-connected.patch b/SOURCES/anaconda-centos-skip-retry-if-not-connected.patch new file mode 100644 index 0000000..2e51bc2 --- /dev/null +++ b/SOURCES/anaconda-centos-skip-retry-if-not-connected.patch @@ -0,0 +1,14 @@ +diff -uNr anaconda-21.48.22.56__orig/pyanaconda/packaging/yumpayload.py anaconda-21.48.22.56/pyanaconda/packaging/yumpayload.py +--- anaconda-21.48.22.56__orig/pyanaconda/packaging/yumpayload.py 2015-12-08 14:36:52.533000000 +0000 ++++ anaconda-21.48.22.56/pyanaconda/packaging/yumpayload.py 2015-12-08 14:38:51.464000000 +0000 +@@ -648,6 +648,10 @@ + # so that unattended installations on unreliable networks have + # a higher chance of finishing successfully + xdelay = xprogressive_delay() ++ if not nm_is_connected(): ++ MAX_METADATA_DOWNLOAD_RETRIES = 1 ++ else: ++ MAX_METADATA_DOWNLOAD_RETRIES = 10 + for retry_count in xrange(0, MAX_METADATA_DOWNLOAD_RETRIES + 1): + if retry_count > 0: + # introduce a retry delay diff --git a/SOURCES/yumpayload-dont-verify-disabled-repos.patch b/SOURCES/yumpayload-dont-verify-disabled-repos.patch new file mode 100644 index 0000000..d985391 --- /dev/null +++ b/SOURCES/yumpayload-dont-verify-disabled-repos.patch @@ -0,0 +1,14 @@ +diff -uNrp anaconda-21.48.22.121.orig/pyanaconda/packaging/yumpayload.py anaconda-21.48.22.121/pyanaconda/packaging/yumpayload.py +--- anaconda-21.48.22.121.orig/pyanaconda/packaging/yumpayload.py 2017-04-27 08:09:33.000000000 -0500 ++++ anaconda-21.48.22.121/pyanaconda/packaging/yumpayload.py 2017-09-04 00:21:23.617491857 -0500 +@@ -206,6 +206,10 @@ class YumPayload(PackagePayload): + """Save repomd.xml files for later test for availability.""" + self._repoMD_list = [] + for repoID in self.repos: ++ if not self.isRepoEnabled(repoID): ++ log.info("Not checking metadata for disabled repo %s", repoID) ++ continue ++ + repo = self.getRepo(repoID) + with _yum_lock: + repoMD = RepoMDMetaHash(self, repo) diff --git a/SPECS/anaconda.spec b/SPECS/anaconda.spec index 11679ab..68b7f35 100644 --- a/SPECS/anaconda.spec +++ b/SPECS/anaconda.spec @@ -16,9 +16,12 @@ URL: http://fedoraproject.org/wiki/Anaconda Source0: %{name}-%{version}.tar.bz2 Patch1: anaconda-centos-add-centos-install-class.patch Patch2: anaconda-centos-set-right-eula-location.patch -Patch3: anaconda-centos-efidir-centos.patch Patch4: anaconda-centos-disable-mirrors.patch Patch5: anaconda-centos-bootfs-default-to-xfs.patch +Patch6: anaconda-centos-help-text.patch +Patch7: anaconda-centos-skip-retry-if-not-connected.patch +Patch8: 9800-rpmostreepayload-Rework-remote-add-handling.patch +Patch9: yumpayload-dont-verify-disabled-repos.patch # Versions of required components (done so we make sure the buildrequires # match the requires versions of things). @@ -185,7 +188,7 @@ Requires: keybinder3 Requires: NetworkManager-wifi %endif Requires: yelp -Requires: anaconda-user-help >= %{helpver} +#Requires: anaconda-user-help >= %{helpver} # Needed to compile the gsettings files BuildRequires: gsettings-desktop-schemas @@ -236,9 +239,12 @@ runtime on NFS/HTTP/FTP servers or local disks. %setup -q %patch1 -p1 %patch2 -p1 -%patch3 -p1 %patch4 -p1 %patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 %build %configure --disable-static \