- #!/bin/sh
- ##############################################################################
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License version 2 as
- # published by the Free Software Foundation.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # Copyright (C) 2016 Eric Luehrsen
- #
- ##############################################################################
- #
- # These are iptools that might be useful in a larger package, if provided
- # elsewhere for common use. One example that many may find useful is turning
- # flexible IPV6 colon dividers into PTR. Otherwise these are incomplete and
- # would need robustness improvements for more generic applications.
- #
- ##############################################################################
-
- # while useful (sh)ellcheck is pedantic and noisy
- # shellcheck disable=1091,2002,2004,2034,2039,2086,2094,2140,2154,2155
-
- UB_IPTOOLS_BLANK=
-
- ##############################################################################
-
- domain_ptr_ip6() {
- # Get the nibble rounded /CIDR ...ip6.arpa.
- echo "$1" | awk -F: \
- 'BEGIN { OFS = "" ; }
- { CIDR = $0 ;
- sub(/.*\//,"",CIDR) ;
- CIDR = (CIDR / 4) ;
- sub(/\/[0-9]+/,"",$0) ;
- ct_stop = 9 - NF ;
- for(i=1; i<=NF; i++) {
- if(length($i) == 0) {
- for(j=1; j<=ct_stop; j++) { $i = ($i "0000") ; } }
- else { $i = substr(("0000" $i), length($i)+5-4) ; } } ;
- y = $0 ;
- ct_start = length(y) - 32 + CIDR ;
- for(i=ct_start; i>0; i--) { x = (x substr(y,i,1)) ; } ;
- gsub(/./,"&\.",x) ;
- x = (x "ip6.arpa") ;
- print x }'
- }
-
- ##############################################################################
-
- host_ptr_ip6() {
- # Get complete host ...ip6.arpa.
- echo "$1" | awk -F: \
- 'BEGIN { OFS = "" ; }
- { sub(/\/[0-9]+/,"",$0) ;
- ct_stop = 9 - NF ;
- for(i=1; i<=NF; i++) {
- if(length($i) == 0) {
- for(j=1; j<=ct_stop; j++) { $i = ($i "0000") ; } }
- else { $i = substr(("0000" $i), length($i)+5-4) ; } } ;
- y = $0 ;
- ct_start = length(y);
- for(i=ct_start; i>0; i--) { x = (x substr(y,i,1)) ; } ;
- sub(/[0-9]+\//,"",x) ;
- gsub(/./,"&\.",x) ;
- x = (x "ip6.arpa") ;
- print x }'
- }
-
- ##############################################################################
-
- domain_ptr_ip4() {
- # Get the byte rounded /CIDR ...in-addr.arpa.
- echo "$1" | awk \
- '{ CIDR = $0 ;
- sub(/.*\//,"",CIDR) ;
- CIDR = (CIDR / 8) ;
- dtxt = $0 ;
- sub(/\/.*/,"",dtxt) ;
- split(dtxt, dtxt, ".") ;
- for(i=1; i<=CIDR; i++) { x = (dtxt[i] "." x) ; }
- x = (x "in-addr.arpa") ;
- print x }'
- }
-
- ##############################################################################
-
- host_ptr_ip4() {
- # Get complete host ...in-addr.arpa.
- echo "$1" | awk -F. \
- '{ x = ( $4"."$3"."$2"."$1".in-addr.arpa" ) ;
- sub(/\/[0-9]+/,"",x) ;
- print x }'
- }
-
- ##############################################################################
-
- valid_subnet6() {
- case "$1" in
- # GA
- [1-9][0-9a-f][0-9a-f][0-9a-f]":"*) echo "ok" ;;
- # ULA
- f[cd][0-9a-f][0-9a-f]":"*) echo "ok" ;;
- # fe80::, ::1, and such
- *) echo "not" ;;
- esac
- }
-
- ##############################################################################
-
- valid_subnet4() {
- case "$1" in
- # Link, Local, and Such
- 169"."254"."*) echo "not" ;;
- 127"."*) echo "not" ;;
- 0"."*) echo "not" ;;
- 255"."*) echo "not" ;;
- # Other Normal
- 25[0-4]"."[0-9]*) echo "ok" ;;
- 2[0-4][0-9]"."[0-9]*) echo "ok" ;;
- 1[0-9][0-9]"."[0-9]*) echo "ok" ;;
- [0-9][0-9]"."[0-9]*) echo "ok" ;;
- [0-9]"."[0-9]*) echo "ok" ;;
- # Not Right
- *) echo "not";;
- esac
- }
-
- ##############################################################################
-
- valid_subnet_any() {
- local subnet=$1
- local validip4=$( valid_subnet4 $subnet )
- local validip6=$( valid_subnet6 $subnet )
-
-
- if [ "$validip4" = "ok" ] || [ "$validip6" = "ok" ] ; then
- echo "ok"
- else
- echo "not"
- fi
- }
-
- ##############################################################################
-
- private_subnet() {
- case "$1" in
- 10"."*) echo "ok" ;;
- 172"."1[6-9]"."*) echo "ok" ;;
- 172"."2[0-9]"."*) echo "ok" ;;
- 172"."3[0-1]"."*) echo "ok" ;;
- 192"."168"."*) echo "ok" ;;
- f[cd][0-9a-f][0-9a-f]":"*) echo "ok" ;;
- *) echo "not" ;;
- esac
- }
-
- ##############################################################################
-
- local_subnet() {
- # local subnet 2nd place is limited to one digit to improve the filter
- case "$1" in
- 127"."[0-9]"."[0-9]*) echo "ok" ;;
- ::1) echo "ok" ;;
- *) echo "not" ;;
- esac
- }
-
- ##############################################################################
-
- domain_ptr_any() {
- local subnet=$1
- local arpa validip4 validip6
-
- validip4=$( valid_subnet4 $subnet )
- validip6=$( valid_subnet6 $subnet )
-
-
- if [ "$validip4" = "ok" ] ; then
- arpa=$( domain_ptr_ip4 "$subnet" )
- elif [ "$validip6" = "ok" ] ; then
- arpa=$( domain_ptr_ip6 "$subnet" )
- fi
-
-
- if [ -n "$arpa" ] ; then
- echo $arpa
- fi
- }
-
- ##############################################################################
-
- host_ptr_any() {
- local subnet=$1
- local arpa validip4 validip6
-
- validip4=$( valid_subnet4 $subnet )
- validip6=$( valid_subnet6 $subnet )
-
-
- if [ "$validip4" = "ok" ] ; then
- arpa=$( host_ptr_ip4 "$subnet" )
- elif [ "$validip6" = "ok" ] ; then
- arpa=$( host_ptr_ip6 "$subnet" )
- fi
-
-
- if [ -n "$arpa" ] ; then
- echo $arpa
- fi
- }
-
- ##############################################################################
-
|