Running the script dials the modem, and on successful connection to the remote, invokes PPPD to take over the connection.
Tested with redhat 9.0 on a Sony Vaio PCG-F450 portable.
Basically does what chat(1) would do, with a few niceties, and probably easier to understand.
Change the red text as needed.
#!/usr/bin/perl
# ppp-start - start a PPP connection
# (C) Copyright Greg Ercolano 2003. This software is public domain.
# Tested for redhat9.0
$tty = "/dev/cua1"; # tty
$baud = 57600;
$dns = "DNS_ADDRESS";
$login = "LOGIN_NAME\r"; # quote '@' sign!
$pass = "PASSWORD\r";
$init = "ate0\r";
$dial = "atdtPHONE_NUMBER\r";
$abort = "NO DIALTONE|NO CARRIER|BUSY|ERROR";
# The following byzantine 'stty' hex data was the output of 'stty -g < /dev/cua0'
# while minicom(1) had the tty open, a 'cheat' to get the right flags ;)
# You can do the same if these numbers don't work for you.
#
$stty = "stty ".
"1:0:80000cbf:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:".
"12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 < $tty";
# READ TTY UNTIL EXPECTED STRING, OR ABORT STRING
# Returns -1 on error.
#
sub ExpectAbort($$)
{
my $char;
my ($expect,$abort) = @_;
my $in = "";
print STDERR "--- expect($expect) abort($abort): ";
while ( 1 )
{
$char = "";
if ( sysread(TTY, $char, 1) != 1 )
{ next; }
if ( $char eq "\r" ) { $char = "[CR]"; }
if ( $char eq "\n" ) { $char = "[LF]"; }
$in .= $char;
print STDERR $char;
if ( $in =~ m/$expect/ ) { print STDERR " **OK**\n"; return(0); }
if ( $in =~ m/$abort/ ) { print STDERR " **ABORT**\n"; return(-1); }
}
}
# SEND A STRING TO THE TTY
sub Send($)
{
print STDERR "$_[0]\n";
syswrite(TTY, $_[0], length($_[0]));
# print TTY $_[0];
}
# SETUP DNS
# Only configure one resolver; using a secondary DNS
# is silly; if the primary ain't workin, secondary takes
# forever to respond, so why bother!
#
open(RES, ">/etc/resolv.conf");
print RES "nameserver $dns\n";
close(RES);
# DISABLE ANY ETHERNET
system("ifconfig eth0 down");
# DISABLE ALL SERVER STUFF
system("killall rushd xinetd portmap sshd httpd sendmail");
# OPEN
print STDERR "--- open $tty: ";
unless ( open(TTY, "+>$tty") )
{ print STDERR "ERROR: $!\n"; exit(1); }
print STDERR "OK\n";
# STTY
print STDERR "--- stty: ";
system($stty);
print STDERR "OK\n";
# MODEM INIT, DIAL
print STDERR "--- init: "; Send($init);
if ( ExpectAbort("OK", $abort) < 0 ) { exit(1); }
print STDERR "--- dial: "; Send($dial);
if ( ExpectAbort("Login: ", $abort) < 0 ) { exit(1); }
sleep(3);
print STDERR "--- login: "; Send($login);
if ( ExpectAbort("Password: ", $abort) < 0 ) { exit(1); }
sleep(3);
print STDERR "--- Password: "; Send($pass);
if ( ExpectAbort("PPP", "Invalid login") < 0 ) { exit(1); }
system("pppd lock modem crtscts defaultroute $tty $baud");
sleep(3);
close(TTY);
print STDERR "\n--- Use 'killall pppd' to hang up. ".
"Tailing /var/log/messages:\n";
exec("tail -f /var/log/messages");