Aide sur mon script perl

Résolu
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

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.

Bobot (l’IA à votre service)
  1. ok c'est bon c'étais mon quota qui étais mal fait quand je faisait quotaon -a j'avais une erreur donc c'est bon mainteanant je part sur un script pour les quota impression et mail. je vais ouvrrir un autre topic pour cela , . Je vais toujours garder les meme script que l'on a fait pour les suota disque et essayer de voir si on peut le faire avec les quota impression et mail !!

    Voila et encore merci ( maintenant si tu veut m'aider pour les autres script :) je ne dirais pas non lol )

    En tout les cas je dirai : ENCORE UNE VICTOIRE DE CAN... EU DE LAMI20J
    0
    1. Oui je les fait en root ,

      Je vien de voir un soucis au niveau de mes quotas quand je fait quotaon j'ai un messages d'erreur :(
      0
      1. Modérateur
        exécute le script en tant que root

        regarde chez moi

        en tant que lami20j
        lami20j@debian:~$  perl -MQuota -e '$dev=Quota::getdev("/home"); while(my ($nom,$uid) = (getpwent())[0,2]){ print Quota::query($dev,$uid),"\n"}'
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        1876318800098012000
        
        
        
        
        
        
        
        
        
        
        lami20j@debian:~$
        
        en tant que root
        debian:~# perl -MQuota -e '$dev=Quota::getdev("/home"); while(my ($nom,$uid) = (getpwent())[0,2]){ print Quota::query($dev,$uid),"\n"}'
        1762000004000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        00000000
        1876318800098012000
        00000000
        160004000
        00000000
        00000000
        00000000
        00000000
        00000000
        160004000
        160004000
        00000000
        debian:~#
        
        0
        1. alors :

          perl -MQuota -e '$dev=Quota::getdev("/home"); while(my ($nom,$uid) = (getpwent())[0,2]){ print Quota::query($dev,$uid),"\n"}'


          pareil que le script que de l'affichage null

          et voici le deuxieme :

          repquota /dev/hda1
          *** Rapport pour les quotas user sur le périphérique /dev/hda1
          Période de sursis bloc : 7days ; période de sursis inode : 7days
                                  Limites bloc               Limites fichier
          Utilisateur     utilisé souple stricte sursis utilisé souple stricte sursis
          ----------------------------------------------------------------------
          root      --   10921       0       0             28     0     0       
          test      --       4    9000   10000              4  9000 10000     
          0
          1. Modérateur
            affiche le résultat de la commande (attention c'est une seule ligne)
             perl -MQuota -e '$dev=Quota::getdev("/home"); while(my ($nom,$uid) = (getpwent())[0,2]){ print Quota::query($dev,$uid),"\n"}'

            ainsi que
            repquota /dev/hda1


            0
            1. voila se que j'ai dans 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('/home'); # à modifier avec ton chemin
              
              while(my ($nom,$uid) = (getpwent())[0,2]){
                      my @tmp = Quota::query($dev,$uid);
              #                if(scalar(grep{$_!=0}@tmp)>0){
              #               my($u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2) =  @tmp;
              #                print "$u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2\n";
               #       }
              print "@tmp\n";
               }
              ~                                                                                                                                                            
              ~                                                                                                                                                            
              ~                                                                                                                                                            
              ~                                                                                                                                                            
              ~                                                                                                                                                            
              ~                                                                                                                                                            
              ~                   


              Et sa me donne un gros trou blanc !! quand je l'execute ( trou blanc = a la ligne plein de fois )
              0
              1. Modérateur
                fait comme ça

                while(my ($nom,$uid) = (getpwent())[0,2]){
                        my @tmp = Quota::query($dev,$uid);
                #                if(scalar(grep{$_!=0}@tmp)>0){
                #               my($u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2) =  @tmp;
                #                print "$u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2\n";
                 #       }
                print "@tmp\n";
                 }

                0
                1. ./gregperl.pl 
                  Use of uninitialized value in concatenation (.) or string at ./gregperl.pl line 28.
                  0
                  1. Modérateur
                    #               my($u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2) =  @tmp;
                    

                    cette ligne tu ne l'a mets pas en commentaire
                    0
                    1. #!/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('/home'); # à modifier avec ton chemin
                      
                      
                      while(my ($nom,$uid) = (getpwent())[0,2]){
                              my @tmp = Quota::query($dev,$uid);
                      #                if(scalar(grep{$_!=0}@tmp)>0){
                      #               my($u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2) =  @tmp;
                                      print "$u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2\n";
                              }
                       #}
                      
                      __END__
                      ~                                                                                                                                                            
                      ~                                                                                                                                                            
                      ~                                                                                                                                                            
                      ~                                                                                                                                                            
                      ~                                                                                                                                                            
                      ~                                                                                                                                                            
                      ~                   
                      0
                      1. ./gregperl.pl 
                        Global symbol "$u1" requires explicit package name at ./gregperl.pl line 28.
                        Global symbol "$s1" requires explicit package name at ./gregperl.pl line 28.
                        Global symbol "$h1" requires explicit package name at ./gregperl.pl line 28.
                        Global symbol "$g1" requires explicit package name at ./gregperl.pl line 28.
                        Global symbol "$u2" requires explicit package name at ./gregperl.pl line 28.
                        Global symbol "$s2" requires explicit package name at ./gregperl.pl line 28.
                        Global symbol "$h2" requires explicit package name at ./gregperl.pl line 28.
                        Global symbol "$g2" requires explicit package name at ./gregperl.pl line 28.
                        Execution of ./gregperl.pl aborted due to compilation errors.
                        
                        0
                        1. Modérateur
                          Mets en commentaire la partie avec la base de donnée et laisse seulement le print
                          Ensuite exécute le script et affiche le résultat
                          Mets en commentaire aussi le if
                          0
                          1. j'ai enlevé adquota.group car il ne me ser a rien et voila su que j'ai dans la fstab :

                             cat /etc/fstab 
                            /dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
                            LABEL=/boot             /boot                   ext3    defaults        1 2
                            devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
                            tmpfs                   /dev/shm                tmpfs   defaults        0 0
                            proc                    /proc                   proc    defaults        0 0
                            sysfs                   /sys                    sysfs   defaults        0 0
                            /dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
                            /dev/hda1       /home          ext3    defaults,usrquota, 1 0 
                            
                            0
                            1. Modérateur
                              Regarde ici (en gras)
                              Chez toi je ne vois pas.
                              Tes partitions ne sont pas monté avec l'option quota

                              affiche
                              cat /etc/fstab
                              --

                              lami20j
                              0
                              1. salut , enfaite je vient de voir que quen je fait quotaon -a j'est cela :

                                 quotaon -a
                                quotaon: utilisation de /home/aquota.group sur /dev/hda1 [/home] : Argument invalide
                                quotaon: Essayez peut-être de créer un nouveau fichier de quotas avec quotacheck(8) ?
                                quotaon: utilisation de /home/aquota.user sur /dev/hda1 [/home] : Argument invalide
                                quotaon: Essayez peut-être de créer un nouveau fichier de quotas avec quotacheck(8) ?
                                
                                0
                                1. Modérateur
                                  Salut,

                                  je ne vois toujours quota sur tes partitions

                                  il y a moyen que je me connecte chez toi pour voir ?!
                                  0
                                  1. Bon lamij j'ai bien crée tout mes quotas puis executé le script mes toujours rien je ne comprend pas pourkoi
                                    0
                                    1. a oui mince , au debut je voulait faire mon script avec python et j'ai oublié de changer oups :)))
                                      0
                                      1. Modérateur
                                        oups
                                        je viens de me rendre compte que ton script s'appelle
                                        gregpython.pl

                                        pourquoi pas greperl.pl ??? :-DDD
                                        0
                                        • 1
                                        • 2
                                        • 3