#!/usr/bin/perl
#
# (c) 1999 TyZ
#

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

my $adsl_login = 'F1xxxxxxxx';
my $isp_login  = "xxx";
my $isp_pass   = "xxxxxxx";

my $host         = "10.128.1.6";
my $port         = "80";
my $service      = "xs4all-F02"; # FAST04 (zucht)
my $chap_secrets = "/etc/ppp/chap-secrets";
my $adsl_pass    = &getchappass($adsl_login);

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

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

sub getchappass
{
	my ($user) = @_;
	my $pass;
	open(F, "<$chap_secrets") or die("$chap_secrets: $!\n");
	while (<F>) {
		($pass) = /^$user\s+\S+\s+(\S+)/ and last;
	}
	close(F);
	die("$user not found in $chap_secrets\n") if not $pass;
	return $pass;
}

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_pass  = urlencode($isp_pass);

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_pass} 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_pass} HTTP/1.0\r\n" .
	"Referer: http://$host:$port/dashboard?fcn=viewService&service=${service}\r\n" .
	"\r\n");

syslog("notice", "Logged in");

