Changeset 40

Show
Ignore:
Timestamp:
11/05/08 22:10:06 (2 months ago)
Author:
jhthorsen
Message:

Cleaned up code

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • network/forward.pl

    r3 r40  
    11#!/usr/bin/perl 
    22 
    3 #=========== 
    4 # forward.pl 
    5 #=========== 
     3=head1 NAME 
     4 
     5forward.pl - forward a socket to remote server 
     6 
     7=head1 SYNOPSIS 
     8 
     9 $ forward.pl --local-port <i> --peer-addr <s> --peer-port <i> 
     10 
     11=head1 DESCRIPTION 
     12 
     13Will listen to C<--local-port>, and will forward packages to C<--peer-addr> 
     14at port C<--peer-port>. 
     15 
     16=cut 
    617 
    718use strict; 
    819use IO::Socket::INET; 
    9 use vars qw/$ENABLED @VALID_PEERS $LOCAL_PORT $PEER_ADDR $PEER_PORT/; 
     20use Getopt::Long qw/:config auto_help auto_version/; 
    1021 
    11  
    12 #== USER SETTINGS ============================================================ 
    13 $ENABLED     = 1; 
    14 $LOCAL_PORT  = shift @ARGV or usage(); 
    15 $PEER_ADDR   = shift @ARGV or usage(); 
    16 $PEER_PORT   = shift @ARGV or usage(); 
    17 @VALID_PEERS = @ARGV; 
    18 #============================================================================= 
    19  
    20 my $server = IO::Socket::INET->new( 
    21                  LocalPort => $LOCAL_PORT, 
    22                  Proto     => 'tcp', 
    23                  Listen    => 5, 
    24                  Timeout   => 5, 
    25              ) or die "Could not create socket: $!\n"; 
     22our $VERSION = 0.3; 
     23our $NAME    = q(forward.pl); 
     24our $ARG     = { 'enable' => 1, 'accept' => [] }; 
    2625$|++; 
    2726 
    28 print "Port forwarding has started:\n"; 
    29 print "From port $LOCAL_PORT to $PEER_ADDR\:$PEER_PORT\n"; 
    30 print "Valid peers: @VALID_PEERS\n"; 
     27GetOptions($ARG, qw/ 
     28    local-port=i  accept=s@ 
     29    peer-addr=s   peer-port=i 
     30    enable 
     31/); 
    3132 
    32 LISTEN: 
    33 while(1) { 
     33my @missing = grep { !defined $ARG->{$_} } qw/local-port peer-addr peer-port/; 
    3434 
    35     ### init 
    36     my $client = $server->accept or next LISTEN; 
     35if(@missing) { 
     36    warn "Missing: @missing\n"; 
     37    Getopt::Long::HelpMessage(); 
     38} 
    3739 
    38     ### debug 
    39     print "Checking peer host: " .$client->peerhost() ."... "; 
     40printf("Forward port %i to %s:%i for %s\n",  
     41    $ARG->{'local-port'}, 
     42    $ARG->{'peer-addr'}, 
     43    $ARG->{'peer-port'}, 
     44    join(", ", @{ $ARG->{'accept'} }) || 'all clients', 
     45); 
    4046 
    41     ### check peer 
    42     grep { $_ eq $client->peerhost } @VALID_PEERS or next LISTEN; 
    43     print "OK"; 
     47my $server = create_socket(); 
     48handle_connection() while(1); 
    4449 
    45     ### connect to printer 
    46     my $printer = IO::Socket::INET->new( 
    47                       PeerAddr => $PEER_ADDR, 
    48                       PeerPort => $PEER_PORT, 
    49                   ) or die "Could not connect to printer: $!\n"; 
     50sub handle_connection { 
     51    my $client = $server->accept or return; 
     52    my($peer, $buf); 
    5053 
    51     ### print 
    52     if($ENABLED) { 
    53         print $printer $_ while(<$client>); 
     54    accept_connection($client) or return; 
     55 
     56    $peer = IO::Socket::INET->new( 
     57                PeerAddr => $ARG->{'peer-addr'}, 
     58                PeerPort => $ARG->{'peer-port'}, 
     59            ) or die "Could not connect to peer port: $!\n"; 
     60 
     61    if($ARG->{'enable'}) { 
     62        print $peer $_ or last while(read $client, $buf, 1024); 
    5463    } 
    5564    else { 
    56         print "." while(<$client>); 
     65        print $buf or last while(read $client, $buf, 1024); 
    5766    } 
     67 
     68    printf "%s disconnected\n", $client->peerhost; 
    5869} 
    5970 
    60 ### THE END 
    61 exit 0; 
     71sub accept_connection { 
     72    my $client = shift; 
     73    my $host   = $client->peerhost; 
     74    my $accept = $ARG->{'accept'}; 
    6275 
     76    unless(@$accept) { 
     77        print "Connection accepted from $host\n"; 
     78        return 1; 
     79    } 
    6380 
    64 sub usage { #================================================================= 
     81    printf("Checking %s against %s...", 
     82        $host, join(", ", @{ $ARG->{'accept'} }), 
     83    ); 
    6584 
    66     print <<'USAGE'; 
    67 Usage: 
    68  $ forward.pl <LISTEN_PORT> <PEER_ADDR> <PEER_PORT> <ALLOW_CLIENTS> 
     85    unless(grep { $_ eq $host } @$accept) { 
     86        print "Not allowed\n"; 
     87        return; 
     88    } 
    6989 
    70 USAGE 
     90    print "Allowed\n"; 
     91    return 1; 
     92} 
    7193 
    72     exit 255; 
     94sub create_socket { 
     95    IO::Socket::INET->new( 
     96        LocalPort => $ARG->{'local-port'}, 
     97        Proto     => 'tcp', 
     98        Listen    => 5, 
     99        Timeout   => 5, 
     100    ) or die "Could not create socket: $!\n"; 
    73101} 
     102 
     103=head1 AUTHOR 
     104 
     105Jan Henning Thorsen - pm at flodhest.net 
     106 
     107=cut 
     108