# In article <joe-1603990908310001@dt093nc2.san.rr.com> , joe@artlung.com (Joe
# Crawford) wrote:
#
# > Just signed up with RoadRunner here ... and I was wondering how people set
# > up their Macs to "automatically" login to RoadRunner - the login app won't
# > take applescript recorded events, unfortunately - so I have to manually
# > type the password.
#
# I use this Perl script, saved as a MacPerl droplet, in the Startup Items
# folder. It just logs in and quits. There's no keepalive or logout support.
#
# (Well, I think there was support to send the keepalive packets every so
# often and logout if you press Command-period, but I changed it so it just
# quits instead of leaving MacPerl sucking up CPU time waiting for the next
# opportunity to send a keepalive packet.)
#
# Copy this into a new MacPerl document, change the login and password, save
# it as a Droplet, and you should be off & running.
#
# If you don't already have MacPerl you can get the latest version from
# ftp://sunsite.cnlab-switch.ch/software/platform/macos/perl/Mac_Perl_520r4_appl.bin
#!/export/home/local/bin/perl
####
# My login and password
# You should hard-code 'em here for quick access
# if ya like... If these have values you won't be prompted for 'em.
####
$login = "MyLogin";
$password = "MyPass";
###
# My AUTHHOST and PROXYHOST for PB/MB area
# Yours are different!!
###
$authhost = "tas.san.rr.com";
$proxyhost = "204.210.0.21";
$proxyport = 8080;
#####
# Perl 5 RoadRunner UNIX login code
# By Mark Trostler adapted from Phil Karn's C code
# 4/2/97
#
# Revised 8/13/97 to send non-outdating commands ('Linux')
# And got rid of keepalives...
#
# Command line options:
# -v = Verbose mode - Highly Recommended!
# -p <Proxy Host IP address>
# -t <timeout value> - Just leave it at 30 seconds which is
# the default
# -h <Login Host IP address>
# -l = Logout First - always a good idea!
#
# Once you know these numbers I would hard-code them so you
# don't need to type any command line options...
# Check out lines 82 and 83.
#
# You will be prompted for your login and password - which I'd
# also hard code on lines 121 & 122.
#
# Enjoy!
####
###
# Maybe this isn't necessary - but ya need 5.0 at least for sure...
###
require 5.003;
###
# Get all the good Socket stuff
###
use Socket;
use MacPerl;
###
# For command line
###
use Getopt::Std;
###
# Get some cool FileHandle methods
# autoflush being the best...
# Better than stupid $|...
###
use FileHandle;
###
# Unbuffer STDOUT
###
STDOUT->autoflush(1);
###
# Send logout message
# (Also use as a signal handler to logout via Ctrl-C)
###
sub logout {
my($signal) = @_;
if ($myip)
{
$wbuffer = sprintf("00,01,0000,00000038,%-16s,",$myip);
print "Sending UDP logout message: $wbuffer\n" if ($DEBUG);
&send_off(\*UDP_S,$wbuffer);
sleep 3;
}
if ($signal)
{
print "Caught Ctrl-C: Logged Out at ".scalar(localtime)."\n";
exit;
}
}
##
# Catch Ctrl-C
##
$SIG{'INT'} = \&logout;
###
# Time between sending keepalives
###
$timeout = 32768;
####
# TCP we gotta connect to
####
$TCPPORT = 7283;
###
# UDP Port for keepalives on remote machine
###
$UDPPORT = 6284;
###
# Local port for UDP keepalives
###
$L_UDPPORT = 6285;
###
# Let's pretend we're Windows...
###
$os = "WIN-95";
$exec = "rrie95.exe";
$version = "1.0.0.1";
###
# Parse command line arguments
###
getopts('t:h:vp:l');
$DEBUG = 1; # if ($opt_v);
$proxyhost = $opt_p if ($opt_p);
$timeout = $opt_t if ($opt_t);
$authhost = $opt_h if ($opt_h);
if (!$login)
{
print "What's your login: ";
$login = <STDIN>;
chomp $login;
}
if (!$password)
{
print "What's your password: ";
$password = <STDIN>;
chomp $password;
}
####
# Resolve authhost - which shouldn't be too difficult
# 'cuz it's already an IP address!!
###
if (!($hp = gethostbyname($authhost)))
{
###
# If ya see this there's real problems
# because $authhost is already an IP address!!
###
die "Couldn't resolve $authhost!";
}
print "Authhost = $authhost is ".inet_ntoa($hp)."\n" if ($DEBUG);
RETRY: {
####
# Now create TCP socket to authhost
###
if (!socket(TCP_S,PF_INET,SOCK_STREAM,getprotobyname('tcp')))
{
die "Couldn't create TCP socket!";
}
###
# And unbuffer that bad-boy
###
TCP_S->autoflush(1);
###
# Create the 'sockaddr_in' structures for 'connect'
# for both the TCP and UDP connexion
###
$p_server = sockaddr_in($TCPPORT,$hp); # $hp is resolved $authhost
$u_server = sockaddr_in($UDPPORT,$hp); # which is just $authhost!
print "Going to connect...\n" if ($DEBUG);
if (!connect(TCP_S,$p_server))
{
die "$!: Couldn't connect to authhost!";
}
print "TCP connexion to $authhost established!\n" if ($DEBUG);
###
# Figure out who the heck I am
# If ya used DHCP this got assigned automagically
# Else it's just hard-coded by 'ifconfig'
###
$p_local = getsockname(TCP_S);
($l_port, $iaddr) = unpack_sockaddr_in($p_local);
$myip = inet_ntoa($iaddr);
print "My IP address is $myip\n" if ($DEBUG);
###
# Now make a UDP socket for the keepalives
###
if (!socket(UDP_S,PF_INET,SOCK_DGRAM,getprotobyname('udp')))
{
die "Couldn't make UDP socket!";
}
###
# And unbuffer that bad boy
###
UDP_S->autoflush(1);
###
# First bind to the local port
###
my $local_UDP_port = sockaddr_in($L_UDPPORT,INADDR_ANY);
if (!bind(UDP_S,$local_UDP_port))
{
die "Couldn't bind to local UDP port $L_UDPPORT!";
}
###
# Now connect to remote UDP_S port on $authhost
###
if (!connect(UDP_S,$u_server))
{
die "Couldn't make a UDP connexion to Server!";
}
print "UDP Connexion made to $authhost for keepalives!\n" if ($DEBUG);
###
# If we need to logoff first...
###
&logout if ($opt_l);
###
# Now for the interesting stuff
# Send TCP login sequence
###
print "Sending TCP login sequence\n" if ($DEBUG);
$wbuffer =
sprintf("01,01,0000,00000065,%-8s,%-8s,%-16s,%-8s,",$login,$password,$myip,$os);
&send_off(\*TCP_S,$wbuffer);
###
# Suck in everything...
###
&suck_in(\*TCP_S);
###
# Make sure we got a valid response back
# $in_buffer is a global variable that
# 'suck_in' fills...
# If this first response doesn't contain your login
# name then something went wrong...
###
if ($in_buffer !~ /$login/)
{
print "Couldn't connect OR bad Username/Password\n";
print "Try again!\n";
exit;
}
###
# Send next string
###
#$wbuffer = sprintf("02,03,0000,00000075,%-8s,1,%-32s,%-8s,",$os,$exec,$version);
#$wbuffer = sprintf("02,03,0000,00000201,WIN-95 ,4 ,rrie95.exe
,1.0.0.2 ,login.new ,1.2.0.0 ,readme.txt
,1.2.0.0 ,modini.exe ,1.0.0.1 ,");
#$wbuffer = sprintf("02,03,0000,00000201,WIN-95 ,4 ,modini.exe
,1.0.0.2 ,rrie95.exe ,1.0.0.2 ,readme.txt
,1.2.0.0 ,login.new ,1.2.0.0 ,");
$wbuffer = sprintf("02,03,0000,00000201,WIN-95 ,4 ,modini.exe
,1.0.0.3 ,rrie95.exe ,1.0.0.2 ,readme.txt
,1.3.0.0 ,login.new ,1.3.0.0 ,");
$wbuffer = sprintf("02,03,0000,00000075,Linux ,0 ,");
&send_off(\*TCP_S,$wbuffer);
###
# Suck in everything...
###
&suck_in(\*TCP_S);
####
# Send last string
####
$wbuffer = sprintf("03,02,0000,00000021,");
&send_off(\*TCP_S,$wbuffer);
###
# Suck in everything...
###
&suck_in(\*TCP_S);
###
# Done w/TCP...
###
close(TCP_S);
print "You are connected!\n\n";
MacPerl::Quit(3);
} #End RETRY
###
# Ship off string to a handle...
###
sub send_off {
my($fh,$string) = @_;
print "tx: $string\n" if ($DEBUG);
$string .= "\0"; #NULL terminate that bad boy
if (length($string) != syswrite($fh,$string,length($string)))
{
die "This is Bad: $!\n";
}
}
###
# Read in up to 256 bytes from a handle...
###
sub suck_in {
my($fh,$bytes) = @_;
$bytes = sysread($fh,$in_buffer,256);
print "rx: $in_buffer\n" if ($DEBUG);
}