# Custom configuration placeholder

Added in version 2.23.0.

LemonLDAP::NG optionally supports the `%SERVERENV:VariableName%` syntax to read configuration values from the environment.

You may also define additional placeholder syntaxes by creating your own Perl module

## Enable and configure your module

Edit the `[configuration]` section in `lemonldap-ng.ini`

    [configuration]

    configPlaceHolderModules=SECRET=Lemonldap::NG::Common::Conf::SecretPlaceholder
    ; optionally configure the module here
    ; secretPlaceholderConfig=my_config

This configuration will call `Lemonldap::NG::Common::Conf::SecretPlaceholder` everytime `%SECRET:MyVariable%` is encountered in the configuration.

You can define multiple modules by separating them with a comma:

    [configuration]

    ; this will dispatch %SECRET:xx%, %DNS:yy% and %VAULT:zz% to each
    ; declared module
    configPlaceHolderModules=SECRET=My::Secret, DNS=My::DNS, VAULT=My::Vault

## Write your custom module

Here is an example of a Perl module that implements a configuration placeholder:

    # Must be stored in Lemonldap/NG/Common/Conf/SecretPlaceholder.pm
    package Lemonldap::NG::Common::Conf::SecretPlaceholder;

    use strict;

    # You must define a replace function
    sub replace {
        # The function takes:
        # * current module name
        # * current configuration hash
        # * variable name to look up
        my ( $class, $conf, $variable ) = @_;

        # You can read configuration options (vault server IP, etc)
        # from the ini-file configuration here
        my $placeholder_config = $conf->{secretPlaceholderConfig};

        # Obtain and return the value to be used in actual configuration
        my $value = implement_this($variable);

        return $value;
    }
    1;