Home Dokumentacje Automatyczne uaktualnienie named.ca
21 | 10 | 2019
Automatyczne uaktualnienie named.ca

Skrypt jest zmodyfikowaną wersją skryptu z dokumentu DNS-HOWTO

#!/bin/bash

# Uaktualnienie informacji serwera bind o root serwerach.
# Można uruchamiać skrypt jako zadanie kron raz na miesiąc.
#
# Janusz Brzeski
# Dodano sprawdzenie czy plik się zmienił.
# Jeżeli tak to wykonujemy uaktualnienie
# Jeżeli nie to pomijamy
# Dodano sprawdzenie czy reload zakończył się powodzeniem, wysyłanie powiadomienia
# do listy adresów. (Wymaga skonfigurowanego demona SMTP), zapis wiadomości do pliku.
#
# Original by Al Longyear
# Updated for BIND 8 by Nicolai Langfeldt
# Miscelanious error-conditions reported by David A. Ranch
# Ping test suggested by Martin Foster
# named up-test suggested by Erik Bryer.
########################PARAMETRY####################################################
# Lista administratorów (gdzie wysłać pocztę) - adresy oddzielone spacjami 
LISTA="adres_email1 adres_email2"
# Czy wysyłać pocztę ? [TAK/cokolwiek] 
POCZTA="TAK"
# Czy zapisywać wiadomości do pliku  ? [TAK/cokolwiek]  
LOGOWANIE="TAK"
UPDATE_PATH="/var/spool/bind/update-root"
BIND_ROOT_PATH="/chroot/dns/var/bind"
BIND_ROOT_FILE="named.ca"
# Nazwa pliku z wiadomościami
LOG_FILE="/var/log/update-${BIND_ROOT_FILE}.log"
########################################KOD###########################################
# Jeżeli nie ma katalogu do uaktualnienia to utwórz go 
if [ ! -d ${UPDATE_PATH} ] ; then
    mkdir -p ${UPDATE_PATH} 
fi
(
# Sprawdzenie czy jest łączność
case `rndc status 2>&1` in 
 *refused*)
    echo "Subject: Serwerbind nie działa." > ${UPDATE_PATH}/temat.txt
    echo > ${UPDATE_PATH}/komunikat.txt
    echo "Serwis nie działa. Nie ma potrzeby uaktualnienia ${BIND_ROOT_FILE}."
    echo
    exit 0
    ;;
esac
case `ping -qnc 1 some.machine.net 2>&1` in 
*'100% packet loss'*)
    echo "Subject: ${BIND_ROOT_FILE} nie pobrane.  Nie działa sieć." > ${UPDATE_PATH}/temat.txt
    echo > ${UPDATE_PATH}/komunikat.txt
    echo "Brak możliwości uaktualnienia." >> ${UPDATE_PATH}/komunikat.txt
    exit 1
    ;;
esac
if [ ! -d ${BIND_ROOT_PATH} ] ; then
    echo "Subject: Brak katalogu ${BIND_ROOT_PATH}" > ${UPDATE_PATH}/temat.txt
    echo > ${UPDATE_PATH}/komunikat.txt
    echo "Awaria brak katalagu ${BIND_ROOT_PATH} !!!" >> ${UPDATE_PATH}/komunikat.txt
    exit 1
fi
dig @e.root-servers.net . ns >${UPDATE_PATH}/${BIND_ROOT_FILE}.new 2> ${UPDATE_PATH}/errors
case `cat ${UPDATE_PATH}/${BIND_ROOT_FILE}.new` in
*NOERROR*)
    # O.K
    :;;
*)
    echo "Subject: Pobranie pliku ${BIND_ROOT_FILE} zakończone błędem." > ${UPDATE_PATH}/temat.txt
    echo > ${UPDATE_PATH}/komunikat.txt
    echo "Pobranie pliku ${BIND_ROOT_FILE} zakończone błędem." >> ${UPDATE_PATH}/komunikat.txt 
    echo "Wyjście komendy dig raportuje:" >> ${UPDATE_PATH}/komunikat.txt
    echo >> ${UPDATE_PATH}/komunikat.txt
    cat ${UPDATE_PATH}/${BIND_ROOT_FILE}.new ${UPDATE_PATH}/errors >> ${UPDATE_PATH}/komunikat.txt
    exit 1
    ;;
esac
cat ${UPDATE_PATH}/${BIND_ROOT_FILE}.new | grep ROOT-SERVERS | sort > ${UPDATE_PATH}/${BIND_ROOT_FILE}.new.sort
cat ${BIND_ROOT_PATH}/${BIND_ROOT_FILE} | grep ROOT-SERVERS | sort > ${UPDATE_PATH}/${BIND_ROOT_FILE}.old.sort
if [ ! -f ${UPDATE_PATH}/${BIND_ROOT_FILE}.old.sort ]; then
    touch ${UPDATE_PATH}/${BIND_ROOT_FILE}.old.sort
fi
if [ ! -f ${UPDATE_PATH}/${BIND_ROOT_FILE}.old ]; then
    touch ${UPDATE_PATH}/${BIND_ROOT_FILE}.old
