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 
18 MAX_UPTIME_SECONDS=360
19 ACCEPTABLE_TIME_OFFSET=180
20 
21 
22 get_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
49 time_offset=$(get_current_time_offset_milliseconds)
50 uptime=$(get_uptime_seconds)
51 # beide Bedingungen voneinander trennen - sonst liefert ash eine Fehlermeldung, falls "time_offset" leer ist
52 if [ -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)"
58 else
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")
63 fi
64 
65 # Schreibe den Zeitstempel
66 add_banner_event "system restart" "$timestamp"
67 # wir sind fertig
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
done
Definition: core.sh:85