Aide sur mon script perl
Résolu
Bonjour,
voici mon script
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 :
je ve recupérer les données que je vien de faire avec sed puis les mettre en variable soit :
Code :
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
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.
-
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 -
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 :( -
Modérateurexécute le script en tant que root
regarde chez moi
en tant que lami20jlami20j@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 rootdebian:~# 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:~# -
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 -
Modérateuraffiche 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 querepquota /dev/hda1
-
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 ) -
Modérateurfait 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"; }
-
./gregperl.pl Use of uninitialized value in concatenation (.) or string at ./gregperl.pl line 28.
-
Modérateur
# my($u1,$s1,$h1,$g1,$u2,$s2,$h2,$g2) = @tmp;
cette ligne tu ne l'a mets pas en commentaire -
#!/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__ ~ ~ ~ ~ ~ ~ ~ -
Modérateuraffiche le script
-
./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.
-
ModérateurMets 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 -
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
-
ModérateurRegarde ici (en gras)
Chez toi je ne vois pas.
Tes partitions ne sont pas monté avec l'option quota
affichecat /etc/fstab
--
lami20j -
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) ?
-
ModérateurSalut,
je ne vois toujours quota sur tes partitions
il y a moyen que je me connecte chez toi pour voir ?! -
Bon lamij j'ai bien crée tout mes quotas puis executé le script mes toujours rien je ne comprend pas pourkoi
-
a oui mince , au debut je voulait faire mon script avec python et j'ai oublié de changer oups :)))
-
Modérateuroups
je viens de me rendre compte que ton script s'appelle
gregpython.pl
pourquoi pas greperl.pl ??? :-DDD
- 1
- 2
- 3
Suivant