fi
cmp -s ${UPDATE_PATH}/${BIND_ROOT_FILE}.old.sort ${UPDATE_PATH}/${BIND_ROOT_FILE}.new.sort
if [ $? = 0 ] ;then
echo "Subject: Nic się nie zmieniło pliki ${BIND_ROOT_FILE} takie same." > ${UPDATE_PATH}/temat.txt
    echo > ${UPDATE_PATH}/komunikat.txt
    echo "Nie ma potrzeby uaktualnienia." >> ${UPDATE_PATH}/komunikat.txt 
    echo "Procedura uaktualnienia pliku ${BIND_ROOT_PATH}/${BIND_ROOT_FILE} została zatrzymana." >> \
                                                                                  ${UPDATE_PATH}/komunikat.txt
    echo >> ${UPDATE_PATH}/komunikat.txt
    exit 1
else
# Wykonuje update plików
    rm -f ${BIND_ROOT_PATH}/${BIND_ROOT_FILE}.old
    mv ${BIND_ROOT_PATH}/${BIND_ROOT_FILE} ${BIND_ROOT_PATH}/${BIND_ROOT_FILE}.old
    mv ${UPDATE_PATH}/${BIND_ROOT_FILE}.new ${BIND_ROOT_PATH}/${BIND_ROOT_FILE}
    chown named.named ${BIND_ROOT_PATH}/${BIND_ROOT_FILE}
    chmod 644 ${BIND_ROOT_PATH}/${BIND_ROOT_FILE}
# Definiowanie komunikatu (wiadomości)
    echo "Subject: Plik ${BIND_ROOT_PATH}/${BIND_ROOT_FILE} został uaktualniony" > ${UPDATE_PATH}/temat.txt
    echo > ${UPDATE_PATH}/komunikat.txt
    echo "Plik ${BIND_ROOT_FILE} zawiera teraz:" >> ${UPDATE_PATH}/komunikat.txt
    echo >> ${UPDATE_PATH}/komunikat.txt
    cat ${BIND_ROOT_PATH}/${BIND_ROOT_FILE} >> ${UPDATE_PATH}/komunikat.txt
# Przeładowanie serwisu i sprawdzenie czy się wykonało
case `rndc reload 2>&1` in 
 "server reload successful")
    echo >> ${UPDATE_PATH}/komunikat.txt
    echo "Przeładowano serwis. Koniec uaktualienia ${BIND_ROOT_FILE}." >> ${UPDATE_PATH}/komunikat.txt
    echo "Poprzednia wersja ${BIND_ROOT_FILE} jest zapisana w pliku   
    ${BIND_ROOT_PATH}/${BIND_ROOT_FILE}.old" >> ${UPDATE_PATH}/komunikat.txt
    exit 0
    ;;
esac
    echo "Subject: Plik ${BIND_ROOT_PATH}/${BIND_ROOT_FILE} został uaktualniony. Błąd przy przeładowaniu."\
 > ${UPDATE_PATH}/temat.txt
    echo >> ${UPDATE_PATH}/komunikat.txt
    echo "Koniec uaktualienia. Próba przeładowania zakończona błędem !!! " >> ${UPDATE_PATH}/komunikat.txt
    echo "Wymagana interwencja administratora !!! " >> ${UPDATE_PATH}/komunikat.txt
    echo "Poprzednia wersja ${BIND_ROOT_FILE} jest zapisana w pliku   
    ${BIND_ROOT_PATH}/${BIND_ROOT_FILE}.old" >> ${UPDATE_PATH}/komunikat.txt
    exit 1
fi
)
# Zapamiętanie kodu zakończenia
KONIEC=$?
# Wysyłanie wiadomości.
if [ "${POCZTA}" = "TAK" ]; then
for ADRESAT in ${LISTA}; do
    (
	echo "To: <$ADRESAT>"
	echo "From: System <root>"
	cat ${UPDATE_PATH}/temat.txt
	echo "Content-Type: text/html; charset=\"UTF-8\""
	echo "MIME-Version: 1.0"
	echo "Content-Transfer-Encoding: 8bit"
	echo
	cat ${UPDATE_PATH}/komunikat.txt
     ) >&1 | sendmail -t
done
fi
# Zapisanie do logów
if [ "${LOGOWANIE}" = "TAK" ]; then
    DATA_CZAS=`date +"%d-%m-%Y %H:%M"`
    echo -n "${DATA_CZAS}         " >> ${LOG_FILE}
    cat ${UPDATE_PATH}/temat.txt >> ${LOG_FILE}
    cat ${UPDATE_PATH}/komunikat.txt >> ${LOG_FILE}
fi
# Wyjście z kodem zakończenia.
exit ${KONIEC}
 
Linki sponsorowane

W celu realizacji usług i funkcji na witrynach internetowych ZUI "ELPRO" stosujemy pliki cookies. Korzystanie z witryny bez zmiany ustawień dotyczących plików cookies oznacza, że będą one zapisywane w urządzeniu wyświetlającym stronę internetową. Więcej szczegółów w Polityce plików cookies.

Akceptuję pliki cookies z tej witryny.