5 use vars qw#%DATAFIELDS#;
8 use Yaala::Data::Persistent qw#init#;
9 use Yaala::Parser::WebserverTools qw#%MONTH_NUMBERS#;
11 @Yaala::Parser::EXPORT_OK = qw(parse extra %DATAFIELDS);
12 @Yaala::Parser::ISA = ('Exporter');
14 our $LASTDATE = init ('$LASTDATE', 'scalar');
16 if (!$$LASTDATE) { $$LASTDATE = 0; }
26 incoming_dev => 'key',
27 outgoing_dev => 'key',
31 source_port => 'key:numeric',
32 destination_port => 'key:numeric',
34 icmp_type => 'key:numeric',
48 # This needs to be done at runtime, since Data uses Setup which relies on
49 # %DATAFIELDS to be defined -octo
50 require Yaala::Data::Core;
51 import Yaala::Data::Core qw#store#;
53 my $VERSION = '$Id: Iptables.pm,v 1.4 2003/12/07 15:21:02 octo Exp octo $';
54 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
62 if ($line =~ m/IN=(\S*) OUT=(\S*) /)
64 my $in = $1 ? $1 : '*unknown*';
65 my $out = $2 ? $2 : '*unknown*';
68 my $mac = '*unknown*';
70 my $len, $tos, $prec, $ttl, $id;
76 my $proto_type = 'N/A';
81 if ($rest =~ m/^SRC=([\d\.]+) DST=([\d\.]+) LEN=(\d+) TOS=(0x\S\S) PREC=(0x\S\S) TTL=(\d+) ID=(\d+) /)
86 $tos = unpack ("%02h", $4);
103 $tos = 'Minimize Delay';
107 $tos = 'Maximize Throughput';
111 $tos = 'Maximize Reliability';
115 $tos = sprintf ("Unknown (%02x)", $tos);
123 if ($rest =~ m/^((?:CE )?(?:DF )?(?:MF )?) (?:FRAG:(\d+) )?(?:OPT \(([0-9A-F]+)\) )?PROTO=(\S+) /)
126 $frag = defined ($2) ? $2 : 0;
127 $opt = defined ($3) ? $3 : 'none';
136 if (($proto eq 'TCP') or ($proto eq 'UDP'))
138 if ($rest =~ m/SPT=(\d+) DPT=(\d+) /)
147 if ($rest =~ m/RES=0x\S\S ((?:CWR )?(?:ECE )?(?:URG )?(?:ACK )?(?:PSH )?(?:RST )?(?:SYN )?(?:FIN )?)/)
151 $proto_type = $temp ? $temp : '*none*';
154 elsif ($proto eq 'ICMP')
158 if ($rest =~ m/TYPE=(\d+) /)
163 if ($type == 0) { $proto_type = 'Echo Reply'; }
164 elsif ($type == 3) { $proto_type = 'Destination Unreachable'; }
165 elsif ($type == 4) { $proto_type = 'Source Quench'; }
166 elsif ($type == 5) { $proto_type = 'Redirect'; }
167 elsif ($type == 8) { $proto_type = 'Echo Request'; }
168 elsif ($type == 11) { $proto_type = 'Time Exceeded'; }
169 elsif ($type == 12) { $proto_type = 'Parameter Problem'; }
170 elsif ($type == 13) { $proto_type = 'Timestamp Request'; }
171 elsif ($type == 14) { $proto_type = 'Timestamp Reply'; }
172 elsif ($type == 15) { $proto_type = 'Information Request'; }
173 elsif ($type == 16) { $proto_type = 'Information Reply'; }
174 elsif ($type == 17) { $proto_type = 'Address Mask Request'; }
175 elsif ($type == 18) { $proto_type = 'Address Mask Reply'; }
176 else { $proto_type = "Unknown type ($type)"; }
185 if ($line =~ m/IN=\S* OUT=/)
187 my ($month, $day, $hour, $minute, $second) = $line =~ m/^(\w{3}) (\d+) (\d\d):(\d\d):(\d\d)/;
188 my $year = (localtime ())[5] + 1900;
189 $month = $MONTH_NUMBERS{$month};
192 my $tmp = int (sprintf ("%04u%02u%02u%02u%02u%02u",
193 $year, $month, $day, $hour, $minute, $second));
195 if ($tmp < $$LASTDATE)
197 print STDERR $/, __FILE__, ": Skipping.. ($tmp < $$LASTDATE)" if ($::DEBUG & 0x0200);
200 else { $$LASTDATE = $tmp; }
203 my $date = sprintf ("%04u-%02u-%02u", $year, $month, $day);
206 while ($line =~ m/([A-Z]+)=(\S+)/g)
213 if (defined ($packet{'size'}))
215 $packet{'payload'} = $val;
219 $packet{'size'} = $val;
224 $packet{$key} = $val;
236 incoming_dev => '*none*',
237 outgoing_dev => '*none*',
239 protocol => '*unknown*',
242 destination_port => 0,
245 mac_address => '*unknown*',
256 $data{'source_ip'} = $packet{'src'} if (defined ($packet{'src'}));
257 $data{'dest_ip'} = $packet{'dst'} if (defined ($packet{'dst'}));
259 $data{'incoming_dev'} = $packet{'in'} if (defined ($packet{'in'}));
260 $data{'outgoing_dev'} = $packet{'out'} if (defined ($packet{'out'}));
262 $data{'protocol'} = $packet{'proto'} if (defined ($packet{'proto'}));
264 $data{'source_port'} = $packet{'spt'} if (defined ($packet{'spt'}));
265 $data{'destination_port'} = $packet{'dpt'} if (defined ($packet{'dpt'}));
266 $data{'icmp_type'} = $packet{'type'} if (defined ($packet{'type'}));
268 $data{'mac_address'} = $packet{'mac'} if (defined ($packet{'mac'}));
270 $data{'tos'} = $packet{'tos'} if (defined ($packet{'tos'}));
271 $data{'prec'} = $packet{'prec'} if (defined ($packet{'prec'}));
272 $data{'ttl'} = $packet{'ttl'} if (defined ($packet{'ttl'}));
274 $data{'size'} = $packet{'size'} if (defined ($packet{'size'}));
275 $data{'payload'} = $packet{'payload'} if (defined ($packet{'payload'}));