1: #!/bin/bash
2: # $Header: $
3: # First attempt at a consolidated auth log collection from kaserver
4: # Timestamps in the raw files are NOT designed for easy sorting.
5: #
6: # Options:
7: # -i -- translate hex IP addresses to dotted-decimal (relatively quick)
8: # -h -- translate hex IP addresses to DNS names (somewhat slower - DNS lookups)
9: # -u user -- filter for the named user before translating addresses
10:
11: hextodec()
12: {
13: # convert the IP address in reverse-hex to dotted-decimal
14: echo $((0x${1:6:2})).$((0x${1:4:2})).$((0x${1:2:2})).$((0x${1:0:2}))
15: }
16:
17: hostlookup()
18: {
19: # Convert a decimal IP to hostname - calls 'host' each time
20: hostname=$(host $1)
21: case $hostname in
22: *\ not\ found*)
23: # Just echo the address we tried to look up
24: echo "$1"
25: ;;
26: *)
27: # The result is word 5. Lower-case it for consistency
28: set $hostname
29: echo "$5" | tr 'A-Z' 'a-z'
30: ;;
31: esac
32: }
33:
34: # Options
35: iptranslate=0
36: gethostnames=0
37: filter=cat
38: while getopts ihu: o ; do
39: case $o in
40: i) iptranslate=1 ;;
41: h) gethostnames=1; iptranslate=1 ;;
42: u) filter="grep $OPTARG" ;;
43: esac
44: done
45: shift $(($OPTIND-1))
46:
47: # We could get the DB server names from 'fs checkservers', but it isn't obvious what is from our cell. We
48: # could also grep CellServDB. I cop out and hard code one known DB server and get the others from it.
49: masterserver=halley.dartmouth.edu
50: serverlist=$(bos listhosts -server $masterserver| grep 'Host .* is ' | awk '{print $4}')
51:
52: # If we want to filter usernames, it is more efficient to do it inline, before sorting, translation and hostname lookups
53:
54: # Array to hold IP address/name conversions (associative array, ksh only)
55: # ksh - use -A for associative array. bash - use -a and numeric array
56: typeset -a hostnames
57:
58: (
59: for dbserver in $serverlist; do
60: bos getlog -server $dbserver -file /usr/afs/logs/AuthLog
61: done
62: ) | grep -v 'Fetching log file' | $filter | sed -e 's/^... //' -e 's/ \([1-9]\) / 0\1 /' | sort --month-sort | \
63: sed '-e s/ \([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\)$/ 0\1/' |
64: while read line; do
65: if [[ $iptranslate == 1 ]] ; then
66: # Ugly!
67: # Sometimes we get a 7-digit hex code in the log - the kaserver apparently drops leading zeros.
68: # The second 'sed' in the pipe catches these are fixes them.
69: case $line in
70: *\ from\ [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])
71: # translate the reverse-hex address
72: iphex=${line##* from }
73: # bash version - index by numeric value only, but can be sparse array -- use the raw IP
74: ipdec=$((0x$iphex))
75: frontpart=${line% from *}
76: if [[ $gethostnames == 1 ]]; then
77: # ksh - index on hex value as a string (iphex)
78: # bash - index on numeric value (ipdec)
79: index=$ipdec
80: if [[ -z "${hostnames[$index]}" ]]; then
81: hostnames[$index]="$(hostlookup $(hextodec $iphex))"
82: fi
83: echo "$frontpart from ${hostnames[$index]}"
84: else
85: echo "$frontpart from $(hextodec $iphex)"
86: fi
87: ;;
88: *)
89: echo "$line"
90: ;;
91: esac
92: else
93: # No ip translation, just echo the whole line
94: echo "$line"
95: fi
96: done
97:
| last modified 22/03/2012 | Introduction | Table of Contents (frame/no frame) |
Printable (single file) |
© Dartmouth College |