diff --git a/SOURCES/001-ostree-move-admindir-to-etc-alternatives.admindir.patch b/SOURCES/001-ostree-move-admindir-to-etc-alternatives.admindir.patch new file mode 100644 index 0000000..3479bc1 --- /dev/null +++ b/SOURCES/001-ostree-move-admindir-to-etc-alternatives.admindir.patch @@ -0,0 +1,132 @@ +From 5352ca18294178c61c317ab9783c2183dc22aad1 Mon Sep 17 00:00:00 2001 +From: Valentin Rothberg +Date: Wed, 24 Jul 2024 11:07:41 +0200 +Subject: [PATCH] ostree: move admindir to /etc/alternatives.admindir + +`ostree container commit` wipes /var and thereby erases the data in +/var/lib/alternatives; the directory used to store configs/symlinks of +alternatives. + +/var is not a good place for storing such configs since it won't receive +updates on bootc images either. We need to move to another location. + +Hence, use /etc/alternatives.admindir when running on an ostree-based +system unless /var/lib/alternatives is already present; a user may have +worked around the problem. This way we enable alternatives to work on +ostree-based systems without breaking backwards compat. + +Fixes: #9 +Signed-off-by: Valentin Rothberg +(cherry picked from commit 4224f51d0212318dd0fada3976e205e8189cf4b4) +--- + Makefile | 1 - + alternatives.8 | 2 ++ + alternatives.c | 34 ++++++++++++++++++++++++++++++---- + chkconfig.spec | 5 +++-- + 4 files changed, 35 insertions(+), 7 deletions(-) + +diff --git a/Makefile b/Makefile +index 0e7abd8..ea1d8dc 100644 +--- a/Makefile ++++ b/Makefile +@@ -55,7 +55,6 @@ install: + [ -d $(DESTDIR)/$(SBINDIR) ] || mkdir -p $(DESTDIR)/$(SBINDIR) + [ -d $(DESTDIR)/$(MANDIR) ] || mkdir -p $(DESTDIR)/$(MANDIR) + [ -d $(DESTDIR)/$(MANDIR)/man8 ] || mkdir -p $(DESTDIR)/$(MANDIR)/man8 +- [ -d $(DESTDIR)/$(ALTDIR) ] || mkdir -p -m 755 $(DESTDIR)/$(ALTDIR) + [ -d $(DESTDIR)/$(ALTDATADIR) ] || mkdir -p -m 755 $(DESTDIR)/$(ALTDATADIR) + [ -d $(DESTDIR)/$(SYSTEMDUTILDIR) ] || mkdir -p -m 755 $(DESTDIR)/$(SYSTEMDUTILDIR) + +diff --git a/alternatives.8 b/alternatives.8 +index d3bbf6b..a04785e 100644 +--- a/alternatives.8 ++++ b/alternatives.8 +@@ -214,6 +214,7 @@ A directory, by default + containing + .BR alternatives ' + state information. ++/etc/alternatives.admindir on OSTree-based systems. + .TP + link group + A set of related symlinks, intended to be updated as a group. +@@ -416,6 +417,7 @@ option. + .TP + .I /var/lib/alternatives/ + The default administration directory. ++/etc/alternatives.admindir on OSTree-based systems. + Can be overridden by the + .B --admindir + option. +diff --git a/alternatives.c b/alternatives.c +index a2d3750..5ba6c87 100644 +--- a/alternatives.c ++++ b/alternatives.c +@@ -496,6 +496,15 @@ static int fileExists(char *path) { + return !stat(path, &sbuf); + } + ++static int dirExists(char *path) { ++ struct stat sbuf; ++ ++ if (stat(path, &sbuf)) ++ return 0; ++ ++ return !!S_ISDIR(sbuf.st_mode); ++} ++ + static int facilityBelongsToUs(char *facility, const char *altDir) { + char buf[PATH_MAX]; + if (readlink(facility, buf, sizeof(buf)) <= 0) +@@ -1248,6 +1257,10 @@ static int listServices(const char *altDir, const char *stateDir, int flags) { + return 0; + } + ++static int isOSTree() { ++ return fileExists("/run/ostree-booted") || isLink("/ostree"); ++} ++ + int main(int argc, const char **argv) { + const char **nextArg; + char *end; +@@ -1256,8 +1269,7 @@ int main(int argc, const char **argv) { + struct alternative newAlt = {-1, {NULL, NULL, NULL}, NULL, NULL, 0, NULL}; + int flags = 0; + char *altDir = "/etc/alternatives"; +- char *stateDir = "/var/lib/alternatives"; +- struct stat sb; ++ char *stateDir= NULL; + struct linkSet newSet = {NULL, NULL, NULL}; + + setlocale(LC_ALL, ""); +@@ -1379,12 +1391,26 @@ int main(int argc, const char **argv) { + } + } + +- if (stat(altDir, &sb) || !S_ISDIR(sb.st_mode) || access(altDir, F_OK)) { ++ if (!dirExists(altDir)) { + fprintf(stderr, _("altdir %s invalid\n"), altDir); + return (2); + } + +- if (stat(stateDir, &sb) || !S_ISDIR(sb.st_mode) || access(stateDir, F_OK)) { ++ // if the stateDir is not explicitly set, we will use /var/lib/alternatives on normal systems ++ // and /etc/alternatives-admindir on OSTree systems, if the dir does not exist, we will create it ++ // if the stateDir is explicitly set, we will *not* try to create the dir and fail immediately if it does not exist ++ if (!stateDir) { ++ stateDir = "/var/lib/alternatives"; ++ if (!dirExists(stateDir)) { ++ if (isOSTree()) ++ stateDir = "/etc/alternatives-admindir"; ++ ++ if (mkdir(stateDir, 0755) < 0 && errno != EEXIST) { ++ fprintf(stderr, _("failed to create admindir: %s\n"), strerror(errno)); ++ exit(2); ++ } ++ } ++ } else if (!dirExists(stateDir)) { + fprintf(stderr, _("admindir %s invalid\n"), stateDir); + return (2); + } +-- +2.46.0 + diff --git a/SPECS/chkconfig.spec b/SPECS/chkconfig.spec index 7a691f4..b71a5e3 100644 --- a/SPECS/chkconfig.spec +++ b/SPECS/chkconfig.spec @@ -1,10 +1,13 @@ Summary: A system tool for maintaining the /etc/rc*.d hierarchy Name: chkconfig Version: 1.24 -Release: 1%{?dist} +Release: 2%{?dist} License: GPL-2.0-only URL: https://github.com/fedora-sysv/chkconfig Source: https://github.com/fedora-sysv/chkconfig/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz + +Patch001: 001-ostree-move-admindir-to-etc-alternatives.admindir.patch + BuildRequires: newt-devel gettext popt-devel libselinux-devel beakerlib gcc systemd-devel make Conflicts: initscripts <= 5.30-1 @@ -13,7 +16,7 @@ Provides: /sbin/chkconfig %description Chkconfig is a basic system utility. It updates and queries runlevel information for system services. Chkconfig manipulates the numerous -symbolic links in /etc/rc.d, to relieve system administrators of some +symbolic links in /etc/rc.d, to relieve system administrators of some of the drudgery of manually editing the symbolic links. %package -n ntsysv @@ -37,7 +40,7 @@ programs fulfilling the same or similar functions to be installed on a single system at the same time. %prep -%setup -q +%autosetup %build %make_build RPM_OPT_FLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_LD_FLAGS" @@ -81,13 +84,17 @@ mkdir -p $RPM_BUILD_ROOT/etc/chkconfig.d %files -n alternatives %license COPYING %dir /etc/alternatives +%ghost %dir %attr(755, root, root) /etc/alternatives.admindir +%ghost %dir %attr(755, root, root) /var/lib/alternatives %{_sbindir}/update-alternatives %{_sbindir}/alternatives %{_mandir}/*/update-alternatives* %{_mandir}/*/alternatives* -%dir /var/lib/alternatives %changelog +* Wed Sep 04 2024 Jan Macku - 1.24-2 +- ostree: move admindir to /etc/alternatives.admindir (RHEL-57665) + * Thu May 04 2023 Jan Macku - 1.24-1 - ci: fix `NEXT_VERSION` in Makefile - revert: releng: Enable Packit to handle Fedora updates