18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#!/usr/bin/perl -w
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# Logwatch script for hostapd
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#
58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# Copyright 2005 Henrik Brix Andersen <brix@gentoo.org>
68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# Distributed under the terms of the GNU General Public License v2
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# Alternatively, this file may be distributed under the terms of the BSD License
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtuse strict;
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtmy $debug = $ENV{'LOGWATCH_DEBUG'} || 0;
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtmy $detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtmy $debugcounter = 1;
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtmy %hostapd;
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtmy @unmatched;
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtif ($debug >= 5) {
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	print STDERR "\n\nDEBUG: Inside HOSTAPD Filter\n\n";
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtwhile (defined(my $line = <STDIN>)) {
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if ($debug >= 5) {
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		print STDERR "DEBUG($debugcounter): $line";
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		$debugcounter++;
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    chomp($line);
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (my ($iface,$mac,$layer,$details) = ($line =~ /(.*?): STA (.*?) (.*?): (.*?)$/i)) {
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		unless ($detail == 10) {
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			# collapse association events
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			$details =~ s/^(associated) .*$/$1/i;
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		$hostapd{$iface}->{$mac}->{$layer}->{$details}++;
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		push @unmatched, "$line\n";
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtif (keys %hostapd) {
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	foreach my $iface (sort keys %hostapd) {
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		print "Interface $iface:\n";
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		foreach my $mac (sort keys %{$hostapd{$iface}}) {
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			print "  Client MAC Address $mac:\n";
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			foreach my $layer (sort keys %{$hostapd{$iface}->{$mac}}) {
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				print "    $layer:\n";
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				foreach my $details (sort keys %{$hostapd{$iface}->{$mac}->{$layer}}) {
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					print "      $details";
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					my $count = $hostapd{$iface}->{$mac}->{$layer}->{$details};
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					if ($count > 1) {
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						print ": " . $count . " Times";
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					}
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					print "\n";
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				}
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtif ($#unmatched >= 0) {
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    print "\n**Unmatched Entries**\n";
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    print @unmatched;
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtexit(0);
66