Laufzeitdaten und Status aktiver Sicherungsgruppen
Das folgende Script ermittelt die aktiven Networker- Sicherungsgruppen, sucht die letzte Sicherung und listet diese mit Laufzeitdaten und Status auf.Das Ergebnis wird als Mail an den lokalen Benutzer root versendet.
Die ermittelten Daten werden für spätere Auswertungen in einem History- File gesammelt.
Vorbereitung
Das Script check-nsr_group_runtime benötigt einige Voreinstellungen. Die Werte von "Arbeitsverzeichnis", "Template-Verzeichnis" und "HOME-Verzeichnis" müssen durch der Umgebung entsprechende Pfade angepasst werden.Im Arbeitsverzeichnis werden ebenfalls die History- Daten gesammelt.
Die Basis der Befehle beruht auf Solaris. Einige Funktionen, z.B. des "date" Befehls müssen hier im Gegensatz zu Linux erst durch kleinere Umwege bereitgestellt werden.
Die Scripte "vortag" und "check-nsr_group_runtime" müssen in das durch die Variable "HOME-Verzeichnis" definierte Verzeichnis abgelegt werden.
Script check-nsr_group_runtime
#!/bin/ksh
############################################################
### © Norbert Ditterich, für Wieland Electric GmbH ###
############################################################
### ###
### dieses Script ermittelt die aktiven Networker- ###
### Sicherungsgruppen, sucht die letzte Sicherung und ###
### listet diese mit Laufzeitdaten und Status auf. ###
### ###
### Die Daten werden fuer eventuelle spaetere ###
### Auswertungen in einem Historyfile gesammelt. ###
### ###
### Das Ergebnis wird als Mail an root geschickt. ###
### ###
############################################################
###
W="{Arbeitsverzeichnis}/check-nsr_group_runtime"; export W
T="{Template-Verzeichnis}/check-group_runtime"; export T
H="{HONE-VErzeichnis}"; export H
heute=`date +%y/%m/%d`
gestern=`${H}/vortag|awk '{split($1,a,"/")} END{print a[3]"/"a[1]"/"a[2]}'`
# tmp-Dateien löschen
if [ -f ${W}.tmp1 ]
then
rm ${W}.tmp*
fi
### alle Sicherungsgruppen aus Networker ermitteln und in Workdatei stellen
/usr/sbin/nsradmin -i ${T}.nsr-groups> ${W}.tmp1
sed 'N;N;;s/\n/:/' ${W}.tmp1|grep name|tr ";" ':'|grep Enabled |grep -v redo|cut -f2 -d':'|cut -f2 -d' '> ${W}.tmp-nsr-savegroups
### pro Savegroup die letzte Sicherung ermitteln
for savegroup in `cat ${W}.tmp-nsr-savegroups`
do
sed "s/xxxxxx/${savegroup}/" ${T}.query >${W}.query
/usr/sbin/jobquery -i ${W}.query |tr ";" ':' |grep ':' |sed 'N;N;s/\n/:/g'|sed 's/ / /g' |sort -nk9 |tail -1 >${W}.tmp2
start=`awk ' { print $9 } ' ${W}.tmp2|cut -f1 -d':'`;export start
ende=`awk ' { print $6 } ' ${W}.tmp2|cut -f1 -d':'`;export ende
status=`awk ' { print $3 } ' ${W}.tmp2|cut -f1 -d':'`
laufzeit=`expr ${ende} - ${start}`
/usr/bin/perl -e 'use POSIX qw(strftime);print strftime("%y/%m/%d_%H:%M:%S",localtime(`echo \$start`));'>${W}.tmp0
starto=`cat ${W}.tmp0`
if [ ${laufzeit} = 0 ]
then
laufzeitmin=0
else
laufzeitmin=`expr ${laufzeit} \/ 60`
fi
/usr/bin/perl -e 'use POSIX qw(strftime);print strftime("%y/%m/%d_%H:%M:%S",localtime(`echo \$ende`));'>${W}.tmp0
endeo=`cat ${W}.tmp0`
echo "${savegroup} ${starto} ${endeo} ${laufzeitmin} ${status} ${laufzeit}" >>${W}.tmp3
done
#### Prüfen, ob alte Sicherungen (nicht von heute und gestern) mit dabei sind und kennzeichnen
for laufdatum in `cat ${W}.tmp3 |cut -f2 -d' '|cut -f1 -d'_'`
do
if [ ${laufdatum} = ${heute} ]
then
echo "OK" >>${W}.tmp5
else
if [ ${laufdatum} = ${gestern} ]
then
echo "OK" >>${W}.tmp5
else
echo "NOK" >>${W}.tmp5
fi
fi
done
paste ${W}.tmp3 ${W}.tmp5 >${W}.tmp6
### Ergebnis formatiert ausgeben
FEHLER=0
if [ `grep -c NOK ${W}.tmp5` -gt 0 ]
then
FEHLER=1
fi
if [ `grep -c fail ${W}.tmp3` -gt 0 ]
then
FEHLER=1
fi
if [ ${FEHLER} = 0 ]
then
echo "subject: Networker Laufzeiten\n" > ${W}.tmp-mail
else
echo "subject: Networker Laufzeiten (fehler)\n" > ${W}.tmp-mail
fi
### Status für SMS-Benarchrichtigung ausgeben
FAILED="failed: "
while read line; do
gruppe=`echo $line |awk ' { print $1 } '`
status=`echo $line |awk ' { print $5 } '`
nok=`echo $line |awk ' { print $7 } '`
if [ ${status} = 'failed' ]
then
FAILED="${FAILED} ${gruppe}"
fi
if [ ${nok} = 'NOK' ]
then
FAILED="${FAILED} ${gruppe}(NOK)"
fi
done <${W}.tmp6
if [ `echo ${FAILED}|wc -c` -gt 8 ]
then
echo "${heute}: ${FAILED}" >>${W}.fehler
fi
### Ausgabe für Mail formatieren und Fortschreiben der Laufzeiten in Lofgile
awk ' BEGIN { format = "%-14s %-19s %-19s %5d %11s %8d %7s\n"
print "<Savegroup-> <--Startdatum---> <---Endedatum---> <Min> <-Status> <-Sek> <-OK/NOK->" }
{ printf format, $1, $2, $3, $4, $5, $6, $7 } ' ${W}.tmp6 >${W}.tmp4
sort ${W}.tmp6 >> ${W}.laufzeiten
sort -k1 ${W}.tmp4 >>${W}.tmp-mail
mail root < ${W}.tmp-mail
#cat ${W}.tmp-mail
Script vortag
#! /usr/bin/ksh
# Get yesterday's date in YYYY-MM-DD format.
# With argument N in range 1..28 gets date N days before.
# Tapani Tarvainen January 2002
# This code is in the public domain.
OFFSET=${1:-1}
case $OFFSET
in *[!0-9]* | ???* | 3? | 29) print -u2 "Invalid input" ; exit 1;;
esac
eval `date "+day=%d; month=%m; year=%Y`
typeset -Z2 day month
typeset -Z4 year
# Subtract offset from day, if it goes below one use 'cal'
# to determine the number of days in the previous month.
day=$((day - OFFSET))
if (( day <= 0 )) ;then
month=$((month - 1))
if (( month == 0 )) ;then
year=$((year - 1)) month=12
fi
set -A days `cal $month $year`
xday=${days[$(( ${#days[*]}-1 ))]}
day=$((xday + day))
fi
# print $year-$month-$day
print $month/$day/${year#??}
Templates
#cat check-group_runtime.nsr-groups:
show name
show autostart
print type: NSR group
# cat check-group_runtime.query
show end time
show completion status
show start time
. type: savegroup job; name: xxxxxx