Rechercher : dans
Par :

Aide sur mon script perl

Dernière réponse le 29 jan 2008 à 14:00:00 specimen35, le 11 jan 2008 à 10:11:52 
 Signaler ce message aux modérateurs

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,$g­race2);
 
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

Meilleures réponses pour « Aide sur mon script perl » dans :
Robots.txt, un fichier important VoirSur votre site : le fichier robots.txt Sur votre site , vous essayez, dans la mesure du possible, de faire en sorte que vos pages soient indexées au mieux par les robots (spiders) des moteurs de recherche. Mais il peut également arriver que...
Perl - Caractéristiques du langage VoirFichier source, et interprétation Le fichier source d'un programme écrit en Perl est un simple fichier texte dont l'extension est par convention .pl. Ce fichier source doit être un fichier texte non formatté, c'est-à-dire un fichier texte dans sa...

1

lami20j, le 11 jan 2008 à 12:07:50

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


lami20j

Répondre à lami20j

2

specimen35, le 11 jan 2008 à 14:04:55

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,$g­race2);
 
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!!!!

Répondre à specimen35

3

specimen35, le 15 jan 2008 à 09:42:00

Up

Répondre à specimen35

4

kij_82, le 15 jan 2008 à 09:51:00

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)

~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~

Répondre à kij_82

5

lami20j, le 15 jan 2008 à 09:57:33

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
lami20j

Répondre à lami20j

6

specimen35, le 15 jan 2008 à 10:59:45

Oki , je le testerai aussi en tout cas merci pour les commentaires de tout le monde

Répondre à specimen35

7

lami20j, le 15 jan 2008 à 11:38:03

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

Répondre à lami20j

8

specimen35, le 15 jan 2008 à 11:40:47

Je vais tester cela par contre quota c'est un module ? cpan ?

Répondre à specimen35

9

lami20j, le 15 jan 2008 à 11:43:46

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__

lami20j

Répondre à lami20j

10

specimen35, le 15 jan 2008 à 11:51:57

#!/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

Répondre à specimen35

11

lami20j, le 15 jan 2008 à 12:03:38

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

lami20j

Répondre à lami20j

12

specimen35, le 15 jan 2008 à 12:05:56

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

Répondre à specimen35

13

lami20j, le 15 jan 2008 à 12:09:38
Répondre à lami20j

14

lami20j, le 15 jan 2008 à 12:10:45

je suis avec une fedora core 7

et tu ne peux pas changer??
t'es sur ovh par hasart?!
lami20j

Répondre à lami20j

15

specimen35, le 15 jan 2008 à 12:18:23

J'ai installé le module esce que toi aussi tu a eu pour l'install a mettre le chemin l'iud .....

Répondre à specimen35

16

specimen35, le 15 jan 2008 à 12:20:35

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 '.'): 

Répondre à specimen35

17

lami20j, le 15 jan 2008 à 12:31:01

Tu laisses par défaut
lami20j

Répondre à lami20j

18

lami20j, le 15 jan 2008 à 12:34:56

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

Répondre à lami20j

19

specimen35, le 15 jan 2008 à 13:40:44

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

Répondre à specimen35