#!/usr/bin/perl -w use strict; use warnings FATAL => 'all'; use Net::Telnet (); use Data::Dumper; my ($arg) = @ARGV; my %config; # # userpass.conf format: # # host = # user = # pass = # open F, (defined $arg && length $arg ? $arg : '/home/ketas/devel/st-780wl/userpass.conf') || die; while () { chomp; if (/^\s*(host|user|pass)\s*=\s*(\S*)\s*$/i) { $config{lc $1} = $2; } } close F; die unless exists $config{host} && exists $config{user} && exists $config{pass}; my $prompt = sprintf "/{%s}=>\$/", $config{user}; my $telnet = new Net::Telnet($config{host}); $telnet->waitfor('/Username\s+:\s+/'); $telnet->print($config{user}); $telnet->waitfor('/\s+Password\s+:\s+/'); $telnet->print($config{pass}); $telnet->waitfor('/\s+SpeedTouch\s+780\s+/'); $telnet->waitfor('/\s+7\.4\.1\.7\s+/'); $telnet->waitfor($prompt); $telnet->print('xdsl info expand=enabled'); my $modemstate = ($telnet->waitfor('/Modem\s+state:\s+\S+/'))[1]; $modemstate =~ s/^Modem\s+state:\s+//; $modemstate = lc $modemstate; my ($standard, $annex, $uptime, $resets, $margin, $margin_down, $margin_up, $attenuation, $attenuation_down, $attenuation_up, $outputpower, $outputpower_down, $outputpower_up, $kbits_downstream, $kbits_upstream, $kbits); if ($modemstate eq 'up') { $uptime = ($telnet->waitfor('/Up\s+time\s+\(Days\s+hh:mm:ss\):\s+.+/'))[1]; ($uptime) = $uptime =~ /^Up\s+time\s+\(Days\s+hh:mm:ss\):\s+(.+)$/; $standard = ($telnet->waitfor('/xDSL\s+Standard:\s+.+/'))[1]; $standard =~ s/^xDSL\s+Standard:\s+//; $annex = ($telnet->waitfor('/xDSL\s+Annex:\s+.+/'))[1]; $annex =~ s/^xDSL\s+Annex:\s+//; $resets = ($telnet->waitfor('/Number\s+of\s+reset:\s+\S+/'))[1]; $resets =~ s/^Number\s+of\s+reset:\s+//; $kbits = ($telnet->waitfor('/Payload\s+rate\s+\[kbps\]:\s+\S+\s+\S+/'))[1]; ($kbits_downstream, $kbits_upstream) = $kbits =~ /^Payload\s+rate\s+\[kbps\]:\s+(\S+)\s+(\S+)$/; $attenuation = ($telnet->waitfor('/Attenuation\s+\[dB\]:\s+\S+\s+\S+/'))[1]; ($attenuation_down, $attenuation_up) = $attenuation =~ /^Attenuation\s+\[dB\]:\s+(\S+)\s+(\S+)$/; $margin = ($telnet->waitfor('/Margins\s+\[dB\]:\s+\S+\s+\S+/'))[1]; ($margin_down, $margin_up) = $margin =~ /^Margins\s+\[dB\]:\s+(\S+)\s+(\S+)$/; $outputpower = ($telnet->waitfor('/Output\s+power\s+\[dBm\]:\s+\S+\s+\S+/'))[1]; ($outputpower_down, $outputpower_up) = $outputpower =~ /^Output\s+power\s+\[dBm\]:\s+(\S+)\s+(\S+)$/; } $telnet->waitfor($prompt); $telnet->print('exit'); $telnet->close; my %info = ( modemstate => $modemstate, standard => $standard, annex => $annex, uptime => $uptime, resets => $resets, margin_down => $margin_down, margin_up => $margin_up, attenuation_down => $attenuation_down, attenuation_up => $attenuation_up, outputpower_down => $outputpower_down, outputpower_up => $outputpower_up, kbits_downstream => $kbits_downstream, kbits_upstream => $kbits_upstream, ); my @display = ( '', [ 'Line state', 'modemstate', ], '', [ 'Standard', 'standard', ], [ 'Annex', 'annex', ], '', [ 'Link uptime', 'uptime', ], '', [ 'Line reinitializations', 'resets', ], '', [ 'Downstream SNR', 'margin_down', ], [ 'Upstream SNR', 'margin_up', ], '', [ 'Downstream attenuation', 'attenuation_down', ], [ 'Upstream attenuation', 'attenuation_up', ], '', [ 'Downstream bandwidth', 'kbits_downstream', ], [ 'Upstream bandwidth', 'kbits_upstream', ], '', ); foreach my $key (@display) { if (ref $key eq '' && $key eq '') { print "\n"; next; } my $desc = $key->[0]; my $name = $key->[1]; my $value = $info{$name}; $value = defined $value ? $value : 'undef'; if ($name =~ /^modemstate$/) { $value = uc $value; } elsif ($name =~ /^(?:margin|attenuation)_/) { $value .= ' dB'; } elsif ($name =~ /^outputpower_/) { $value .= ' dBm'; } elsif ($name =~ /^kbits_/) { $value .= ' Kbit/s'; } printf "%32s %17s\n", $desc, $value; }