rendered paste body#!perl --
# Written by $Bill - last modified 10/04/2008
# Permission to use and modify for your own personal use is granted.
# Commercial use requires permission from dbecoll@gmail.com
use MIME::Base64;
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request::Common qw(POST);
use LWP::Debug qw(level);
use Data::Dumper; $Data::Dumper::Indent=1;
our %A; # get commandline switches into %A
for (my $ii = 0; $ii < @ARGV; ) {
last if $ARGV[$ii] =~ /^--$/;
if ($ARGV[$ii] !~ /^-{1,2}(.*)$/) { $ii++; next; }
my $arg = $1; splice @ARGV, $ii, 1;
if ($arg =~ /^([\w]+)=(.*)$/) { $A{$1} = $2; } else { $A{$1}++; }
}
$| = 1; binmode STDOUT; select ((select (STDERR), $| = 1)[0]); binmode STDERR;
my $debug = $A{d} || 0;
my $file = $A{o} || '';
my $AMBIT = $A{A} || 0; # Ambit U10C018 - set to 1
my $base_url = 'http://192.168.100.1';
my $cookiepath = defined $ENV{foo} ? "$ENV{foo}/txt" : '.';
# Main http://192.168.100.1/mainPage
# (to login) /diagnostics_page.html - user/user!
# (or ??) http://192.168.100.1/checkModemPasswdPage
# Troubleshoot http://192.168.100.1/modemTroubleshootPage
# Connection http://192.168.100.1/modemRfPage
# Advanced Links
# Event Log http://192.168.100.1/modemLogPage
# Status http://192.168.100.1/modemStatusPage
# DS Freq http://192.168.100.1/modemDsFreqPage
# Configuration http://192.168.100.1/modemConfigPage
# Logout http://192.168.100.1/logout
my $logpage = "$base_url/modemLogPage";
my $url = "$base_url/checkModemPasswdPage"; # start at login page
my $pw_arg = 'passwdStr=user';
my %pages = (
a => [qw(r s d c)],
c => ['Config', 'modemConfigPage'],
d => ['Diagnostics', 'diagnostics_page.html'],
f => ['Downstream Frequency', 'modemDsFreqPage'],
l => ['Event Log', 'modemLogPage'],
r => ['RF', 'modemRfPage'],
s => ['Status', 'modemStatusPage'],
);
if ($AMBIT) { # change pages for AMBIT
# Main http://192.168.100.1/
# (to login) /login.html
# Modem http://192.168.100.1/CmNavigation.asp
# Information http://192.168.100.1/CmInfo.asp
# Status http://192.168.100.1/CmStatus.asp
# Downstream http://192.168.100.1/CmDnstream.asp
# Upstream http://192.168.100.1/CmUpstream.asp
# Upstream Burst http://192.168.100.1/CmUpBurst.asp
# Operation Config. http://192.168.100.1/CmOpConfig.asp
# Event Log http://192.168.100.1/CmEventLog.asp
%pages = (
a => [qw(c d i n s u ub)],
i => ['Info', 'CmInfo.asp'],
c => ['Op Config', 'CmOpConfig.asp'],
d => ['Downstream', 'CmDnstream.asp'],
l => ['Event Log', 'CmEventLog.asp'],
n => ['Navigation', 'CmNavigation.asp'],
s => ['Status', 'CmStatus.asp'],
u => ['Upstream', 'CmUpstream.asp'],
ub => ['Upstream Burst', 'CmUpBurst.asp'],
);
$logpage = "$base_url/CmEventLog.asp";
$url = "$base_url/login.html";
$pw_arg = 'username=user&password=user';
}
(my $prog = $0) =~ s/^.*[\\\/]//;
my $usage = <<EOD;
Usage: $prog [-d] [-A] [-o=<file>] [<page> ...]
-d debug
-A AMBIT U10C018
-o=<file> file to dump contents into (def: STDOUT)
<page> page(s) to retrieve
TJ715 Pages:
a all pages except log page (def)
f Downstream Frequency
c Config
l Log Page (will be output last)
m Diagnostics
r Rf
s Status
AMBIT U10C018 Pages:
a all pages except log page (def)
c OpConfig
d Downstream
i Info
l EventLog (will be output last)
n Navigation
s Status
u Upstream
ub Upstream Burst
EOD
print STDERR Data::Dumper->Dump([\%pages], [qw(%pages)]) if $debug;
die $usage if $A{h} or $A{help};
my @pgs = ('a');
my $logging = 0;
if (@ARGV) {
my $all = 0;
@pgs = (); # start over with pages wanted
foreach (@ARGV) {
if (not exists $pages{$_}) {
print "No page option: '$_' skipping\n";
next;
} elsif ($_ eq 'l') {
$logging = 1;
} elsif ($_ eq 'a') {
$all = 1;
} else {
push @pgs, $_;
}
}
@pgs = @{$pages{a}} if $all; # set back to all of 'a'
} else {
@pgs = @{$pages{a}};
}
print STDERR Data::Dumper->Dump([\@pgs], [qw(@pgs)]) if $debug;
my @pages = (); # pages to display
push @pages, "$base_url/$pages{$_}[1]" foreach @pgs; # set pages in
push @pages, $logpage if $logging; # add logging last if wanted
print STDERR Data::Dumper->Dump([\@pages], [qw(@pages)]) if $debug;
open OUT, ">$file" or die "open: $!" if $file;
LWP::Debug::level('+') if $debug;
my $ua = LWP::UserAgent->new(timeout => 30);
$ua->agent('Mozilla/5.0');
my $cookie_jar = HTTP::Cookies->new(file => "$cookiepath/lwpcookies.txt",
autosave => 1, ignore_discard => 1);
$ua->cookie_jar($cookie_jar);
my $req; # request
my $res; # response
my $ct; # content before altering
my $content; # content
# log in to modem password page
#$req = HTTP::Request->new(POST => $url);
#$req->content_type('application/x-www-form-urlencoded');
#$req->content($pw_arg);
$req = new HTTP::Request 'GET', $url;
$req->header('Authorization' => 'Basic ' . encode_base64 ('user:user'));
$res = $ua->request($req) or warn "Req: $url: $! ($^E)";
print STDERR Data::Dumper->Dump([$res], [qw($res)]) if $debug;
print "\n";
foreach $url (@pages) {
print "url=$url\n" if $debug;
$req = HTTP::Request->new(GET => $url);
$res = $ua->request($req) or warn "Req: $url: $! ($^E)";
print STDERR Data::Dumper->Dump([$res], [qw($res)]) if $debug;
if ($res->is_error()) {
printf STDERR "Error: %s\n", $res->status_line;
next;
}
$ct = $res->content();
$content = $ct;
$content =~ s/[\t ]*<[^>]+>[\t ]*/ /gs; # rem tags
$content =~ s/\ / /gs; # -> ' '
$content =~ s/\t+/ /gs; # de-tab
$content =~ s/[\t ]{2,}/ /gs; # mult WS to ' '
$content =~ s/^\s+//s; # rem 1st leading WS
$content =~ s/\n */\n/gs; # rem leading WS
$content =~ s/\n{2,}/\n/gs; # rem blank lines
print $content if $debug;
if ($url =~ /diagnostics_page/) {
print "\tDiagnostics Page\n";
$content =~ s/Cable Modem.*?Connectivity:\s*//s;
$content =~ s/Auto Refresh.*?Auto Refresh\.\s*//s;
foreach (split /\n/, $content) {
if (/^(.*):\s+(.*)\s*$/) {
printf "%-24s %s\n", $1, $2;
} else {
printf "%s\n", $_;
}
}
print "\n";
} elsif ($url =~ /modemRfPage/) {
print "\tRF Page\n";
$content =~ s/Cable Modem.*?Units\s*//s;
foreach (split /\n/, $content) {
if (/^(.*)\s+([^\s]+)\s+([^\s]+)\s*$/) {
printf "%-16s %s %s\n", $1, $2, $3;
} else {
printf "%s\n", $_;
}
}
print "\n";
} elsif ($url =~ /modemStatusPage/) {
print "\tStatus Page\n";
$content =~ s/Cable Modem.*?Parameter Value\s*//s;
$content =~ s/Auto Refresh.*?Auto Refresh\.\s*//s;
foreach (split /\n/, $content) {
/^(.*)\s+([^\s]+)\s*$/;
printf "%-42s %s\n", $1, $2;
}
print "\n";
} elsif ($url =~ /modemConfigPage/) {
print "\tConfig Page\n";
$content =~ s/Cable Modem.*?Value\s*//s;
foreach (split /\n/, $content) {
/^(.*)\s+([^\s]+)\s*$/;
printf "%-30s %s\n", $1, $2;
}
print "\n";
} elsif ($url =~ /modemDsFreqPage/) {
print "\tDS Freq Page\n";
$ct =~ /dsFreqValue.*?VALUE=(\d+)/s;
printf "DS Freq Value %s\n", $1 || '<undef>';
print "\n";
} elsif ($url =~ /modemLogPage/) {
print "\tLog Page\n";
foreach (split /\n/, $content) {
if (/\//) { # if date line, join it up to next line
print "$_ ";
} else {
printf "$_\n";
}
}
print "\n";
} else {
print "\tUnknown Page $url\n";
print $content;
print "\n";
}
if ($file) {
open OUT, ">>$file" or die "open: $!";
binmode OUT;
print OUT $content;
close OUT;
print "File $file saved\n";
}
}
__END__