#!/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
|
|
}
|
|
|
|
##############################################################################
|
|
|