Alternativas

Las alternativas proporcionan medios para la instalación paralela de paquetes que proporcionan la misma funcionalidad manteniendo conjuntos de enlaces simbólicos (uno por paquete) que apuntan a ficheros alternativizados como este: /ruta/archivo-original -> /etc/alternativas/nombre-paquete-archivo-original -> /ruta/archivo-original.sufijo Para más información, consulte la página de manual update-alternatives(8).

Uso en Fedora

Las alternativas PODRÍAN utilizarse para permitir la instalación paralela de software cuando:

  • el software puede utilizarse como sustituto directo y funciona con suficiente similitud como para que los usuarios y otros programas, dentro de lo razonable, no necesiten saber qué variante está instalada en ese momento

Y

  • la selección del software sólo la realiza el administrador del sistema en todo el sistema y los usuarios finales no tienen necesidad de cambiar entre las variantes.

Inversamente, las alternativas NO DEBEN utilizarse cuando:

  • El software no es un sustituto directo. Por ejemplo, si los argumentos comunes de la línea de comandos son diferentes entre las dos variantes, las alternativas NO DEBEN utilizarse.

O

  • A los usuarios finales les importará qué variante están utilizando. Si un usuario que no sea root puede ganar algo cambiando entre las variantes, entonces las alternativas NO DEBEN usarse.

Un buen ejemplo de uso de alternativas son los distintos MTA, todos los cuales proporcionan /usr/bin/sendmail con argumentos de línea de comandos similares.

Los malos ejemplos de uso de alternativas incluyen:

  • los distintos entornos MPI en los que los usuarios se preocupan tanto del entorno MPI con el que compilan como del que ejecutan

  • elección del editor cuando el usuario invoque "vi", donde el usuario se preocupará por la disponibilidad de funciones, la compatibilidad con plugins, etc

Los casos donde la instalación paralela es deseable pero las alternativas son inadecuadas pueden ser escenarios donde Módulos de entorno son apropiados. MPI y python-sphinx (hasta Fedora 31) son ejemplos de paquetes que usan environment-modules para este propósito.

Cómo utilizar las alternativas

Si un paquete utiliza alternativas, los ficheros que de otro modo entrarían en conflicto DEBEN instalarse con un sufijo apropiado (por ejemplo: %{_bindir}/sendmail.postfix en lugar de %{_bindir}/sendmail), las ubicaciones originales DEBEN tocarse (por ejemplo: touch %{_bindir}/sendmail), los enlaces establecidos por las alternativas DEBEN listarse como %ghost en la lista de ficheros y deben añadirse los Requires. adecuados, como en los ejemplos siguientes: como en los ejemplos siguientes.

Poner los archivos alternativizados en la lista de archivos asegura que son propiedad de los paquetes respectivos, lo que significa que comandos como:

  • rpm -qf /usr/bin/tal-cual

  • dnf install /usr/bin/tal-cual

  • repoquery --whatprovides /usr/bin/tal-cual

funcionan correctamente. El uso de %ghost para este fin permite utilizar globos y listas de archivos generados.

Ejemplos

Ejemplo de antlr.spec:

Requiere(post): %{_bindir}/update-alternatives
Requiere(postun): %{_bindir}/update-alternatives
...
%install
...
touch %{buildroot}%{_bindir}/antlr

%post
update-alternatives --install %{_bindir}/antlr \
  %{name} %{_bindir}/antlr-java 10

%postun
if [ $1 -eq 0 ] ; then
  update-alternatives --remove %{name} %{_bindir}/antlr-java
fi
...
%files
...
%ghost %{_bindir}/antlr
%{_bindir}/antlr-java

Y un ejemplo más complejo de invocación de alternativas de sendmail.spec, ligeramente editado:

Requires(post): %{_bindir}/update-alternatives
Requires(postun): %{_bindir}/update-alternatives
Requires(preun): %{_bindir}/update-alternatives
...
%install
...
# rename files for alternative usage
mv %{buildroot}%{_bindir}/sendmail %{buildroot}%{_bindir}/sendmail.sendmail
touch %{buildroot}%{_bindir}/sendmail
for i in mailq newaliases rmail; do
    mv %{buildroot}%{_bindir}/$i %{buildroot}%{_bindir}/$i.sendmail
    touch %{buildroot}%{_bindir}/$i
