in reply to Net::Telnet problem

From the Net::Telnet manual:

Debugging

The typical bug causes a timeout error because you've made incorrect assumptions about what the remote side actually sends. The easiest way to reconcile what the remote side sends with your expectations is to use input_log() or dump_log(). dump_log() allows you to see the data being sent from the remote side before any translation is done, while input_log() shows you the results after translation. The translation includes converting end of line characters and stripping and responding to TELNET protocol commands.


Use this to see what the other side is really returning (chances are there's an escape character or a spacing issue that you're missing). dump_log produces a huge amount of output, but you can find exactly what you should be waiting for. I'd be willing to be that you really want to be waiting for something like this:
$t->waitfor('/<--- More ---> /');
I've used this several times when automatic switch/router scripts mysteriously seem to "not work".....

BlueLines

Disclaimer: This post may contain inaccurate information, be habit forming, cause atomic warfare between peaceful countries, speed up male pattern baldness, interfere with your cable reception, exile you from certain third world countries, ruin your marriage, and generally spoil your day. No batteries included, no strings attached, your mileage may vary.

Replies are listed 'Best First'.
ubernewbie question--- Net::Telnet problem
by meonkeys (Chaplain) on Nov 10, 2000 at 11:40 UTC
    This may be a simple IO question, but I have to ask...

    Could you give me an example of how you would turn on debugging?
    $t->dump_log('temp.txt');

    just writes out a blank file for me.

    similarly,
    $t->dump_log(<STDOUT>);

    gives no debugging information.
      Your first sample works for me:
      use Net::Telnet; my $telnet = Net::Telnet->new(Timeout => 10); $telnet->dump_log("dump.log"); $telnet->open("machine"); $telnet->login("user", "oass"); $telnet->close;
      I get a bunch of stuff (the stuff that goes in and out over the telnet connection) in dump.log. Are you actually trying to open a connection? I doubt you'll get anything in your dump_log file if you don't *do anything*. :)

      Oh, and your second snippet is wrong. That's not a filehandle; that's a diamond-operator *read* from a filehandle. STDOUT is the filehandle, <STDOUT> is you reading from the filehandle. You want

      $telnet->dump_log(*STDOUT);
        I should have just posted this in the first place; anyway, this is my weak attempt at automating a mundane Apache test, trying to telnet in to port 80 and doing a HTTP GET. It's probably not what Net::Telnet was meant to do.
        #!/usr/bin/perl -w use strict; use Time::HiRes qw( time tv_interval ); use Net::Telnet (); my $hosts = join ' ', @ARGV; unless ($hosts){ die "Usage: ruffbench <host> [<host2> <host3> ...]\n"; } my $port = '80'; my $t = new Net::Telnet; my $get = "GET / HTTP/1.0\n\n"; my $output; foreach my $host ($hosts) { print "Connecting to $host. Starting timer.\n"; print $t->dump_log(*STDERR); # no debugging is seen! :| my $start = [ time() ]; $t->open(Host=>$host, Port=>$port); print "Connected to $host. Sending request...\n"; print $t->waitfor(String=>"HTTP", Timeout=>5); $t->print($get); print $t->waitfor(String=>"Content-Type", Timeout=>5); my $end = [ time() ]; $t->close; print "Connection closed. Timer stopped.\n\n"; print "Time for simple GET from $host: " . tv_interval($start, $end) . " seconds.\n"; }

        I'm not sure why, but I get no debugging info, even if I swap out *STDERR with, say, "dump.log".

        Humbly,
        Adam