Newer
Older
waccess / waccess
#!/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)