X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXCommandmode.pm;h=a9777cbf0929b2da31cc5d3b76fa30929e6e55cb;hb=ed2d469812ca5ab82baab7f8b4795660e01ef539;hp=c75f32f165a47fb80bbd0f59920dfff6be5d6937;hpb=8081646e932b160975ad061a7a2741418b099761;p=spider.git diff --git a/perl/DXCommandmode.pm b/perl/DXCommandmode.pm index c75f32f1..a9777cbf 100644 --- a/perl/DXCommandmode.pm +++ b/perl/DXCommandmode.pm @@ -13,6 +13,10 @@ package DXCommandmode; @ISA = qw(DXChannel); +use AnyEvent; +use AnyEvent::Handle; +use AnyEvent::Socket; + use POSIX qw(:math_h); use DXUtil; use DXChannel; @@ -65,7 +69,7 @@ sub new my $pkg = shift; my $call = shift; # my @rout = $main::routeroot->add_user($call, Route::here(1)); - DXProt::_add_thingy($main::routeroot, [$call, 0, 0, 1]); + DXProt::_add_thingy($main::routeroot, [$call, 0, 0, 1, undef, undef, $self->{conn}->peerhost], ); # ALWAYS output the user my $ref = Route::User::get($call); @@ -89,7 +93,7 @@ sub start my $name = $user->{name}; # log it - my $host = $self->{conn}->{peerhost}; + my $host = $self->{conn}->peerhost; $host ||= "AGW Port #$self->{conn}->{agwport}" if exists $self->{conn}->{agwport}; $host ||= "unknown"; LogDbg('DXCommand', "$call connected from $host"); @@ -133,23 +137,8 @@ sub start $self->{registered} = 1; } - - # decide which motd to send - my $motd; - unless ($self->{registered}) { - $motd = "${main::motd}_nor_$self->{lang}"; - $motd = "${main::motd}_nor" unless -e $motd; - } - $motd = "${main::motd}_$self->{lang}" unless $motd && -e $motd; - $motd = $main::motd unless $motd && -e $motd; - if ($self->conn->{csort} eq 'ax25') { - if ($motd) { - $motd = "${motd}_ax25" if -e "${motd}_ax25"; - } else { - $motd = "${main::motd}_ax25" if -e "${main::motd}_ax25"; - } - } - $self->send_file($motd) if -e $motd; + # send the relevant MOTD + $self->send_motd; # sort out privilege reduction $self->{priv} = 0 if $line =~ /^(ax|te)/ && !$self->conn->{usedpasswd}; @@ -1226,5 +1215,72 @@ sub print_find_reply my $sort = $flag == 2 ? "External" : "Local"; $self->send("$sort $target found at $node in $ms ms" ); } + +# send the most relevant motd +sub send_motd +{ + my $self = shift; + my $motd; + + unless ($self->{registered}) { + $motd = "${main::motd}_nor_$self->{lang}"; + $motd = "${main::motd}_nor" unless -e $motd; + } + $motd = "${main::motd}_$self->{lang}" unless $motd && -e $motd; + $motd = $main::motd unless $motd && -e $motd; + if ($self->conn->ax25) { + if ($motd) { + $motd = "${motd}_ax25" if -e "${motd}_ax25"; + } else { + $motd = "${main::motd}_ax25" if -e "${main::motd}_ax25"; + } + } + $self->send_file($motd) if -e $motd; +} + +sub http_get +{ + my $self = shift; + my ($host, $uri, $cb) = @_; + + # store results here + my ($response, $header, $body); + + my $handle; + $handle = AnyEvent::Handle->new( + connect => [$host => 'http'], + on_error => sub { + $cb->("HTTP/1.0 500 $!"); + $self->anyevent_del($handle); + $handle->destroy; # explicitly destroy handle + }, + on_eof => sub { + $cb->($response, $header, $body); + $self->anyevent_del($handle); + $handle->destroy; # explicitly destroy handle + } + ); + $self->anyevent_add($handle); + $handle->push_write ("GET $uri HTTP/1.0\015\012\015\012"); + + # now fetch response status line + $handle->push_read (line => sub { + my ($handle, $line) = @_; + $response = $line; + }); + + # then the headers + $handle->push_read (line => "\015\012\015\012", sub { + my ($handle, $line) = @_; + $header = $line; + }); + + # and finally handle any remaining data as body + $handle->on_read (sub { + $body .= $_[0]->rbuf; + $_[0]->rbuf = ""; + }); +} + 1; __END__