#!/bin/bash
#
# test_networker
#
# Satus der Networker Datensicherungen ans ULS schicken
#
########################################################
#
NSRPORT=7937
#
if which netcat >/dev/null 2>&1
 then
  NETCAT=netcat
elif which nc >/dev/null 2>&1
 then
  NETCAT=nc
else
  NETCAT=true
fi
#
. `dirname $0`/uls_header
#
if [[ -x /opt/nsr/mminfo ]]
 then
  MMINFO=/opt/nsr/mminfo
elif [[ -x /usr/sbin/mminfo ]]
 then
  MMINFO=/usr/sbin/mminfo
else
  echo "Networker not found"
  exit 0
fi
NSRSCOUNT=`tr -d '\015' </nsr/res/servers | grep -v ' *#' | sed 's/,/ /g' | wc -w`
if [[ $NSRSCOUNT -lt 1 ]]
 then
  exit 0
fi
( echo "D;$DT;$ULSHOSTNAME;Backup;Networker;"
  SRV=""
  LSRV="#"
  ( mount | sort | awk '$1 ~ "^/dev" && $1 !~ "/dev/loop" && $3 !~ "media" && $(NF-1) !~ "9660" {if(!m[$1]++)print "M;" $3}' | sort
    for NSRSERVER in `tr -d '\015' </nsr/res/servers | egrep -v ' *#|^ *$' | sed 's/,/ /g' | sort -u`
     do
      if [[ ${NSRSERVER#$LSRV.} = $NSRSERVER && -n "$NSRSERVER" ]]
       then
        if ping -c 1 -w 5 $NSRSERVER >/dev/null 2>&1 && netcat -z -w 5 $NSRSERVER $NSRPORT
         then
          LSRV=$NSRSERVER
          if [[ $NSRSCOUNT -gt 1 ]]
           then
            SRV=$NSRSERVER
          fi
          echo "NSR;$SRV"
          $MMINFO -s $NSRSERVER -ot -t '-3 day' -xc';' -q "client=`hostname`,level>full" -r 'name,level,nsavetime,totalsize,nfiles,ssflags' 2>/dev/null
          if ! $MMINFO -s $NSRSERVER -ot -t '-8 day' -xc';' -q "client=`hostname`,level=full" -r 'name,level,nsavetime,totalsize,nfiles,ssflags' 2>/dev/null
           then
            $MMINFO -s $NSRSERVER -ot -xc';' -q "client=`hostname`,level=full" -r 'name,level,nsavetime,totalsize,nfiles,ssflags' 2>/dev/null
          fi
          if [[ -f /etc/uls/test_networker.conf ]]
           then
            awk -F '[ \t]*#' '$1 ~ ":"{print $1}' /etc/uls/test_networker.conf | sed 's/:/,name=/' | while read n
             do
              $MMINFO -s $NSRSERVER -ot -t '-3 day' -xc';' -q "client=$n,level>full" -r 'name,level,nsavetime,totalsize,nfiles,ssflags' 2>/dev/null
              if ! $MMINFO -s $NSRSERVER -ot -t '-8 day' -xc';' -q "client=$n,level=full" -r 'name,level,nsavetime,totalsize,nfiles,ssflags' 2>/dev/null
               then
                $MMINFO -s $NSRSERVER -ot -xc';' -q "client=$n,level=full" -r 'name,level,nsavetime,totalsize,nfiles,ssflags' 2>/dev/null
              fi
            done
          fi
        fi
      fi
    done
        ) | awk -F ';' -v SRV=$SRV '
$1 == "NSR"  { SRV = $2 }
$1 == "M"    { lastfull[$2] = 0
               lastlevel[$2] = 0
               mp[$2] = 1
             }
$4 ~ "[0-9]" { t = strftime("%Y-%m-%d %T", $3)
               if( $4 > 0 )
               { f = 3 - log($4/1048576)/2.3
                 if( f < 0 )
                   f = 0
                 if( (d = index($1, ":")) )
                 { m = substr($1, 1, d-1)
                   r = substr($1, d+1)
                   printf("U;%s;;;Networker:%s;Path;%s;\n", t, m, r)
                 }
                 else
                   m = $1
                 if( $2 == "manual" )
                 { if( !lastmanual[m] || $3 > lastmanual[m] )
                     lastmanual[m] = $3
                 }
                 else if( mp[m] )
                 { if( $2 == "full" )
                   { if( $3 > lastfull[m] )
                       lastfull[m] = $3
                   }
                   else
                   { if( $3 > lastlevel[m] )
                       lastlevel[m] = $3
                   }
                 }
                 if( $2 != "" )
                   printf("U;%s;;;Networker:%s;Level;%s;\n", t, m, $2)
                 printf("U;%s;;;Networker:%s;Size;%0.*f;MByte\n", t, m, f, $4/1048576)
                 printf("U;%s;;;Networker:%s;Files;%d;#\n", t, m, $5)
                 if( SRV )
                   printf("U;%s;;;Networker:%s;NSR-Server;%s;\n", t, m, SRV)
                 if( $6 ~ "i" )
                   printf("U;%s;;;Networker:%s;status;aborted;\n", t, m)
               }
             }
END { today = strftime("%Y-%m-%d 00:00:00")
      todaysec = mktime(strftime("%Y %m %d 00 00 00"))
      for( m in mp )
      { if( mp[m] == 1 )
        { if( lastfull[m] == 0 )
            printf("U;%s;;System;Disk Space:%s;last full backup;0000-00-00 00:00:00;{DT}\n", today, m)
          else if( lastfull[m] < todaysec )
            printf("U;%s;;System;Disk Space:%s;last full backup;%s;{DT}\n", today, m, strftime("%Y-%m-%d %T", lastfull[m]))
          else
            printf("U;%s;;System;Disk Space:%s;last full backup;%s;{DT}\n", strftime("%Y-%m-%d %T", lastfull[m]), m, strftime("%Y-%m-%d %T", lastfull[m]))
          if( lastlevel[m] == 0 )
            printf("U;%s;;System;Disk Space:%s;last level backup;0000-00-00 00:00:00;{DT}\n", today, m)
          else if( lastlevel[m] < todaysec )
            printf("U;%s;;System;Disk Space:%s;last level backup;%s;{DT}\n", today, m, strftime("%Y-%m-%d %T", lastlevel[m]))
          else
            printf("U;%s;;System;Disk Space:%s;last level backup;%s;{DT}\n", strftime("%Y-%m-%d %T", lastlevel[m]), m, strftime("%Y-%m-%d %T", lastlevel[m]))
        }
      }
      for( m in lastmanual )
      { if( lastmanual[m] && mp[m] )
        { if( lastmanual[m] < todaysec )
            printf("U;%s;;System;Disk Space:%s;last manual backup;%s;{DT}\n", today, m, strftime("%Y-%m-%d %T", lastmanual[m]))
          else
            printf("U;%s;;System;Disk Space:%s;last manual backup;%s;{DT}\n", strftime("%Y-%m-%d %T", lastmanual[m]), m, strftime("%Y-%m-%d %T", lastmanual[m]))
        }
      }
    }'
) | send_test_tab
