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