#!/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.00 (towardEX) 5/6/2012 # 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" == "default" ]; then echo -n "DNS_SERVER=\"192.168.1.2\" KEY=\"key_name\" SECRET=\"MD5_secret_here\" DEFAULT_TTL=\"86400\" " > ./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 -n 1>&2 "Enter IPv6 host address [2001:db8::1] >> " read inet6_addr echo -n 1>&2 "Enter desired hostname (AAAA) >> " read _hostname } 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"; if ( action=="delete") printf "update %s %s in aaaa", action, hostname; else printf "update %s %s %s in aaaa %s", action, hostname, ttl, $2; 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