Resulta que ahora tengo otra duda, que no puedo entender porque no va, el simple hecho de cambiar una variable con valor a pasarle como parámetro algo hace que la cosa deje de funcionar...
Tengo este script que hace, mediante SNMP, ping de un router a otro y me dice el tiempo medio y el número de paquetes en % correctos.
Using perl Syntax Highlighting
#! /usr/bin/perl
use strict;
use Socket;
use Net::SNMP;
&latencia();
exit 0;
sub latencia {
my $numofpackets = 5;
my $packetsize = 64;
my $ipaddress ='200.1.23.100';
my $router = '200.9.21.100';
my $community = 'password'; #
my ($session, $error) = Net::SNMP->session(
-hostname => shift || $router,
-community => shift || $community,
-port => shift || 161
);
if (!defined($session)) {
printf("ERROR: %s.\n", $error);
exit 1;
}
my $response = $session->set_request(('.1.3.6.1.4.1.9.9.16.1.1.1.16.333', INTEGER, 6,
'.1.3.6.1.4.1.9.9.16.1.1.1.16.333', INTEGER, 5,
'.1.3.6.1.4.1.9.9.16.1.1.1.15.333', OCTET_STRING, 'SLA',
'.1.3.6.1.4.1.9.9.16.1.1.1.2.333', INTEGER, 1,
'.1.3.6.1.4.1.9.9.16.1.1.1.3.333', OCTET_STRING, inet_aton($ipaddress),
'.1.3.6.1.4.1.9.9.16.1.1.1.4.333', INTEGER, $numofpackets,
'.1.3.6.1.4.1.9.9.16.1.1.1.5.333', INTEGER, $packetsize
));
if (!defined($response)) {
printf("SNMP ERROR: %s.\n <br>", $session->error());
$session->close();
exit 1;
}
# start ping
$response = $session->set_request('.1.3.6.1.4.1.9.9.16.1.1.1.16.333', INTEGER, 1);
my $finished;
while ($finished != 1) {
my $oid;
$oid = '.1.3.6.1.4.1.9.9.16.1.1.1.14.333';
$response = $session->get_request($oid);
$finished = $response->{$oid};
sleep(1);
}
# take a look at the result
my $sndpkts_oid = '.1.3.6.1.4.1.9.9.16.1.1.1.9.333';
my $rcvpkts_oid = '.1.3.6.1.4.1.9.9.16.1.1.1.10.333';
$response = $session->get_request(($sndpkts_oid,$rcvpkts_oid));
if (!defined($response)) {
printf("SNMP ERROR: %s.\n <br>", $session->error());
$session->close();
exit 1;
}
my $sndpkts = $response->{$sndpkts_oid};
my $rcvpkts = $response->{$rcvpkts_oid};
my $successrate = $rcvpkts*100/$sndpkts;
my $avgpingtime;
if ($rcvpkts > 0) {
my $avgpingtime_oid = '.1.3.6.1.4.1.9.9.16.1.1.1.12.333';
$response = $session->get_request(($avgpingtime_oid,$sndpkts_oid,$rcvpkts_oid));
if (!defined($response)) {
printf("SNMP ERROR: %s.\n <br>", $session->error());
$session->close();
exit 1;
}
$avgpingtime = $response->{$avgpingtime_oid};
} else {
$avgpingtime = 0;
}
print "Average Ping Time = $avgpingtime\nSuccess Rate = $successrate%\n";
# cleanup
$response = $session->set_request('.1.3.6.1.4.1.9.9.16.1.1.1.16.333', INTEGER, 6);
$session->close();
}
1;
use strict;
use Socket;
use Net::SNMP;
&latencia();
exit 0;
sub latencia {
my $numofpackets = 5;
my $packetsize = 64;
my $ipaddress ='200.1.23.100';
my $router = '200.9.21.100';
my $community = 'password'; #
my ($session, $error) = Net::SNMP->session(
-hostname => shift || $router,
-community => shift || $community,
-port => shift || 161
);
if (!defined($session)) {
printf("ERROR: %s.\n", $error);
exit 1;
}
my $response = $session->set_request(('.1.3.6.1.4.1.9.9.16.1.1.1.16.333', INTEGER, 6,
'.1.3.6.1.4.1.9.9.16.1.1.1.16.333', INTEGER, 5,
'.1.3.6.1.4.1.9.9.16.1.1.1.15.333', OCTET_STRING, 'SLA',
'.1.3.6.1.4.1.9.9.16.1.1.1.2.333', INTEGER, 1,
'.1.3.6.1.4.1.9.9.16.1.1.1.3.333', OCTET_STRING, inet_aton($ipaddress),
'.1.3.6.1.4.1.9.9.16.1.1.1.4.333', INTEGER, $numofpackets,
'.1.3.6.1.4.1.9.9.16.1.1.1.5.333', INTEGER, $packetsize
));
if (!defined($response)) {
printf("SNMP ERROR: %s.\n <br>", $session->error());
$session->close();
exit 1;
}
# start ping
$response = $session->set_request('.1.3.6.1.4.1.9.9.16.1.1.1.16.333', INTEGER, 1);
my $finished;
while ($finished != 1) {
my $oid;
$oid = '.1.3.6.1.4.1.9.9.16.1.1.1.14.333';
$response = $session->get_request($oid);
$finished = $response->{$oid};
sleep(1);
}
# take a look at the result
my $sndpkts_oid = '.1.3.6.1.4.1.9.9.16.1.1.1.9.333';
my $rcvpkts_oid = '.1.3.6.1.4.1.9.9.16.1.1.1.10.333';
$response = $session->get_request(($sndpkts_oid,$rcvpkts_oid));
if (!defined($response)) {
printf("SNMP ERROR: %s.\n <br>", $session->error());
$session->close();
exit 1;
}
my $sndpkts = $response->{$sndpkts_oid};
my $rcvpkts = $response->{$rcvpkts_oid};
my $successrate = $rcvpkts*100/$sndpkts;
my $avgpingtime;
if ($rcvpkts > 0) {
my $avgpingtime_oid = '.1.3.6.1.4.1.9.9.16.1.1.1.12.333';
$response = $session->get_request(($avgpingtime_oid,$sndpkts_oid,$rcvpkts_oid));
if (!defined($response)) {
printf("SNMP ERROR: %s.\n <br>", $session->error());
$session->close();
exit 1;
}
$avgpingtime = $response->{$avgpingtime_oid};
} else {
$avgpingtime = 0;
}
print "Average Ping Time = $avgpingtime\nSuccess Rate = $successrate%\n";
# cleanup
$response = $session->set_request('.1.3.6.1.4.1.9.9.16.1.1.1.16.333', INTEGER, 6);
$session->close();
}
1;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Al ejecutar este Perl, me devuelve:
- Código: Seleccionar todo
Average Ping Time = 82
Success Rate = 100%
o valores parecidos, ok.
Pero ¿qué pasa si $ipaddress es un parámetro tal que así?:
Using perl Syntax Highlighting
#! /usr/bin/perl
use strict;
use Socket;
use Net::SNMP;
&latencia('200.1.23.100');
exit 0;
sub latencia {
# ...
my $ipaddress =$_[0];
# ...
}
use strict;
use Socket;
use Net::SNMP;
&latencia('200.1.23.100');
exit 0;
sub latencia {
# ...
my $ipaddress =$_[0];
# ...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Pues que me devuelve esto:
- Código: Seleccionar todo
Average Ping Time = 1
Success Rate = 100%
y no consigo entender por qué, ya que si dentro de la función hago un print de $ipaddress ¡me la devuelve igual que la que he escrito!
¿qué puede ser?
¿qué más maneras hay de pasar parámetros?