Annotation of embedaddon/dnsmasq/contrib/reverse-dns/reverse_replace.sh, revision 1.1.1.1

1.1       misho       1: #!/bin/ash
                      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 
                      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.
                     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>