[Date Prev] [Date Index] [Date Next] [Thread Prev] [Thread Index] [Thread Next]
Christopher Fowler cfowler@outpostsentinel.com
Fri, 25 Apr 2003 13:08:58 -0700 (PDT)
It also needs WIN32 support POSIX::Termios is not supported under winbloze. Chris On Fri, 2003-04-25 at 16:03, Christopher Fowler wrote: > Don't say I don't give anything back :) > > Someone mod this to support all command line options. And clean it > up a bit. > > > > > ---- > > #!/usr/bin/perl > > > sub cpanMirrorSpeak { > my $mod = $_[0]; > die <<EOT; > You don't have $mod installed. Please install a copy from your > favourite CPAN mirror. > > perl -MCPAN -e 'install( "$mod" )' > EOT > } > > eval { require POSIX; }; > if( $@ ) { > cpanMirrorSpeak("POSIX"); > } > > eval { require IO::Socket; }; > if( $@ ) { > cpanMirrorSpeak("IO::Socket"); > } > > eval { require Getopt::Std; }; > if( $@ ) { > cpanMirrorSpeak("Getopt::Std"); > } > > eval { require IO::Select; }; > if( $@ ) { > cpanMirrorSpeak("IO::Select"); > } > > use Getopt::Std; > use POSIX; > use IO::Socket; > use IO::Select; > use strict; > > # Static variables > my $USER; > my $SERVER; > my $CONSOLE; > > > # Commands > my $CMD_LOGIN = "c;"; > > > sub console_syntax { > die "$0 [-h] -s <server> -u <user> <console>\n"; > } > > sub console_pArgs { > console_syntax() unless (getopts("s:u:h")); > console_syntax() if not $Getopt::Std::opt_s; > console_syntax() if not $Getopt::Std::opt_u; > console_syntax() if $Getopt::Std::opt_h; > console_syntax() if not @ARGV; > > $USER = $Getopt::Std::opt_u; > $SERVER = $Getopt::Std::opt_s; > $CONSOLE = $ARGV[0]; > > return; > } > > # > # Implement enough of the portcommander protocol > # to attach to the required console (or die trying), > # return the live socket. > # > sub connect_console { > > my $SERVER = $_[0]; > my $CONSOLE = $_[1]; > my $USER = $_[2]; > my $PASS = $_[3]; > # > # Create the socket to the main server > # We'll recoeve a port number then connect to secondary > # server for console data > # > my $sock = new IO::Socket::INET (PeerAddr => $SERVER, > PeerPort => 782, > Proto => 'tcp',) or > return -1; > > # We do not want buffered output to socket > $sock->autoflush(); > > ($_ = <$sock>) ; > return -1 unless /ok/ ; > > # Specify console name > print $sock "call:$CONSOLE\n"; > > # Only valid reply is a port number, > # stick that in $1. > ($_ = <$sock>); > return -1 unless /^(\d+)/ ; > > close($sock); > > > $sock = new IO::Socket::INET (PeerAddr => $SERVER, > PeerPort => $1, > Proto => 'tcp',) or > return -1; > > $sock->autoflush(); > setsockopt($sock, SOL_SOCKET, SO_KEEPALIVE, 1); > > ($_ = <$sock>) ; > return unless /ok/ ; > > # tell server we wish to log in > print $sock $CMD_LOGIN; > > # TODO: test reply. > ($_ = <$sock>) ; > > # specify user name > print $sock "$USER\n"; > ($_ = <$sock>) ; > > if (/^host:/) { > print $sock "$CONSOLE\n"; > > #TODO > #validate we are connected > #to the console > ($_ = <$sock>) ; > } > > if (/^passwd:/) { > print "Enter $USER\@$SERVER\'s password: "; > $PASS = getPassword(); > print $sock "$PASS\n"; > > ($_ = <$sock>) ; > return -1 if (/Sorry/) ; > } > > return $sock ; > } > > sub getPassword { > > \*STDOUT->flush(); > \*STDIN->autoflush(); > > my $t1 = POSIX::Termios->new; > my $t2 = POSIX::Termios->new; > $t1->getattr(); > $t2->getattr(); > > my $c_lflag = $t1->getlflag(); > $t1->setlflag($c_lflag &= ~&POSIX::ECHO); > $t1->setattr( 0, &POSIX::TCSANOW ); > > my $pass; > $pass = <STDIN>; > chomp($pass); > $t2->setattr( 0, &POSIX::TCSANOW ); > > print "\n"; > > return $pass; > } > > > # Main > # > my $cCon; > > console_pArgs(); > if(( $cCon = connect_console($SERVER, $CONSOLE, $USER, "password")) == -1) { > die "Could not connect to console!\n"; > } > > print "[Enter `^Ec?' for help]\n"; > \*STDOUT->flush(); > > > > > > > > sub cfmakeraw { > my $tty = $_[0]; > $tty->getattr(); > my $c_iflag = $tty->getiflag(); > my $c_oflag = $tty->getoflag(); > my $c_lflag = $tty->getlflag(); > my $c_cflag = $tty->getcflag(); > $tty->setiflag($c_iflag &= ~&POSIX::IGNBRK); > $tty->setiflag($c_iflag &= ~&POSIX::BRKINT); > $tty->setiflag($c_iflag &= ~&POSIX::PARMRK); > $tty->setiflag($c_iflag &= ~&POSIX::ISTRIP); > $tty->setiflag($c_iflag &= ~&POSIX::INLCR); > $tty->setiflag($c_iflag &= ~&POSIX::IGNCR); > $tty->setiflag($c_iflag &= ~&POSIX::ICRNL); > $tty->setiflag($c_iflag &= ~&POSIX::IXON); > $tty->setoflag($c_oflag &= ~&POSIX::OPOST); > $tty->setlflag($c_lflag &= ~&POSIX::ECHO); > $tty->setlflag($c_lflag &= ~&POSIX::ECHONL); > $tty->setlflag($c_lflag &= ~&POSIX::ICANON); > $tty->setlflag($c_lflag &= ~&POSIX::ISIG); > $tty->setlflag($c_lflag &= ~&POSIX::IEXTEN); > $tty->setcflag($c_cflag &= ~&POSIX::CSIZE); > $tty->setcflag($c_cflag &= ~&POSIX::PARENB); > $tty->setcflag($c_cflag | &POSIX::CS8); > } > > my $termios = POSIX::Termios->new; > my $old = POSIX::Termios->new; > $termios->getattr(); > $old->getattr(); > cfmakeraw($termios); > $termios->setattr( 0, &POSIX::TCSANOW ); > > > #cfmakeraw sets the terminal attributes as follows: > #termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP > #|INLCR|IGNCR|ICRNL|IXON); > #termios_p->c_oflag &= ~OPOST; > #termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); > #termios_p->c_cflag &= ~(CSIZE|PARENB); > #termios_p->c_cflag |= CS8; > > > my $fdset = new IO::Select; > my $wfdset = new IO::Select; > my $r_ready; > my $w_ready; > my $error; > my $timeout = 30; > my $err; > > $fdset->add($cCon); > $fdset->add(\*STDIN); > > while (1) { > > SELECT: > > ($r_ready, $w_ready, $error) = > IO::Select->select($fdset, $wfdset, $err, $timeout); > > # If nothing has occured, we have timedout > if($r_ready eq "") { > goto SELECT; > } > > foreach my $ready (@$r_ready) { > my $data; > > if($ready == \*STDIN) { > sysread($ready, $data, 1); > print $cCon $data; > } > > if($ready == $cCon) { > if(sysread($ready, $data, 1) == 0) { > $old->setattr( 1, &POSIX::TCSANOW ); > exit(0); > } > print $data; > \*STDOUT->flush(); > } > } > } > > > ---- > > _______________________________________________ > users mailing list > users@conserver.com > https://www.conserver.com/mailman/listinfo/users