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