OVH Cloud OVH Cloud

Problème de 'autoflush'

4 réponses
Avatar
Yves Martin
Je suis en train d'écrire un script pour net-snmp... et je me retrouve avec
le problème décrit dans ce forum:

http://www.opensubscriber.com/message/net-snmp-users@lists.sourceforge.net/1699280.html

Et de constater sans comprendre que $|=1; (ou $OUTPUT_AUTOFLUSH=1;) ne
fonctionne pas s'il est précédé de "use stricts;" - mais pourqoi ??

--
Yves Martin

4 réponses

Avatar
Paul Gaborit
À (at) Fri, 06 Jan 2006 14:03:39 +0100,
Yves Martin écrivait (wrote):
Et de constater sans comprendre que $|=1; (ou $OUTPUT_AUTOFLUSH=1;) ne
fonctionne pas s'il est précédé de "use stricts;" - mais pourqoi ??


Êtes-vous sûr de votre diagnostic ?

Normalement $| est utilisable avec ou sans 'use strict;'.

En revanche $OUTPUT_AUTOFLUSH n'est pas utilisable tel quel (comme
toutes les variables avec des noms explicites). Il *faut* placer en
début de script :

use English '-no_match_vars';

Petit extrait de la doc perlvar :

Les noms suivants ont une signification spéciale en Perl. La
plupart de ces noms ont des mnémoniques acceptables ou
équivalents dans l'un des shells. Néanmoins, si vous souhaitez
utiliser des descripteurs longs, vous avez juste à ajouter

use English;

en tête de votre programme. Cela créera un alias entre les noms
courts et les noms longs du module courant. Certains ont même
des noms de longueur intermédiaire, généralement empruntés à
awk. En général, il est préférable d'invoquer

use English '-no_match_vars';

si vous n'avez pas besoin de $PREMATCH, $MATCH, ou $POSTMATCH,
ce qui évite une baisse de performance certaine dans le
traitement des expressions rationnelles.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Yves Martin
Paul Gaborit writes:

À (at) Fri, 06 Jan 2006 14:03:39 +0100,
Yves Martin écrivait (wrote):
Et de constater sans comprendre que $|=1; (ou $OUTPUT_AUTOFLUSH=1;) ne
fonctionne pas s'il est précédé de "use stricts;" - mais pourqoi ??



J'ai bien utilisé 'use English'.

Êtes-vous sûr de votre diagnostic ?
Normalement $| est utilisable avec ou sans 'use strict;'.


En ce qui concerne mon diagnostique, voici les informations sur la base d'une
Debian Sarge 3.1 ; Perl 5.8.4 ; NET-SNMP 5.1.2-6.2

,--- /etc/snmp/snmpd.conf
| pass_persist .1.3.6.1.4.1.15204.3 /usr/local/bin/mibtest.pl
`---

Voici le script:

,--- /usr/local/bin/mibtest.pl
| #!/usr/bin/perl
|
| # Fail if uncommented
| #use strict;
| use warnings;
|
| $|=1;
|
| $MYMIB=".1.3.6.1.4.1.15204.3";
| while ($command=<>)
| {
| chomp ($command);
| if ($command eq "PING")
| { print "PONGn"; }
| elsif ($command eq "get")
| {
| $command=<>;
| chomp ($command);
| if($command eq "$MYMIB")
| {
| print "$commandn";
| print "integern";
| print "999n";
| }
| else
| { print "NONEn"; };
| }
| else
| { print "NONEn"; };
| };
`---

Sans "use strict":
$ snmpget -v 2c -c public localhost .1.3.6.1.4.1.15204.3
SNMPv2-SMI::enterprises.15204.3 = INTEGER: 999

Avec "use strict":
$ snmpget -v 2c -c public localhost .1.3.6.1.4.1.15204.3
SNMPv2-SMI::enterprises.15204.3 = No Such Instance currently exists at this OID

Je n'arrive pas à en savoir plus. Pour une raison que j'ignore, il m'est
impossible d'ouvrir un fichier (/tmp/mibtest.log) pour tracer les requêtes...

