Annotation of embedaddon/dnsmasq/contrib/reverse-dns/reverse_replace.sh, revision 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>