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} |