#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS conf

function display_help() {
    local OENC="$UTF8"
    uecho "$scriptname: Activer ou désactiver un paramètre dans un fichier de configuration

USAGE
    $scriptname [options] config name[=value]...

OPTIONS
    -e
        Activer le paramètre (par défaut). Si le paramètre existe, mais est
        commenté, il est décommenté. Si une valeur est spécifiée pour le
        paramètre, le paramètre est modifié dans le fichier en conséquence.
    -q
        Cette option s'utilise avec l'option -e et le type shell. Elle permet
        de s'assurer que les valeurs ayant des espaces et/ou des caractères
        spéciaux sont quotées
    -d
        Désactiver le paramètre. Le paramètre est commenté s'il existe dans le
        fichier
    -a
        Ajouter une valeur à la variable, ou un paramètre avec cette valeur
        (suivant le type de fichier de configuration)
    -A
        Ajouter une valeur au tableau, ou un paramètre avec cette valeur
        (suivant le type de fichier de configuration)
    -t TYPE
        Type de fichier de configuration. TYPE peut être sh (par défaut), apache
        ou mysql.
        shell
            les paramètres sont de la forme 'name=value', et les commentaires
            débutent par '#'. Ce type peut être utilisé pour tous les fichiers
            ayant ces caractéristiques, dont les fichiers de script shell
        apache
            les paramètres sont de la forme 'name value', et les commentaires
            débutent par '#'. Ce type peut être utilisé pour tous les fichiers
            ayant ces caractéristiques, dont les fichiers de configuration
            apache
        mysql, php
            les paramètres sont dans des sections nommées de la forme [section],
            sont de la forme 'name=value', et les commentaires débutent par '#'
            ou ';'
            Ce type peut être utilisé pour tous les fichiers ayant ces
            caractéristiques, dont les fichiers de configuration de mysql et de
            php. Avec ce type, la section est obligatoire.
    -s SECTION
        Avec le type mysql, préciser la section dans laquelle inscrire le
        paramètre. Attention! La section DOIT exister, elle n'est pas créée
        automatiquement."
}

action=enable
quoted=
type=auto
section=
parse_opts "${PRETTYOPTS[@]}" \
    --help '$exit_with display_help' \
    -e action=enable \
    -q quoted=1 \
    -d action=disable \
    -a action=append \
    -A action=array_append \
    -t: type= \
    --shell type=shell \
    --apache type=apache \
    --mysql type=mysql \
    --php type=mysql \
    -s: section= \
    @ args -- "$@" && set -- "${args[@]}" || die "$args"

config="$1"; shift
[ -f "$config" ] || touch "$config" || die

if [ "$type" == auto ]; then
    # essayer de deviner le type
    [ -f "$config" ] && first_lines="$(head -n5 <"$config")" || first_lines=
    name="$(basename "$config")"
    MYSQL_NAMES=(my.cnf php.ini)
    APACHE_NAMES=(apache{,2}.conf httpd.conf)
    # ... d'abord sur la base du nom
    if array_contains MYSQL_NAMES "$name"; then
        type=mysql
    elif array_contains APACHE_NAMES "$name"; then
        type=apache
    # ... puis sur la ligne de mode
    elif quietgrep "^[ $TAB]*#.*-\\*-.* mode: sh .*-\\*-" <<<"$first_lines"; then
        type=shell
    elif quietgrep "^[ $TAB]*#.*-\\*-.* mode: conf .*-\\*-" <<<"$first_lines"; then
        type=apache
    elif [[ "$name" == *.sh ]]; then
        type=shell
    elif [[ "$name" == *.conf ]]; then
        type=apache
    else
        # type shell par défaut
        type=shell
    fi
fi

case "$type" in
s|sh|shell)
    [ -n "$quoted" -a "$action" == "enable" ] && action=enableq
    "conf_$action" "$config" "$@"
    ;;
a|apache)
    "aconf_$action" "$config" "$@"
    ;;
m|mysql|p|php)
    [ -n "$section" ] || die "Il faut spécifier la section avec -s"
    "mconf_$action" "$config" "$section" "$@"
    ;;
esac
