Empaquetado de Configuración por Producto

En el entorno de Fedora.next, contamos con una selección de productos Fedora, además de la disponibilidad de la versión clásica de Fedora. Tradicionalmente, hemos mantenido una configuración predeterminada única para todas las instalaciones de Fedora, pero los distintos casos de uso tienen necesidades diferentes. El objetivo de este documento es establecer las directrices para crear configuraciones predeterminadas específicas para cada producto.

Queremos garantizar que todos los paquetes tengan valores predeterminados razonables para cualquier Producto en el que estén instalados, y al mismo tiempo evitar situaciones donde los usuarios tengan algunos paquetes instalados con los valores predeterminados de un Producto y algunos paquetes con los de otro.

Requerimientos

  • Todos los paquetes DEBEN tener una configuración predeterminada global. Esta configuración se utilizará siempre que no se requiera una configuración predeterminada específica del producto. (Por ejemplo, si se utiliza una instalación que no es del producto o si solo Fedora Cloud tiene una configuración personalizada y se instaló Fedora Workstation).

  • Cualquier paquete que requiera una configuración predeterminada por producto DEBE proporcionar todos los archivos de configuración alternativos en el mismo paquete.

  • Cualquier paquete que requiera una configuración que difiera entre Productos DEBE obtener permisos desde ese Grupo de Trabajo de Productos antes de empaquetarlo.

Configuración Predeterminada Global

  • La configuración global por defecto DEBE ser proporcionada por el paquete que lo requiere.

  • La configuración global por defecto DEBE ser nombrada basándose en la esquema de nombrado nomalizado del paquete, con la parte principal del nombre siendo sufijo por defecto. Por ejemplo, si el paquete normalmente utiliza algo.conf, entonces la configuración global por defecto DEBE ser nombrada como algo-predeterminado.conf..

Configuración Per-Producto Predeterminado

  • Por cada Producto requiriendo una única configuración por defecto, el empaquetador DEBE proporcionar una copia del archivo de configuración por defecto, modificado como sea apropiado para el producto específico.

  • El archivo de configuración específico del producto DEBE ser nombrado basado en el esquema de nombrado normal del paquete, con la parte principal del nombre siendo anexado por un guión seguido por el nombre del producto. Por ejemplo, si el paquete utiliza normalmente algo.conf, entonces la versión Servidor DEBE ser nombrada algo-server.conf.

  • Si la configuración será enlazado simbólicamente en su lugar, el archivo de configuración específico de producto DEBE ser puesto en una parte apropiada de la jerarquía /etc. EL archivo de configuración divergente DEBE ser especificado como %config(noremplazar) en %archivos como por las guías de empaquetado usual de /etc.

  • Si la configuración será copiada en su lugar, el archivo de configuración específico del producto DEBE ubicarse en una parte adecuada de la jerarquía /usr/share. El archivo de configuración divergente DEBE especificarse como un archivo normal en la sección %files.

Aplicar Configuración

Con el fin de aplicar la configuración, el empaquetador DEBE implementar un mecanismo en la sección posttrans del específico que se comporte como sigue:

  • Primero DEBE comprobar si el archivo config final ya existe. Si es así, el script no DEBE ningún cambio.

    %posttrans
    if [ ! -e %{_sysconfdir}/algo/algo.conf ]; then
        ...
    fi
  • Then it MUST use the value of the Fedora VARIANT_ID to symlink or copy one of the divergent config files (or the default) to the final config file location. It will get this value by importing the contents of /etc/os-release as shell values. Known values of this field at the time of this writing are "atomichost", "cloud", "server" and "workstation". For more detail, see the os-release(5) man page.

    . /etc/os-release || :
    case "$VARIANT_ID" in
        server)
            ln -sf foo-server.conf %{_sysconfdir}/foo/foo.conf || :
            ;;
        *)
            ln -sf foo-default.conf %{_sysconfdir}/foo/foo.conf || :
            ;;
        esac
  • Por último, el lugar del archivo config final DEBE ser listado dentro de la sección %files con %ghost:

    %ghost %config(noreplace) %{_sysconfdir}/algo/algo.conf
  • Para propósito de seguimiento, el paquete proporciona varios archivos de configuración DEBEN además contener un Provides: virtual por cada configuración variante que pueda ser aplicado:

    Provides: variant_config(Atomic.host)
    Provides: variant_config(Cloud)
    Provides: variant_config(Server)
    Provides: variant_config(Workstation)

Ejemplo (firewalld)

We will assume for the sake of demonstration that firewalld will need a custom configuration for Fedora Server and Fedora Workstation, but that Fedora Cloud will not require any changes from the global default.

...
Provides: variant_config(Server)
Provides: variant_config(Workstation)
...

%posttrans
# Si aún no tenemos un enlace simbólico o un archivo existente para firewalld.conf,
# créalo. Nota: esto restablecerá intencionalmente la directiva del kit de directivas.
# al mismo tiempo, por tanto están en sincronía.
if [ ! -e %{_sysconfdir}/firewalld/firewalld.conf ]; then
    # Importar /etc/os-release para obtener la definición de variante
    . /etc/os-release || :

    case "$VARIANT_ID" in
        server)
            ln -sf firewalld-server.conf %{_sysconfdir}/firewalld/firewalld.conf || :
            ln -sf org.fedoraproject.FirewallD1.server.policy \
                %{_datadir}/polkit-1/actions/org.fedoraproject.FirewallD1.policy || :
            ;;
        workstation)
            ln -sf firewalld-workstation.conf %{_sysconfdir}/firewalld/firewalld.conf || :
            ln -sf org.fedoraproject.FirewallD1.desktop.policy \
                %{_datadir}/polkit-1/actions/org.fedoraproject.FirewallD1.policy || :
            ;;
        *)
            ln -sf firewalld-default.conf %{_sysconfdir}/firewalld/firewalld.conf || :
            # The default firewall policy will be the same as Server
            ln -sf org.fedoraproject.FirewallD1.server.policy \
                %{_datadir}/polkit-1/actions/org.fedoraproject.FirewallD1.policy || :
            ;;
        esac
fi

…

%files -f %{name}.lang
…
%attr(0750,root,root) %dir %{_sysconfdir}/firewalld
%ghost %config(noreplace) %{_sysconfdir}/firewalld/firewalld.conf
%config(noreplace) %{_sysconfdir}/firewalld/firewalld-default.conf
%config(noreplace) %{_sysconfdir}/firewalld/firewalld-server.conf
%config(noreplace) %{_sysconfdir}/firewalld/firewalld-workstation.conf
…
%ghost %{_datadir}/polkit-1/actions/org.fedoraproject.FirewallD1.policy
%{_datadir}/polkit-1/actions/org.fedoraproject.FirewallD1.desktop.policy
%{_datadir}/polkit-1/actions/org.fedoraproject.FirewallD1.server.policy