web-dev-qa-db-fra.com

Ajout d'entrées de fichier de configuration à des sections spécifiques

J'essaie d'écrire un script qui configure mySQL. Disons que je veux configurer le port sur 3333, donc je veux que le fichier de configuration contienne les lignes

[mysqld]
port=3333
[client]
port=3333

Au début, j'étais simplement echoing les nouvelles lignes:

echo "[mysqld]" >> /etc/mysql/my.cnf
echo "port=3333" >> /etc/mysql/my.cnf
echo "[client]" >> /etc/mysql/my.cnf
echo "port=3333" >> /etc/mysql/my.cnf

Mais ensuite, j'ai réalisé que le fichier de configuration contiendrait toutes les entrées plusieurs fois au cas où je l'exécuterais plusieurs fois. J'ai donc appliqué une vérification à l'aide d'une fonction:

function appendconfig {
    grep -qF "$1" "$2" || echo "$1" >> "$2"
}
cfg=/etc/mysql/my.cnf
appendconfig "[client]" $cfg
appendconfig "port=3333" $cfg
appendconfig "[mysqld]" $cfg
appendconfig "port=3333" $cfg

Cette fonction n’ajoutera la ligne que si elle n’existe pas encore.

Malheureusement, lors de la configuration de port=3333 dans la section [mysqld], il détecte que port=3333 est déjà présent (mais dans [client]).

Comment pourrais-je écrire des fichiers de configuration comme celui de mySQL dans un script Bash Linux?

Fondamentalement, je cherche quelque chose comme

setconfigvalue <section> <value> <file>

pour que je puisse écrire

setconfigvalue [mysqld] port=3333 /etc/mysql/my.cnf

J'ai essayé les suggestions de cette question du site soeur de U & L "Éditer INI comme des fichiers avec un script" .

La réponse acceptée ne fournit que des solutions codées en dur pour le problème du PO. J'aurais besoin de les adapter, mais c'est sujet aux erreurs.

J'ai essayé crudini, qui semble être le bon outil de par sa syntaxe. Mais il ne peut pas analyser les fichiers de configuration mySQL à cause des includes:

crudini --get /etc/mysql/my.cnf client port
File contains parsing errors: <???>
    [line 22]: !includedir /etc/mysql/conf.d/
    [line 23]: !includedir /etc/mysql/mariadb.conf.d/
2
Thomas Weller

Il s'est avéré que j'ai la version 0.7-1 de crudini installée à partir des packages officiels. Il existe une version plus récente disponible sur Github , 0.9 au moment de la rédaction.

J'ai remplacé l'ancienne version par la nouvelle version en utilisant wget:

wget -q https://raw.githubusercontent.com/pixelb/crudini/master/crud‌​ini -O /usr/bin/crudini

Ainsi, le message d'erreur relatif à l'erreur d'analyse a disparu:

crudini --get /etc/mysql/my.cnf mysqld port
Parameter not found: port

Et j'ai pu définir les paramètres que je voulais:

crudini --set /etc/mysql/my.cnf mysqld port 3333
crudini --get /etc/mysql/my.cnf mysqld port
3333
3
Thomas Weller