#!/bin/sh # # Copyright (c) 2012 TowardEX Technology Services Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)ipv6_reserve_ptr.sh 1.10 (towardEX) 5/6/2012 # HOSTNAME_PREFIX="-1" nsupdate_command=`which nsupdate` nsupdate_flags="" print_usage() { echo 1>&2 "Usage: $0 " echo 1>&2 ":" echo 1>&2 " Possible completions:" echo 1>&2 " add Add or update DNS resource record" echo 1>&2 " delete Delete DNS resource record" echo 1>&2 ": Path to DNS+TSIG config input file" } # pre-conditional argument check case $1 in 'add') ;; 'delete') ;; *) print_usage exit 1 ;; esac is_file_exists() { if [ ! -f "./__ipv6_to_base36.sh" ]; then echo "error: __ipv6_to_base36.sh not loaded, run script from local directory!" exit fi if [ "$f" == "default" ]; then echo -n "DNS_SERVER=\"192.168.1.2\" KEY=\"key_name\" SECRET=\"MD5_secret_here\" DEFAULT_TTL=\"86400\" #HOSTNAME_PREFIX=\"hcctrc.com\" " > ./tsig_setup.in . tsig_setup.in elif [ -f "$f" ]; then . $f else echo "error: file not found, use \"default\" for default values" exit 1 fi } # call usage() function if filename not supplied if [ $# -eq 0 ]; then print_usage exit 1 else f="$2" is_file_exists || echo test fi query_user(){ echo "CC IPv4-mapped in IPV6, Dual-Stack Addressing Trick Method: 2001:db8:2ff::10.23.17.2 becomes: 2001:db8:2ff::0a17:1102 " echo -n 1>&2 "Enter IPv6 base prefix, terminate with ::, NO Pfx Len! Example: [2001:db8:2ff::] >> " read inet6_base echo -n 1>&2 "Enter IPv4 host address [10.23.0.2] >> " read ipv4_host _hexconv=`sh ./__ipv4_to_hex.sh ${ipv4_host}` inet6_addr="${inet6_base}${_hexconv}" echo " This is the converted IPv6 address, is this OK? [${inet6_addr}] If NOT OK, Ctrl-C to abort NOW! Press [CR]/Enter to continue.. " read junk echo " --------------------------------------------------------------- " if [ ${HOSTNAME_PREFIX} != -1 ]; then echo -n 1>&2 "HOSTNAME.ptn loaded, enter domain suffix [onesummer.ma.sys.tcisn.net] >> " read _domain_sfx _base36=`sh ./__ipv6_to_base36.sh ${inet6_addr}` _hostname="${HOSTNAME_PREFIX}${_base36}.${_domain_sfx}" echo -n 1>&2 "auto-gen: [$_hostname]" else _hostname=`host ${ipv4_host} | awk '{ print $NF }'` echo " This is what I have for desired hostname mapping. Is this OK? [${_hostname}] If NOT OK, Ctrl-C to abort NOW! If you want to enter your own hostname, use the 'ipv6-reverse-ptr.sh' for manual operation. Press [CR]/Enter to continue.. " read junk fi } run_ns_update(){ std_data="server ${DNS_SERVER}\nkey ${KEY} ${SECRET}" std_concat=`echo "inet6 $inet6_addr" | awk -v "hostname=${_hostname}" -v "action=${_action}" -v "ttl=${_ttl}" \ '! inet6 && /inet6 / && $2 !~ /^(fe80:|::1)/ { ip6[++j] = $2; } END { print ""; for (j in ip6) { cols = gsub(/:/, ":", ip6[j]); zeroes = ""; for (i = cols; i < 8; i++) { zeros = zeros ":0"; } zeros = zeros ":"; sub(/::/, zeros, ip6[j]); split(ip6[j], shorts, /:/); ip6str = ""; for (i = 1; i <= 8; i++) { ip6str = ip6str substr("000" shorts[i], length(shorts[i])); } revstr = "ip6.arpa"; for (i = 1; i <= length(ip6str); i++) { revstr = substr(ip6str, i, 1) "." revstr; } if ( action=="delete") printf "update %s %s in ptr", action, revstr; else printf "update %s %s %s in ptr %s", action, revstr, ttl, hostname; print "\nsend"; } }'` printf "%b " "$std_concat\n" printf "%b " "$std_data\n$std_concat\n" | "${nsupdate_command}" ${nsupdate_flags} } # end run_ns_update() # main() routine query_user case $1 in 'add') _action='delete' _ttl='' run_ns_update _action='add' _ttl=${DEFAULT_TTL} run_ns_update ;; 'delete') _action='delete' _ttl='' run_ns_update ;; *) exit 1 ;; esac # EOF