diff --git a/snmp/osupdate b/snmp/osupdate index 11a6d9a9b..9914f0217 100755 --- a/snmp/osupdate +++ b/snmp/osupdate @@ -32,68 +32,85 @@ CMD_APK=' version' ################################################################ # Don't change anything unless you know what are you doing # ################################################################ -if command -v zypper &>/dev/null ; then - # OpenSUSE - # shellcheck disable=SC2086 - UPDATES=$($BIN_ZYPPER $CMD_ZYPPER | $BIN_WC $CMD_WC) - if [ "$UPDATES" -ge 2 ]; then - echo $(($UPDATES-2)); +function check-update() { + if command -v zypper &>/dev/null ; then + # OpenSUSE + # shellcheck disable=SC2086 + UPDATES=$($BIN_ZYPPER $CMD_ZYPPER | $BIN_WC $CMD_WC) + if [ "$UPDATES" -ge 2 ]; then + echo $(($UPDATES-2)); + else + echo "0"; + fi + elif command -v dnf &>/dev/null ; then + # Fedora + # shellcheck disable=SC2086 + UPDATES=$($BIN_DNF $CMD_DNF | $BIN_WC $CMD_WC) + if [ "$UPDATES" -ge 1 ]; then + echo $(($UPDATES-1)); + else + echo "0"; + fi + elif command -v pacman &>/dev/null ; then + # Arch + UPDATES=$($BIN_PACMAN $CMD_PACMAN | $BIN_WC $CMD_WC) + if [ "$UPDATES" -ge 1 ]; then + echo $(($UPDATES-1)); + else + echo "0"; + fi + elif command -v yum &>/dev/null ; then + # CentOS / Redhat + # shellcheck disable=SC2086 + UPDATES=$($BIN_YUM $CMD_YUM | $BIN_WC $CMD_WC) + if [ "$UPDATES" -ge 1 ]; then + echo $(($UPDATES-1)); + else + echo "0"; + fi + elif command -v apt-get &>/dev/null ; then + # Debian / Devuan / Ubuntu + # shellcheck disable=SC2086 + UPDATES=$($BIN_APT $CMD_APT | $BIN_GREP $CMD_GREP 'Inst') + if [ "$UPDATES" -ge 1 ]; then + echo "$UPDATES"; + else + echo "0"; + fi + elif command -v pkg &>/dev/null ; then + # FreeBSD + # shellcheck disable=SC2086 + UPDATES=$($BIN_PKG $CMD_PKG | $BIN_WC $CMD_WC) + if [ "$UPDATES" -ge 1 ]; then + echo "$UPDATES"; + else + echo "0"; + fi + elif command -v apk &>/dev/null ; then + # Alpine + # shellcheck disable=SC2086 + UPDATES=$($BIN_APK $CMD_APK | $BIN_WC $CMD_WC) + if [ "$UPDATES" -ge 2 ]; then + echo $(($UPDATES-1)); + else + echo "0"; + fi else echo "0"; fi -elif command -v dnf &>/dev/null ; then - # Fedora - # shellcheck disable=SC2086 - UPDATES=$($BIN_DNF $CMD_DNF | $BIN_WC $CMD_WC) - if [ "$UPDATES" -ge 1 ]; then - echo $(($UPDATES-1)); - else - echo "0"; - fi -elif command -v pacman &>/dev/null ; then - # Arch - UPDATES=$($BIN_PACMAN $CMD_PACMAN | $BIN_WC $CMD_WC) - if [ "$UPDATES" -ge 1 ]; then - echo $(($UPDATES-1)); - else - echo "0"; - fi -elif command -v yum &>/dev/null ; then - # CentOS / Redhat - # shellcheck disable=SC2086 - UPDATES=$($BIN_YUM $CMD_YUM | $BIN_WC $CMD_WC) - if [ "$UPDATES" -ge 1 ]; then - echo $(($UPDATES-1)); - else - echo "0"; - fi -elif command -v apt-get &>/dev/null ; then - # Debian / Devuan / Ubuntu - # shellcheck disable=SC2086 - UPDATES=$($BIN_APT $CMD_APT | $BIN_GREP $CMD_GREP 'Inst') - if [ "$UPDATES" -ge 1 ]; then - echo "$UPDATES"; - else - echo "0"; - fi -elif command -v pkg &>/dev/null ; then - # FreeBSD - # shellcheck disable=SC2086 - UPDATES=$($BIN_PKG $CMD_PKG | $BIN_WC $CMD_WC) - if [ "$UPDATES" -ge 1 ]; then - echo "$UPDATES"; - else - echo "0"; - fi -elif command -v apk &>/dev/null ; then - # Alpine - # shellcheck disable=SC2086 - UPDATES=$($BIN_APK $CMD_APK | $BIN_WC $CMD_WC) - if [ "$UPDATES" -ge 2 ]; then - echo $(($UPDATES-1)); - else - echo "0"; - fi -else - echo "0"; +} + +# Cache the file for 30 minutes +# We cache because it is a several second delay, which is painful for the poller +DATE=$(date +%s) +FILE=/var/cache/librenms/agent-local-osupdate + +if [ ! -e $FILE ]; then + check-update > $FILE +fi +FILEMTIME=$(stat -c %Y $FILE) +FILEAGE=$(($DATE-$FILEMTIME)) +if [ $FILEAGE -gt 1800 ]; then + check-update > $FILE fi +cat $FILE