Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Script pour récuperer une partie d'une ligne dans le fichier conf d'apache et la traiter dans un autre script

3 réponses
Avatar
berserker
J'essaye d'écrire un script pour rechercher dans le fichier config d'apache
toutes les lignes ou j'utilise un utilitaire qui fait de la rotation de log
pour chaque vhost !

La ligne se représente ainsi dans le fichier httpd.conf:

<VirtualHost *>
DocumentRoot /www/domain.tld/subd/html/
ServerName subd.domain.tld
CustomLog "|/apache/bin/cronolog.exe
/www/domain.tld/subd/logs/%Y-%m-%d-access.log" combined
ErrorLog "|/apache/bin/cronolog.exe
/www/domain.tld/subd/logs/%Y-%m-%d-error.log"
</VirtualHost>

Mais tous mes vhosts non pas la rotation et ont des lignes pour les logs
normales (CustomLog /www/domain.tld/subd/logs/access.log combined).

Le but étant de retrouvé donc les vhost qui ont la rotation pour récupérer
le répertoire ou se trouve les logs, et avec un autre script compréssé ces
fichiers.

J'ai écris un script ou j'arrive à ce que je veux mais je ne le trouve pas
très propre :

-------------------------
open(FICHIER, "<\\Apache\\conf\\httpd.conf") || die "Fichier non trouvé";
@vhosts = <FICHIER>;
close(FICHIER);

foreach $item (@vhosts) {
if ($item =~ /cronolog/){
if ($item =~ /access/){
print "item = $item\n";
@tab = split(/ /,$item);
shift(@tab);
shift(@tab);
shift(@tab);
shift(@tab);
print "$tab[2]\n";
@last = split(/%/,$tab[2]);
print "$last[0]\n";
$last[0] =~ s/\//\\\\/g;
print "$last[0]\n";
}
}
}
-------------------------
Dans ce cadre la $last[0] me retourne le chemin avec le double \\ pour être
réutilisé en tant que path dans un autre script !
Les 4 shift servent à supprimer les espaces (au nombre de 4) qui se trouve
avant CustomLog.

Si quelqu'un voyait quelques amélioration !

Merci d'avance !

--
--

3 réponses

Avatar
dominix
berserker wrote:

[littérature abrégé]

Le but étant de retrouvé donc les vhost qui ont la rotation pour
récupérer le répertoire ou se trouve les logs, et avec un autre


si je comprend bien c'est qq comme ca

perl -nle 'if (/cronolog.exe (.*)%Y.*access/)
{$t=$1;$t=~s|/|\|g;print $t}' httpd.conf

ce qui donne en "éclairci"
perl -MOÞparse -nle 'if (/cronolog.exe (.*)%Y.*access/)
{$t=$1;$t=~s|/|\|g;print $t}'
BEGIN { $/ = "n"; $ = "n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
if (/cronolog.exe (.*)%Y.*access/) {
$t = $1;
$t =~ s[/][\]g;
print $t;
}
}

--
dominix

Avatar
berserker
Je n'ai qu'un mot à dire : "impressionnant" !!!!

Et aussi merci ;)

J'avoue être assez bleuffé par autnat d'efficacité en une seule ligne !!!

J'ai à peu pret compris le tout, ma grande interrogation viens surtout du
fait que je ne vois pas d'ou viens le $1 et surtout comment il peut ne
ressortir que la bonne portion sans le nom de fichier à la fin !!!

Mais encore merci !

C'est fou ;)
Avatar
dominix
berserker wrote:
J'ai à peu pret compris le tout, ma grande interrogation viens
surtout du fait que je ne vois pas d'ou viens le $1 et surtout


la documentation de perl est une Perl(e) :)
la consultation immediate et sans detour de
http://www.enstimac.fr/Perl/DocFr/perlre.html
s'impose ! (merci Paul)

pour info $1 contient la premiere "mise entre parenthese" de
l'expression rationnelle. un coup d'oeuil a
http://www.enstimac.fr/Perl/DocFr/perlvar.html
est tres instructif egalement, on y apprend qu'il existe
$& ainsi que $' $` $+ en plus des $<chiffre> qui peuvent aider pas
mal dans l'utilisation des regexp et dans Perl en general

--
dominix