add AMsg handler
authorminima <minima>
Thu, 26 Aug 2004 16:10:46 +0000 (16:10 +0000)
committerminima <minima>
Thu, 26 Aug 2004 16:10:46 +0000 (16:10 +0000)
perl/AMsg.pm [new file with mode: 0644]
perl/cluster.pl

diff --git a/perl/AMsg.pm b/perl/AMsg.pm
new file mode 100644 (file)
index 0000000..26ad126
--- /dev/null
@@ -0,0 +1,157 @@
+#
+# This class implements the new style comms for Aranea
+# communications for Msg.pm
+#
+# $Id$
+#
+# Copyright (c) 2001 - Dirk Koopman G1TLH
+#
+
+package AMsg;
+
+use strict;
+use Msg;
+use DXVars;
+use DXUtil;
+use DXDebug;
+use IO::File;
+use IO::Socket;
+use IPC::Open3;
+
+use vars qw($VERSION $BRANCH);
+$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/  || (0,0));
+$main::build += $VERSION;
+$main::branch += $BRANCH;
+
+use vars qw(@ISA $deftimeout);
+
+@ISA = qw(Msg);
+$deftimeout = 60;
+
+sub enqueue
+{
+       my ($conn, $msg) = @_;
+       unless ($msg =~ /^[ABZ]/) {
+               if ($msg =~ /^E[-\w]+\|([01])/ && $conn->{csort} eq 'telnet') {
+                       $conn->{echo} = $1;
+                       if ($1) {
+#                              $conn->send_raw("\xFF\xFC\x01");
+                       } else {
+#                              $conn->send_raw("\xFF\xFB\x01");
+                       }
+               } else {
+                       $msg =~ s/^[-\w]+\|//;
+                       push (@{$conn->{outqueue}}, $msg . $conn->{lineend});
+               }
+       }
+}
+
+sub send_raw
+{
+       my ($conn, $msg) = @_;
+    my $sock = $conn->{sock};
+    return unless defined($sock);
+       push (@{$conn->{outqueue}}, $msg);
+       dbg("connect $conn->{cnum}: $msg") if $conn->{state} ne 'C' && isdbg('connect');
+    Msg::set_event_handler ($sock, "write" => sub {$conn->_send(0)});
+}
+
+sub echo
+{
+       my $conn = shift;
+       $conn->{echo} = shift;
+}
+
+sub dequeue
+{
+       my $conn = shift;
+       my $msg;
+
+       if ($conn->{csort} eq 'ax25' && exists $conn->{msg}) {
+               $conn->{msg} =~ s/\cM/\cJ/g;
+       }
+       if ($conn->{state} eq 'WC') {
+               if (exists $conn->{cmd}) {
+                       if (@{$conn->{cmd}}) {
+                               dbg("connect $conn->{cnum}: $conn->{msg}") if isdbg('connect');
+                               $conn->_docmd($conn->{msg});
+                       } 
+               }
+               if ($conn->{state} eq 'WC' && exists $conn->{cmd} && @{$conn->{cmd}} == 0) {
+                       $conn->to_connected($conn->{call}, 'O', $conn->{csort});
+               }
+       } elsif ($conn->{msg} =~ /\cJ/) {
+               my @lines =  $conn->{msg} =~ /([^\cM\cJ]*)\cM?\cJ/g;
+               if ($conn->{msg} =~ /\cJ$/) {
+                       delete $conn->{msg};
+               } else {
+                       $conn->{msg} =~ s/([^\cM\cJ]*)\cM?\cJ//g;
+               }
+               while (defined ($msg = shift @lines)) {
+                       dbg("connect $conn->{cnum}: $msg") if $conn->{state} ne 'C' && isdbg('connect');
+               
+                       $msg =~ s/\xff\xfa.*\xff\xf0|\xff[\xf0-\xfe].//g; # remove telnet options
+#                      $msg =~ s/[\x00-\x08\x0a-\x19\x1b-\x1f\x80-\x9f]/./g;         # immutable CSI sequence + control characters
+                       
+                       if ($conn->{state} eq 'C') {
+                               &{$conn->{rproc}}($conn, "I$conn->{call}|$msg");
+                       } elsif ($conn->{state} eq 'WL' ) {
+                               $msg = uc $msg;
+                               if (is_callsign($msg) && $msg !~ m|/| ) {
+                                       my $sort = $conn->{csort};
+                                       $sort = 'local' if $conn->{peerhost} eq "127.0.0.1";
+                                       my $uref;
+                                       if ($main::passwdreq || ($uref = DXUser->get_current($msg)) && $uref->passwd ) {
+                                               $conn->conns($msg);
+                                               $conn->{state} = 'WP';
+                                               $conn->{decho} = $conn->{echo};
+                                               $conn->{echo} = 0;
+                                               $conn->send_raw('password: ');
+                                       } else {
+                                               $conn->to_connected($msg, 'A', $sort);
+                                       }
+                               } else {
+                                       $conn->send_now("Sorry $msg is an invalid callsign");
+                                       $conn->disconnect;
+                               }
+                       } elsif ($conn->{state} eq 'WP' ) {
+                               my $uref = DXUser->get_current($conn->{call});
+                               $msg =~ s/[\r\n]+$//;
+                               if ($uref && $msg eq $uref->passwd) {
+                                       my $sort = $conn->{csort};
+                                       $conn->{echo} = $conn->{decho};
+                                       delete $conn->{decho};
+                                       $sort = 'local' if $conn->{peerhost} eq "127.0.0.1";
+                                       $conn->{usedpasswd} = 1;
+                                       $conn->to_connected($conn->{call}, 'A', $sort);
+                               } else {
+                                       $conn->send_now("Sorry");
+                                       $conn->disconnect;
+                               }
+                       } elsif ($conn->{state} eq 'WC') {
+                               if (exists $conn->{cmd} && @{$conn->{cmd}}) {
+                                       $conn->_docmd($msg);
+                                       if ($conn->{state} eq 'WC' && exists $conn->{cmd} &&  @{$conn->{cmd}} == 0) {
+                                               $conn->to_connected($conn->{call}, 'O', $conn->{csort});
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+sub to_connected
+{
+       my ($conn, $call, $dir, $sort) = @_;
+       $conn->{state} = 'C';
+       $conn->conns($call);
+       delete $conn->{cmd};
+       $conn->{timeout}->del if $conn->{timeout};
+       delete $conn->{timeout};
+       $conn->nolinger;
+       &{$conn->{rproc}}($conn, "$dir$call|$sort");
+       $conn->_send_file("$main::data/connected") unless $conn->{outgoing};
+}
+
+
index 8ce857a7abdc2a3a27b7da48a30a0227cc765d8a..2449495b70821cfda795152abedb33930dc5a814 100755 (executable)
@@ -101,6 +101,7 @@ use UDPMsg;
 use QSL;
 use Thingy;
 use RouteDB;
+use AMsg;
 
 use Data::Dumper;
 use IO::File;
@@ -128,7 +129,7 @@ $reqreg = 0;                                        # 1 = registration required, 2 = deregister people
 use vars qw($VERSION $BRANCH $build $branch);
 $VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
 $BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/  || (0,0));
-$main::build += 3;                             # add an offset to make it bigger than last system
+$main::build += 2;                             # add an offset to make it bigger than last system
 $main::build += $VERSION;
 $main::branch += $BRANCH;
 
@@ -432,14 +433,16 @@ DXUser->init($userfn, 1);
 # start listening for incoming messages/connects
 dbg("starting listeners ...");
 my $conn = IntMsg->new_server($clusteraddr, $clusterport, \&login);
-$conn->conns("Server $clusteraddr/$clusterport");
+$conn->conns("Server $clusteraddr/$clusterport using IntMsg");
 push @listeners, $conn;
-dbg("Internal port: $clusteraddr $clusterport");
+dbg("Internal port: $clusteraddr $clusterport using IntMsg");
 foreach my $l (@main::listen) {
-       $conn = ExtMsg->new_server($l->[0], $l->[1], \&login);
-       $conn->conns("Server $l->[0]/$l->[1]");
+       no strict 'refs';
+       my $pkg = $l->[2] || 'ExtMsg';
+       $conn = $pkg->new_server($l->[0], $l->[1], \&login);
+       $conn->conns("Server $l->[0]/$l->[1] using $pkg");
        push @listeners, $conn;
-       dbg("External Port: $l->[0] $l->[1]");
+       dbg("External Port: $l->[0] $l->[1] using $pkg");
 }
 
 dbg("AGW Listener") if $AGWMsg::enable;