1 |
diff -uNrp anaconda-21.48.22.121.orig/pyanaconda/packaging/rpmostreepayload.py anaconda-21.48.22.121/pyanaconda/packaging/rpmostreepayload.py |
2 |
--- anaconda-21.48.22.121.orig/pyanaconda/packaging/rpmostreepayload.py 2017-06-21 12:44:34.000000000 +0000 |
3 |
+++ anaconda-21.48.22.121/pyanaconda/packaging/rpmostreepayload.py 2017-08-23 02:28:23.121006339 +0000 |
4 |
@@ -142,24 +142,25 @@ class RPMOSTreePayload(ArchivePayload): |
5 |
["admin", "--sysroot=" + iutil.getTargetPhysicalRoot(), |
6 |
"init-fs", iutil.getTargetPhysicalRoot()]) |
7 |
|
8 |
- repo_arg = "--repo=" + iutil.getTargetPhysicalRoot() + '/ostree/repo' |
9 |
+ self._sysroot_path = Gio.File.new_for_path(iutil.getTargetPhysicalRoot()) |
10 |
+ sysroot = OSTree.Sysroot.new(self._sysroot_path) |
11 |
+ sysroot.load(cancellable) |
12 |
+ repo = sysroot.get_repo(None)[1] |
13 |
+ # We don't support resuming from interrupted installs |
14 |
+ repo.set_disable_fsync(True) |
15 |
+ |
16 |
+ self._remoteOptions = {} |
17 |
|
18 |
- # Store this for use in postInstall too, where we need to |
19 |
- # undo/redo this step. |
20 |
- self._base_remote_args = ["remote", "add"] |
21 |
+ # Handle variations in pykickstart |
22 |
if ((hasattr(ostreesetup, 'noGpg') and ostreesetup.noGpg) or |
23 |
(hasattr(ostreesetup, 'nogpg') and ostreesetup.nogpg)): |
24 |
- self._base_remote_args.append("--set=gpg-verify=false") |
25 |
- self._base_remote_args.extend([ostreesetup.remote, |
26 |
- ostreesetup.url]) |
27 |
- self._safeExecWithRedirect("ostree", [repo_arg] + self._base_remote_args) |
28 |
+ self._remoteOptions['gpg-verify'] = GLib.Variant('b', False) |
29 |
|
30 |
- self._sysroot_path = sysroot_path = Gio.File.new_for_path(iutil.getTargetPhysicalRoot()) |
31 |
- sysroot = OSTree.Sysroot.new(sysroot_path) |
32 |
- sysroot.load(cancellable) |
33 |
+ repo.remote_change(None, OSTree.RepoRemoteChange.ADD_IF_NOT_EXISTS, |
34 |
+ ostreesetup.remote, ostreesetup.url, |
35 |
+ GLib.Variant('a{sv}', self._remoteOptions), |
36 |
+ cancellable) |
37 |
|
38 |
- repo = sysroot.get_repo(None)[1] |
39 |
- repo.set_disable_fsync(True) |
40 |
progressQ.send_message(_("Starting pull of %(branchName)s from %(source)s") % \ |
41 |
{"branchName": ostreesetup.ref, "source": ostreesetup.remote}) |
42 |
|
43 |
@@ -192,6 +193,14 @@ class RPMOSTreePayload(ArchivePayload): |
44 |
log.info("ostree pull: " + (progress.get_status() or "")) |
45 |
progressQ.send_message(_("Preparing deployment of %s") % (ostreesetup.ref, )) |
46 |
|
47 |
+ # Now that we have the data pulled, delete the remote for now. |
48 |
+ # This will allow a remote configuration defined in the tree |
49 |
+ # (if any) to override what's in the kickstart. Otherwise, |
50 |
+ # we'll re-add it in post. Ideally, ostree would support a |
51 |
+ # pull without adding a remote, but that would get quite |
52 |
+ # complex. |
53 |
+ repo.remote_delete(self.data.ostreesetup.remote, None) |
54 |
+ |
55 |
self._safeExecWithRedirect("ostree", |
56 |
["admin", "--sysroot=" + iutil.getTargetPhysicalRoot(), |
57 |
"os-init", ostreesetup.osname]) |
58 |
@@ -348,20 +357,30 @@ class RPMOSTreePayload(ArchivePayload): |
59 |
from gi.repository import OSTree |
60 |
cancellable = None |
61 |
|
62 |
- # Reload this data - we couldn't keep it open across |
63 |
- # the remounts happening. |
64 |
sysroot = OSTree.Sysroot.new(self._sysroot_path) |
65 |
sysroot.load(cancellable) |
66 |
repo = sysroot.get_repo(None)[1] |
67 |
|
68 |
- # This is an ugly hack - we didn't have /etc/ostree/remotes.d, |
69 |
- # so the remote went into /ostree/repo/config. But we want it |
70 |
- # in /etc, so delete that remote, then re-add it to |
71 |
- # /etc/ostree/remotes.d, executing ostree inside the sysroot |
72 |
- # so that it understands it's a "system repository" and should |
73 |
- # modify /etc. |
74 |
- repo.remote_delete(self.data.ostreesetup.remote, None) |
75 |
- self._safeExecWithRedirect("ostree", self._base_remote_args, root=iutil.getSysroot()) |
76 |
+ # CentOS specific patch (for now) - pull the remote config from usr/etc if it exists. |
77 |
+ # The OSTree handling here was buggy in that it wasn't looking in the sysroot |
78 |
+ # for existing remotes. |
79 |
+ default_remote_path = iutil.getSysroot() + '/usr/etc/ostree/remotes.d/' + self.data.ostreesetup.osname + '.conf' |
80 |
+ if os.path.isfile(default_remote_path): |
81 |
+ destpath = iutil.getSysroot() + '/etc/ostree/remotes.d/' + os.path.basename(default_remote_path) |
82 |
+ self._safeExecWithRedirect('cp', ['-r', '-p', default_remote_path, destpath]) |
83 |
+ else: |
84 |
+ # Following up on the "remote delete" above, we removed the |
85 |
+ # remote from /ostree/repo/config. But we want it in /etc, so |
86 |
+ # re-add it to /etc/ostree/remotes.d, using the sysroot path. |
87 |
+ # |
88 |
+ # However, we ignore the case where the remote already exists, |
89 |
+ # which occurs when the content itself provides the remote |
90 |
+ # config file. |
91 |
+ repo.remote_change(Gio.File.new_for_path(iutil.getSysroot()), |
92 |
+ OSTree.RepoRemoteChange.ADD_IF_NOT_EXISTS, |
93 |
+ self.data.ostreesetup.remote, self.data.ostreesetup.url, |
94 |
+ GLib.Variant('a{sv}', self._remoteOptions), |
95 |
+ cancellable) |
96 |
|
97 |
boot = iutil.getSysroot() + '/boot' |
98 |
|