removed client.pl
authorminima <minima>
Tue, 13 Mar 2001 21:57:48 +0000 (21:57 +0000)
committerminima <minima>
Tue, 13 Mar 2001 21:57:48 +0000 (21:57 +0000)
Changes
perl/client.pl [deleted file]

diff --git a/Changes b/Changes
index e657a56910025357b2f94f9264d83a4f66c2c8e4..21e2e2c289e4b73b9881182ebe826bcf1bd005dd 100644 (file)
--- a/Changes
+++ b/Changes
@@ -3,6 +3,7 @@
 2. removed memory leakage in connects
 3. add link IP address if available on who
 4. made the \r\n work correctly
 2. removed memory leakage in connects
 3. add link IP address if available on who
 4. made the \r\n work correctly
+5. removed client.pl
 10Mar01=======================================================================
 1. minor changes to the admin manual to reflect differences in distibutions
 thanks to pa3ezl (g0vgs)
 10Mar01=======================================================================
 1. minor changes to the admin manual to reflect differences in distibutions
 thanks to pa3ezl (g0vgs)
diff --git a/perl/client.pl b/perl/client.pl
deleted file mode 100755 (executable)
index f159ee7..0000000
+++ /dev/null
@@ -1,559 +0,0 @@
-#!/usr/bin/perl -w
-#
-# A thing that implements dxcluster 'protocol'
-#
-# This is a perl module/program that sits on the end of a dxcluster
-# 'protocol' connection and deals with anything that might come along.
-#
-# this program is called by ax25d or inetd and gets raw ax25 text on its input
-# It can also be launched into the ether by the cluster program itself for outgoing
-# connections
-#
-# Calling syntax is:-
-#
-# client.pl [callsign] [telnet|ax25|local] [[connect] [program name and args ...]]
-#
-# if the callsign isn't given then the sysop callsign in DXVars.pm is assumed
-#
-# if there is no connection type then 'local' is assumed
-#
-# if there is a 'connect' keyword then it will try to launch the following program
-# and any arguments and connect the stdin & stdout of both the program and the 
-# client together.
-#
-# Copyright (c) 1998 Dirk Koopman G1TLH
-#
-# $Id$
-# 
-
-require 5.004;
-
-# search local then perl directories
-BEGIN {
-       # root of directory tree for this system
-       $root = "/spider"; 
-       $root = $ENV{'DXSPIDER_ROOT'} if $ENV{'DXSPIDER_ROOT'};
-       
-       unshift @INC, "$root/perl";     # this IS the right way round!
-       unshift @INC, "$root/local";
-}
-
-use Msg;
-use IntMsg;
-use DXVars;
-use DXDebug;
-use DXUtil;
-use Net::Telnet qw(TELOPT_ECHO TELOPT_BINARY);
-use IO::File;
-use IO::Socket;
-use IPC::Open2;
-
-# cease communications
-sub cease
-{
-       my $sendz = shift;
-#      if ($conn && $sendz) {
-#              $conn->send_now("Z$call|bye...");
-#              sleep(1);
-#      }
-       $stdout->flush if $stdout;
-       if ($pid) {
-               dbg('connect', "killing $pid");
-               kill(9, $pid);
-       }
-       dbgclose();
-#      $SIG{__WARN__} = sub {my $a = shift; cluck($a); };
-       sleep(1);
-
-       # do we need this ?
-       $conn->disconnect if $conn;
-       exit(0);        
-}
-
-# terminate program from signal
-sub sig_term
-{
-       cease(1);
-}
-
-# terminate a child
-sub sig_chld
-{
-       unless ($^O =~ /^MS/i) {
-               $SIG{CHLD} = \&sig_chld;
-               $waitedpid = wait;
-               dbg('connect', "caught $waitedpid");
-       }
-}
-
-
-sub setmode
-{
-       if ($mode == 1) {
-               $mynl = "\r";
-               $out_lineend = "\r";
-       } else {
-               $mynl = "\n";
-               $out_lineend = "\r\n";
-       }
-       $/ = $mynl;
-       $out_lineend = $mynl;
-}
-
-# handle incoming messages
-sub rec_socket
-{
-       my ($con, $msg, $err) = @_;
-       if (defined $err && $err) {
-               cease(0);
-       }
-       if (defined $msg) {
-               my ($sort, $call, $line) = $msg =~ /^(\w)([^\|]+)\|(.*)$/;
-               
-               if ($sort eq 'D') {
-                       my $snl = $mynl;
-                       my $newsavenl = "";
-                       $snl = "" if $mode == 0;
-                       $snl = "\r\n" if $mode == 3;
-                       $snl = "\n" if $mode == 2;
-                       if ($mode == 2 && $line =~ />$/) {
-                               $newsavenl = $snl;
-                               $snl = ' ';
-                       }
-                       $line =~ s/\n/\r/og if $mode == 1;
-                       #my $p = qq($line$snl);
-                       if ($buffered) {
-                               if (length $outqueue >= $client_buffer_lth) {
-                                       print $stdout $outqueue;
-                                       pop @echo while (@echo > $maxecho);
-                                       push @echo, $outqueue;
-                                       $outqueue = "";
-                               }
-                               $outqueue .= "$savenl$line$snl";
-                               $lasttime = time;
-                       } else {
-                               print $stdout $savenl, $line, $snl;;
-                       }
-                       $savenl = $newsavenl;
-               } elsif ($sort eq 'M') {
-                       $mode = $line;          # set new mode from cluster
-                       setmode();
-               } elsif ($sort eq 'E') {
-                       if ($sort eq 'telnet') {
-                               $mode = $line;          # set echo mode from cluster
-                               my $term = POSIX::Termios->new;
-                               $term->getattr(fileno($sock));
-                               $term->setiflag( 0 );
-                               $term->setoflag( 0 );
-                               $term->setattr(fileno($sock), &POSIX::TCSANOW );
-                       }
-               } elsif ($sort eq 'I') {
-                       ;                       # ignore echoed I frames
-               } elsif ($sort eq 'B') {
-                       if ($buffered && $outqueue) {
-                               print $stdout $outqueue;
-                               pop @echo while(@echo > $maxecho);
-                               push @echo, $outqueue;
-                               $outqueue = "";
-                       }
-                       $buffered = $line;      # set buffered or unbuffered
-               } elsif ($sort eq 'Z') { # end, disconnect, go, away .....
-                       cease(0);
-               } 
-
-               # ******************************************************
-               # ******************************************************
-               # any other sorts that might happen are silently ignored.
-               # ******************************************************
-               # ******************************************************
-       } else {
-               cease(0);
-       }
-       $lasttime = time; 
-}
-
-sub rec_stdin
-{
-       my ($fh) = @_;
-       my $buf;
-       my @lines;
-       my $r;
-       my $first;
-       my $dangle = 0;
-       
-       $r = sysread($fh, $buf, 1024);
-       #  my $prbuf;
-       #  $prbuf = $buf;
-       #  $prbuf =~ s/\r/\\r/;
-       #  $prbuf =~ s/\n/\\n/;
-       #  print "sys: $r ($prbuf)\n";
-       if (!defined $r || $r == 0) {
-               cease(1);
-       } elsif ($r > 0) {
-               if ($mode) {
-                       $buf =~ s/\r/\n/g if $mode == 1;
-                       $buf =~ s/[\r\x00]//g if $mode == 2 || $mode == 3;
-                       
-                       $dangle = !($buf =~ /\n$/);
-                       if ($buf eq "\n") {
-                               @lines = (" ");
-                       } else {
-                               @lines = split /\n/, $buf;
-                       }
-                       if ($dangle) {          # pull off any dangly bits
-                               $buf = pop @lines;
-                       } else {
-                               $buf = "";
-                       }
-                       $first = shift @lines;
-                       unshift @lines, ($lastbit . $first) if ($first);
-                       foreach $first (@lines) {
-                               #                 print "send_now $call $first\n";
-                               next if grep {$_ eq $first } @echo;
-                               $conn->send_later("I$call|$first");
-                       }
-                       $lastbit = $buf;
-                       $savenl = "";           # reset savenl 'cos we will have done a newline on input
-               } else {
-                       $conn->send_later("I$call|$buf");
-               }
-       } 
-       $lasttime = time;
-}
-
-sub optioncb
-{
-}
-
-sub doconnect
-{
-       my ($sort, $line) = @_;
-       dbg('connect', "CONNECT sort: $sort command: $line");
-       if ($sort eq 'telnet') {
-               # this is a straight network connect
-               my ($host, $port) = split /\s+/, $line;
-               $port = 23 if !$port;
-               
-               $sock = new Net::Telnet (Timeout => $timeout, Port => $port);
-               $sock->option_callback(\&optioncb);
-               $sock->output_record_separator('');
-               $sock->option_accept(Dont => TELOPT_ECHO, Wont => TELOPT_ECHO);
-               $sock->open($host) or die "Can't connect to $host port $port $!";
-               if ($port == 23) {
-                       $sock->telnetmode(1);
-                       $sock->option_send(Dont => TELOPT_ECHO, Wont => TELOPT_ECHO) if $port == 23;
-               } else {
-                       $sock->telnetmode(0);
-               }
-               $sock->binmode(0);
-               $mode = 3;
-       } elsif ($sort eq 'ax25' || $sort eq 'prog') {
-               my @args = split /\s+/, $line;
-               $rfh = new IO::File;
-               $wfh = new IO::File;
-               $pid = open2($rfh, $wfh, "$line") or die "can't do $line $!";
-               die "no receive channel $!" unless $rfh;
-               die "no transmit channel $!" unless $wfh;
-               dbg('connect', "got pid $pid");
-               $wfh->autoflush(1);
-               $mode = 1;
-       } else {
-               die "invalid type of connection ($sort)";
-       }
-       $csort = $sort;
-}
-
-sub doabort
-{
-       my $string = shift;
-       dbg('connect', "abort $string");
-       $abort = $string;
-}
-
-sub dotimeout
-{
-       my $val = shift;
-       dbg('connect', "timeout set to $val");
-       $timeout = $val;
-}
-
-sub dolineend
-{
-       my $val = shift;
-       $out_lineend = $val;
-       $out_lineend =~ s/\\r/\r/g;
-       $out_lineend =~ s/\\n/\n/g;
-       dbg('connect', "lineend set to $val ");
-       $out_lineend = $mynl unless $out_lineend;
-}
-
-sub dochat
-{
-       my ($expect, $send) = @_;
-       dbg('connect', "CHAT \"$expect\" -> \"$send\"");
-    my $line;
-       
-       alarm($timeout);
-       
-    if ($expect) {
-               for (;;) {
-                       if ($csort eq 'telnet') {
-                               $line = $sock->get();
-                               cease(11) unless $line;          # the socket has gone away?
-                               if (length $line == 0) {
-                                       dbg('connect', "received 0 length line, aborting...");
-                                       cease(11);
-                               }
-                               $line =~ s/\r//g;
-                               chomp;
-                       } elsif ($csort eq 'ax25' || $csort eq 'prog') {
-                               local $/ = "\r";
-                               $line = <$rfh>;
-                               if (length $line == 0) {
-                                       dbg('connect', "received 0 length line, aborting...");
-                                       cease(11);
-                               }
-                               $line =~ s/\r/\n/g;
-                               chomp;
-                       }
-                       dbg('connect', map { "received \"$_\"" } split /\n/, $line);
-                       if ($abort && $line =~ /$abort/i) {
-                               dbg('connect', "aborted on /$abort/");
-                               cease(11);
-                       }
-                       last if $line =~ /$expect/i;
-               }
-       }
-       if ($send) {
-               if ($csort eq 'telnet') {
-#                      local $\ = $out_lineend;
-                       $sock->print("$send\n");
-               } elsif ($csort eq 'ax25') {
-                       local $\ = $out_lineend;
-                       $wfh->print("$send");
-               }
-               dbg('connect', "sent \"$send\"");
-       }
-}
-
-sub timeout
-{
-       dbg('connect', "timed out after $timeout seconds");
-       cease(0);
-}
-
-# handle callsign and connection type firtling
-sub doclient
-{
-       my $line = shift;
-       my @f = split /\s+/, $line;
-       $call = uc $f[0] if $f[0];
-       $csort = $f[1] if $f[1];
-}
-
-#
-# initialisation
-#
-
-$mode = 2;                      # 1 - \n = \r as EOL, 2 - \n = \n, 0 - transparent
-$call = "";                     # the callsign being used
-$conn = 0;                      # the connection object for the cluster
-$lastbit = "";                  # the last bit of an incomplete input line
-$mynl = "\n";                   # standard terminator
-$lasttime = time;               # lasttime something happened on the interface
-$outqueue = "";                 # the output queue 
-$client_buffer_lth = 200;       # how many characters are buffered up on outqueue
-$buffered = 1;                  # buffer output
-$savenl = "";                   # an NL that has been saved from last time
-$timeout = 60;                  # default timeout for connects
-$abort = "";                    # the current abort string
-$cpath = "$root/connect";              # the basic connect directory
-$maxecho = 5;                  # length of max echo queue
-
-$pid = 0;                       # the pid of the child program
-$csort = "";                    # the connection type
-$sock = 0;                      # connection socket
-$out_lineend = $mynl;          # connection lineending (used for outgoing connects) 
-
-$stdin = *STDIN;
-$stdout = *STDOUT;
-$rfh = 0;
-$wfh = 0;
-
-$waitedpid = 0;
-
-#
-# deal with args
-#
-
-$call = uc shift @ARGV if @ARGV;
-$call = uc $myalias if !$call;
-$connsort = lc shift @ARGV if @ARGV;
-$connsort = 'local' if !$connsort;
-
-$loginreq = $call eq 'LOGIN';
-
-# we will do this again later 'cos things may have changed
-$mode = ($connsort eq 'ax25') ? 1 : 2;
-setmode();
-
-if ($call eq $mycall) {
-       print $stdout "You cannot connect as your cluster callsign ($mycall)", $nl;
-       cease(0);
-}
-
-$stdout->autoflush(1);
-
-unless ($^O =~ /^MS/i) {
-       $SIG{'INT'} = \&sig_term;
-       $SIG{'TERM'} = \&sig_term;
-       $SIG{'HUP'} = \&sig_term;
-       $SIG{'CHLD'} = \&sig_chld;
-}
-
-dbgadd('connect');
-
-# do we need to do a login and password job?
-if ($loginreq) {
-       my $user;
-       my $s;
-
-       $connsort = 'telnet' if $connsort eq 'local';
-       setmode();
-
-       if (-e "$data/issue") {
-               open(I, "$data/issue") or die;
-               local $/ = undef;
-               $issue = <I>;
-               close(I);
-               $issue = s/\n/\r/og if $mode == 1;
-               local $/ = $nl;
-               $stdout->print($issue) if $issue;
-       }
-       
-       # allow a login from an existing user. I could create a user but
-       # I want to check for valid callsigns and I don't have the 
-       # necessary info / regular expression yet
-       alarm($timeout);
-               
-       $stdout->print('login: ');
-       $stdout->flush();
-       local $\ = $mynl;
-       $s = $stdin->getline();
-       chomp $s;
-       $s =~ s/\s+//og;
-       $s =~ s/-\d+$//o;            # no ssids!
-       cease(0) unless $s && $s gt ' ';
-       unless (is_callsign($s)) {
-               $stdout->print("Sorry, $s is an invalid callsign");
-               cease(0);
-       } 
-       $call = uc $s;
-       alarm(0);
-}
-
-# is this an out going connection?
-if ($connsort eq "connect") {
-       my $mcall = lc $call;
-       
-       open(IN, "$cpath/$mcall") or cease(2);
-       @in = <IN>;
-       close IN;
-
-       alarm($timeout);
-       
-       for (@in) {
-               chomp;
-               next if /^\s*\#/o;
-               next if /^\s*$/o;
-               doconnect($1, $2) if /^\s*co\w*\s+(\w+)\s+(.*)$/io;
-               doabort($1) if /^\s*a\w*\s+(.*)/io;
-               dotimeout($1) if /^\s*t\w*\s+(\d+)/io;
-               dolineend($1) if /^\s*[Ll]\w*\s+\'((?:\\[rn])+)\'/;
-               dochat($1, $2) if /^\s*\'(.*)\'\s+\'(.*)\'/io;
-               
-               if (/^\s*cl\w+\s+(.*)/io) {
-                       doclient($1);
-                       last;
-               }
-       }
-       
-    dbg('connect', "Connected to $call ($csort), starting normal protocol");
-       dbgsub('connect');
-       
-       # if we get here we are connected
-       if ($csort eq 'ax25' || $csort eq 'prog') {
-               #               open(STDIN, "<&R"); 
-               #               open(STDOUT, ">&W"); 
-               #               close R;
-               #               close W;
-        $stdin = $rfh;
-               $stdout = $wfh;
-               $csort = 'telnet' if $csort eq 'prog';
-       } elsif ($csort eq 'telnet') {
-               #               open(STDIN, "<&$sock"); 
-               #               open(STDOUT, ">&$sock"); 
-               #               close $sock;
-               $stdin = $sock;
-               $stdout = $sock;
-       }
-    alarm(0);
-    $outbound = 1;
-       $connsort = $csort;
-       $stdout->autoflush(1);
-       $mode = ($connsort eq 'ax25') ? 1 : $mode;
-       close STDIN;
-       close STDOUT;
-       close STDERR;
-}
-
-setmode();
-
-# adjust the callsign if it has an SSID, SSID <= 8 are legal > 8 are netrom connections
-$call =~ s/-0$//;     # strip off -0 as this is equiv to just call on its own
-my ($scall, $ssid) = split /-/, $call;
-$ssid = undef unless $ssid && $ssid =~ /^\d+$/;  
-if ($ssid) {
-       $ssid = 15 if $ssid > 15;
-       if ($connsort eq 'ax25') {
-               if ($ssid > 8) {
-                       $ssid = 15 - $ssid;
-               }
-       }
-       $call = "$scall-$ssid";
-}
-
-
-$conn = IntMsg->connect("$clusteraddr", $clusterport, \&rec_socket);
-if (! $conn) {
-       if (-r "$data/offline") {
-               open IN, "$data/offline" or die;
-               while (<IN>) {
-                       s/\n/\r/og if $mode == 1;
-                       print $stdout $_;
-               }
-               close IN;
-       } else {
-               print $stdout "Sorry, the cluster $mycall is currently off-line", $mynl;
-       }
-       cease(0);
-}
-
-$let = $outbound ? 'O' : 'A';
-$conn->send_now("$let$call|$connsort");
-Msg->set_event_handler($stdin, "read" => \&rec_stdin);
-
-for (;;) {
-       my $t;
-       Msg->event_loop(1, 0.1);
-       $t = time;
-       if ($t > $lasttime) {
-               if ($outqueue) {
-                       print $stdout $outqueue;
-                       $outqueue = "";
-               }
-               $lasttime = $t;
-       }
-}
-
-exit(0);