Annotation of embedaddon/dnsmasq/contrib/reverse-dns/reverse_replace.sh, revision 1.1.1.2
1.1.1.2 ! misho 1: #!/bin/dash
1.1 misho 2: # $Id: reverse_replace.sh 18 2015-03-01 16:12:35Z jo $
3: #
4: # Usage e.g.: netstat -n -4 | reverse_replace.sh
5: # Parses stdin for IP4 addresses and replaces them
6: # with names retrieved by parsing the dnsmasq log.
7: # This currently only gives CNAMEs. But these
1.1.1.2 ! misho 8: # usually tell you more than the ones from reverse
1.1 misho 9: # lookups.
10: #
1.1.1.2 ! misho 11: # This has been tested on debian and asuswrt. Please
1.1 misho 12: # report successful tests on other platforms.
13: #
14: # Author: Joachim Zobel <jz-2014@heute-morgen.de>
15: # License: Consider this MIT style licensed. You can
16: # do as you ike, but you must not remove my name.
17: #
18:
19: LOG=/var/log/dnsmasq.log
20: MAX_LINES=15000
21:
22: # sed regex do match IPs
23: IP_regex='[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
24: # private IP ranges
25: IP_private='\(^127\.\)\|\(^192\.168\.\)\|\(^10\.\)\|\(^172\.1[6-9]\.\)\|\(^172\.2[0-9]\.\)\|\(^172\.3[0-1]\.\)'
26:
27: #######################################################################
28: # Find Commands
29:
30: HOST=nslookup
31: if type host > /dev/null 2>&1; then
32: # echo "No need for nslookup, host is there"
33: HOST=host
34: fi
35:
36: #######################################################################
37: # Functions
38:
39: # Use shell variables for an (IP) lookup table
40: create_lookup_table()
41: {
42: # Parse log into lookup table
43: local CMDS="$( tail -"$MAX_LINES" "$LOG" | \
44: grep " is $IP_regex" | \
45: sed "s#.* \([^ ]*\) is \($IP_regex\).*#set_val \2 \1;#" )"
46:
47: local IFS='
48: '
49: for CMD in $CMDS
50: do
51: eval $CMD
52: done
53: }
54:
55: set_val()
56: {
57: local _IP=$(echo $1 | tr . _)
58: local KEY="__IP__$_IP"
59: eval "$KEY"=$2
60: }
61:
62: get_val()
63: {
64: local _IP=$(echo $1 | tr . _)
65: local KEY="__IP__$_IP"
66: eval echo -n '${'"$KEY"'}'
67: }
68:
69: dns_lookup()
70: {
71: local IP=$1
72:
73: local RTN="$($HOST $IP | \
74: sed 's#\s\+#\n#g' | \
75: grep -v '^$' | \
76: tail -1 | tr -d '\n' | \
77: sed 's#\.$##')"
78: if echo $RTN | grep -q NXDOMAIN; then
79: echo -n $IP
80: else
81: echo -n "$RTN"
82: fi
83: }
84:
85: reverse_dns()
86: {
87: local IP=$1
88:
89: # Skip if it is not an IP
90: if ! echo $IP | grep -q "^$IP_regex$"; then
91: echo -n $IP
92: return
93: fi
94:
95: # Do a dns lookup, if it is a local IP
96: if echo $IP | grep -q $IP_private; then
97: dns_lookup $IP
98: return
99: fi
100:
101: local NAME="$(get_val $IP)"
102:
103: if [ -z "$NAME" ]; then
104: echo -n $IP
105: else
106: echo -n $NAME
107: fi
108: }
109:
110: #######################################################################
111: # Main
112: create_lookup_table
113:
114: while read LINE; do
115: for IP in $(echo "$LINE" | \
116: sed "s#\b\($IP_regex\)\b#\n\1\n#g" | \
117: grep $IP_regex)
118: do
119: NAME=`reverse_dns $IP `
120: # echo "$NAME $IP"
121: LINE=`echo "$LINE" | sed "s#$IP#$NAME#" `
122: done
123: echo $LINE
124: done
125:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>