fedora-sysv / chkconfig

✔️ A system tool for maintaining the /etc/rc*.d hierarchy.
GNU General Public License v2.0
15 stars 31 forks source link

Weird behavior when `--add-slave` and `--keep-foreign` used together for active alternative #102

Closed frenzymadness closed 1 year ago

frenzymadness commented 1 year ago

We have a problem in python3.11-wheel package which we can probably solve by ourselves but I think the strange behavior of alternatives I discovered is still worth reporting.

When talking about packages, I mean the ones available in RHEL 8 and I'm using 1minutetip for testing. The most important ones are chkconfig-1.19.1-1.el8.x86_64 and python3.11-wheel-0.38.4-3.el8.noarch.

To reproduce the problem on RHEL 8:

  1. dnf install python36 python3.11 (Python 3.6 is needed later.)
  2. alternatives --set python3 /usr/bin/python3.11
  3. dnf install python3.11-wheel

The installation of python3.11-wheel calls this command in its %post scriptlet: alternatives --keep-foreign --add-slave python3 /usr/bin/python3.11 /usr/bin/wheel-3 wheel-3 /usr/bin/wheel-3.11

The command produces the following error:

Running scriptlet: python3.11-wheel-0.38.4-3.el8.noarch                                 1/1 
failed to link /usr/bin/wheel-3 -> /etc/alternatives/wheel-3: /usr/bin/wheel-3 exists and it is either not a symlink or --keep-foreign was set and link points outside /etc/alternatives

But, if you set the alternative for python3 to python36 which means that the installation of python3.11-wheel will add the slave into an inactive alternative, it works fine and no error is shown. So these steps are fine:

  1. dnf install python36 python3.11
  2. alternatives --set python3 /usr/bin/python3.6
  3. dnf install python3.11-wheel

If I understand it correctly --keep-foreign should prevent the --add-slave from removing/changing a symlink, if it already exists. If that's true, having --add-slave together with --keep-foreign makes perfect sense. The problem is that the error message is not true: /usr/bin/wheel-3 does not exist in this case. Alternatives should create that file if you install python3.11-wheel when python3.11 is the active alternative for python3.

To sum this up:

Bug report with some more context: https://bugzilla.redhat.com/show_bug.cgi?id=2181479

Does it make sense to use --keep-foreign with --add-slave? If so, could we fix the problem? And if not, could we improve the error message to make it clear that this is not supported?

lnykryn commented 1 year ago

Yep, this is a bug. This combination should work.

If I understand it correctly --keep-foreign should prevent the --add-slave from removing/changing a symlink, if it already exists.

Well, the correct definition is: --keep-foreign prevents changing a symlink if it is not a symlink created by alternatives.

frenzymadness commented 1 year ago

Thank you for the fix!