#!/bin/bash # modify by Puppet !!! # verze:2.1 # defunije funkce pushLog() Notify() makePID() removePID() # autor: Ales Cernik # : <<'COMMENT' Skrypt init_sets.sh to uniwersalny plik pomocniczy (tzw. plik konfiguracyjny/biblioteczny), który jest wczytywany (poprzez polecenie source lub .) przez inne skrypty Bash, aby zapewnić im standaryzowane środowisko pracy. Z komentarzy wynika, że jest on zarządzany automatycznie przez system Puppet. Oto co dokładnie robi i jakie funkcje udostępnia: 1. Inicjalizacja zmiennych i środowiska Ustalenie nazwy uruchomionego skryptu (myScript) w celu ujednolicenia nazewnictwa plików. Ustalenie katalogu logów (logDir). Skrypt szuka katalogu /opt/log, a jeśli go nie ma, próbuje /srv/log. Jeśli żaden nie istnieje – przerywa działanie z błędem. Ustalenie ścieżki docelowego pliku z logami (logFile), np. /opt/log/nazwa_twojego_skryptu.sh.log. Pobranie nazwy hosta (myHost) oraz definicja adresu serwera monitoringu Nagios/Centreon (NAGIOSHOST="centreon.bisnode.cz"). Utworzenie ścieżki do pliku blokady/PID w /tmp/ dla danego skryptu (lock_file). 2. Definicje przydatnych funkcji (do użycia w innych skryptach) Skrypt definiuje cztery główne funkcje, z których mogą korzystać skrypty nadrzędne: pushLog() Zwykła funkcja logująca, która dopisuje przekazane do niej argumenty (tekst) na koniec zdefiniowanego pliku logu. Notify() Służy do wysyłania pasywnych powiadomień do systemu monitoringu (Centreon/Nagios). Przyjmuje kod statusu (0=OK, 1=Warning, 2=Error) oraz wiadomość. Zapisuje wiadomość do lokalnego logu używając pushLog, a następnie wysyła alert do serwera Nagios za pomocą narzędzia send_nsca. makePID() Implementuje mechanizm wyłączności (mutex), zapobiegając równoległemu uruchomieniu kilku instancji tego samego skryptu. Czyta identyfikator procesu (PID) z pliku blokady. Sprawdza w systemowym katalogu /proc/, czy proces o takim PID nadal żyje. Jeśli proces działa – funkcja bezgłośnie przerywa działanie kolejnej instancji skryptu. Jeśli proces nie działa, zapisuje bieżący PID ($$) do pliku blokady i pozwala skryptowi kontynuować działanie. W razie błędu przy zapisie powiadamia Nagiosa i kończy z błędem. removePID() Funkcja sprzątająca – po prostu usuwa plik blokady (PID), aby zwolnić "kolejkę" dla kolejnych uruchomień skryptu. Podsumowując: Jest to klasyczna "namiastka biblioteki" dla skryptów administracyjnych, ujednolicająca sposób ich logowania, raportowania błędów do systemu monitoringu oraz chroniąca przed zduplikowanym uruchomieniem zadań w tle (cron). COMMENT myScript=${0##*/} #myPath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" #" export logDir=${logDir:="/opt/log"} [ ! -d $logDir ] && logDir="/srv/log" [ ! -d $logDir ] && { "Neexistuje $logDir"; exit 1;} logFile=${logDir}/${myScript}.log myHost=$(/bin/hostname -a) NAGIOSHOST="centreon.bisnode.cz" lock_file=/tmp/${myScript}.pid pushLog () { echo "$1 $2 $3 $4 $5 $6 $7 $8 $9" >>$logFile } Notify () { # $1 - status 0=OK, 1=Warning, 2=Error $2 message if [ ${NAGIOSHOST} != "" ]; then pushLog $2 /bin/echo -e "${myHost};${myScript};${1};${2}" | /usr/sbin/send_nsca -H ${NAGIOSHOST} -d \; fi } ## vyhradni spousteni procesu makePID () { cat /dev/null >> $lock_file || { Notify 2 "nelze udelat PID file"; exit 1;} read lastPID < $lock_file # if lastPID is not null and a process with that pid exists , exit [ ! -z "$lastPID" -a -d /proc/$lastPID ] && exit [ -z $$ ] && { Notify 2 "Chybi PID parametr" ; exit 1; } echo $$ > $lock_file || { Notify 2 "Nelze zapsat PID" ; exit 1; } } removePID () { rm $lock_file }