All pastes #1221044 Raw Edit

Unnamed

public text v1 · immutable
#1221044 ·published 2008-10-06 20:54 UTC
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/\&nbsp;/ /gs;	# &nbsp; -> ' '
	$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__