Skip to content

Commit

Permalink
ostree: move admindir to /etc/.alternatives.admindir
Browse files Browse the repository at this point in the history
`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 <vrothberg@redhat.com>
  • Loading branch information
vrothberg committed Jul 25, 2024
1 parent d142752 commit a3468c0
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 57 deletions.
6 changes: 6 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
FROM quay.io/fedora/fedora-bootc:40
RUN mkdir -p /etc/.alternatives.admindir
COPY alternatives /usr/sbin/alternatives
RUN dnf -y install golang
RUN ls /etc/.alternatives.admindir
RUN go help > /dev/null
2 changes: 2 additions & 0 deletions alternatives.8
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ A directory, by default
containing
.BR alternatives '
state information.
/etc/.alternatives.state on OSTree-based systems.
.TP
link group
A set of related symlinks, intended to be updated as a group.
Expand Down Expand Up @@ -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.
Expand Down
30 changes: 30 additions & 0 deletions alternatives.c
Original file line number Diff line number Diff line change
Expand Up @@ -1290,6 +1290,32 @@ static int listServices(const char *altDir, const char *stateDir, int flags) {
return 0;
}

int dirExists(const char *path) {
struct stat stats;
stat(path, &stats);

if (S_ISDIR(stats.st_mode))
return 1;

return 0;
}

int canUseAlternativeAdminDir() {
if (dirExists("/var/lib/alternatives")) {
return 0;
}

if (fileExists("/run/ostree-booted")) {
return 1;
}

if (isLink("/ostree")) {
return 1;
}

return 0;
}

int main(int argc, const char **argv) {
const char **nextArg;
char *end;
Expand All @@ -1304,6 +1330,10 @@ int main(int argc, const char **argv) {
struct stat sb;
struct linkSet newSet = {NULL, NULL, NULL};

if (canUseAlternativeAdminDir()) {
stateDir = "/etc/.alternatives.admindir";
}

setlocale(LC_ALL, "");
bindtextdomain("chkconfig", "/usr/share/locale");
textdomain("chkconfig");
Expand Down
5 changes: 2 additions & 3 deletions chkconfig.spec
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,7 @@ mkdir -p $RPM_BUILD_ROOT/etc/chkconfig.d
%{_sysconfdir}/chkconfig.d
%{_sysconfdir}/init.d
%{_sysconfdir}/rc.d
%{_sysconfdir}/rc.d/init.d
%{_sysconfdir}/rc[0-6].d
%{_sysconfdir}/rc.d/rc[0-6].d
%{_mandir}/*/chkconfig*
%{_prefix}/lib/systemd/systemd-sysv-install

Expand All @@ -95,11 +93,12 @@ mkdir -p $RPM_BUILD_ROOT/etc/chkconfig.d
%files -n alternatives
%license COPYING
%dir /etc/alternatives
%dir /etc/.alternatives.admindir
%ghost /var/lib/alternatives
%{_sbindir}/update-alternatives
%{_sbindir}/alternatives
%{_mandir}/*/update-alternatives*
%{_mandir}/*/alternatives*
%dir /var/lib/alternatives

%changelog
* Fri Jun 21 2024 Jan Macku <jamacku@redhat.com> - 1.28-1
Expand Down
Loading

0 comments on commit a3468c0

Please sign in to comment.