Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 17 sur 17
  1. #1
    Invité de passage
    Homme Profil pro Stéphane
    Ingénieur Systèmes Réseaux et Supervision
    Inscrit en
    octobre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Nom : Homme Stéphane
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Systèmes Réseaux et Supervision

    Informations forums :
    Inscription : octobre 2012
    Messages : 11
    Points : 1
    Points
    1

    Par défaut Script Perl pour Apache

    Bonjour à tous,

    Alors voila je vous explique, je doit pour le boulot créer un script Perl pour superviser un serveur Apache or je ne connais pas encore Perl et le script doit être fait rapidement, je recherche donc une âme charitable qui aurait déjà une base de script et qui pourrais me le passer.

    Voilà ce dont j'ai besoin :
    -faire un script perl qui lance la commande "apachectl fullstatus", parse sa sortie, et récupère les infos suivantes :
    -nombre de requêtes par sec
    -nombre d'octets par sec
    -nombre de workers actifs et idle, calcul du pourcentage de workers occupés
    -pourcentage d'utilisation du cache ssl
    -état de chaque membre d'un loadbalancer, où OK = 0 et not OK = 1

    Merci par avance à ceux qui pourront m'aider.

  2. #2
    Invité de passage
    Homme Profil pro Stéphane
    Ingénieur Systèmes Réseaux et Supervision
    Inscrit en
    octobre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Nom : Homme Stéphane
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Systèmes Réseaux et Supervision

    Informations forums :
    Inscription : octobre 2012
    Messages : 11
    Points : 1
    Points
    1

    Par défaut Complément

    J'ai réalisé un petit draft pour donner l'idée générale de ce que je veux faire :

    Sachant que pour l'instant je n'arrive pas à voir comment transférer le résultat de ma commande dans un fichier.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    # Algorithme pour script apache
     
    Execute commande "apachectl fullstatus" >> $resultat
     
    Open FICHIER ">resultat.txt"
     
    print FICHIER "$resultat"
     
    Close FICHIER
     
    ==============================
    # Premier test : nombres de requêtes par seconde
     
    Open FICHIER "<resultat.txt"
     
    Find X "requests/sec"
    $X=X
    opcmon opcmon MAPOLICY=$X -option requestspsec=$X
     
    Close FICHIER
     
    ==============================
    # Deuxième test : nombre d'octets par seconde
     
    Open FICHIER "<resultat.txt"
     
    Find Y "B/second"
    $Y=Y
    opcmon MAPOLICY=$Y -option bpsecond=$Y
     
    Close FICHIER
     
    =============================
    # Troisième test : nombre de workers actif et d'idle, et pourcentage de workers occupés
     
    Open FICHIER "<resultat.txt"
     
    Find W "requests currently being processed," I "idle workers"
    $W=W
    $I=I
     
    $Z=($W*100)/($W+$I)
     
    opcmon MAPOLICY=$Z -option pourcentworkersoccupes=$Z -option workersactifs=$W -option idle=$I
     
    Close FICHIER
     
    =============================
    #Quatrième test : pourcentage utilisation cache ssl
     
    Open FICHIER "<resultat.txt"
     
    Find "cache usage:" V"%"
    $V=V
    opcmon MAPOLICY=$V -option cacheusage=$V
     
    Close FICHIER
     
    =============================
    #Cinquième test : etats des membres du loadbalancer
     
    Open FICHIER "<resultat.txt"
     
    Find "ajp" R S
    $R=R
    $S=S
     
    If ($S=OK
    	Then $S=1)
    else ($S=0)
     
    opcmon MAPOLICY=$S -option name=$R -option state=$S
     
    Close FICHIER

  3. #3
    Membre chevronné Avatar de Gardyen
    Profil pro
    Inscrit en
    août 2005
    Messages
    555
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 555
    Points : 766
    Points
    766

    Par défaut

    pour capturer la sortie d'une commande, tu peux utiliser les backsticks (cf la)
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  4. #4
    Invité de passage
    Homme Profil pro Stéphane
    Ingénieur Systèmes Réseaux et Supervision
    Inscrit en
    octobre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Nom : Homme Stéphane
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Systèmes Réseaux et Supervision

    Informations forums :
    Inscription : octobre 2012
    Messages : 11
    Points : 1
    Points
    1

    Par défaut

    Merci du lien je pense qu'il me servira, au final j'ai trouver avec :
    Code :
    1
    2
     
    my $resultat = `$commande > resultat.txt`;
    ça fonctionne maintenant les recherches vont être difficiles, je débute totalement en perl et quasiment en prog.

  5. #5
    Membre chevronné Avatar de Gardyen
    Profil pro
    Inscrit en
    août 2005
    Messages
    555
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 555
    Points : 766
    Points
    766

    Par défaut

    dans cette partie de la faq perl tu as comment parcourir un fichier

    ensuite pour tester la chaine et rechercher des valeurs, les expressions régulières te seront utiles, voir les exemples ici

    bon courage pour digérer tout cela !
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  6. #6
    Invité de passage
    Homme Profil pro Stéphane
    Ingénieur Systèmes Réseaux et Supervision
    Inscrit en
    octobre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Nom : Homme Stéphane
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Systèmes Réseaux et Supervision

    Informations forums :
    Inscription : octobre 2012
    Messages : 11
    Points : 1
    Points
    1

    Par défaut

    Merci du coup de main à nouveau.
    Ouai dur de tout digéré pour le début. Mais ça va bien finir par rentré.
    Je vais regarder les liens que tu m'as donné et essayé jusqu'à ce que ça fonctionne.

    Par contre est ce que c'est pareil pour par exemple j'ai :

    "66 B/second" sachant que le 66 est un nombre qui peut varier et correspond au nombre que je veux capturer en gros on va dire que j'ai "X B/second" je vas faire ma recherche sur B/second comment je peux faire pour récupéré X et l'affecter à une variable?

    Merci.

  7. #7
    Membre chevronné Avatar de Gardyen
    Profil pro
    Inscrit en
    août 2005
    Messages
    555
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 555
    Points : 766
    Points
    766

    Par défaut

    dans le 2e lien de mon précédent message il est indiqué comment récupérer un motif

    En plus détaillé ça donne:
    Code :
    1
    2
    if ( $chaine =~ /\s(\d+\seuros)$/ ) {
     my $prix = $1;
    Dans cet exemple, on recherche un espace, un nombre non nul (d'où le +) de chiffres (symbolisé par \d) puis un espace puis euros, en fin d'expression

    Tu suis toujours ?

    Pour capturer le groupe matchant \d+euros, on l'entoure d'une parenthèse.
    La ligne suivante utilise la variable $1, dans laquelle est entrée la valeur du premier groupe matchant l'expression régulière. Si tu mets plusieurs groupes tu as $2 $3 etc.

    De très nombreux tuto existent sur les expressions régulières de perl, bon courage !
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  8. #8
    Invité de passage
    Homme Profil pro Stéphane
    Ingénieur Systèmes Réseaux et Supervision
    Inscrit en
    octobre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Nom : Homme Stéphane
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Systèmes Réseaux et Supervision

    Informations forums :
    Inscription : octobre 2012
    Messages : 11
    Points : 1
    Points
    1

    Par défaut

    J'avais vu dans la FAQ mais je n'avais rien compris alors que la déjà beaucoup plus.

    Donc en gros dans mon cas ça donnerais :

    if ( $chaine =~ /\s(\d+\sB/second)$/ ) {
    my $prix = $1;

  9. #9
    Invité de passage
    Homme Profil pro Stéphane
    Ingénieur Systèmes Réseaux et Supervision
    Inscrit en
    octobre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Nom : Homme Stéphane
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Systèmes Réseaux et Supervision

    Informations forums :
    Inscription : octobre 2012
    Messages : 11
    Points : 1
    Points
    1

    Par défaut

    Au final je suis arrivé à ça, est-ce que vus pensez que c'est bon?

    my $commande = "ipconfig";
    my $resultat = `$commande > resultat.txt`;
    print $resultat;

    my $file = "resultat.txt";
    open (FILE, $file);

    ========================================
    # Recherche du nombres de requêtes par seconde

    my $substring = "requests/sec";

    while (<FILE>) {
    if ( $_ =~ /\s(\d+\s$substring)$/ ) {
    my $reqpsec = $1; }
    }

  10. #10
    Membre chevronné Avatar de Gardyen
    Profil pro
    Inscrit en
    août 2005
    Messages
    555
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 555
    Points : 766
    Points
    766

    Par défaut

    hum attention au $ en fin d'expression, il indique que ce que tu cherches doit se trouver à la fin de la ligne, je ne sais pas si c'est bien le cas pour toi

    il te faut éplucher les tutos sur les expressions régulières, c'est inévitable vu la complexité du sujet.
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  11. #11
    Invité de passage
    Homme Profil pro Stéphane
    Ingénieur Systèmes Réseaux et Supervision
    Inscrit en
    octobre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Nom : Homme Stéphane
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Systèmes Réseaux et Supervision

    Informations forums :
    Inscription : octobre 2012
    Messages : 11
    Points : 1
    Points
    1

    Par défaut

    Ouai je crois que je suis parti pour ça.

    .0435 requests/sec - 66 B/second

    1 requests currently being processed, 49 idle workers

    index usage: 0%, cache usage: 0%

    ajp hostname Init Ok 1 0 0 0 0


    Voila en rouge ce que je veux récupérer dans des variables et en vert ce que je me suis défini comme chaîne pour ma recherche.

    Si ça peut aider pour comprendre.

  12. #12
    Membre chevronné Avatar de Gardyen
    Profil pro
    Inscrit en
    août 2005
    Messages
    555
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 555
    Points : 766
    Points
    766

    Par défaut

    en gros voilà ce que je ferais, sachant que je suis très loin d'être expert en expressions régulières ^^

    ([\w\.]+) requests/sec - (\d+) B/second

    (\d+) requests currently being processed, (\d+) idle workers

    cache usage: (\d+)%

    ajp (\w+) Init (\w+)
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  13. #13
    Invité de passage
    Homme Profil pro Stéphane
    Ingénieur Systèmes Réseaux et Supervision
    Inscrit en
    octobre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Nom : Homme Stéphane
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Systèmes Réseaux et Supervision

    Informations forums :
    Inscription : octobre 2012
    Messages : 11
    Points : 1
    Points
    1

    Par défaut

    Ok donc ça donnerais un truc du genre :

    my $substring = "requests/sec";
    my $reqpsec;
    while ($_ = <FILE>){
    if ( $_ =~ ([\w\.]+)$substring/ )
    {
    $reqpsec == $1;
    }
    }

  14. #14
    Membre chevronné Avatar de Gardyen
    Profil pro
    Inscrit en
    août 2005
    Messages
    555
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 555
    Points : 766
    Points
    766

    Par défaut

    attention aux = ^^

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    my $substring = "requests/sec";
    my $reqpsec;
    while (<FILE>){
      if (([\w\.]+) $substring/ )
      {
        $reqpsec = $1;
      }
    }
    il y a un espace avant requests non ?
    tu peux le préciser soit avec ' ' soit avec \s

    ps: on peut omettre $_ qui est le plus souvent implicitement utilisé quand on ne précise pas de paramètres; sauf si tu préfères le mettre afin d'y voir plus clair
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  15. #15
    Invité de passage
    Homme Profil pro Stéphane
    Ingénieur Systèmes Réseaux et Supervision
    Inscrit en
    octobre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Nom : Homme Stéphane
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Systèmes Réseaux et Supervision

    Informations forums :
    Inscription : octobre 2012
    Messages : 11
    Points : 1
    Points
    1

    Par défaut

    Au final j'ai trouvé une autre manière je la poste si des fois ça peut aider d'autres, je garde quand même tes conseils si des fois ça ne fonctionnait pas (je ne pourrais tester que lundi prochain). Un grand merci en tout cas pour ton aide.

    Juste si des fois tu sais une dernière petite chose, pour la partie en gras rouge dans le script sur la fin. Je récupère un statut OK et je voudrais le transformer en 1 si OK ou en 0 sinon est-ce que mon if est bon?

    #!C:\Perl\bin

    use strict;
    use warnings;

    # ========================================
    # Execution de la commande apachectl fullstatus et préparation pour l'analyse du résultat de la commande

    my $exec = "apachectl fullstatus";
    $_ = qx{$exec};
    print "Resultat :\n$_\n";

    # ========================================
    # Recherche du nombres de requêtes par seconde et du nombres d'octets apr seconde

    my $req_sec = "";
    my $b_sec = "";

    if ( /([.0-9]+)\srequests\/sec\s-\s([0-9]+)\sB\/second.*/ )
    {
    $req_sec = $1;
    $b_sec = $2;

    } else
    {
    print "Erreur : req_sec / b_sec introuvables\n";
    }

    # ========================================
    # Recherche du nombre de workers actifs, du nombre d'idle et calcul du pourcentage de workers occupés

    my $workers_actifs = "";
    my $idle = "";
    my $pourcentage_workers_occupes = "";

    if ( /([0-9]+)\srequests currently being processed,\s([0-9]+)\sidle workers/ )
    {
    $workers_actifs = $1;
    $idle = $2;
    $pourcentage_workers_occupes = ($workers_actifs*100)/($workers_actifs+$idle);

    } else
    {
    print "Erreur : workers_actifs / idle introuvables\n";
    }

    # ========================================
    # Recherche du pourcentage de cache ssl

    my $cache_ssl = "";

    if ( /cache usage:\s([.0-9]+)%/ )
    {
    $cache_ssl = $1;

    } else
    {
    print "Erreur : cache_ssl introuvables\n";
    }

    # ========================================
    # Recherche de l'état des membres du loadbalancer

    my $hostname = "";
    my $status = "";

    if ( /ajp\s([^\s]+)\sInit\s([^\s]+)\s\d\s\d\s\d\s\d\s\d/ )
    {
    $hostname = $1;
    $status = $2;
    if ($status = "OK")
    {
    $status = 1;
    } else
    {
    $status = 0;
    }

    } else
    {
    print "Erreur : hostname / status introuvables\n";
    }

  16. #16
    Membre chevronné Avatar de Gardyen
    Profil pro
    Inscrit en
    août 2005
    Messages
    555
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 555
    Points : 766
    Points
    766

    Par défaut

    pour tester l'égalité des chaînes de caractères, il faut utiliser eq (ou ne pour la différence)

    Code :
    1
    2
    3
    4
    5
    6
    7
    if ($status eq "OK")
    {
    $status = 1;
    } else
    {
    $status = 0;
    }
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  17. #17
    Invité de passage
    Homme Profil pro Stéphane
    Ingénieur Systèmes Réseaux et Supervision
    Inscrit en
    octobre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Nom : Homme Stéphane
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Systèmes Réseaux et Supervision

    Informations forums :
    Inscription : octobre 2012
    Messages : 11
    Points : 1
    Points
    1

    Par défaut

    Merci beaucoup de ton aide, maintenant résultat lundi prochain lors des tests.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •