All pastes #46610 Raw Edit

Mine

public text v1 · immutable
#46610 ·published 2006-03-22 15:35 UTC
rendered paste body
#!/usr/bin/perl
use warnings;
use strict;

use Net::Pcap;
use NetPacket::Ethernet;
use NetPacket::IP;

use Net::hostent;
use Sys::Hostname;
use Socket qw ( inet_ntoa );

use threads;
use threads::shared;
use Data::Dumper;

die "Usage: $0 <if>\n" unless @ARGV;

my %iplist;
&grab_ips();

my($dev) = ($ARGV[0]);
die "Cannot open tcpdump: $!\n" unless open TCPDUMP, "tcpdump -e -t -n -i $dev |";

my %counts : shared;
my $thr = threads->create("save_counts");

while(my $l=<TCPDUMP>) {
  if($l=~/ip (\d+): ([\w\.]+) > ([\w\.]+)/){
    my($len,$src,$dst)=($1,$2,$3);
    $src =~ s/\.\w+$//;
    $dst =~ s/\.\w+$//;
    #print("$l$len $src $dst\n");
#    my $tgt = (defined($iplist{$dst}))?$dst:$src;
    my $tgt;
#    print keys(%iplist)."\n";
    if (exists($iplist{$src})) {
      $tgt = $src;
      $counts{$tgt} = 0 unless defined $counts{$tgt};
      $counts{$tgt} += $len;
    }
    if (exists($iplist{$dst})) {
      $tgt = $dst;
      $counts{$tgt} = 0 unless defined $counts{$tgt};
      $counts{$tgt} += $len;
    }

  }
}

sub save_counts {
  while(1) {
    print Dumper \%counts;
    # ^
    #this should be a flatfile count write

    foreach my $k (keys %counts){
      # hopefully this will keep the key churn down.
      if($counts{$k}==0){
        delete($counts{$k});
      } else {
        $counts{$k} = 0;
      }
    }
    sleep 5;
  }
}

sub grab_ips{
  if (open IPS, "</etc/rc.d/ips") {
    my $line;
    while( $line = <IPS> ) {
      chomp $line;
      $line =~s/ +//g;        # clean off whitespace.
      if( $line =~ /^#/ || $line eq "" || $line =~ /[^0-9.]/ ){ next; }
      $iplist{$line}++;
      }
    close IPS;
  }
  my $hostname = hostname;
  my $hostent = gethost($hostname);
  my $addr    = inet_ntoa($hostent->addr); undef $hostent;
  $iplist{$addr}++;
}