Aide sur mon script perl

Résolu
specimen35 Messages postés 342 Date d'inscription   Statut Membre Dernière intervention   -  
specimen35 Messages postés 342 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

voici mon script

#!/usr/bin/perl -w
use strict;
use DBI;
use CGI;
 
my $cgi = new CGI;
my $recup = ` sed -e '1,/-\+/d;/^$/,$d' repquota -v/chemin`
my ($user1,$used1,$soft1,$hard1,$grace1,$used2,$soft2,$hard2,$grace2);
 
print "Content-type: text/html\n\n";
 
#Connection à la base de données mysql avec le module dbd::mysql (conncetion à distance)
$dbh = DBI->connect("DBI:mysql:database=$db;host=$host",
                      $user, $password, {RaiseError => 1});
 
#Requete sur la base de donnée 
my $query = sprintf("INSERT INTO foo VALUES (%d, %s)",
                      $number, $dbh->quote("name"));
  $dbh->do($query);
 
while ($ligne = $recup){
# récupération des éléments
 ($user1,$used1,$soft1,$hard1,$grace1,$used2,$soft2,$hard2,$grace2) = split /;/,$ligne;
# et on insere dans la base
  $db->do("insert into client values ('$user1','$used1','$soft1','$hard1','$grace1','$used2','$soft2','$hard2','$grace2')"
 
);
          or die "pb de requete : $DBI::errstr";


Bon on va structurer ce que j'ai vue :

1) il manque un ; à la fin de la ligne 7 : d'accor ou pas d'accord

2) Utiliser Sed est il bon d'apres vous car je ne suis pas sûr de ce que cela filtre.
avec sed voici le principe :

Code :

sed -e '1,/-\+/d;/^$/,$d' rep //rep = fichier
 
root -- 157696 0 0 12 0 0
uucp -- 40 0 0 76 0 0
fradin -- 2304352 2500000 2550000 12465 50000 55000


je ve recupérer les données que je vien de faire avec sed puis les mettre en variable soit :
Code :

my ($user1,$used1,$soft1,$hard1,$grace1,$used2,$soft2,$hard2,$grace2);


d'accord du code ou pas d'accord

3) Pour moi le programme boucle indéfiniement, vu que ni $recup, ni $ligne ne sont modifiés dans la boucle. D'ailleurs, si je comprend bien le code, il serait même plus judicieux de "parser" le résultat du "repquota" dans la boucle. Mais comment ces une de mes grande question

d'autre suggestion sur mon code je suis prenneur merci
Configuration: Windows XP
Firefox 1.5.0.12

51 réponses

  • 1
  • 2
  • 3
Résumé de la discussion

