#!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 = <] [ ...] -d debug -A AMBIT U10C018 -o= file to dump contents into (def: STDOUT) 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 || ''; 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__