1#!/bin/sh 2# 3# Copyright (C) 2010, 2012, 2014 Internet Systems Consortium, Inc. ("ISC") 4# 5# Permission to use, copy, modify, and/or distribute this software for any 6# purpose with or without fee is hereby granted, provided that the above 7# copyright notice and this permission notice appear in all copies. 8# 9# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15# PERFORMANCE OF THIS SOFTWARE. 16 17# Id: zone-edit.sh.in,v 1.2 2010/12/21 23:47:08 tbox Exp 18 19dir=/tmp/zone-edit.$$ 20mkdir ${dir} || exit 1 21trap "/bin/rm -rf ${dir}" 0 22 23prefix=@prefix@ 24exec_prefix=@exec_prefix@ 25bindir=@bindir@ 26sbindir=@sbindir@ 27 28dig=${bindir}/dig 29checkzone=${sbindir}/named-checkzone 30nsupdate=${bindir}/nsupdate 31 32case $# in 330) echo "Usage: zone-edit <zone> [dig options] [ -- nsupdate options ]"; exit 0 ;; 34esac 35 36# What kind of echo are we using? 37try=`echo -n ""` 38if test "X$try" = "X-n " 39then 40 echo_arg="" 41 bsc="\\c" 42else 43 echo_arg="-n" 44 bsc="" 45fi 46 47zone="${1}" 48shift 49digopts= 50while test $# -ne 0 51do 52 case "${1}" in 53 --) 54 shift 55 break 56 ;; 57 *) 58 digopts="$digopts $1" 59 shift 60 ;; 61 esac 62done 63 64${dig} axfr "$zone" $digopts | 65awk '$4 == "RRSIG" || $4 == "NSEC" || $4 == "NSEC3" || $4 == "NSEC3PARAM" { next; } { print; }' > ${dir}/old 66 67if test -s ${dir}/old 68then 69 ${checkzone} -q -D "$zone" ${dir}/old > ${dir}/ooo 70fi 71 72if test -s ${dir}/ooo 73then 74 cp ${dir}/ooo ${dir}/new 75 while : 76 do 77 if ${VISUAL:-${EDITOR:-/bin/ed}} ${dir}/new 78 then 79 if ${checkzone} -q -D "$zone" ${dir}/new > ${dir}/nnn 80 then 81 sort ${dir}/ooo > ${dir}/s1 82 sort ${dir}/nnn > ${dir}/s2 83 comm -23 ${dir}/s1 ${dir}/s2 | 84 sed 's/^/update delete /' > ${dir}/ccc 85 comm -13 ${dir}/s1 ${dir}/s2 | 86 sed 's/^/update add /' >> ${dir}/ccc 87 if test -s ${dir}/ccc 88 then 89 cat ${dir}/ccc | more 90 while : 91 do 92 echo ${echo_arg} "Update (u), Abort (a), Redo (r), Modify (m), Display (d) : $bsc" 93 read ans 94 case "$ans" in 95 u) 96 ( 97 echo zone "$zone" 98 cat ${dir}/ccc 99 echo send 100 ) | ${nsupdate} "$@" 101 break 2 102 ;; 103 a) 104 break 2 105 ;; 106 d) 107 cat ${dir}/ccc | more 108 ;; 109 r) 110 cp ${dir}/ooo ${dir}/new 111 break 112 ;; 113 m) 114 break 115 ;; 116 esac 117 done 118 else 119 while : 120 do 121 echo ${echo_arg} "Abort (a), Redo (r), Modify (m) : $bsc" 122 read ans 123 case "$ans" in 124 a) 125 break 2 126 ;; 127 r) 128 cp ${dir}/ooo ${dir}/new 129 break 130 ;; 131 m) 132 break 133 ;; 134 esac 135 done 136 fi 137 else 138 while : 139 do 140 echo ${echo_arg} "Abort (a), Redo (r), Modify (m) : $bsc" 141 read ans 142 case "$ans" in 143 a) 144 break 2 145 ;; 146 r) 147 cp ${dir}/ooo ${dir}/new 148 break 149 ;; 150 m) 151 break 152 ;; 153 esac 154 done 155 fi 156 fi 157 done 158fi 159