Mais la seule différence entre "ça marche" et "ça ne marche pas"
est bien le "use strict".

--
Yves Martin


Avatar
Paul Gaborit
À (at) Mon, 09 Jan 2006 10:38:46 +0100,
Yves Martin écrivait (wrote):
Paul Gaborit writes:

À (at) Fri, 06 Jan 2006 14:03:39 +0100,
Yves Martin écrivait (wrote):
Et de constater sans comprendre que $|=1; (ou
$OUTPUT_AUTOFLUSH=1;) ne fonctionne pas s'il est précédé de "use
stricts;" - mais pourqoi ??



J'ai bien utilisé 'use English'.

Êtes-vous sûr de votre diagnostic ?
Normalement $| est utilisable avec ou sans 'use strict;'.


En ce qui concerne mon diagnostique, voici les informations sur la
base d'une Debian Sarge 3.1 ; Perl 5.8.4 ; NET-SNMP 5.1.2-6.2

,--- /etc/snmp/snmpd.conf
| pass_persist .1.3.6.1.4.1.15204.3 /usr/local/bin/mibtest.pl
`---

Voici le script:

,--- /usr/local/bin/mibtest.pl
| #!/usr/bin/perl
|
| # Fail if uncommented
| #use strict;
| use warnings;
|
| $|=1;
|
| $MYMIB=".1.3.6.1.4.1.15204.3";
| while ($command=<>)
| {
| chomp ($command);
| if ($command eq "PING")
| { print "PONGn"; }
| elsif ($command eq "get")
| {
| $command=<>;
| chomp ($command);
| if($command eq "$MYMIB")
| {
| print "$commandn";
| print "integern";
| print "999n";
| }
| else
| { print "NONEn"; };
| }
| else
| { print "NONEn"; };
| };
`---

Sans "use strict":
$ snmpget -v 2c -c public localhost .1.3.6.1.4.1.15204.3
SNMPv2-SMI::enterprises.15204.3 = INTEGER: 999

Avec "use strict":
$ snmpget -v 2c -c public localhost .1.3.6.1.4.1.15204.3
SNMPv2-SMI::enterprises.15204.3 = No Such Instance currently
exists at this OID

Je n'arrive pas à en savoir plus. Pour une raison que j'ignore, il
m'est impossible d'ouvrir un fichier (/tmp/mibtest.log) pour
tracer les requêtes...

Mais la seule différence entre "ça marche" et "ça ne marche pas"
est bien le "use strict".


Et qu'est-ce qui vous faisait croire que cela avait quelque chose à
voir avec l'utilisation de $| ???

En l'occurrence, votre script ne peut pas marcher avec 'use strict'
car vos variables ($MYMIB et $command) ne sont pas déclarées (par 'my'
ou 'our'). Voici le script modifié pour qu'il fonctionne avec 'use
strict' :

------------------------------------------------------------
/usr/local/bin/mibtest.pl
------------------------------------------------------------
#!/usr/bin/perl

use strict;
use warnings;

$|=1;

my $MYMIB=".1.3.6.1.4.1.15204.3";
while (my $command=<>)
{
chomp ($command);
if ($command eq "PING")
{ print "PONGn"; }
elsif ($command eq "get")
{
$command=<>;
chomp ($command);
if($command eq "$MYMIB")
{
print "$commandn";
print "integern";
print "999n";
}
else
{ print "NONEn"; };
}
else
{ print "NONEn"; };
};
------------------------------------------------------------

PS: lorsque vous postez un script, évitez de le décorer avec de "> |"
au début de chaque ligne. Ça évite la tâche de nettoyage aux lecteurs
de vos messages...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>



Avatar
Yves Martin
Paul Gaborit writes:

PS: lorsque vous postez un script, évitez de le décorer avec de "> |"
au début de chaque ligne. Ça évite la tâche de nettoyage aux lecteurs
de vos messages...


Mille excuses... c'est une emacserie !

Merci d'avoir déverminé mon code. Je me sens idiot de ne pas avoir tenté une
exécution en ligne de commande pour voir les erreurs !

--
Yves Martin