Un script Perl qui lit la sortie de repquota via sed et insère les résultats dans MySQL présente des soucis: une fin de ligne manquante et une boucle while qui peut rester sans progression si la lecture n'est pas correctement testée. La meilleure réponse propose d'abandonner sed au profit du module Quota et d'utiliser Quota::getdev et Quota::query pour récupérer directement les données, puis d'exporter les résultats sans boucle infinie. Des conseils soulignent aussi que sed reste puissant mais superflu en Perl et que vérifier les montages et le chemin dev évite les incohérences lors de l'extraction des quotas.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    1. oui il manque
    2. utliser sed quand tu as la puissance des regex de Perl, c'est vraiment superflu
    3. je vais regarder ce soir,

    ce que j'ai besoin c'est d'avoir une sortie de la commande

    on pourra stocker le résultat dans une chaîne ou dans un fichier texte

    0
  2. specimen35 Messages postés 342 Date d'inscription   Statut Membre Dernière intervention   17
     
    Voici le ce qui ce passe quand je fait un pepquota -v (exemple de fichier) :

    eport for user quotas on device /dev/mapper/data-sitcar
    Block grace time: 7days; Inode grace time: 7days
    Block limits File limits
    User used soft hard grace used soft hard grace
    ----------------------------------------------------------------------
    root -- 157696 0 0 12 0 0
    uucp -- 40 0 0 76 0 0
    fradin -- 2304352 2500000 2550000 12465 50000 55000
    
    Statistics:
    Total blocks: 7
    Data blocks: 1
    Entries: 3
    Used average: 3.000000


    ensuite voici ce qui ce passe quand je fait : sed -e '1,/-\+/d;/^$/,$d' rep //rep = fichier

    root -- 157696 0 0 12 0 0
    uucp -- 40 0 0 76 0 0
    fradin -- 2304352 2500000 2550000 12465 50000 55000


    L'objectif de mon code (que je metterai en cron plus tard ) est de nourrir une base de donnée distante ( donc de lui donnée toute les infos de repquota) Il faut que je mette toute ces donnée en variable puis je les balance a la table distante . Une fois que tout cela sera terminé je ferai un script php qui donnera dans une sorte d'intranet les quotas disque utilisé puis ... .

    Voila a tu compris mon objectif ?

    Maintenant il est vrai j'ai quelque soucis dans mon code mais en tant que debutatn et surtout premier script voila je demande de l'aide en tout cas merci a toi

    Sinon voici se qu'une autre personne ma conseillé quand pense tu ?

    Il ma mis en commentaire les lignes d'origine

    Code :

    #!/usr/bin/perl -w
    use strict;
    use DBI;
    use CGI;
     
    my $cgi = new CGI;
    #my $recup = ` sed -e '1,/-\+/d;/^$/,$d' repquota -v/chemin` 
    my @recup = ` sed -e '1,/-\+/d;/^$/,$d' repquota -v/chemin`;
    chomp(@recup);
     
    my ($user1,$used1,$soft1,$hard1,$grace1,$used2,$soft2,$hard2,$grace2);
     
    print "Content-type: text/html\n\n";
     
    #Connection à la base de données mysql avec le module dbd::mysql (conncetion à distance)
    $dbh = DBI->connect("DBI:mysql:database=$db;host=$host",
                          $user, $password, {RaiseError => 1});
     
    #Requete sur la base de donnée 
    my $query = sprintf("INSERT INTO foo VALUES (%d, %s)",
                          $number, $dbh->quote("name"));
      $dbh->do($query);
     
    #while ($ligne = $recup){
    foreach($ligne(@recup)) {
    # récupération des éléments
    # ($user1,$used1,$soft1,$hard1,$grace1,$used2,$soft2,$hard2,$grace2) = split /;/,$ligne;
     ($user1,$used1,$soft1,$hard1,$grace1,$used2,$soft2,$hard2,$grace2) = split / +/,$ligne;
    # et on insere dans la base
      $db->do("insert into client values ('$user1','$used1','$soft1','$hard1','$grace1','$used2','$soft2','$hard2','$grace2')"
     
    );
              or die "pb de requete : $DBI::errstr"; 


    Voiloilou!!!!
    0
  3. specimen35 Messages postés 342 Date d'inscription   Statut Membre Dernière intervention   17
     
    up
    0
  4. kij_82 Messages postés 4102 Date d'inscription   Statut Contributeur Dernière intervention   857
     
    Effectivement ca boucle, mais non pas indéfiniement, mais infiniement ;)

    Quand tu fais ceci :
    while ($ligne = $recup){


    Il n'y a pas de condition d'arrêt puisque $ligne = $recup n'est pas une condition, mais une attribution.
    Dans ce type de cas, généralement on fais un truc du genre :
    while ( ($ligne = $recup) != null ){
         // --- code
    }
    


    Affectation + test en même temps.
    Regarde si tu ne peux pas faire un truc du même genre (condition sur la nullité de ta ligne)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    pas testé
    à savoir que si un champ est vide tu auras de problèmes
    vaut mieux utiliser le module Quota, qui met un zéro pour le champ vide
    l'inconvenient c'est qu'il faut exécuter un getpwent mets il n'y a pas vraiment de perte de performances
    #!/usr/bin/perl
    use strict;use warnings;
    use DBI;
    use CGI;
    use Quota;
    my $cgi = new CGI;
    
    
    print "Content-type: text/html\n\n";
    
    #Connection à la base de données mysql avec le module dbd::mysql (conncetion à distance)
    $dbh = DBI->connect("DBI:mysql:database=$db;host=$host",
                          $user, $password, {RaiseError => 1});
    
    #Requete sur la base de donnée
    my $query = sprintf("INSERT INTO foo VALUES (%d, %s)",
                          $number, $dbh->quote("name"));
    $dbh->do($query);
    
    my $dev = Quota::getdev('/home'); # à modifier avec ton chemin
    
    while(my ($nom,$uid) = (getpwent())[0,2]){
      my @tmp = Quota::query($dev,$uid);
      if (eval(join '+',@tmp) > 0){
        my($u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2) = map { $dbh->quote($_) } @tmp;
        print "$nom : $u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2\n"; # seulement pour test
    
        $db->do("insert into client values ($nom,$u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2)");
          or die "pb de requete : $DBI::errstr";
      }
    }
    je vais tester plus tard, mais normalement ça doit fonctionner
    0
  7. specimen35 Messages postés 342 Date d'inscription   Statut Membre Dernière intervention   17
     
    Oki , je le testerai aussi en tout cas merci pour les commentaires de tout le monde
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    il y a quelques erreurs dans le script, je ne me suis penché que sur l'histoire d'obtenir les quotas

    j'ai crée une base avec une table de 10 champs
    id,utilisateur,u1,s1,h1,g1,u2,s2,h2,g2
    ensuite j'ai fait ce test et ça marche

    à toi d'adapter

    quand tu fait insert il faut spécifier les champs

    donc le script que je te donne, fonctionne, je l'ai testé
    j'ai mis des variables, qui te permettra de changer seulement la valeur

    #!/usr/bin/perl
    use strict;use warnings;
    use DBI;
    use Quota;
    
    my $base = 'aaa';
    my $host = 'localhost';
    my $user = 'root';
    my $pass = 'aaaaaaaa';
    my $mysql_sock = '/var/run/mysqld/mysqld.sock';
    
    #Connection à base de donnée mysql
    my $db = DBI->connect("DBI:mysql:database=$base;host=$host;mysql_socket=$mysql_sock",
                    $user, $pass, {RaiseError => 1});
    
    my $dev = Quota::getdev('/'); # à modifier avec ton chemin
    
    while(my ($nom,$uid) = (getpwent())[0,2]){
            my @tmp = Quota::query($dev,$uid);
            if (eval(join '+',@tmp) > 0){
                    my($u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2) = map {$db->quote($_)} @tmp;
                    my $nom_ = $db->quote($nom);
    
    $db->do("INSERT INTO quota
              (utilisateur,u1,s1,h1,g1,u2,s2,h2,g2) VALUES  (
                      $nom_,
                      $u1,
                      $s1,
                      $h1,
                      $g1,
                      $u2,
                      $s2,
                      $h2,
                      $g2)
              ")
            or die "pb de requete : $DBI::errstr";
            }
    }
    __END__
    --

    lami20j
    0
  9. specimen35 Messages postés 342 Date d'inscription   Statut Membre Dernière intervention   17
     
    je vais tester cela par contre quota c'est un module ? cpan ?
    0
  10. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    oui tu peux chercher sur cpan
    sur mon debian je l'ai installer avec aptitude install libquota-perl
    peut être que tu l'as aussi sur ta distribution.
    Voici pour une meilleur visibilité
    #!/usr/bin/perl
    use strict;use warnings;
    use DBI;
    use Quota;
    
    my $base = 'aaa';
    my $host = 'localhost';
    my $user = 'root';
    my $pass = 'aaaaaaaa';
    my $mysql_sock = '/var/run/mysqld/mysqld.sock';
    
    #Connection à la base de données
    my $db = DBI->connect("DBI:mysql:database=$base;
                           host=$host;
                           mysql_socket=$mysql_sock",
                           $user,
                           $pass,
                           {RaiseError => 1}
                         );
    
    my $dev = Quota::getdev('/'); # à modifier avec ton chemin
    
    while(my ($nom,$uid) = (getpwent())[0,2]){
            my @tmp = Quota::query($dev,$uid);
            if (eval(join '+',@tmp) > 0){
                    my($u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2) = map {$db->quote($_)} @tmp;
                    my $nom_ = $db->quote($nom);
    
    # insertion dans la base de données
    $db->do("INSERT INTO quota
              (utilisateur,u1,s1,h1,g1,u2,s2,h2,g2) VALUES  (
                      $nom_,
                      $u1,
                      $s1,
                      $h1,
                      $g1,
                      $u2,
                      $s2,
                      $h2,
                      $g2)
              ")
            or die "pb de requete : $DBI::errstr";
            }
    }
    __END__
    
    0
  11. specimen35 Messages postés 342 Date d'inscription   Statut Membre Dernière intervention   17
     
    #!/usr/bin/perl
    use strict;use warnings;
    use DBI;
    use Quota;
    
    my $base = 'aaa';
    my $host = 'localhost';
    my $user = 'root';
    my $pass = 'aaaaaaaa';
    my $mysql_sock = '/var/run/mysqld/mysqld.sock';
    
    #Connection à la base de données
    my $db = DBI->connect("DBI:mysql:database=$base;
                           host=$host;
                           mysql_socket=$mysql_sock",
                           $user,
                           $pass,
                           {RaiseError => 1}
                         );


    Cette partie oki

    my $dev = Quota::getdev('/'); # à modifier avec ton chemin


    La je ne voit pas trop c'est pour le chemin de koi

    # la c'est pour ... 
    while(my ($nom,$uid) = (getpwent())[0,2]){
            my @tmp = Quota::query($dev,$uid);
            if (eval(join '+',@tmp) > 0){
                    my($u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2) = map {$db->quote($_)} @tmp;
                    my $nom_ = $db->quote($nom);
    
    # insertion dans la base de données                                ok 
    $db->do("INSERT INTO quota                          ok        
              (utilisateur,u1,s1,h1,g1,u2,s2,h2,g2) VALUES  (      ok 
                      $nom_,            ok 
                      $u1,               ok 
                      $s1,           ok 
                      $h1,      ok 
                      $g1,          ok 
                      $u2,                ok  
                      $s2,                   ok 
                      $h2,                 ok 
                      $g2)         ok 
              ")                       ok                             
            or die "pb de requete : $DBI::errstr";                 ok 
            }        ok  
    }             ok  
    __END__        ok 
    


    je test merci
    0
  12. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    my $dev = Quota::getdev('/'); # à modifier avec ton chemin

    La je ne voit pas trop c'est pour le chemin de koi


    le chemin que tu utilisais pour repquota ;-))))
    moi j'ai fait le test pour la racine
    tu veux peut être tester un autre chemin
    /home
    je ne sais pas
    regarde dans /etc/mtab les partition monté avec l'option de quota disque
    0
  13. specimen35 Messages postés 342 Date d'inscription   Statut Membre Dernière intervention   17
     
    mon chemin se situe pour moi dans /home/export/nomdel'entrerpise

    Sa doit etre bon je pense la je suis entrai nde lutter pour trouver le module quota : je suis avec une fedora core 7
    0
  14. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    je suis avec une fedora core 7

    et tu ne peux pas changer??
    t'es sur ovh par hasart?!
    0
  15. specimen35 Messages postés 342 Date d'inscription   Statut Membre Dernière intervention   17
     
    J'ai installé le module esce que toi aussi tu a eu pour l'install a mettre le chemin l'iud .....
    0
  16. specimen35 Messages postés 342 Date d'inscription   Statut Membre Dernière intervention   17
     
    OVH c'est une entrerpise de domaine ?

    Moi je suis null par je suis en local reseau d'entreprise

    regarde pour mon install : il me fait sa :

    make test
    PERL_DL_NONLAZY=1 /usr/bin/perl "-Iblib/lib" "-Iblib/arch" test.pl
    
    Enter path to get quota for (NFS possible; default '.'): 
    0
  17. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    tu laisses par défaut
    0
  18. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Une fois que tu l'as installé tu peux taper cette commande pour voir si tout va bien ;-)
     perl -MQuota -e 'print "$Quota::VERSION\n"'
    --

    lami20j
    0
  19. specimen35 Messages postés 342 Date d'inscription   Statut Membre Dernière intervention   17
     
    oki je vais mettre en place une maquette cette aprem-midi
    je te redis pour la suite des evenement mais apriori sa devrai tres bien marcher
    0
  20. specimen35 Messages postés 342 Date d'inscription   Statut Membre Dernière intervention   17
     
    Bon resultat de la maquette :

    1 . J'ai eu pas mal de soucis pour lancé le service httpd mais bon enfin de compte sa la fait
    2. une fois lancé forcement il y avait un soucis avec allow from all
    3. puis j'ai crée ma table en fonction de toi dit moi si j'ai fait une erreur

    table quota :

    utilisateur
    u1
    s1 h1
    g1
    u2
    s2 h2
    g2

    cela est ma table quota ( normalement comme la tienne )

    ensuite je fait les modife sur mon script

    #!/usr/bin/perl
    use strict;use warnings;
    use DBI;
    use Quota;
    
    my $base = 'test';
    my $host = '10.27.0.51';
    my $user = 'user';
    my $pass = '';
    my $mysql_sock = '/var/run/mysqld/mysqld.sock';
    
    #Connection à la base de données
    my $db = DBI->connect("DBI:mysql:database=$base;
                           host=$host;
                           mysql_socket=$mysql_sock",
                           $user,
                           $pass,
                           {RaiseError => 1}
                         );
    
    my $dev = Quota::getdev('/'); # à modifier avec ton chemin
    
    
    while(my ($nom,$uid) = (getpwent())[0,2]){
            my @tmp = Quota::query($dev,$uid);
            if (eval(join '+',@tmp) > 0){
                    my($u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2) = map {$db->quote($_)} @tmp;
                    my $nom_ = $db->quote($nom);
    
    # insertion dans la base de données
    $db->do("INSERT INTO quota
              (utilisateur,u1,s1,h1,g1,u2,s2,h2,g2) VALUES  (
                      $nom_,
                      $u1,
                      $s1,
                      $h1,
                      $g1,
                      $u2,
                      $s2,
                      $h2,
                      $g2)
              ")
            or die "pb de requete : $DBI::errstr";
            }
    }
    __END__
    ~                                                                                                                                                            
    ~                                                                                                                                                            
    ~                                                                                                                                                            
    ~                                    


    dit moi si je me trompe puis je lance mon script et sa me fait

    Use of uninitialized value in numeric gt (>) at ./gregpython.pl line 26.


    quand pense tu ?
    0
  • 1
  • 2
  • 3