#!/usr/bin/perl

use strict;
use IO::Socket;
use Sys::Syslog;

my @secrets     = qw(/etc/ppp/chap-secrets /etc/ppp/pap-secrets);
my $adsl_login  = 'F100000060';
my $adsl_passwd = get_passwd($adsl_login);
my $isp_login   = 'rj';
my $isp_passwd  = get_passwd($isp_login);

my $host         = "10.128.1.6";
my $port         = "80";
my $service      = "xs4all-F04";

############################################################################

sub get_passwd
{
	my($user) = @_;
	foreach my $file (@secrets) {
		open (FILE, "<$file") or die "Cannot open $file: $!\n";
		while (<FILE>) {
			return $1 if /^$user\s+\S+\s+(\S+)/;
		}
	}
	die "Cannot find password of $user\n";
}

sub urlencode
{
	$_[0] =~ s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x", ord($1))/eg;
	return $_[0];
}

sub sendtoserver
{
	my $sock = new IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp');
	if (not $sock) {
		syslog("notice", "Connect to $host:$port failed");
		exit;
	}
	print $sock $_[0];
	my @lines = <$sock>;
	close($sock);
	return @lines;
}

$isp_login  = urlencode($isp_login);
$isp_passwd = urlencode($isp_passwd);

openlog("adsl-login", "pid", "daemon");
Sys::Syslog::setlogsock('unix');

syslog("notice", "Connecting to $host:$port");

my @resp = sendtoserver(
	"GET / HTTP/1.0\r\n" .
	"\r\n");

for (@resp) {
	($host, $port) = m!^Location: http://(\S+?):(\d+)! and last;
}

syslog("notice", "Redirected to $host:$port");

sendtoserver(
	"GET /dashboard?fcn=accountLogon&username=${adsl_login}&password=${adsl_passwd} HTTP/1.0\r\n" .
	"Referer: http://$host:$port/dashboard?fcn=accountLogonPrompt\r\n" .
	"\r\n");

sendtoserver(
	"GET /dashboard?fcn=viewDashBoardFrame&serviceViewFcn=viewService&service=${service} HTTP/1.0\r\n" .
	"Referer: http://$host:$port/dashboard?fcn=viewServiceList\r\n" .
	"\r\n");

sendtoserver(
	"GET /dashboard?fcn=serviceLogon&service=${service}&username=${isp_login}&password=${isp_passwd} HTTP/1.0\r\n" .
	"Referer: http://$host:$port/dashboard?fcn=viewService&service=${service}\r\n" .
	"\r\n");

syslog("notice", "Logged on to $service");