done
mv %{buildroot}%{_mandir}/man1/mailq.1 %{buildroot}%{_mandir}/man1/mailq.sendmail.1
touch %{buildroot}%{_mandir}/man1/mailq.1
mv %{buildroot}%{_mandir}/man1/newaliases.1 %{buildroot}%{_mandir}/man1/newaliases.sendmail.1
touch %{buildroot}%{_mandir}/man1/newaliases.1
mv %{buildroot}%{_mandir}/man5/aliases.5 %{buildroot}%{_mandir}/man5/aliases.sendmail.5
touch %{buildroot}%{_mandir}/man5/aliases.5
mv %{buildroot}%{_mandir}/man8/sendmail.8 %{buildroot}%{_mandir}/man8/sendmail.sendmail.8
touch %{buildroot}%{_mandir}/man8/sendmail.8

%postun
if [ "$1" -ge "1" ]; then
    if [ "`readlink %{_sysconfdir}/alternatives/mta`" == "%{_bindir}/sendmail.sendmail" ]; then
        %{_bindir}/alternatives --set mta %{_bindir}/sendmail.sendmail
    fi
fi

%post
# Configurar los archivos alternativos para los MTA.
update-alternatives --install %{_bindir}/sendmail mta %{_bindir}/sendmail.sendmail 90 \
    --slave %{_bindir}/mailq mta-mailq %{_bindir}/mailq.sendmail \
    --slave %{_bindir}/newaliases mta-newaliases %{_bindir}/newaliases.sendmail \
    --slave %{_bindir}/rmail mta-rmail %{_bindir}/rmail.sendmail \
    --slave /usr/lib/sendmail mta-sendmail /usr/lib/sendmail.sendmail \
    --slave %{_sysconfdir}/pam.d/smtp mta-pam %{_sysconfdir}/pam.d/smtp.sendmail \
    --slave %{_mandir}/man8/sendmail.8.gz mta-sendmailman %{_mandir}/man8/sendmail.sendmail.8.gz \
    --slave %{_mandir}/man1/mailq.1.gz mta-mailqman %{_mandir}/man1/mailq.sendmail.1.gz \
    --slave %{_mandir}/man1/newaliases.1.gz mta-newaliasesman %{_mandir}/man1/newaliases.sendmail.1.gz \
    --slave %{_mandir}/man5/aliases.5.gz mta-aliasesman %{_mandir}/man5/aliases.sendmail.5.gz \
    --initscript sendmail
...

%preun
if [ $1 = 0 ]; then
    update-alternatives --remove mta %{_bindir}/sendmail.sendmail
fi
...

%files
...
%ghost %{_bindir}/sendmail
%ghost %{_bindir}/mailq
%ghost %{_bindir}/newaliases
%ghost %{_bindir}/rmail
%ghost /usr/lib/sendmail
%ghost %{_sysconfdir}/pam.d/smtp
%ghost %{_mandir}/man8/sendmail.8.gz
%ghost %{_mandir}/man1/mailq.1.gz
%ghost %{_mandir}/man1/newaliases.1.gz
%ghost %{_mandir}/man5/aliases.5.gz

%{_bindir}/sendmail.sendmail
%{_bindir}/mailq.sendmail
%{_bindir}/newaliases.sendmail
%{_bindir}/rmail.sendmail
/usr/lib/sendmail.sendmail
%config(noreplace) %{_sysconfdir}/pam.d/smtp.sendmail
%{_mandir}/man8/sendmail.sendmail.8.gz
%{_mandir}/man1/mailq.sendmail.1.gz
%{_mandir}/man1/newaliases.sendmail.1.gz
%{_mandir}/man5/aliases.sendmail.5.gz

%attr(0755,root,root) %{_initrddir}/sendmail