initial commit
[map-websocket.git] / client-pcapcolors-inject.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use Net::Pcap;
5 use NetPacket::Ethernet;
6 use NetPacket::IP;
7 use NetPacket::TCP;
8 use Socket;
9 use IO::Socket;
10
11 use Geo::IP;
12 my $gi = Geo::IP->open("GeoLiteCity.dat", GEOIP_STANDARD);
13
14 my $err;
15
16 my $dev = "eth1";
17 unless (defined $dev) {
18   $dev = Net::Pcap::lookupdev(\$err);
19   if (defined $err) {
20     die 'Unable to determine network device for monitoring - ', $err;
21   }
22 }
23
24 my $server = IO::Socket::INET->new(
25   Proto     => 'tcp',
26   PeerPort => 10000,
27   PeerAddr    => 'localhost' )
28 or die "can't setup server";
29
30 my ($address, $netmask);
31 print "Starting to send data\n";
32 my $object = Net::Pcap::open_live($dev, 1500, 0, 0, \$err);
33
34 my $filter;
35 Net::Pcap::compile(
36   $object, 
37   \$filter, 
38   #'(not net 192.168.0.0/16) && (tcp[13] & 2!=0)', 
39   '(tcp[13] & 2!=0) && (not src net 192.168.0.0/16)',
40   #'net 70.91.6.64/29',
41   0, 
42   $netmask
43 ) && die 'Unable to compile packet capture filter';
44
45 Net::Pcap::setfilter($object, $filter) &&
46   die 'Unable to set packet capture filter';
47
48
49 unless (defined $object) {
50   die 'Unable to create packet capture on device ', $dev, ' - ', $err;
51 }
52
53 Net::Pcap::loop($object, -1, \&syn_packets, $server) ||
54   die 'Unable to perform packet capture';
55
56 sub syn_packets {
57   my ($user_data, $header, $packet) = @_;
58   my $ether_data = NetPacket::Ethernet::strip($packet);
59   my $ip = NetPacket::IP->decode($ether_data);
60   my $tcp = NetPacket::TCP->decode($ip->{'data'});
61
62   my $record = $gi->record_by_addr($ip->{'src_ip'});
63   if ($record) {
64     print $ip->{'src_ip'}. " - " ."Sending ".$record->latitude.":".$record->longitude."\n";
65     print $user_data $record->latitude.":".$record->longitude."-red:darkred\n";;
66   }
67 }
68