]>
Commit | Line | Data |
---|---|---|
4c960fa9 SK |
1 | #!/bin/ash |
2 | # $Id: reverse_replace.sh 18 2015-03-01 16:12:35Z jo $ | |
47b9ac59 JZ |
3 | # |
4 | # Usage e.g.: netstat -n -4 | reverse_replace.sh | |
5 | # Parses stdin for IP4 addresses and replaces them | |
4c960fa9 SK |
6 | # with names retrieved by parsing the dnsmasq log. |
7 | # This currently only gives CNAMEs. But these | |
8 | # usually tell ou more than the mones from reverse | |
9 | # lookups. | |
10 | # | |
11 | # This has been tested on debian and asuswrt. Plese | |
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. | |
47b9ac59 JZ |
17 | # |
18 | ||
4c960fa9 SK |
19 | LOG=/var/log/dnsmasq.log |
20 | MAX_LINES=15000 | |
47b9ac59 | 21 | |
4c960fa9 | 22 | # sed regex do match IPs |
47b9ac59 | 23 | IP_regex='[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' |
4c960fa9 SK |
24 | # private IP ranges |
25 | IP_private='\(^127\.\)\|\(^192\.168\.\)\|\(^10\.\)\|\(^172\.1[6-9]\.\)\|\(^172\.2[0-9]\.\)\|\(^172\.3[0-1]\.\)' | |
47b9ac59 | 26 | |
4c960fa9 SK |
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 | |
47b9ac59 | 99 | fi |
4c960fa9 SK |
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 | |
47b9ac59 | 123 | echo $LINE |
4c960fa9 | 124 | done |
47b9ac59 | 125 |