Skip to content

Instantly share code, notes, and snippets.

@ryrun
Last active March 28, 2025 06:22
Show Gist options
  • Save ryrun/f97b9d07854f3c0bca3529209ce98b83 to your computer and use it in GitHub Desktop.
Save ryrun/f97b9d07854f3c0bca3529209ce98b83 to your computer and use it in GitHub Desktop.
Add delay mk_apt to reduce update reports, based on https://github.com/ypid-bot/check_mk/blob/master/agents/plugins/mk_apt
#!/bin/bash
# Check for APT updates (Debian, Ubuntu)
# +------------------------------------------------------------------+
# | ____ _ _ __ __ _ __ |
# | / ___| |__ ___ ___| | __ | \/ | |/ / |
# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
# | | |___| | | | __/ (__| < | | | | . \ |
# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
# | |
# | Copyright Mathias Kettner 2014 [email protected] |
# +------------------------------------------------------------------+
#
# This file is part of Check_MK.
# The official homepage is at http://mathias-kettner.de/check_mk.
#
# check_mk is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation in version 2. check_mk is distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY; with-
# out even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more de-
# tails. You should have received a copy of the GNU General Public
# License along with GNU Make; see the file COPYING. If not, write
# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301 USA.
# TODO:
# Einstellungen:
# - upgrade oder dist-upgrade
# - vorher ein update machen
# Bakery:
# - Bakelet anlegen
# - Async-Zeit einstellbar machen und das Ding immer async laufen lassen
# Check programmieren:
# * Schwellwerte auf Anzahlen
# * Regexen auf Pakete, die zu CRIT/WARN führen
# - Graph malen mit zwei Kurven
# This variable can either be "upgrade" or "dist-upgrade"
UPGRADE=upgrade
DO_UPDATE=yes
STATUS_FILE="/tmp/apt_update_status.txt"
WAIT_DAYS=7
function check_apt_update {
if [ "$DO_UPDATE" = yes ] ; then
# NOTE: Even with -qq, apt-get update can output several lines to
# stderr, e.g.:
#
# W: There is no public key available for the following key IDs:
# 1397BC53640DB551
apt-get update -qq 2> /dev/null
fi
apt-get -o 'Debug::NoLocking=true' -s -qq "$UPGRADE" | grep -v '^Conf'
}
function days_since_update {
if [ -f "$STATUS_FILE" ]; then
last_update=$(cat "$STATUS_FILE")
now=$(date +%s)
elapsed_days=$(( (now - last_update) / 86400 ))
echo "$elapsed_days"
else
echo "-1"
fi
}
if type apt-get > /dev/null ; then
echo '<<<apt:sep(0)>>>'
out=$(check_apt_update)
if [ -z "$out" ]; then
echo "No updates pending for installation"
[ -f "$STATUS_FILE" ] && rm "$STATUS_FILE"
else
elapsed_days=$(days_since_update)
if [ "$elapsed_days" -lt 0 ]; then
echo "$(date +%s)" > "$STATUS_FILE"
echo "No updates pending for installation"
elif [ "$elapsed_days" -ge "$WAIT_DAYS" ]; then
# Wartezeit ist abgelaufen
echo "$out"
else
echo "No updates pending for installation"
fi
fi
fi
#!/bin/bash
# Einstellungen
UPGRADE=upgrade
DO_UPDATE=yes
STATUS_FILE="/tmp/apt_update_status.txt"
# Funktion zum Überprüfen, ob heute der 2. oder 4. Dienstag im Monat nach 19 Uhr ist
function is_second_or_fourth_tuesday_after_19 {
local day_of_month=$(date +%d)
local weekday=$(date +%u) # 1 = Montag, 2 = Dienstag, ...
local hour=$(date +%H)
# Überprüfen, ob heute Dienstag ist
if [ "$weekday" -ne 2 ]; then
return 1
fi
# Berechnung des ersten Dienstags im Monat:
# Erster Tag des Monats ermitteln und dessen Wochentag (1 = Montag, ... 7 = Sonntag)
local first_day=$(date -d "$(date +%Y-%m-01)" +%u)
# Offset berechnen: Wie viele Tage fehlen bis zum Dienstag (2)
local offset=$(( (2 - first_day + 7) % 7 ))
local first_tuesday=$(( 1 + offset ))
# Berechnung des zweiten und vierten Dienstags
local second_tuesday=$(( first_tuesday + 7 ))
local fourth_tuesday=$(( first_tuesday + 21 ))
# Überprüfen, ob heute der zweite oder vierte Dienstag ist
if [ "$day_of_month" -eq "$second_tuesday" ] || [ "$day_of_month" -eq "$fourth_tuesday" ]; then
# Überprüfen, ob die Zeit nach 19:00 Uhr ist
if [ "$hour" -ge 19 ]; then
return 0
fi
fi
return 1
}
function check_apt_update {
if [ "$DO_UPDATE" = yes ] ; then
apt-get update -qq 2> /dev/null
fi
apt-get -o 'Debug::NoLocking=true' -s -qq "$UPGRADE" | grep -v '^Conf'
}
if type apt-get > /dev/null ; then
echo '<<<apt:sep(0)>>>'
# Falls noch Updates offen sind, weiter prüfen
if [ -f "$STATUS_FILE" ]; then
out=$(check_apt_update)
if [ -z "$out" ]; then
echo "No updates pending for installation"
rm "$STATUS_FILE"
else
echo "$out"
fi
elif is_second_or_fourth_tuesday_after_19; then
out=$(check_apt_update)
if [ -n "$out" ]; then
echo "$out" > "$STATUS_FILE"
echo "$out"
else
echo "No updates pending for installation"
fi
else
echo "No updates pending for installation"
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment