<?xml version="1.0" encoding="utf-8"?>
<creole>
    <files>
        <file filelist='postgresql' name='/etc/bareos/bareosfichiers.d/postgresql.conf' source='bareos_postgresql.conf' mkdir='True'/>
        <file filelist='eoledbpsql' name='/etc/eole/eole-db.d/postgresql_databases.yml'/>
    </files>
    <containers>
        <container name='postgresql' id='11'>
            <file filelist='postgresql' name='/etc/postgresql/12/main/postgresql.conf' del_comment='#'/>
            <file filelist='postgresql' name='/etc/postgresql/12/main/pg_hba.conf'/>
            <file filelist='postgresql' name='/etc/postgresql/12/main/pg_ident.conf'/>
            <service servicelist='postgresql'>postgresql@12-main</service>
            <package>eole-postgresql-pkg</package>
            <service_access service='postgresql@12-main'>
                <port>5432</port>
                <tcpwrapper>postgresql</tcpwrapper>
            </service_access>
        </container>
    </containers>

    <variables>

        <family name='services'>
            <variable name='activer_postgresql' type='oui/non' description='Activer le serveur de bases de données PostgreSQL'>
                <value>oui</value>
            </variable>
        </family>

        <family name='postgresql' mode='expert' icon='postgres'>

            <variable name='pg_additional_db' type='oui/non' description="Bases de données PostgreSQL supplémentaires">
                <value>non</value>
            </variable>
            <variable name='pg_additional_db_name' type='string' description="Nom de la base de données supplémentaire" mandatory='True' multi='True' mode='expert'/>
            <variable name='pg_additional_db_template' type='string' description="Modèle de base de données" mode='expert' mandatory='True'/>
            <variable name='pg_additional_db_admin' type='string' description="Administrateur de la base de données" mode='expert'>
                <value>postgres</value>
            </variable>
            <variable name='pg_additional_db_admin_createrole' type='oui/non' description='Donner le droit de créer des rôles à l’administrateur de la base'>
                <value>non</value>
            </variable>
            <variable name='pg_additional_db_admin_superuser' type='oui/non' description='Donner le role superuser à l’administrateur de la base'>
                <value>non</value>
            </variable>
            <variable name='pg_additional_db_admin_login' type='oui/non' description='Il s agit d un role de connexion'>
                <value>oui</value>
            </variable>

            <variable name='pg_additional_role' type='oui/non' description="Créer des rôles" mode='expert'>
                <value>non</value>
            </variable>
            <variable name='pg_additional_role_name' type='string' description="Nom du rôle" multi='True' mandatory='True' mode='expert'/>
            <variable name='pg_additional_role_createrole' type='oui/non' description='Donner le droit de créer des rôles au rôle courant'>
                <value>non</value>
            </variable>
            <variable name='pg_additional_role_superuser' type='oui/non' description='Donner le role superuser au role courant'>
                <value>non</value>
            </variable>
            <variable name='pg_additional_role_login' type='oui/non' description='Il s agit d un role de connexion'>
                <value>oui</value>
            </variable>
            <variable name='pg_additional_role_pwd' type='string' description="Gestion du mot de passe" mandatory='True' mode='expert'>
                <value>auto</value>
            </variable>
            <variable name='set_pg_role_perms' type='oui/non' description="Paramétrer des permissions pour les rôles" mandatory='True' mode='expert'>
                <value>non</value>
            </variable>
            <variable name='pg_role_perms' type='string' description="Permissions des rôles" multi='True' mandatory='True' mode='expert'/>
            <variable name='pg_role_perms_name' type='string' description="Rôle affecté par les permissions" mandatory='True' mode='expert'/>
            <variable name='pg_role_perms_object' type='string' description="Objet cible des permissions" mandatory='True' mode='expert'/>
            <variable name='pg_role_perms_source_ip' type='ip' description="IP/réseau source de connexion" mandatory='True' mode='expert'/>
            <variable name='pg_role_perms_source_netmask' type='netmask' description="Netmask" mandatory='True' mode='expert'/>
            <variable name='pg_role_perms_hba_only' type='oui/non' description='Permission uniquement définie pour l’accès au serveur' mode='expert'>
                <value>non</value>
            </variable>

            <variable name='pg_max_connections' type='number' description='Nombre maximum de connexions'>
                <value>100</value>
            </variable>
            <variable name='pg_authentication_timeout' type='number' description='Délai de connexion maximum (en secondes)'>
                <value>60</value>
            </variable>
            <variable name='pg_server_key' type='filename' description="Emplacement de la clé SSL du serveur PostgreSQL" mode='expert'>
                <value>/etc/postgresql/12/main/server.key</value>
            </variable>
            <variable name='pg_server_cert' type='filename' description="Emplacement du certificat du serveur PostgreSQL" mode='expert'>
                <value>/etc/postgresql/12/main/server.crt</value>
            </variable>
            <variable name='pg_ssl_only' type='oui/non' description="Autoriser uniquement les connexions SSL" mode='expert'>
                <value>non</value>
            </variable>
            <variable name='pg_data_directory' type='filename' description="Répertoire contenant les bases de données PostgreSQL">
                <value>/var/lib/postgresql/12/main</value>
            </variable>

            <variable name='pg_custom_backup_script' type='filename' description="Chemin du script de sauvegarde personnalisé"/>
            <variable name='pg_custom_bs_param_name' type='string' description="Paramètre pour le script" multi='True'/>
            <variable name='pg_custom_bs_param_value' type='string' description='Valeur pour le paramètre' multi='True'/>
            <variable name='pg_custom_bs_database' type='string' description='Base de données à sauvegarder' multi='True'/>

            <variable name='pg_work_mem' type='number' description="Mémoire tampon allouée aux opérations de tri et tables de hash" mode='expert'>
                <value>4</value>
            </variable>
            <variable name='pg_work_mem_unit' type='string' description='Unité de la mémoire tampon' mode='expert'>
                <value>MB</value>
            </variable>
            <variable name='pg_maintenance_work_mem' type='number' description="Mémoire tampon allouée pour les opérations de maintenance" mode='expert'>
                <value>64</value>
            </variable>
            <variable name='pg_maintenance_work_mem_unit' type='string' description='Unité de la mémoire tampon' mode='expert'>
                <value>MB</value>
            </variable>
            <variable name='pg_wal_buffers' type='number' description="Mémoire tampon allouée pour les journaux" mode='expert'>
                <value>-1</value>
            </variable>
            <variable name='pg_max_wal_size' type='number' description="Limite douce du Write Ahead Log" mode='expert'>
                <value>1</value>
            </variable>
            <variable name='pg_max_wal_size_unit' type='string' description="Unité de la limite douce du Write Ahead Log">
                <value>GB</value>
            </variable>
            <variable name='pg_shared_buffers' type='number' description='Quantité de mémoire pour les buffers partagés'>
                <value>128</value>
            </variable>
            <variable name='pg_shared_buffers_unit' type='string' description='Unité de la quantité de mémoire pour les buffers partagés'>
                <value>MB</value>
            </variable>
            <variable name='pg_effective_cache_size' type='number' description='Taille du cache (blocs de 8ko)' mandatory='True'/>
            <variable name='pg_effective_cache_size_unit' type='string' description='Unité de la taille du cache'>
                <value>kB</value>
            </variable>

        </family>

        <separators>
            <separator name='pg_additional_db'>Gestion des bases et utilisateurs</separator>
            <separator name='pg_roles_perms'>Permissions</separator>
            <separator name='pg_custom_backup_script'>Méthode de sauvegarde personnalisée</separator>
            <separator name='pg_work_mem'>Optimisation</separator>
        </separators>

    </variables>

    <constraints>
        <check name='valid_enum' target='pg_additional_db_template'>
            <param>['postgres']</param>
            <param name='checkval'>False</param>
        </check>
        <check name="valid_enum" target="pg_additional_role_pwd">
            <param>['auto', 'manuelle']</param>
        </check>
        <check name='pg_valid_object' target='pg_role_perms_object'/>
        <!-- <check name='pg_valid_perms' target='pg_role_perms'/> passage de la variable maître problèmatique-->
        <check name="valid_enum" target="pg_shared_buffers_unit">
            <param>['MB','kB']</param>
        </check>
        <check name="valid_enum" target="pg_effective_cache_size_unit">
            <param>['MB','kB']</param>
        </check>
        <check name="valid_enum" target="pg_max_wal_size_unit">
            <param>['GB','MB','kB']</param>
        </check>
        <check name="valid_enum" target="pg_work_mem_unit">
            <param>['MB','kB']</param>
        </check>
        <check name="valid_enum" target="pg_maintenance_work_mem_unit">
            <param>['MB','kB']</param>
        </check>
        <fill name='calc_pg_cache_size' target='pg_effective_cache_size'/>
        <condition name='disabled_if_in' source='activer_postgresql'>
            <param>non</param>
            <target type='filelist'>postgresql</target>
            <target type='filelist'>eoledbpsql</target>
            <target type='servicelist'>postgresql</target>
            <target type='family'>postgresql</target>
        </condition>
        <condition name='disabled_if_in' source='activer_eoledb' fallback='True'>
            <param>non</param>
            <target type='filelist'>eoledbpsql</target>
            <target>pg_additional_db</target>
            <target>pg_additional_role</target>
        </condition>
        <condition name='disabled_if_in' source='pg_additional_db'>
            <param>non</param>
            <target>pg_additional_db_name</target>
            <target>pg_additional_db_template</target>
            <target>pg_additional_db_admin</target>
        </condition>
        <group master='pg_additional_db_name'>
            <slave>pg_additional_db_template</slave>
            <slave>pg_additional_db_admin</slave>
            <slave>pg_additional_db_admin_createrole</slave>
            <slave>pg_additional_db_admin_superuser</slave>
            <slave>pg_additional_db_admin_login</slave>
        </group>
        <condition name='disabled_if_in' source='pg_additional_role'>
            <param>non</param>
            <target>pg_additional_role_name</target>
            <target>pg_additional_role_createrole</target>
            <target>pg_additional_role_pwd</target>
            <target>pg_additional_role_superuser</target>
            <target>set_pg_role_perms</target>
        </condition>
        <condition name='disabled_if_in' source='set_pg_role_perms'>
            <param>non</param>
            <target>pg_role_perms</target>
            <target>pg_role_perms_name</target>
            <target>pg_role_perms_object</target>
            <target>pg_role_perms_source_ip</target>
            <target>pg_role_perms_source_netmask</target>
            <target>pg_role_perms_hba_only</target>
        </condition>
        <group master='pg_additional_role_name'>
            <slave>pg_additional_role_createrole</slave>
            <slave>pg_additional_role_pwd</slave>
            <slave>pg_additional_role_superuser</slave>
            <slave>pg_additional_role_login</slave>
        </group>
        <group master='pg_role_perms'>
            <slave>pg_role_perms_name</slave>
            <slave>pg_role_perms_object</slave>
            <slave>pg_role_perms_source_ip</slave>
            <slave>pg_role_perms_source_netmask</slave>
            <slave>pg_role_perms_hba_only</slave>
        </group>
        <group master='pg_custom_bs_param_name'>
            <slave>pg_custom_bs_param_value</slave>
        </group>
    </constraints>

    <help>
        <variable name='activer_postgresql'>PostgreSQL est un système de gestion de base de données relationnelle et objet</variable>
        <family name='postgresql'>Paramétrage avancé du serveur de gestion de bases de données PostgreSQL</family>
        <variable name='pg_additional_db'>Déclaration de bases de données sans configuration eole-db</variable>
        <variable name='pg_additional_db_name'>Nom de la base de données (doit être unique dans le cluster)</variable>
        <variable name='pg_additional_db_admin'>Propriétaire de la base de données PostgreSQL (ne nécessite pas la déclaration spécifique de droits)</variable>
        <variable name='pg_additional_db_template'>Modèle de base de données servant à créer la base</variable>
        <variable name='pg_additional_role'>Déclaration de rôles dans PostgreSQL</variable>
        <variable name='pg_additional_role_name'>Nom du rôle (doit être unique, insensible à la casse)</variable>
        <variable name='pg_additional_role_pwd'>Mode de gestion du mot de passe (renouvelé automatiquement au reconfigure si auto)</variable>
        <variable name='pg_role_perms'>Permissions à appliquer pour un rôle donné, sous la forme d'une série des termes parmi SELECT INSERT UPDATE DELETE TRUNCATE REFERENCES TRIGGER CREATE CONNECT TEMPORARY TEMP EXECUTE USAGE ALL (séparation par espace).</variable>
        <variable name='pg_role_perms_name'>Rôle affecté par les permissions (seuls les rôles existants dans PostgreSQL sont traités)</variable>
        <variable name='pg_role_perms_object'>Objet (base, schema, table) sur lequel porte les permissions identifier par son nom complet de type database[.schema[.table]] (utiliser * pour ne pas spécifier le schéma ou la table, la base devant être spécifiée). Pour chaque niveau, plusieurs membres peuvent être déclarés en les séparant par le caractère "|" (par ex. base1|base2.public.table1|table2)</variable>
        <variable name='pg_role_perms_source_ip'>Adresse IP pour restreindre le domaine d'accès d'un rôle (all si 0.0.0.0 avec un netmask identique, local si 127.0.0.1)</variable>
        <variable name='pg_role_perms_hba_only'>La permissions servira uniquement à remplir le fichier pg_hba.conf et pas à créer les permissions dans les bases de données</variable>
        <variable name='pg_max_connections'>Nombre maximum de connexions concurrentes au serveur de base de données</variable>
        <variable name='pg_authentication_timeout'>Temps maximum pour terminer l'authentification du client</variable>
        <variable name='pg_data_directory'>Répertoire à utiliser pour l'entrepôt de données</variable>
        <variable name='pg_work_mem'>Quantité de mémoire allouée à chaque opération avant écriture sur le disque (par défaut : 4MB)</variable>
        <variable name='pg_maintenance_work_mem'>Quantité de mémoire allouée à chaque opération avant écriture sur le disque (par défaut : 64MB, minimum: 1024kB)</variable>
        <variable name='pg_wal_buffers'>Quantité de mémoire allouée avant écriture sur le disque (par défaut : -1, soit 1/32ème de la valeur de shared_buffers)</variable>
        <variable name='pg_max_wal_size'>Limite douce pour le Write Ahead Log</variable>
        <variable name='pg_shared_buffers'>Quantité de mémoire que le serveur de bases de données utilise comme mémoire partagée</variable>
        <variable name='pg_effective_cache_size'>Initialise l'estimation faite par le planificateur de la taille réelle du cache disque disponible pour une requête</variable>
        <variable name='pg_custom_backup_script'>Emplacement du script de sauvegarde personnalisé prenant le pas sur la sauvegarde 'normal' des bases de données spécifiées</variable>
        <variable name='pg_custom_bs_param_name'>Nom du paramètre à fournir au script de sauvegarde</variable>
        <variable name='pg_custom_bs_param_value'>Valeur à fournir au script pour le paramètre parent</variable>
        <variable name='pg_custom_bs_database'>Nom de base de données à sauvegarder via le script personnalisé (exclut cette base de la gestion des sauvegardes EOLE</variable>
    </help>
</creole>
