Forum Programmation.shell Le plus petit

Posté par  .
Étiquettes :
0
23
août
2012

Bonjour !

Je cherche à déterminer lequel des serveurs est le moins chargé pour un script de connexion automatique.

Pour cela, j'ai programmé la récupération de la liste depuis la page du site en php, puis coupé les éléments du fichier inutiles pour ne garder que l'essentiel

grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2

Le résultat :

338 personnes connectées à NL 278 personnes connectées à NL2 128 personnes connectées à NL3 133 personnes connectées à NL4 38 personnes connectées à IE 40 personnes connectées à IE2 10 personnes connectées à IE3 20 personnes connectées à IE4

Mais à partir de là, comment faire pour ne garder que le nom du serveur le moins chargé ?

Dans cet exemple j'aimerai simplement avoir comme retour "IE3" pour ensuite automatiser la connexion vers ce serveur.

Merci !

EDIT Voici un extrait un peu plus complet du script :

echo ----- OCCUPATION DES SERVEURS
echo
wget --no-check-certificate -O /tmp/fip_occupation https://freedom-ip.com/statistiques.php
SERV_LOAD=$(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2)
echo
echo $SERV_LOAD
notify-send "Occupation des serveurs" "$SERV_LOAD"

  • # question

    Posté par  . Évalué à 0.

    Peux tu avoir ce fichier avec des retours à la lignes plutôt que tout sur la même ligne ? Ca va simplifier…

    • [^] # Re: question

      Posté par  . Évalué à 0.

      Bonjour !

      Je ne comprends pas pourquoi, je lance ma commande seule dans un terminal le résultat est affiché avec des retours de ligne (1 serveur par ligne) mais ce n'est pas le cas en exécutant le script

  • # une solution Perlesque

    Posté par  . Évalué à 1.

    Voici comment faire avec un algo simple en Perl (on boucle de 5 en 5, on récupère le nombre de connectés, si il est inférieur au précédent on récupère le nom du serveur) :

    #!/usr/bin/env perl
    
    use strict; use warnings;
    
    my (%hash, $server, $maxValue, $oldValue);
    
    my @file = split " ", <>;
    
    for (my $i = 0; $i < $#file; $i+=5) {
        $maxValue = $file[$i];
        if ($maxValue < $oldValue) {
            $server = $file[$i+4];
        }
        $oldValue = $maxValue;
    }
    
    print "Le serveur le moins chargé est $server\n";
    
    # vim:ts=4:sw=4
    
    

    Usage :

    cat FILE | perl script.pl
    
    
  • # Solution quick & dirty Bash

    Posté par  . Évalué à 0.

    Sinon en bash quick & dirty :

    remplir le fichier /tmp/FICHIER puis

    x=( $(</tmp/FICHIER) )
    for ((i=0; i<${#x[@]}; i+=5)); do
        echo "${x[i]} personnes sur ${x[i+4]}"; done |
            sort -n |
            awk 'NR==1{print "Le serveur le moins chargé est "$4}'
    
    
    • [^] # Re: Solution quick & dirty Bash

      Posté par  (site Web personnel) . Évalué à 0. Dernière modification le 24/08/12 à 08:26.

      ou encore

       awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' tmp.txt | sort -n
      
      

      Ce qui donnerai

      awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' < <(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2) | sort -n
      
      

      Is it a Bird? Is it a Plane?? No, it's Super Poil !!!

      • [^] # Re: Solution quick & dirty Bash

        Posté par  (site Web personnel) . Évalué à 0. Dernière modification le 24/08/12 à 08:37.

        nota tu peux faire exactement la même chose sans utiliser awk

        i=1
        for mot in $(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2); do
            if (( i%5==1 )); then
               nb=$mot
            elif (( i%5==0 )); then
               echo $nb" "$mot
            fi
            i=$(( i + 1))
        done
        
        

        Is it a Bird? Is it a Plane?? No, it's Super Poil !!!

      • [^] # Re: Solution quick & dirty Bash

        Posté par  . Évalué à 0. Dernière modification le 24/08/12 à 12:07.

        avec

        awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' < <(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2) | sort -n
        
        

        j'ai les résultats dans l'ordre ! :)

  • # en shell

    Posté par  . Évalué à 4. Dernière modification le 23/08/12 à 20:14.

    1°) ajoute des retours à la ligne entre chaque serveur (dans le script fip_occupation)
    2°) puis ajoute à ta ligne

    | sort -r | tail -n 1

    pour ne recuperer que le dernier de la liste classé par ordre decroissant.

    il ne te reste plus qu'à refaire des cut/awk pour ne prendre que la 5e colonne

    • [^] # Re: en shell

      Posté par  . Évalué à 1. Dernière modification le 24/08/12 à 11:56.

      Bonjour !

      En effet, quand je lance la commande seule dans un terminal les résultats sont bien affichés avec des retours de ligne.
      Par contre dans le script tout s'affiche à la suite… :(

      PS: fip_occupation n'est pas un script mais la page .php qui affiche l'occupation des serveurs et que je récupère directement avec wget.

      J'ai édité le post original pour l'exemple :)

      • [^] # Re: en shell

        Posté par  . Évalué à 2. Dernière modification le 24/08/12 à 13:33.

        chez moi ca marche avec l'option rn à sort (classement numerique : n, et decroissant r)

        /tmp/$ wget -O free.ip https://freedom-ip.com/statistiques.php
        /tmp$ grep personnes free.ip | cut -d '<' -f2 | cut -d '"' -f2 | sort -rn
        315 personnes connectées à NL
        255 personnes connectées à NL2
        115 personnes connectées à NL3
        100 personnes connectées à NL4
        40 personnes connectées à IE2
        38 personnes connectées à IE
        20 personnes connectées à IE4
        10 personnes connectées à IE3

        puis la meme en ajoutant le tail -n1 pour prendre la derniere ligne

        /tmp$ grep personnes free.ip | cut -d '<' -f2 | cut -d '"' -f2 | sort -rn | tail -n1
        10 personnes connectées à IE3

        • [^] # Re: en shell

          Posté par  . Évalué à 0. Dernière modification le 24/08/12 à 14:35.

          Oui c'est curieux, je pense que ça doit venir du fait que j'intègre la commande dans la variable SERV_MIN_LOAD=$( )

          Mais grâce à vous tous, le script fonctionne enfin !! Merci !! Voir dernier commentaire :)

  • # Parfait !

    Posté par  . Évalué à 1. Dernière modification le 24/08/12 à 13:31.

    Parfait !!!

    Voici la ligne de script :

    SERV_MIN_LOAD=$(awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' < <(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2 | sort -n) | cut -d ' ' -f2 | cut -d '
    ' -f1)
    echo $SERV_MIN_LOAD est le moins occupé
    
    

    qui me retourne :

    IE3 est le moins occupé
    
    

    De fait, le serveur le moins occupé est définit dans $SERV_MIN_LOAD , ce qui me permet de la réutiliser pour la connexion :D

    Un grand merci à tous !!!

    • [^] # Re: Parfait !

      Posté par  (site Web personnel) . Évalué à 1.

      Tu aurais également pu faire (juste pour te montrer qu'il y a plein de solution à un problème)

      RESULT=$(wget --no-check-certificate -qO- "https://freedom-ip.com/statistiques.php" | awk 'BEGIN { FS="=| "; minCon=99999;  } /personnes/ { gsub("\"","",$5); gsub("\"","",$9); if ($5<minCon) { minCon=$5; str=$5" "$6" "$7" "$8" "$9; } } END { print str }')
      echo $RESULT
      
      

      ou

       RESULT=$(wget --no-check-certificate -qO- "https://freedom-ip.com/statistiques.php" | awk 'BEGIN { FS="<|\""; minCon=99999;  } /personnes/ { split($3,arr," "); if (arr[1]<minCon) { minCon=arr[1]; str=$3  } } END { print str }')
      echo $RESULT
      
      

      ou

       RESULT=$(wget --no-check-certificate -qO- "https://freedom-ip.com/statistiques.php" | awk 'BEGIN { FS="<|\""  } /personne/ { print $3 }' | sort -k 1 -n | head -1)
      echo $RESULT
      
      

      Is it a Bird? Is it a Plane?? No, it's Super Poil !!!

      • [^] # Re: Parfait !

        Posté par  . Évalué à 0.

        wow !

        Cela me dépasse complètement !!!

        Mais qui sait, vu que je le retrouve de plus en plus souvent confronté à la nécessité du bash script, ça pourrait bien m'être utile un jour :))

        Merci :))

  • # SCRIPT COMPLET

    Posté par  . Évalué à 1.

    Pour ceux que ça intéresserait, voici le script complet.

    Je sais qu'il pourrait être nettoyé, optimisé et qu'on pourrait même y ajouter certaines fonctions. Mais pour l'instant c'est le mieux que je puisse faire !

    Le script à pour but de connecter automatiquement un serveur OpenVPN au démarrage d'une session Linux à condition de de l'avoir ajouté à gnome-session-properties, ou d'avoir créé un lanceur .desktop dans /etc/xdg/autostart/, ou encore de l'avoir placé dans /etc/NetworkManager/Dispatcher.d/ (dans ce dernier cas aucune déconnexion sera possible, et les notifications ne s'afficheront pas).

    Voici le code, originalement créé pour la communauté Freedom-Ip qui offre un service OpenVPN gratuit.

    Mais attention ! Ce script cherche les valeurs freedomip retournées par le NerworkManager d'Ubuntu, pensez à le modifier en conséquence ;)

    Fonctions du script:

    • Cherche l'interface réseau active (limité à wlan0 & eth0)
    • Vérifie que la connexion internet soit bien opérationnelle via ping, sinon stop l'opération
    • Récupère l'occupation des serveurs et détermine le moins occupé via wget / http (à adapter en fonction de votre fournisseur!)
    • Vérifie qu'aucune connexion VPN (ici à Freedom-IP) ne soit active. Si c'est le cas, déconnecte puis reconnecte au serveur le moins occupé
    • Sinon connecte tout simplement le serveur le moins occupé, à condition qu'une interface réseau (wlan0 ou eth0) et qu'aucun VPN Freedom-IP ne soient actifs
    • Retours terminal étape par étape
    • Retours de notifications graphiques via libnotify : Pas d'internet, VPN déjà connecté, Serveur le moins occupé, Reconnexion, Connexion, Erreur de connexion

    Script:

    #!/bin/bash
    #
    # FREEDOM-IP AUTO CONNECT SCRIPT
    #
    # DÉPENDANCES: nmcli ping wget openvpn network-manager-openvpn network-manager-openvpn-gnome openssl libnotify
    
    
    ETH_DEV="eth0"
    WLN_DEV="wlan0"
    
    
    # ANALYSE INTERFACE RÉSEAU ACTIVE
    echo
    echo ----- ANALYSE INTERFACE RÉSEAU
    NET_STAT=$(nmcli con status | egrep "${ETH_DEV}|${WLN_DEV}")
    echo
    echo $NET_STAT est la connexion active
    
    
    # VÉRIFICATION D'ÉTABLISSEMENT COMPLET DE LA CONNECTIVITÉ INTERNET
    echo
    echo ----- VÉRIFICATION INTERNET...
    PING=$(ping -c 3 vpn2.freedom-ip.com | grep received | cut -d ',' -f2 | cut -d ' ' -f2)
    echo
    echo $PING sur 3 paquets reçus depuis vpn2.freedom-ip.com
    if [ -z $PING ]; then
        echo
        echo Pas de connexion Internet fonctionnelle        
        notify-send 'Freedom-IP:' 'Pas de connexion Internet fonctionnelle' -i dialog-error
        exit
    fi
    
    # OCCUPATION DES SERVEURS
    echo
    echo ----- OCCUPATION DES SERVEURS
    wget --no-check-certificate -O /tmp/fip_occupation https://freedom-ip.com/statistiques.php
    SERV_LOAD=$(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2)
    echo
    echo $SERV_LOAD
    
    SERV_MIN_LOAD=$(awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' < <(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2 | sort -n) | cut -d ' ' -f2 | cut -d '
    ' -f1)
    echo
    echo $SERV_MIN_LOAD est le moins occupé, sélection pour connexion
    notify-send "Occupation des serveurs" "$SERV_MIN_LOAD est le moins occupé, sélection pour connexion"
    
    
    # VÉRIFICATION D'UNE CONNEXION AU VPN DÉJÀ EXISTANTE
    echo
    echo ----- VERIFICATION
    VPN_STAT=$(nmcli con status | grep freedomip | cut -d\  -f 1)
    if [ -z "${VPN_STAT}" ]; then
    echo
    echo Pas de connexion VPN active
    notify-send 'Freedom-IP:' 'Établissement de la connexion sécurisée...' -i dialog-warning ; else
    echo
    echo Déjà connecté à $VPN_STAT - Redémarrage avec $SERV_MIN_LOAD
    notify-send "Déjà connecté à $VPN_STAT" "Redémarrage avec $SERV_MIN_LOAD" -i dialog-warning
    echo
    echo ----- DÉCONNEXION DE $VPN_STAT
    nmcli con down id "${VPN_STAT}"
    echo
    echo ----- RECONNEXION À $SERV_MIN_LOAD
    echo
    RCON=$(nmcli con up id $SERV_MIN_LOAD'_freedomip' | grep "Connexion activée")
    echo $RCON
        if [ "$RCON" = "Connexion activée" ]; then
        sleep 3
        notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD, surfez tranquile :-)" -i dialog-information ; else
        echo
        echo Impossible de se connecter à $SERV_MIN_LOAD   
        notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD" -i dialog-error
        fi
    echo
    echo ----- FIN DE SCRIPT
    exit
    fi
    
    
    # CONNECTION AU VPN SI INTERNET CONNECTÉ
    if [ $PING -eq 3 ]; then
        echo
        echo ----- CONNEXION À $SERV_MIN_LOAD
        echo
        if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
        CON=$(nmcli con up id $SERV_MIN_LOAD'_freedomip' | grep "Connexion activée")
        echo $CON
        fi
    fi
        if [ "$CON" = "Connexion activée" ]; then
        sleep 3
        notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD, surfez tranquile :-)" -i dialog-information ; else
        echo
        echo Impossible de se connecter à $SERV_MIN_LOAD   
        notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD" -i dialog-error
        fi
    
    echo
    echo ----- FIN DE SCRIPT
    exit
    
    

    Encore un grand merci à vous tous pour votre aide précieuse ;)

    • [^] # Re: SCRIPT COMPLET

      Posté par  . Évalué à 2. Dernière modification le 25/08/12 à 09:49.

      y a quelques ameliorations possibles

      ex : tester si y a du reseau, de l'internet et si le VPN est ouvert.
      s'il est deja ouvert, ne pas besoin de calculer l'occupation des serveurs

      mais je viens de lire ton script en entier, et si le vpn est deja ouvert, tu le fermes pour en ouvrir un sur le serveur le moins chargé.
      c'est intelligent.

    • [^] # Re: SCRIPT COMPLET

      Posté par  (site Web personnel) . Évalué à 1.

      Généralement je teste les codes retours plutôt que ce qui est affiché (qui peut changer en fonction de l'environnement LANG utilisé)

      exemple : a la place de

      echo
      echo ----- VÉRIFICATION INTERNET...
      PING=$(ping -c 3 vpn2.freedom-ip.com | grep received | cut -d ',' -f2 | cut -d ' ' -f2)
      echo
      echo $PING sur 3 paquets reçus depuis vpn2.freedom-ip.com
      if [ -z $PING ]; then
          echo
          echo Pas de connexion Internet fonctionnelle        
          notify-send 'Freedom-IP:' 'Pas de connexion Internet fonctionnelle' -i dialog-error
          exit
      fi
      
      

      j'aurai plus tendance à faire

      echo
      echo ----- VÉRIFICATION INTERNET...
      PING=$(ping -c 3 vpn2.freedom-ip.com)
      if [ $? -ne 0 ]; then
          echo
          echo Pas de connexion Internet fonctionnelle        
          notify-send 'Freedom-IP:' 'Pas de connexion Internet fonctionnelle' -i dialog-error
          exit
      fi
      
      

      Is it a Bird? Is it a Plane?? No, it's Super Poil !!!

      • [^] # Re: SCRIPT COMPLET

        Posté par  . Évalué à 1.

        Ok je comprends :)

        Du coup j'ai modifié comme ceci pour conserver un retour terminal "propre" :

        echo ----- VÉRIFICATION INTERNET...
        PING=$(ping -c 3 vpn2.freedom-ip.com | grep % | cut -d ' ' -f4)
        echo
        echo $PING sur 3 paquets reçus depuis vpn2.freedom-ip.com
        if [ -z $PING ]; then
            echo
            echo Pas de connexion Internet fonctionnelle        
            notify-send 'Freedom-IP:' 'Pas de connexion Internet fonctionnelle' -i dialog-error
            exit
        fi
        
        
        • [^] # Re: SCRIPT COMPLET

          Posté par  (site Web personnel) . Évalué à 1. Dernière modification le 26/08/12 à 10:50.

          Attention commentaire extrémiste :

          Puisque vous parlez d optimisation je rajoute mon grain de sel de "Bonnes pratiques".

          1. Il est conseille de ne pas utiliser de variables pour stocker des commandes mais plutôt des fonctions PING() { If { ping -c 3 vpn2.freedom-ip.com | grep % | cut -d ' ' -f4 ; } ; then return 0 else return 1 fi } À la place de : PING=$(ping -c 3 vpn2.freedom-ip.com | grep % | cut -d ' ' -f4)

          C est plus long mais plus robuste selon moi, et plus facilement reutilisable à priori.

          Dans la série 'c'est mieux comme ça' :
          Il est conseille d'utiliser des doubles crochets plutôt que les simples, ils sont plus robuste et souples.

          Voilà c'est pas forcément très utile mais tant qu'à coder du bash autant faire avec les standard, non ?

          Ah oui : pardon pour les tags du code mais 'lapin compris' comment ca fonctionne !

          • [^] # Re: SCRIPT COMPLET

            Posté par  . Évalué à 0.

            LoL oui je suis aussi toujours à la recherche de la "perfection".

            Mais je commence seulement à tâter du bash script, et là ça me rajoute des lignes. Alors que je cherche au contraire à y voir plus clair en en mettant le moins possible.

            Mais merci quand même, ça peut toujours servir !

            • [^] # Re: SCRIPT COMPLET

              Posté par  . Évalué à 3.

              c'est en prenant tres tot les bonnes habitudes qu'on acquiert les bonnes pratiques.

              et un code sur une ligne n'est pas forcement plus clair ou plus efficace qu'un code sur plusieurs lignes.

  • # MAJ SCRIPT

    Posté par  . Évalué à 0.

    Bonsoir !

    Mise à jour du script !!!!

    MAJ 28 AOÛT :

    • Détecte les échecs de connexion, et essaie sur le prochain serveur le moins chargé
    • En cas d'essai infructueux sur tous les serveurs, arrête et propose de vérifier les paramètres de connexion

    Encore merci pour votre aide !!! :D

    #!/bin/bash
    # FREEDOM-IP AUTO CONNECT SCRIPT
    
    ETH_DEV="eth0"
    WLN_DEV="wlan0"
    
    
    # ANALYSE INTERFACE RÉSEAU ACTIVE
    echo
    echo ----- ANALYSE INTERFACE RÉSEAU
    NET_STAT=$(nmcli con status | egrep "${ETH_DEV}|${WLN_DEV}")
    echo
    echo $NET_STAT est la connexion active
    
    
    # VÉRIFICATION D'ÉTABLISSEMENT COMPLET DE LA CONNECTIVITÉ INTERNET
    echo
    echo ----- VÉRIFICATION INTERNET...
    CURRENT_IP=$(wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//')
    PING=$(ping -c 3 vpn2.freedom-ip.com | grep % | cut -d ' ' -f4)
    echo
    echo Adresse IP actuelle: $CURRENT_IP
    echo
    echo $PING sur 3 paquets reçus depuis vpn2.freedom-ip.com
    if [ -z $PING ]; then
        echo
        echo Pas de connexion Internet fonctionnelle        
        notify-send 'Freedom-IP:' 'Pas de connexion Internet fonctionnelle' -i dialog-error
        exit
    fi
    
    # OCCUPATION DES SERVEURS
    echo
    echo ----- OCCUPATION DES SERVEURS
    wget --no-check-certificate -O /tmp/fip_occupation https://freedom-ip.com/statistiques.php
    SERV_LOAD=$(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2)
    echo
    echo $SERV_LOAD
    
    SERV_MIN_LOAD=$(awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' < <(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2 | sort -rn | tail -n1) | cut -d ' ' -f2 | cut -d '
    ' -f1)
    echo
    echo $SERV_MIN_LOAD est le moins occupé, sélection pour connexion
    notify-send "Occupation des serveurs" "$SERV_MIN_LOAD est le moins occupé, sélection pour connexion"
    
    SERV_MIN_LOAD_2=$(awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' < <(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2 | sort -rn | tail -n2) | cut -d ' ' -f2 | cut -d '
    ' -f1)
    
    SERV_MIN_LOAD_3=$(awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' < <(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2 | sort -rn | tail -n3) | cut -d ' ' -f2 | cut -d '
    ' -f1)
    
    SERV_MIN_LOAD_4=$(awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' < <(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2 | sort -rn | tail -n4) | cut -d ' ' -f2 | cut -d '
    ' -f1)
    
    SERV_MIN_LOAD_5=$(awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' < <(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2 | sort -rn | tail -n5) | cut -d ' ' -f2 | cut -d '
    ' -f1)
    
    SERV_MIN_LOAD_6=$(awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' < <(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2 | sort -rn | tail -n6) | cut -d ' ' -f2 | cut -d '
    ' -f1)
    
    SERV_MIN_LOAD_7=$(awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' < <(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2 | sort -rn | tail -n7) | cut -d ' ' -f2 | cut -d '
    ' -f1)
    
    SERV_MIN_LOAD_8=$(awk '{ for (i=1; i<=NF; i++) { if (i%5==1) { nb=$i  } if (i%5==0) { print nb" "$i } } }' < <(grep personnes /tmp/fip_occupation | cut -d '<' -f2 | cut -d '"' -f2 | sort -rn | tail -n8) | cut -d ' ' -f2 | cut -d '
    ' -f1)
    
    
    # VÉRIFICATION D'UNE CONNEXION AU VPN DÉJÀ EXISTANTE
    echo
    echo ----- VERIFICATION
    VPN_STAT=$(nmcli con status | grep freedomip | cut -d\  -f 1)
    if [ -z "${VPN_STAT}" ]; then
    echo
    echo Pas de connexion VPN active
    notify-send 'Freedom-IP:' "Établissement de la connexion sécurisée..." -i dialog-warning ; else
    echo
    echo Déjà connecté à $VPN_STAT - Redémarrage avec $SERV_MIN_LOAD
    notify-send "Déjà connecté à $VPN_STAT" "Redémarrage avec $SERV_MIN_LOAD" -i dialog-warning
    echo
    echo ----- DÉCONNEXION DE $VPN_STAT
    nmcli con down id "${VPN_STAT}"
    echo
    echo OK
    echo
    echo ----- RECONNEXION À $SERV_MIN_LOAD'_freedomip'
    echo
    RCON=$(nmcli con up id $SERV_MIN_LOAD'_freedomip' | grep "Connexion activée")
    echo $RCON
        if [ "$RCON" = "Connexion activée" ]; then
        NEW_IP=$(wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//')
        echo
        echo Nouvelle IP: $NEW_IP
        sleep 3
        notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD" -i dialog-information ; else
        echo
        echo Impossible de se connecter à $SERV_MIN_LOAD   
        notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD, essai avec $SERV_MIN_LOAD_2" -i dialog-error
            if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
            CON_2=$(nmcli con up id $SERV_MIN_LOAD_2'_freedomip' | grep "Connexion activée")
            echo $CON_2
            sleep 3
            notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_2" -i dialog-information; else
            echo Impossible de se connecter à $SERV_MIN_LOAD_2 
            notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD_2, essai avec $SERV_MIN_LOAD_3" -i dialog-error
                if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
                CON_2=$(nmcli con up id $SERV_MIN_LOAD_3'_freedomip' | grep "Connexion activée")
                echo $CON_3
                sleep 3
                notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_3" -i dialog-information; else
                echo Impossible de se connecter à $SERV_MIN_LOAD_2 
                notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD_3, essai avec $SERV_MIN_LOAD_4" -i dialog-error
                    if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
                    CON_4=$(nmcli con up id $SERV_MIN_LOAD_4'_freedomip' | grep "Connexion activée")
                    echo $CON_4
                    sleep 3
                    notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_4" -i dialog-information; else
                    echo Impossible de se connecter à $SERV_MIN_LOAD_4 
                    notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD_4, essai avec $SERV_MIN_LOAD_5" -i dialog-error
                        if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
                        CON_5=$(nmcli con up id $SERV_MIN_LOAD_5'_freedomip' | grep "Connexion activée")
                        echo $CON_5
                        sleep 3
                        notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_5" -i dialog-information; else
                        echo Impossible de se connecter à $SERV_MIN_LOAD_5 
                        notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD_5, essai avec $SERV_MIN_LOAD_6" -i dialog-error
                            if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
                            CON_6=$(nmcli con up id $SERV_MIN_LOAD_6'_freedomip' | grep "Connexion activée")
                            echo $CON_6
                            sleep 3
                            notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_6" -i dialog-information; else
                            echo Impossible de se connecter à $SERV_MIN_LOAD_6 
                            notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD_6, essai avec $SERV_MIN_LOAD_7" -i dialog-error
                                if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
                                CON_7=$(nmcli con up id $SERV_MIN_LOAD_7'_freedomip' | grep "Connexion activée")
                                echo $CON_7
                                sleep 3
                                notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_7" -i dialog-information; else 
                                echo Impossible de se connecter à $SERV_MIN_LOAD_7 
                                notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD_7, essai avec $SERV_MIN_LOAD_8" -i dialog-error
                                    if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
                                    CON_8=$(nmcli con up id $SERV_MIN_LOAD_8'_freedomip' | grep "Connexion activée")
                                    echo $CON_8
                                    sleep 3
                                    notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_8" -i dialog-information; else 
                                    echo Impossible de se connecter à $SERV_MIN_LOAD_8 
                                    notify-send 'Freedom-IP:' "Connexion à tous les serveurs impossible, Vérifiez vos paramètres de connexion !" -i dialog-error
                                    fi
                                fi
                            fi
                        fi
                    fi
                fi
            fi
        fi
    echo
    echo ----- FIN DE SCRIPT
    exit
    fi
    
    
    # CONNECTION AU VPN SI INTERNET CONNECTÉ
    if [ $PING -eq 3 ]; then
        echo
        echo ----- CONNEXION À $SERV_MIN_LOAD
        echo
        if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
        CON=$(nmcli con up id $SERV_MIN_LOAD'_freedomip' | grep "Connexion activée")
        echo $CON
        fi
    fi
        if [ "$CON" = "Connexion activée" ]; then
        NEW_IP=$(wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//')
        echo
        echo Nouvelle IP: $NEW_IP
        sleep 3
        notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD" -i dialog-information ; else
        echo
        echo Impossible de se connecter à $SERV_MIN_LOAD   
        notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD, essai avec $SERV_MIN_LOAD_2" -i dialog-error   
            if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
            CON_2=$(nmcli con up id $SERV_MIN_LOAD_2'_freedomip' | grep "Connexion activée")
            echo $CON_2
            sleep 3
            notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_2" -i dialog-information; else
            echo Impossible de se connecter à $SERV_MIN_LOAD_2 
            notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD_2, essai avec $SERV_MIN_LOAD_3" -i dialog-error
                if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
                CON_2=$(nmcli con up id $SERV_MIN_LOAD_3'_freedomip' | grep "Connexion activée")
                echo $CON_3
                sleep 3
                notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_3" -i dialog-information; else
                echo Impossible de se connecter à $SERV_MIN_LOAD_2 
                notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD_3, essai avec $SERV_MIN_LOAD_4" -i dialog-error
                    if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
                    CON_4=$(nmcli con up id $SERV_MIN_LOAD_4'_freedomip' | grep "Connexion activée")
                    echo $CON_4
                    sleep 3
                    notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_4" -i dialog-information; else
                    echo Impossible de se connecter à $SERV_MIN_LOAD_4 
                    notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD_4, essai avec $SERV_MIN_LOAD_5" -i dialog-error
                        if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
                        CON_5=$(nmcli con up id $SERV_MIN_LOAD_5'_freedomip' | grep "Connexion activée")
                        echo $CON_5
                        sleep 3
                        notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_5" -i dialog-information; else
                        echo Impossible de se connecter à $SERV_MIN_LOAD_5 
                        notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD_5, essai avec $SERV_MIN_LOAD_6" -i dialog-error
                            if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
                            CON_6=$(nmcli con up id $SERV_MIN_LOAD_6'_freedomip' | grep "Connexion activée")
                            echo $CON_6
                            sleep 3
                            notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_6" -i dialog-information; else
                            echo Impossible de se connecter à $SERV_MIN_LOAD_6 
                            notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD_6, essai avec $SERV_MIN_LOAD_7" -i dialog-error
                                if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
                                CON_7=$(nmcli con up id $SERV_MIN_LOAD_7'_freedomip' | grep "Connexion activée")
                                echo $CON_7
                                sleep 3
                                notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_7" -i dialog-information; else 
                                echo Impossible de se connecter à $SERV_MIN_LOAD_7 
                                notify-send 'Freedom-IP:' "Impossible de se connecter à $SERV_MIN_LOAD_7, essai avec $SERV_MIN_LOAD_8" -i dialog-error
                                    if [ ! -z "${NET_STAT}" -a -z "${VPN_STAT}" ]; then
                                    CON_8=$(nmcli con up id $SERV_MIN_LOAD_8'_freedomip' | grep "Connexion activée")
                                    echo $CON_8
                                    sleep 3
                                    notify-send "Connexion sécurisée établie au server $SERV_MIN_LOAD_8" -i dialog-information; else 
                                    echo Impossible de se connecter à $SERV_MIN_LOAD_8 
                                    notify-send 'Freedom-IP:' "Connexion à tous les serveurs impossible, Vérifiez vos paramètres de connexion !" -i dialog-error
                                    fi
                                fi
                            fi
                        fi
                    fi
                fi
            fi
        fi
    
    echo
    echo ----- FIN DE SCRIPT
    exit
    
    
    • [^] # Re: MAJ SCRIPT

      Posté par  . Évalué à 2. Dernière modification le 28/08/12 à 21:15.

      Ta deuxième version de ton script est absolument gorissime. J'ai donc pris mon stylo pour t'écrire le canvas suivant:

      (Il faut remplacer les [@ par un [[ mais dacode croit qu'il s'agit de liens wikipedia, d'où le subtil déguisement.)

      sdata_statname='stats.html'
      
      # sdata_extract
      #  Filter extracting tabular data out of statistiques html page
      #
      # Input is the file served at https://freedom-ip.com/statistiques.php,
      # output is a list of load by servers, looking like
      #
      #   390 NL
      #   315 NL2
      #   140 NL3
      #   140 NL4
      #   38 IE
      #   40 IE2
      #   10 IE3
      #   20 IE4
      sdata_extract()
      {
      {
          sed -n -e 's|^<img src=[./@:alnum:]]* alt="\([@:digit:]]*\) personnes connect.*es .* \([@:alnum:]]*\)".*|\1 \2|p'
      }
      }
      
      
      # sdata_sort_by_name
      #  Filter sorting tabular data by name (ascending order)
      sdata_sort_by_name()
      {
          sort -d -k 2
      }
      
      
      # sdata_sort_by_load
      #  Filter sorting tabular data by load (ascending order)
      sdata_sort_by_load()
      {
          sort -g -k 1
      }
      
      # sdata_try_to_connect
      #  A filter connecting to a server.
      #
      # It read tabular data and tries to connect in turn to each server. It
      # writes the record corresponding to the server it could connect to.
      #
      # Notes:
      #  - Use of echo(1) to output records is okay, because data is read(1).
      sdata_try_to_connect()
      {
          local load
          local server
      
          sdata_connect_state='NOT_CONNECTED'
          while read load server; do
          if [ "$sdata_connect_state" = 'NOT_CONNECTED' ]; then
              if sdata_try_to_connect_loop "$load" "$server"; then
              sdata_connect_state='CONNECTED'
              echo "$load" "$server"
              fi
          fi
          done
      
      }
      
      sdata_try_to_connect_loop()
      {
          if [ "$2" = 'NL2' ]; then
          return 0
          else
          return 1
          fi
      }
      
      # sdata_outcome
      #  A filter describing the outcome of sdata_try_to_connect.
      sdata_outcome()
      {
          read load server;
          if [ "$load" = "" ]; then
          printf 'Failure: could not connect to any server\n'
          else
          printf 'Connected to server %s (%d users apart me), yeah!\n' \
              "$server" "$load"
          fi
      }
      
      # sdata_connect()
      #  The full connection chain.
      sdata_connect()
      {
          sdata_extract < "$sdata_statname" \
          | sdata_sort_by_load \
          | sdata_try_to_connect \
          | sdata_outcome
      }
      
      sdata_connect
      
      

      Ce n'est pas interdit de définir des fonctions au lieu de copier et coller à tort et à travers!

      Ton bloc d'extraction des données de la page est visiblement un bon candidat pour faire une fonction. Au lieu d'enchaîner les cut on peut faire le travail proprement avec sed. C'est ma fonction sdata_extract qui mange ton fichier HTML et écrit un beau tableau bien propre avec toutes les statistiques. C'est l'étape N°1 de tout programme shell qui travaille sur des données: extraire les données dans un format propre. Après c'est un jeu d'enfant de les maniper avec sort, awk, etc.

      Ensuite ton gros bloc de if imbiqués est classiquement représenté par une boucle, ce que fait le while , et c'est toujours achement plus facile de caler la boucle while dans une fonction dédiée (plus facile pour les pipes).

      Ensuite, quelques conseils en vrac, que tu peux utiliser même si tu débutes en shell:

      1. si tes diagnostics sont internationalisés il faut les piper à travers iconv avant de les afficher. Par exemple

        printf 'Pouët\n' | iconv -f utf-8

        si ton script est en utf-8, éventuellement rédiriger vers stderr.

      2. Les trentes lignes de echo avec des lignes vides, des 'début de script' etc. ne servent à rien et créent une sortie inutilement difficile à analyser avec un programme: vire les.

      3. Continue de poser tes questions ici, et si tu n'as pas lu ce journal vas-y!

      • [^] # Re: MAJ SCRIPT

        Posté par  . Évalué à 4.

        (Il faut remplacer les [@ par un [[ mais dacode croit qu'il s'agit de liens wikipedia, d'où le subtil déguisement.)

        Voilà l'entrée dans le suivi : http://linuxfr.org/suivi/insertion-de-liens-wikipedia-dans-les-balises-de-code

        « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

        • [^] # Re: MAJ SCRIPT

          Posté par  . Évalué à 2.

          Merci, la soirée était bien avancée hier et j'ai eu la flemme d'ouvrir une entrée dans le suivi!

          • [^] # Re: MAJ SCRIPT

            Posté par  . Évalué à 1.

            wow !

            C'est sûr que le script est beaucoup plus organisé et compact comme ça :)

            Maintenant il ne me reste plus qu'à le comprendre !!! Mais merci je vais plancher là-dessus ;)

            • [^] # Re: MAJ SCRIPT

              Posté par  . Évalué à 2.

              Si tout à la fin tu enlèves l'appel à la fonction principale, tu peux jouer avec les diverses fonctions pour voir ce qu'elles font.

              C'est très important d'expérimenter pour se sentir à l'aise!

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.