Modifer une variable dans n fichiers de configs INI
Hier, j'ai finalisé la config d'un serveur de secours Linux Opteron pour notre guichet cartographique. Il s'appuye sur l'excellent produit Mapserver ainsi que sur le non moins excellent framework php Cartoweb de CamptoCamp!
J'utilise rsync pour la synchronisation et j'ai été confronté à un chtit problème, sur mon deuxième serveur au vu des versions de apache et php que j'avais utilisé il me fallait charger la dll php_mapscript.so au niveau du php.ini. Du coup il me fallait modifier tous les sites cartographiques de mon serveur au niveau d'un fichier de config nommé server.ini. Je devais modifier dans tous ces fichiers la valeur d'une variable nommée disablePHPModuleCheck, est la passer de false à true.
Donc en résumé j'avais n fichiers server.ini à chercher dans une arborescence complexe démarrant dans "/data/dataweb/web/" puis il me fallait éditer chacun de ces fichiers pour passer la valeur de la variable "disablePHPModuleCheck" de false à true. Et il fallait absolument automatiser cette tâche pour deux raisons, la première étant que je suis un gros fainéant ne supportant pas de faire des tâches répétitives, la deuxième étant qu'à chaque synchronisation depuis le serveur source mes modifs seraient perdues.
Heureusement en m'appuyant sur le truc précédent et en le combinant avec un "perl oneliner" j'allais facilement atteindre le nirvana de l'adminsitrateur système.
Assez parlé voici la commande :
find /data/dataweb/web/ -name 'server.ini'|xargs perl -pi.original -e 's/(^disablePHPModuleCheck\s*=\s*)(false)/$1true/'
la première partie jusqu'au xargs est similaire au truc précédent, on cherche tous les fichiers "server.ini" depuis un endroit donné est on passe le nom de ces fichiers à la commande se trouvant après xargs. Ensuite on utilise perl pour éxécuter une expression perl en mode ligne de commande (grâce au -e). Dans mon cas il s'agit d'une bête regular expression de substitution contenant deux groupes de match identifiables aux deux paires de parenthèses, le premier groupe va chercher une ligne commençant par (grâce au ^) le mot clé disablePHPModuleCheck suivi de zéro ou plusieurs espace (grâce au \s*) suivi d'un signe égal (=) et de zéro ou plusieurs espaces (\s*).Le deuxième groupe va chercher la présence d'une valeur false pour cette variable. la valeur de substitution correspond à tous le contenu du premier groupe (grâce au $1) suivi de la valeur true. En fait la partie vraiment "magique" se situe au niveau des paramètres -p et -i.originale le premier crée une boucle implicite du style :
cette boucle sera appliquée sur tous les fichiers passé en paramètre, et on peut même rajouter du code à exécuter avant ou après la boucle (comme dans awk) avec des blocs "BEGIN" et "END" le mieux c'est de faire un chtit "man perlrun" pour voire tout cela plus en détail.
Enfin le paramètre -i.original permet d'éditer le fichier en place et de créer une copie de secours de l'original en le renommant en rajoutant .original à la fin du nom du fichier.
Voilà c'est tout, c'est plus long à expliquer qu'à taper, j'éspère que vous allez faire plein de tests d'editions en place grâce au "perl oneliners".
J'utilise rsync pour la synchronisation et j'ai été confronté à un chtit problème, sur mon deuxième serveur au vu des versions de apache et php que j'avais utilisé il me fallait charger la dll php_mapscript.so au niveau du php.ini. Du coup il me fallait modifier tous les sites cartographiques de mon serveur au niveau d'un fichier de config nommé server.ini. Je devais modifier dans tous ces fichiers la valeur d'une variable nommée disablePHPModuleCheck, est la passer de false à true.
Donc en résumé j'avais n fichiers server.ini à chercher dans une arborescence complexe démarrant dans "/data/dataweb/web/" puis il me fallait éditer chacun de ces fichiers pour passer la valeur de la variable "disablePHPModuleCheck" de false à true. Et il fallait absolument automatiser cette tâche pour deux raisons, la première étant que je suis un gros fainéant ne supportant pas de faire des tâches répétitives, la deuxième étant qu'à chaque synchronisation depuis le serveur source mes modifs seraient perdues.
Heureusement en m'appuyant sur le truc précédent et en le combinant avec un "perl oneliner" j'allais facilement atteindre le nirvana de l'adminsitrateur système.
Assez parlé voici la commande :
find /data/dataweb/web/ -name 'server.ini'|xargs perl -pi.original -e 's/(^disablePHPModuleCheck\s*=\s*)(false)/$1true/'
la première partie jusqu'au xargs est similaire au truc précédent, on cherche tous les fichiers "server.ini" depuis un endroit donné est on passe le nom de ces fichiers à la commande se trouvant après xargs. Ensuite on utilise perl pour éxécuter une expression perl en mode ligne de commande (grâce au -e). Dans mon cas il s'agit d'une bête regular expression de substitution contenant deux groupes de match identifiables aux deux paires de parenthèses, le premier groupe va chercher une ligne commençant par (grâce au ^) le mot clé disablePHPModuleCheck suivi de zéro ou plusieurs espace (grâce au \s*) suivi d'un signe égal (=) et de zéro ou plusieurs espaces (\s*).Le deuxième groupe va chercher la présence d'une valeur false pour cette variable. la valeur de substitution correspond à tous le contenu du premier groupe (grâce au $1) suivi de la valeur true. En fait la partie vraiment "magique" se situe au niveau des paramètres -p et -i.originale le premier crée une boucle implicite du style :
while (<>) {
#et ici il éxécute votre commande
} continue {
print or die "-p destination $!\n";
}
cette boucle sera appliquée sur tous les fichiers passé en paramètre, et on peut même rajouter du code à exécuter avant ou après la boucle (comme dans awk) avec des blocs "BEGIN" et "END" le mieux c'est de faire un chtit "man perlrun" pour voire tout cela plus en détail.
Enfin le paramètre -i.original permet d'éditer le fichier en place et de créer une copie de secours de l'original en le renommant en rajoutant .original à la fin du nom du fichier.
Voilà c'est tout, c'est plus long à expliquer qu'à taper, j'éspère que vous allez faire plein de tests d'editions en place grâce au "perl oneliners".
Commentaires