1 1.1 christos #!/bin/sh 2 1.1.1.4 christos # 3 1.1 christos # Copyright (C) Internet Systems Consortium, Inc. ("ISC") 4 1.1 christos # 5 1.1.1.3 christos # SPDX-License-Identifier: MPL-2.0 6 1.1.1.3 christos # 7 1.1 christos # This Source Code Form is subject to the terms of the Mozilla Public 8 1.1.1.4 christos # License, v. 2.0. If a copy of the MPL was not distributed with this 9 1.1.1.2 christos # file, you can obtain one at https://mozilla.org/MPL/2.0/. 10 1.1 christos # 11 1.1 christos # See the COPYRIGHT file distributed with this work for additional 12 1.1 christos # information regarding copyright ownership. 13 1.1 christos 14 1.1 christos dir=/tmp/zone-edit.$$ 15 1.1 christos mkdir ${dir} || exit 1 16 1.1 christos trap "/bin/rm -rf ${dir}" 0 17 1.1 christos 18 1.1 christos prefix=@prefix@ 19 1.1 christos exec_prefix=@exec_prefix@ 20 1.1 christos bindir=@bindir@ 21 1.1 christos 22 1.1 christos dig=${bindir}/dig 23 1.1.1.4 christos checkzone=${bindir}/named-checkzone 24 1.1 christos nsupdate=${bindir}/nsupdate 25 1.1 christos 26 1.1 christos case $# in 27 1.1.1.4 christos 0) 28 1.1.1.4 christos echo "Usage: zone-edit <zone> [dig options] [ -- nsupdate options ]" 29 1.1.1.4 christos exit 0 30 1.1.1.4 christos ;; 31 1.1 christos esac 32 1.1 christos 33 1.1 christos # What kind of echo are we using? 34 1.1.1.4 christos try=$(echo -n "") 35 1.1.1.4 christos if test "X$try" = "X-n "; then 36 1.1.1.4 christos echo_arg="" 37 1.1.1.4 christos bsc="\\c" 38 1.1 christos else 39 1.1.1.4 christos echo_arg="-n" 40 1.1.1.4 christos bsc="" 41 1.1 christos fi 42 1.1 christos 43 1.1 christos zone="${1}" 44 1.1 christos shift 45 1.1 christos digopts= 46 1.1.1.4 christos while test $# -ne 0; do 47 1.1.1.4 christos case "${1}" in 48 1.1 christos --) 49 1.1.1.4 christos shift 50 1.1.1.4 christos break 51 1.1.1.4 christos ;; 52 1.1 christos *) 53 1.1.1.4 christos digopts="$digopts $1" 54 1.1.1.4 christos shift 55 1.1.1.4 christos ;; 56 1.1.1.4 christos esac 57 1.1 christos done 58 1.1 christos 59 1.1.1.4 christos ${dig} axfr "$zone" $digopts \ 60 1.1.1.4 christos | awk '$4 == "RRSIG" || $4 == "NSEC" || $4 == "NSEC3" || $4 == "NSEC3PARAM" { next; } { print; }' >${dir}/old 61 1.1 christos 62 1.1.1.4 christos if test -s ${dir}/old; then 63 1.1.1.4 christos ${checkzone} -q -D "$zone" ${dir}/old >${dir}/ooo 64 1.1 christos fi 65 1.1 christos 66 1.1.1.4 christos if test -s ${dir}/ooo; then 67 1.1.1.4 christos cp ${dir}/ooo ${dir}/new 68 1.1.1.4 christos while :; do 69 1.1.1.4 christos if ${VISUAL:-${EDITOR:-/bin/ed}} ${dir}/new; then 70 1.1.1.4 christos if ${checkzone} -q -D "$zone" ${dir}/new >${dir}/nnn; then 71 1.1.1.4 christos sort ${dir}/ooo >${dir}/s1 72 1.1.1.4 christos sort ${dir}/nnn >${dir}/s2 73 1.1.1.4 christos comm -23 ${dir}/s1 ${dir}/s2 \ 74 1.1.1.4 christos | sed 's/^/update delete /' >${dir}/ccc 75 1.1.1.4 christos comm -13 ${dir}/s1 ${dir}/s2 \ 76 1.1.1.4 christos | sed 's/^/update add /' >>${dir}/ccc 77 1.1.1.4 christos if test -s ${dir}/ccc; then 78 1.1.1.4 christos cat ${dir}/ccc | more 79 1.1.1.4 christos while :; do 80 1.1.1.4 christos echo ${echo_arg} "Update (u), Abort (a), Redo (r), Modify (m), Display (d) : $bsc" 81 1.1.1.4 christos read ans 82 1.1.1.4 christos case "$ans" in 83 1.1.1.4 christos u) 84 1.1.1.4 christos ( 85 1.1.1.4 christos echo zone "$zone" 86 1.1.1.4 christos cat ${dir}/ccc 87 1.1.1.4 christos echo send 88 1.1.1.4 christos ) | ${nsupdate} "$@" 89 1.1.1.4 christos break 2 90 1.1.1.4 christos ;; 91 1.1.1.4 christos a) 92 1.1.1.4 christos break 2 93 1.1.1.4 christos ;; 94 1.1.1.4 christos d) 95 1.1.1.4 christos cat ${dir}/ccc | more 96 1.1.1.4 christos ;; 97 1.1.1.4 christos r) 98 1.1.1.4 christos cp ${dir}/ooo ${dir}/new 99 1.1.1.4 christos break 100 1.1.1.4 christos ;; 101 1.1.1.4 christos m) 102 1.1.1.4 christos break 103 1.1.1.4 christos ;; 104 1.1.1.4 christos esac 105 1.1.1.4 christos done 106 1.1.1.4 christos else 107 1.1.1.4 christos while :; do 108 1.1.1.4 christos echo ${echo_arg} "Abort (a), Redo (r), Modify (m) : $bsc" 109 1.1.1.4 christos read ans 110 1.1.1.4 christos case "$ans" in 111 1.1.1.4 christos a) 112 1.1.1.4 christos break 2 113 1.1.1.4 christos ;; 114 1.1.1.4 christos r) 115 1.1.1.4 christos cp ${dir}/ooo ${dir}/new 116 1.1.1.4 christos break 117 1.1.1.4 christos ;; 118 1.1.1.4 christos m) 119 1.1.1.4 christos break 120 1.1.1.4 christos ;; 121 1.1.1.4 christos esac 122 1.1.1.4 christos done 123 1.1 christos fi 124 1.1.1.4 christos else 125 1.1.1.4 christos while :; do 126 1.1.1.4 christos echo ${echo_arg} "Abort (a), Redo (r), Modify (m) : $bsc" 127 1.1.1.4 christos read ans 128 1.1.1.4 christos case "$ans" in 129 1.1.1.4 christos a) 130 1.1.1.4 christos break 2 131 1.1.1.4 christos ;; 132 1.1.1.4 christos r) 133 1.1.1.4 christos cp ${dir}/ooo ${dir}/new 134 1.1.1.4 christos break 135 1.1.1.4 christos ;; 136 1.1.1.4 christos m) 137 1.1.1.4 christos break 138 1.1.1.4 christos ;; 139 1.1.1.4 christos esac 140 1.1.1.4 christos done 141 1.1.1.4 christos fi 142 1.1.1.4 christos fi 143 1.1.1.4 christos done 144 1.1 christos fi 145