#!/usr/bin/env python
# waccess - Copyright (c) 2001, TundraWare Inc., All Rights Reserved
# $Id: waccess,v 1.3 2002/08/30 21:52:07 tundra Exp $
#
# Look for selected strings passed on the command line in the http access log.
# If found, dump the address, name, item retrieved, and access date for the
# matching record.
import commands
import getopt
import socket
import sys
##########
# Booleans
##########
FALSE = 0==1
TRUE = not FALSE
##########
# Constants
##########
##########
# Function Defintions
##########
def usage():
print "usage: waccess [-rs -f logfile]"
sys.exit(2)
##########
# Command Line Processing
##########
LOG = "/var/log/httpd-access.log"
REVERSE = FALSE
SHOW = TRUE
try:
opts, args = getopt.getopt(sys.argv[1:], '-f:rs')
except getopt.GetoptError:
usage()
for opt, val in opts:
if opt == "-f":
LOG = val
if opt == "-r":
REVERSE = TRUE
SHOW = TRUE
if opt == "-s":
SHOW = FALSE
REVERSE = FALSE
##########
# Process the log
##########
f = open(LOG)
matched = {}
for a in args:
matched[a] = 0
total = 0
# Read in the whole log file
for record in f.read().splitlines():
total += 1
# Check each log record for a match with any command line argument
MATCHED = FALSE
for a in args:
if record.count(a):
fields = record.split()
i = 0
revname = ""
matched[a] += 1
MATCHED = TRUE
# But only display the matching record once, regardless of how many
# matching substrings are found.
if MATCHED:
if REVERSE:
try:
revname = socket.gethostbyaddr(fields[0])[0]
except:
revname = "NO REVERSE RESOLUTION"
if SHOW:
print fields[3][1:], " " * (19 - len(fields[3][1:])), \
fields[0], " " * (15 - len(fields[0])), \
revname[-(35+1):], " " * (35 - len(revname)), \
fields[5], " " * (8 - len(fields[5])), fields[6]
f.close()
print "\nProcessed %d Total Records.\n" % (total,)
for a in args:
print "Found %d Matching Records Containing: %s" % (matched[a], a)