in reply to Can Perl dialup?
#!/usr/bin/perl # Rename this file to ppp.pl $number = "9999999"; #the phone number to dial $username = "USER"; #the username to send (not required) $password = "USER"; #the password (not required) $init = "AT&F\r"; #the init string for the modem $nameprompt = "sername:"; #the string searching for the username + prompt $passprompt = "assword:"; #the string searching for the password + prompt $pppprompt = ">"; #the prompt for the ppp command $pppon = "ppp\r"; #the command to send to the dialup for ppp $redials = 3; #number of times to redial if busy $debug = 0; #set to 1 to see lots of info $tries = 3; #number of tries to reinitialize the modem $sleeptime = 3; #amount of time to wait for responses $dials=0; $looper=0; while($looper == 0) { print "Initializing Modem\n"; &ModemSetup; #run the ModemSetup subroutine print "Dialing $number\n"; &Dial; #run the Dial subroutine print "Connecting...\n"; $looper=&Loop; #store the return value of Loop sleep $sleeptime; #sleep to make sure that ppp } #has started on remote end print "Starting PPPD\n"; #start up ppp locally system "/usr/sbin/pppd debug lock modem crtscts /dev/modem 115200 noip +default defaultroute"; #This subroutine reads from the modmem 1 character at a time and appen +ds #it to a string. The string is then parsed to see if it matches one of + the #categories below. When the program has sent the string to start ppp +on #the remote computer it returns 1, if it doesn't get through everythin +g, and #it reads NO CARRIER from the modem, then it returns 0. sub Loop { $loop=0; $in=""; #initialize our variables, to get rid $in2=""; #begin our super while loop, while it can read from modem, it goes while(sysread(MODEM, $in2, 1)) { if(($in2 eq "\n") or ($in2 eq "\r")) { $in=""; } $in=$in.$in2; if($debug == 1) { print "$in"; #prints out everything read from modem $loop++; } #busy or no carrier errors, return 0, so we can redial. if(($in =~ /BUSY/) or ($in =~ /CARRIER/)) { $dials++; sleep $sleeptime; print "Error : $in\n"; sleep $sleeptime; return 0; } #hey we're connected if( $in =~ /CONNECT (\d*)/) { $speeds=$1; } #run the username stuff, if username is set to USER, then get user to #input it. if( $in =~ /$nameprompt/) { $resetu=0; #if we get hung up on we need to reset if($username eq "USER")#the username. { print "Please enter your Username: "; $username=<STDIN>; chomp $username; #gets rid of newline char $resetu=1; } print "\nSending $username...\n"; $username=$username."\r"; syswrite(MODEM, $username, length($username)); $in=""; if($resetu==1) { $username="USER"; } } #password stuff, not very good yet if(($in =~ /$passprompt/)) { $reset=0; if($password eq "USER") { print "Please enter your Password: "; system "stty -echo"; $password=<STDIN>; chomp $password; system "stty echo"; print "\n"; $reset=1; } $passwords=$password."\r"; print "Sending Password...\n"; syswrite(MODEM, $passwords, length($passwords)); $in=""; if($reset == 1) { $password="USER"; } } #launch the ppp on the remote end, then get out of this damn while loo +p if( $in =~ /$pppprompt/) { print "Sending $pppon\n"; syswrite(MODEM, $pppon, length($pppon)); last; } } print "Connected at $speeds\n"; return 1; } #set up modem, run all the initialization we need. sub ModemSetup { if (-f "/var/lock/LCK..modem") #this checks to see if the mode +m is { #locked, if it is exit. print "Hey the modem is locked!\n"; open LOCKFILE, "</var/lock/LCK..modem"; $pid=<LOCKFILE>; $running = system "ps h $pid"; if($running ne "No processes available.") { print "running is $running\n"; print "Hey there is something still using the modem\n"; exit; } print "There doesn't seem to be anything really using the mode +m\n"; print "Should we rm -f the file, and try anyway?\n"; $answer=<STDIN>; if($answer =~ /y/i) { system "rm -f /var/lock/LCK..modem"; } else { exit; } } $in = ""; #gets rid of the warning open MODEM, "+>/dev/modem"; #opens the modem system "setserial /dev/modem spd_vhi"; #runs setserial, set spe +ed to 115200 syswrite(MODEM, $init, length($init)); #sends the init sleep 5; sysread(MODEM, $in, 10); #reads the results of init #if not okay, then retry for a few times $n=0; while($in =~ /NO/) { print "Something Is Wrong\n"; sleep $sleeptime; $n++; print "Error $in\n"; syswrite(MODEM, $init, length($init)); if($n > $tries) { exit; } sysread(MODEM, $in, 10); } } #this is the subroutine that actually sends the dialing string to the +modem. sub Dial { $dials++; if($dials > $redials) { print "Failed after $dials redials\n"; exit; } print "Dial attempt #$dials\n"; $numberw = "ATDT $number\r\n"; #set up dialing string. syswrite(MODEM, $numberw, length($numberw)); #dial }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
RE: Re: Can Perl dialup?
by Anonymous Monk on Oct 21, 2000 at 23:02 UTC | |
by BastardOperator (Monk) on Oct 22, 2000 at 23:18 UTC |