Re: Continuous packet capture

Brad Lhotsky <[email protected]>
Newsgroups gmane.comp.lang.perl.poe
Message-ID <[email protected]>
I don't know if this will help you or not, but here's a script I have  
running to monitor and track recursive DNS Queries on my network.  You  
can ignore the database stuff, but it might help.

http://divisionbyzero.net/~brad/code/dns_snoop.pl.html

I process the packets as they come in, but I could be using  
POE::Wheel::Run on them as well...  The key part of the tutorial (http://poe.perl.org/?POE_Cookbook/Child_Processes_3 
) seems to be the while() loop in the start_tasks routine.

It doesn't sound like you need the feedback from the child tasks  
because you'll be feeding them via the heap.  The Filter::Reference  
stuff is being used to return status information from the child tasks  
to the main processor.

Here's another script I've written that needs some reworking as well.   
It listens on our egress link, and collects statistics inside the  
heap.  At intervals (POE::Component::Cron), the heap is processed  
written to a database (or RRD) and then cleared. The processing  
continues.

http://divisionbyzero.net/~brad/code/traffic_detection.pl.html

I hope there's something in there that helps.

On Mar 24, 2009, at 4:25 PM, Jonathan S. Polacheck wrote:

>
> I have spent a couple of days casting about, looking at examples and
> perldoc.  I don't seem to be able to get the data from 'tcpdump' (or
> POE::Component::PCAP) to the wheel that will process the data.  For  
> my last
> attempt, I removed Filter::Referece and tried with just the wheel.   
> Still
> no luck.  Any suggestions?
>
> #!/usr/bin/perl
>
> use warnings;
> use strict;
> use POE qw( Wheel::Run ); #Filter::Reference );
> use Data::Dumper;
>
> our $offset = 0;
> our $linechars = '';
>
> POE::Session->create
>      ( inline_states =>
>      {
>            _start => sub {
>                  my ($heap) = $_[HEAP];
>                  my $gp = POE::Wheel::Run->new
>                        ( Program => '/usr/sbin/tcpdump -i eth0 -w - '
> #                       , Conduit => "pipe"
> #                       , StdoutFilter => POE::Filter::Reference- 
> >new()
> #                       , StdinEvent  => 'process_packet'
>                        , StdinEvent  => 'stdin'
> #                       , StdoutEvent => 'print'
> #                       , InputEvent => 'process_packet'
>                        );
> print "gp compleate\n";
>                  $heap->{gp} = $gp;
> #                 my $pp = POE::Wheel::Run->new
> #                       ( Program => &process_packet
> #                       , StdoutEvent => 'stdout'
> #                       );
>
>            }
>      }
>      );
>
> sub process_packet {
>      print "process_packet called\n";
> #     my ($heap) = $_[HEAP];
>
> #     my $filter = POE::Filter::Reference->new();
> #     my $pdump = $filter->get( [ $heap->{gp} ] );
>      my $pdump = $_[ARG0];
>      foreach my $char (split(//, $pdump)) {
>            if($char !~ /\n/) {
>                  dump_char($char) ;
>            } else {
>                  print "\n\n";
>                  $offset = 0;
>                  $linechars = '';
>            }
>            1;
>      }
>
>
>      dump_char( ' ', 1 ) while length($linechars) != 0;
>
> }
>
> sub dump_char {
>  my ( $char ) = shift;
>  if ( length( $linechars ) == 0 ) {
>    printf( "%06X ", $offset );
>  }
>  $linechars .= ( $char =~ m#[!-~ ]# ) ? $char : '.';
>     printf( "%02X ", ord($char) );
>   if ( length( $linechars ) == 16 ) {
>    print( "\n" );
>    $linechars = '';
>    $offset += 16;
>  }
> }
>
> $poe_kernel->run();
> exit 0;
>

--
Brad Lhotsky  <[email protected]>
Security Administrator / NIA Alt. ISSO
.. WAR IS PEACE
    FREEDOM IS SLAVERY
    IGNORANCE IS STRENGTH ..
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.