#!/usr/bin/env bash working_dir="$(dirname $(realpath $0))" conf_file="${working_dir}/conf/bind.conf" log_file="$(mktemp)" #--------------------------------------- #----------------------------- # Base Function(s) #----------------------------- #--------------------------------------- clean_up() { # Perform program exit housekeeping rm $log_file exit $1 } echononl(){ echo X\\c > /tmp/shprompt$$ if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then echo -e -n "$*\\c" 1>&2 else echo -e -n "$*" 1>&2 fi rm /tmp/shprompt$$ } fatal(){ echo "" echo -e "[ \033[31m\033[1mError\033[m ]: $*" echo "" echo -e "\t\033[31m\033[1mScript is canceled\033[m\033[m" echo "" clean_up 1 } warn (){ echo "" echo -e "\t[ \033[33m\033[1mWarning\033[m ]: $*" echo "" } info (){ echo "" echo -e "\t[ \033[33m\033[1mInfo\033[m ]: $*" echo "" } ok (){ echo "" echo -e "\t[ \033[36m\033[1mOk\033[m ]: $*" echo "" } error(){ echo "" echo -e "\t[ \033[31m\033[1mFehler\033[m ]: $*" echo "" } echo_ok() { echo -e "\033[75G[ \033[32mok\033[m ]" } echo_failed(){ echo -e "\033[75G[ \033[1;31mfailed\033[m ]" } echo_skipped() { echo -e "\033[75G[ \033[33m\033[1mskipped\033[m ]" } trap clean_up SIGHUP SIGINT SIGTERM #--------------------------------------- #----------------------------- # Setting Defaults #----------------------------- #--------------------------------------- DEFAULT_CONF_FILE_DIR="/etc/bind" #--------------------------------------- #----------------------------- # Load default values from bind.conf # # Overwrites the settings above # #----------------------------- #--------------------------------------- #clear echo "" echo "" echononl " Loading default Configuration values from $(basename ${conf_file}).." if [[ ! -f "$conf_file" ]]; then echo_skipped else source "${conf_file}" > $log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed fatal "$(cat $log_file)" fi fi [[ -n "$CONF_FILE_DIR" ]] && DEFAULT_CONF_FILE_DIR="$CONF_FILE_DIR" if [[ -n "$ZONES_DECLARATION_FILE" ]] ; then DEFAULT_ZONES_DECLARATION_FILE="$ZONES_DECLARATION_FILE" else DEFAULT_ZONES_DECLARATION_FILE="${CONF_FILE_DIR}/named.conf.local" fi echo "" echo "Insert directory containing the bind configuration files." echo "" CONF_FILE_DIR="" if [[ -n "$DEFAULT_CONF_FILE_DIR" ]] ; then echononl "Bind Configuration Directory [${DEFAULT_CONF_FILE_DIR}]: " read CONF_FILE_DIR if [[ "X$CONF_FILE_DIR" = "X" ]]; then CONF_FILE_DIR="$DEFAULT_CONF_FILE_DIR" fi else echononl "Bind Configuration Directory: " read CONF_FILE_DIR while [ "X$CONF_FILE_DIR" = "X" ] ; do echo -e "\n\t\033[33m\033[1mSetting 'Bind Configuration Directory' is required!\033[m\n" echononl "Bind Configuration Directory: " read CONF_FILE_DIR done fi [[ -n "$ZONES_DECLARATION_FILE" ]] || DEFAULT_ZONES_DECLARATION_FILE="${CONF_FILE_DIR}/named.conf.local" echo "" echo -e "\033[32m--\033[m" echo "" echo "Insert zones declaration file." echo "" ZONES_DECLARATION_FILE="" if [[ -n "$DEFAULT_ZONES_DECLARATION_FILE" ]] ; then echononl "Zones Declaration File [${DEFAULT_ZONES_DECLARATION_FILE}]: " read ZONES_DECLARATION_FILE if [[ "X$ZONES_DECLARATION_FILE" = "X" ]]; then ZONES_DECLARATION_FILE="$DEFAULT_ZONES_DECLARATION_FILE" fi else echononl "Zones Declaration File: " read ZONES_DECLARATION_FILE while [ "X$ZONES_DECLARATION_FILE" = "X" ] ; do echo -e "\n\t\033[33m\033[1mSetting 'Zones Declaration File' is required!\033[m\n" echononl "Zones Declaration File: " read ZONES_DECLARATION_FILE done fi clear echo "" echo "" echo -e "\033[21G\033[32mReload all (master) Zones\033[m" echo "" echo "" echo "Bind Configuration Directory......: $CONF_FILE_DIR" echo "Zones Declaration File............: $ZONES_DECLARATION_FILE" echo "" OK= while [ "$OK" != "yes" -o "$OK" != "no" ] ; do echononl "Parameters ok? [yes/no]: " read OK ## - To lower case OK=${OK,,} if [ "X$OK" = "X" ]; then echo -e "\n\t\033[33m\033[1mAn entry is required!\033[m\n" OK="" continue fi if [ "$OK" = "yes" -o "$OK" = "no" ] ; then break else OK="" continue fi echo -e "\n\t\033[33m\033[1mWrong entry!\033[m\n" done [[ $OK = "yes" ]] || fatal Repeat execution with different parameters echo "" ## - Read Zonefile line by line ## - ## - || [[ -n $line ]] prevents the last line from being ignored if it doesn't end with a \n ## - declare -i number=0 regex_master="type[[:space:]]+master" while IFS='' read -r line || [[ -n "$line" ]] ; do if [[ $line =~ ^\s*zone ]]; then zone=`echo $line | awk '{print$2}'` shopt -s extglob if [[ $zone =~ ^\" ]]; then zone=${zone##*(\")} zone=${zone%%*(\")} fi shopt -u extglob fi if [[ $line =~ $regex_master ]]; then echononl "\tReload Zone \"$zone\"" /usr/sbin/rndc reload $zone > /dev/null 2>&1 if [ "$?" = "0" ]; then echo_ok let number="$number+1" sleep 1 else echo_failed fi fi done < $ZONES_DECLARATION_FILE [[ $number -eq 0 ]] && info "No Zonedefinition (master) found in file $ZONES_DECLARATION_FILE ." info $number Zones reloaded. echo clean_up 0