#!/bin/bash
#
# send_patchstatus
# Wichige Patche als Inventory-Datei speichern
#
# Datei wird im ULS bei der Serverdoku gespeichert
# Dateiname: Patchstatus-<servername>.csv.xz
# Inhalt der Datei:
#
# 1. Zeile Header:
# Servername;InventoryDate;Patchname;PatchCreated;Category;Severity;Conflicts
# 2. - n. Zeile pro Patch eine Zeile
#######################################################
#
DT="`date '+%Y-%m-%d %H:%M:%S'`"
#
if which xz >/dev/null 2>&1
 then
  COMPRESS=xz
  EXT=xz
else
  COMPRESS=bzip2
  EXT=bz2
fi
#
OUTFILE=/tmp/Patchstatus-`hostname`.csv
ZYPPERLU=/tmp/zypperlu.out
#
export PATH=/usr/bin:$PATH
#
HOSTNAME=`hostname -s`
if [[ -z "$HOSTNAME" ]]
 then
  HOSTNAME=`hostname`
fi
#
export LANG=C
#
if [[ -n "$HOSTNAME" ]] && which zypper >/dev/null 2>&1
 then
  export DT HOSTNAME
  ( zypper lu >$ZYPPERLU
    echo 'Servername;InventoryDate;Patchname;PatchCreated;Category;Severity;Name;Current;Available'
    zypper lp | awk -F ' *[|] *' '$6 == "needed" {print $2}' | while read P
     do
      zypper patch-info $P | awk -v P="$P" -F ' *: *' '
/^Category/    { category = $2 }
/^Severity/    { severity = $2 }
/^Created On/  { cmd = "date -d \"" gensub("[^:]*: *", "", 1, $0)  "\" \"+%Y-%m-%d %H:%M:%S\""
                 cmd | getline creadate
                 close(cmd)
               }
/Conflicts:/,0 { if( $0 ~ "<" )
                 { gsub("^ *", "", $0)
                   printf("%s;%s;%s;%s|%s\n", P, creadate, category, severity, $0)
                 }
               }'
    done | awk -v ZYPPERLU="$ZYPPERLU" -v H=$HOSTNAME -v DT="$DT" -F ' *[|] *' '
BEGIN { while( 0 < (getline <ZYPPERLU) )
        { curr[$3"."$6] = $4
          avail[$3"."$6] = $5
        }
        close(ZYPPERLU)
        p = 0
      }
{ split($2, a, " *< *")
  if( curr[a[1]] )
  { printf("%s;%s;%s;%s;%s;%s\n", H, DT, $1, a[1], curr[a[1]], avail[a[1]])
    p++
  }
}
END { if( p == 0 )
        printf("%s;%s;;;;\n", H, DT)
    }'
  ) >$OUTFILE
  if [[ -s $OUTFILE ]]
   then
    if $COMPRESS -f $OUTFILE
     then
      send_server_doku "Patchstatus" "Patch Status" $DT $OUTFILE.$EXT
    fi
  fi
fi
