105 lines
3.6 KiB
Diff
105 lines
3.6 KiB
Diff
|
From 6120fe52511775b60b6031d4169988c025610ab5 Mon Sep 17 00:00:00 2001
|
||
|
From: Joseph Marrero <jmarrero@redhat.com>
|
||
|
Date: Tue, 16 Jul 2024 15:48:41 -0400
|
||
|
Subject: [PATCH] Update ostree/bootc host system check.
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
This changes the is_container() func for _is_bootc_host()
|
||
|
and updates the logic and message. This should detect on
|
||
|
all ostree and bootc hosts to date that are not using
|
||
|
bootc usroverlay or ostree admin unlock for development
|
||
|
purposes.
|
||
|
|
||
|
resolves: #RHEL-49670, RHEL-49671
|
||
|
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
||
|
---
|
||
|
dnf/cli/cli.py | 11 +++++------
|
||
|
dnf/util.py | 32 ++++++++------------------------
|
||
|
2 files changed, 13 insertions(+), 30 deletions(-)
|
||
|
|
||
|
diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py
|
||
|
index c14f83639..83b190026 100644
|
||
|
--- a/dnf/cli/cli.py
|
||
|
+++ b/dnf/cli/cli.py
|
||
|
@@ -214,13 +214,12 @@ class BaseCli(dnf.Base):
|
||
|
elif 'test' in self.conf.tsflags:
|
||
|
logger.info(_("{prog} will only download packages, install gpg keys, and check the "
|
||
|
"transaction.").format(prog=dnf.util.MAIN_PROG_UPPER))
|
||
|
- if dnf.util.is_container():
|
||
|
- _container_msg = _("""
|
||
|
-*** This system is managed with ostree. Changes to the system
|
||
|
-*** made with dnf will be lost with the next ostree-based update.
|
||
|
-*** If you do not want to lose these changes, use 'rpm-ostree'.
|
||
|
+ if dnf.util._is_bootc_host():
|
||
|
+ _bootc_host_msg = _("""
|
||
|
+*** Error: system is configured to be read-only; for more
|
||
|
+*** information run `bootc status` or `ostree admin status`.
|
||
|
""")
|
||
|
- logger.info(_container_msg)
|
||
|
+ logger.info(_bootc_host_msg)
|
||
|
raise CliError(_("Operation aborted."))
|
||
|
|
||
|
if self._promptWanted():
|
||
|
diff --git a/dnf/util.py b/dnf/util.py
|
||
|
index 1b465bda5..0327321ca 100644
|
||
|
--- a/dnf/util.py
|
||
|
+++ b/dnf/util.py
|
||
|
@@ -33,13 +33,11 @@ import errno
|
||
|
import functools
|
||
|
import hawkey
|
||
|
import itertools
|
||
|
-import json
|
||
|
import locale
|
||
|
import logging
|
||
|
import os
|
||
|
import pwd
|
||
|
import shutil
|
||
|
-import subprocess
|
||
|
import sys
|
||
|
import tempfile
|
||
|
import time
|
||
|
@@ -643,30 +641,16 @@ def _is_file_pattern_present(specs):
|
||
|
return False
|
||
|
|
||
|
|
||
|
-def is_container():
|
||
|
+def _is_bootc_host():
|
||
|
"""Returns true is the system is managed as an immutable container,
|
||
|
false otherwise. If msg is True, a warning message is displayed
|
||
|
for the user.
|
||
|
"""
|
||
|
+ ostree_booted = '/run/ostree-booted'
|
||
|
+ usr = '/usr/'
|
||
|
+ # Check if usr is writtable and we are in a running ostree system.
|
||
|
+ # We want this code to return true only when the system is in locked state. If someone ran
|
||
|
+ # bootc overlay or ostree admin unlock we would want normal DNF path to be ran as it will be
|
||
|
+ # temporary changes (until reboot).
|
||
|
+ return os.path.isfile(ostree_booted) and not os.access(usr, os.W_OK)
|
||
|
|
||
|
- bootc = '/usr/bin/bootc'
|
||
|
- ostree = '/sysroot/ostree'
|
||
|
-
|
||
|
- if os.path.isfile(bootc) and os.access(bootc, os.X_OK):
|
||
|
- p = subprocess.Popen([bootc, "status", "--json"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||
|
- (out, err) = p.communicate()
|
||
|
-
|
||
|
- if p.returncode == 0:
|
||
|
- # check the output of 'bootc status'
|
||
|
- j = json.loads(out)
|
||
|
-
|
||
|
- # XXX: the API from bootc status is evolving
|
||
|
- status = j.get("status", "")
|
||
|
- kind = j.get("kind", "")
|
||
|
-
|
||
|
- if kind.lower() == "bootchost" and bool(status.get("isContainer", None)):
|
||
|
- return True
|
||
|
- elif os.path.isdir(ostree):
|
||
|
- return True
|
||
|
-
|
||
|
- return False
|
||
|
--
|
||
|
2.45.2
|
||
|
|