Patchwoche in Unternehmen
Microsoft veröffentlich am zweiten Dienstag im Monat neue Patches. In größeren Unternehmen wird bei normalen Updates eine Woche auf Unverträglichkeiten getesten und dann die Patches unternehmensweit ausgerollt. In dieser "Patchwoche" sollen auch automatisch Updates ausgerollt werden, in anderen Wochen aber nicht.
Das Problem besteht offensichtlich darin, dass Patches, die auf einem Gerät am Mittwoch in der Patchwoche ausgerollt werden sollen, jeden Monat von Hand mit dem Datum verknüpft werden müssen. So kann der 1. des Monats ein Montag oder Dienstag sein, dann ist der relevante Tag der 16. oder 18. des Monats. Ist der 1. des Monats aber ein Mittwoch, so wäre der relevante Tag am 21. des Monats.
Wie automatisiert man sowas?
Offensichtlich ändert sich an der Situation nichts, wenn der Wochentag und gleichzeitig das Datum erhöht werden: Die gesuchte Woche ist charaterisiert durch die Differenz von Datum und Wochentag.
Diese Differenz bezieht sich auf den Montag (1) als Monatsanfang (1), denn da ist die Differenz 0. Nun soll der Wochenanfang so liegen, als sei der Dienstag der Wochenbeginn. Die Differenz ist für einen Dienstag (2) als Monatsanfang (1) aber -1. Um das wieder auf 0 zu bekommen, muss man diese 1 hinzu addieren.
Um die Woche zu ermitteln teilt man einfach durch 7 und verwirft den Rest. 0 ist dann die erste Woche, 1 die Woche, in der der Microsoft veröffentlicht und 2 die Woche, in der regulär gepatcht werden soll.
Die Formel lautet also: (Monatstag - Wochentag + 1)/7 == 2
Als Shellscript sieht das so aus:
$ cat patchwoche-mache #! /usr/bin/bash [ 2 -eq $[$(/usr/bin/date +'(%-d-%u+1)/7')] ] || exit exec mache "$@"
Nun steht einem generischen Crontab nichts mehr im Wege:
# Daueraufgaben 0 2 * * 1 mache am montag 0 2 * * 2 mache am dienstag 0 2 * * 3 mache am mittwoch 0 2 * * 4 mache am donnerstag 0 2 * * 5 mache am freitag ... 0 2 * * 3 patchwoche-mache am mittwoch ...
Und tut.