1## @defgroup devel Entwicklungswerkzeuge
2## @brief Funktionen, die lediglich für die Firmware-Entwicklung, nicht jedoch zur Laufzeit nützlich sind.
3# Beginn der Doku-Gruppe
7# Ablage fuer profiling-Ergebnisse
8PROFILING_DIR=/var/run/on-profiling
9GIT_REPOSITORY_COMMIT_URL_FMT=
"https://dev.opennet-initiative.de/changeset/%s/on_firmware?format=diff"
11# erzeuge das Profiling-Verzeichnis (vorsorglich - es wird wohl unbenutzt bleiben)
12mkdir -p
"$PROFILING_DIR"
15## @fn list_installed_packages_by_size()
16## @brief Zeige alle installierten Pakete und ihren Größenbedarf an.
17## @details Dies erlaubt die Analyse des Flash-Bedarfs.
20 find /usr/lib/opkg/info/ -type f -name
"*.control" |
while read -r fname;
do
21 grep
"Installed-Size:" "$fname" \
22 | awk
'{print $2, "\t", "'"$(basename "${fname%.control}
")"'" }'
23 done | sort -n | awk
'BEGIN { summe=0 } { summe+=$1; print $0 } END { print summe }'
27## @fn clean_luci_restart()
28## @brief Starte den Webserver neu und lösche alle luci-Cache-Dateien und Kompilate.
29## @details Diese Funktion sollte nach Änderungen von luci-Templates oder -Code ausgeführt werden.
31 local rc_path=
"/etc/init.d/uhttpd"
32 [ -e
"$rc_path" ] ||
return 0
39## @fn run_httpd_debug()
40## @brief Starte den Webserver im Debug-Modus zur Beobachtung von lua/luci-Ausgaben.
43 /etc/init.d/uhttpd stop 2>/dev/
null ||
true
45 # ignoriere CTRL-C (wir ueberlassen das INT-Signal dem uhttpd-Prozess)
47 local uhttpd_args=
"-f -h /www -x /cgi-bin -t 60 -T 30 -k 20 -A 1 -n 3 -N 100 -R -p 0.0.0.0:80 -s 0.0.0.0:443 -q"
48 [ -e /etc/uhttpd.crt ] && uhttpd_args=
"$uhttpd_args -C /etc/uhttpd.crt -K /etc/uhttpd.key"
49 # shellcheck disable=SC2086
51 /etc/init.d/uhttpd start
55## @fn get_function_names()
56## @brief Liefere die Namen aller Funktionen zurück.
58 grep -h
"^[^_][a-z0-9_]*(" "${IPKG_INSTROOT:-}"/usr/lib/opennet/
' | sort
62## @fn enable_profiling()
63## @brief Manipuliere die Funktionsheader in allen shell-Skripten der opennet-Pakete für das Sammeln von profiling-Informationen.
64## @details Diese Operation ist irreversibel - eine erneute Installation der Pakete ist der einzige saubere Weg zurück.
65## Die Ergebnisse sind anschließend im PROFILING_DIR verfügbar.
66## @see summary_profiling
69 command -v bash >/dev/null || message="Failed to enable profiling - due to missing bash"
70 [ -e /usr/bin/date ] || message="Failed to enable profiling - due to missing coreutils-date"
71 if [ -z "$message" ]; then
72 # ersetze das shebang in allen Opennet-Skripten
73 # eventuell fehlen ein paar Dateien (Umbennungen usw. im Vergleich zum installierten Paket) -> überspringen
74 cat /usr/lib/opkg/info/on-*.list | grep -E '(bin/|\.sh$|etc/cron\.|/etc/hotplug\.d/|lib/opennet)
' \
75 | while read -r fname; do [ -e "$fname" ] && echo "$fname"; true; done \
76 | xargs -n 200 -r sed -i -f "${IPKG_INSTROOT:-}/usr/lib/opennet/profiling.sed"
79 logger -t "on-profile" "$message"
86## @fn summary_profiling()
87## @brief Werte gesammelte profiling-Informationen aus.
88## @returns Jede Zeile beschreibt das kumulative Profiling einer Funktion:
89## Gesamtzeit, Anzahl der Aufrufe, durchschnittliche Verarbeitungszeit, Funktionsname
90## Die Zeiten sind jeweils in Millisekunden angegeben.
91## @details Als Verarbeitungszeit einer Funktion gilt dabei der gesamte Zeitunterschied zwischen Funktionseintritt und -ende.
92## @see enable_profiling
96 printf '%16s %16s %16s %s\n
' "Duration [ms]" "Call count" "avgDuration [ms]" "Name"
97 find "$PROFILING_DIR" -type f | while read -r fname; do
98 # filtere Fehlmessungen (irgendwie tauchen dort Zahlen wie "27323677987" auf)
99 grep -v '^27[0-9]\{9\}
$' "$fname" | awk '
100 BEGIN { summe=0; counter=0 }
101 { summe+=($1/1000); counter+=1 }
102 END { printf
"%16d %16d %16d %s\n", summe, counter, int(summe/counter),
"'"$(basename
"$fname")
"'"}
'
107## @fn apply_repository_patch()
108## @brief Wende einen commit aus dem Firmware-Repository als Patch an.
109## @param Eine oder mehrere Commit-IDs.
110## @details Dies kann die punktuelle Fehlerbehebung nach einem Release erleichtern.
111## Die Umgebungsvariable "ON_PATCH_ARGS" wird als Parameter für "patch" verwendet (z.B. "--reverse").
112apply_repository_patch() {
113 # Patch-Argumente können beim Aufruf gesetzt werden - z.B. "--reverse"
114 local patch_args="${ON_PATCH_ARGS:-}"
115 # wir benötigen das Paket "patch"
116 is_package_installed "patch" || { opkg update && opkg install "patch"; }
119 for commit in "$@"; do
120 # Currently the git repository server uses the Opennet CA for its webserver
122 # shellcheck disable=SC2059
123 patch=$(http_request "$(printf "$GIT_REPOSITORY_COMMIT_URL_FMT" "$commit")")
124 # shellcheck disable=SC2086
125 echo "$patch" | patch $patch_args -p4 --directory --dry-run /
126 # shellcheck disable=SC2086
127 echo "$patch" | patch $patch_args -p4 --directory /
133# Ende der Doku-Gruppe
run_httpd_debug()
Starte den Webserver im Debug-Modus zur Beobachtung von lua/luci-Ausgaben.
list_installed_packages_by_size()
Zeige alle installierten Pakete und ihren Größenbedarf an.
get_function_names()
Liefere die Namen aller Funktionen zurück.
clean_luci_restart()
Starte den Webserver neu und lösche alle luci-Cache-Dateien und Kompilate.
set eu grep root::etc shadow exit if command v chpasswd dev null