#!/usr/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'`"
DT0="`date '+%Y-%m-%d %H:%M:00'`"
#
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 --non-interactive lu >$ZYPPERLU
    echo 'Servername;InventoryDate;Patchname;PatchCreated;Category;Severity;Name;Current;Available'
    zypper --non-interactive lp | awk -F ' *[|] *' '$6 == "needed" {print $2}' | while read P; do
      zypper --non-interactive patch-info $P | awk -v P="$P" -F ' *: *' '
/^Category/    { gsub(" *$", "", $2); category = $2 }
/^Severity/    { gsub(" *$", "", $2); 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
