Home | History | Annotate | Line # | Download | only in scripts
      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