Opennet Firmware
log_restart_timestamp
gehe zur Dokumentation dieser Datei
1#!/bin/sh
2#
3# Sorge dafuer, dass nach einem Boot-Vorgang ein passender Log-Eintrag in
4# die Banner-Datei geschrieben wird.
5# Vor dem Schreiben des Zeitstempels wird geprueft, ob die aktuelle Systemzeit
6# mit der Zeit der konfigurierten Zeitserver grob uebereinstimmt. Falls dies
7# nicht der Fall ist, wird der Log-Vorgang verschoben, bis eine maximale
8# Wartezeit ueberschritten ist. Anschliessend erfolgt die Ausgabe mit einem
9# passenden Text ("no time retrieved").
10#
11# Falls die maximal zulässige Zeit noch nicht abgelaufen ist, wird eine erneute
12# Ausführung via 'schedule_task' veranlasst.
13
14# shellcheck source=opennet/packages/on-core/files/usr/lib/opennet/on-helper.sh
15. "${IPKG_INSTROOT:-}/usr/lib/opennet/on-helper.sh"
16
17
18MAX_UPTIME_SECONDS=360
19ACCEPTABLE_TIME_OFFSET=180
20
21
22get_current_time_offset_milliseconds() {
23 local peer_args=
24 local peer
25 local offsets
26 # Die Liste der konfigurierten Zeitserver auslesen und als Argumente fuer ntpd zusammensetzen.
27 for peer in $(uci_get_list system.ntp.server); do
28 [ -z "$peer" ] || peer_args="$peer_args -p $peer"
29 done
30 [ -z "$peer_args" ] && return 0
31 # Alle konfigurierten Zeitserver abfragen.
32 # Wir sind lediglich am "offset"-Wert interessiert.
33 # shellcheck disable=SC2086
34 offsets=$(timeout -s INT 4 ntpd -w -n -q $peer_args 2>&1 \
35 | grep "offset:" \
36 | cut -f 4 -d : \
37 | cut -f 1 -d " ")
38 # Keine Zeitserver erreichbar? Abbruch ...
39 [ -z "$offsets" ] && return 0
40 # Durchschnitt der Offsets ermitteln.
41 echo "$offsets" | awk '
42 BEGIN { summe=0; zaehler=1; }
43 { summe+=$1; zaehler+=1; }
44 END { print int((summe * 1000) / zaehler) }'
45}
46
47
48# Uptime und Zeitsynchronitaet ermitteln
49time_offset=$(get_current_time_offset_milliseconds)
50uptime=$(get_uptime_seconds)
51# beide Bedingungen voneinander trennen - sonst liefert ash eine Fehlermeldung, falls "time_offset" leer ist
52if [ -z "$time_offset" ] || [ "$time_offset" -gt "$ACCEPTABLE_TIME_OFFSET" ]; then
53 # bisher fand kein Zeitabgleich statt - wir pruefen, ob die uptime inzwischen abgelaufen ist
54 # Ist die maximale Uptime abgelaufen? Falls nicht, dann warten wir auf den naechsten Versuch.
55 [ "$uptime" -lt "$MAX_UPTIME_SECONDS" ] && echo "$0" | schedule_task && exit 0
56 # Die Zeit ist um - wir schreiben den ungueltigen Zeitstempel.
57 timestamp="(no time retrieved)"
58else
59 # unsere Zeit ist synchronisert - wir koennen das reboot-Log schreiben
60 # Ziehe von der aktuellen Zeit die uptime ab
61 boot_time=$(($(date +%s) - uptime))
62 timestamp=$(date --date "@$boot_time")
63fi
64
65# Schreibe den Zeitstempel
66add_banner_event "system restart" "$timestamp"
67# wir sind fertig
done
Definition: core.sh:85
add_banner_event(event, timestamp)
Füge ein Ereignis zum dauerhaften Ereignisprotokoll (/etc/banner) hinzu.
Definition: core.sh:68
uci_get_list(uci_path)
Liefere alle einzelnen Elemente einer UCI-Liste zurück.
Definition: uci.sh:15
set eu on function print_services services log for dir in etc on services d var on services volatile d
Definition: services:13