The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Net::Netmask;
use POE qw(Component::Proxy::SOCKS);

$|=1;

POE::Session->create(
   package_states => [ 
	'main' => [ qw(_start _default socksd_registered) ],
   ],
);

$poe_kernel->run();
exit 0;

sub _start {
  my ($kernel,$heap) = @_[KERNEL,HEAP];
  $heap->{socksd} = POE::Component::Proxy::SOCKS->spawn( alias => 'socksd', ident => 0 );
  return;
}

sub socksd_registered {
  my $socksd = $_[ARG0];
  my $all = Net::Netmask->new2('any');
  my $loopback = Net::Netmask->new2('127.0.0.1');
  my $local = Net::Netmask->new2('192.168.1.0/24');
  $socksd->add_denial( $all );
  $socksd->add_exemption( $loopback );
  $socksd->add_exemption( $local );
  return;
}

sub _default {
  my ($event, $args) = @_[ARG0 .. $#_];
  my @output = ( "$event: " );

  foreach my $arg ( @$args ) {
    if ( ref($arg) eq 'ARRAY' ) {
       push( @output, "[" . join(" ,", @$arg ) . "]" );
    } else {
       push ( @output, "'$arg'" );
    }
  }
  print STDOUT join ' ', @output, "\n";
  return 0;
}