3 # Dieses Skript enthaelt Funktionen, die fuer Updates altes Firmware-Versionen notwendig sind.
4 # Alle Funktionen muessen idempotent sein.
6 # Dieses Skript wird nur ein einziges Mal nach einem Upgrade oder der Erstinstallation ausgefuehrt:
7 # http://wiki.openwrt.org/doc/uci#defaults
11 .
"${IPKG_INSTROOT:-}/usr/lib/opennet/on-helper.sh"
14 # bis Version v0.4-5: openvpn.opennet_user.comp_lzo=1
15 # seit Version v0.5 muss die Einstellung einen der folgenden Werte haben: yes/no/adaptive
16 # bzw. seit Version v0.5 gibt es Sektion nicht mehr (openvpn.opennet_user)
18 # ~# uci show|grep lzo
19 # on-usergw.opennet_ugw.comp_lzo=1
20 # openvpn.opennet_user.comp_lzo=1
21 # openvpn.opennet_ugw_erina_on_i_de.comp_lzo=1
22 # openvpn.opennet_ugw_subaru_on_i_de.comp_lzo=1
23 coerce_openvpn_comp_lzo() {
26 # wir wissen nicht genau, ob on-usergw und openvpn existiert - also lieber vorsichtig fragen
27 (uci -q show openvpn; uci -q show on-usergw) | grep
"\.comp_lzo=[01]$" |
while read line;
do
29 echo
"$line" | grep -q
"1$" && new_value=yes
30 key=$(echo
"$line" | cut -f 1 -
d =)
31 uci
set "$key=$new_value"
33 if [ -n
"$(uci changes openvpn)" -o -n
"$(uci changes | grep "^on-usergw\.
")" ]; then
34 msg_info "MIGRATION: coerce_openvpn_comp_lzo"
35 uci changes | grep -q
"^on-usergw\." && uci commit on-usergw
41 # bis Version v0.4-5: die Opennet-Firmware hat die /etc/passwd durch einen Symlink auf /etc/etc_preset/passwd ersetzt
42 # Bei einem Update wird das symlink-Ziel ersetzt und somit gibt es keine Nutzerdatenbank mehr.
43 # Dies verhindert jeden telnet/ssh-Login-Versuch. Lediglich das Web-Interface ist nutzbar.
44 fix_passwd_broken_symlink() {
45 local target=/etc/passwd
46 if [ -
h "$target" -a ! -e
"$target" ]; then
47 msg_info "MIGRATION: fix_passwd_broken_symlink"
49 # ein huebscheres here-Document mit Tabulator-Bereinigung ("<<-") funktioniert leider nicht mit busybox
51 root:x:0:0:root:/root:/bin/ash
52 daemon:*:1:1:daemon:/var:/bin/
false
53 ftp:*:55:55:ftp:/home/ftp:/bin/
false
54 network:*:101:101:network:/var:/bin/
false
55 nobody:*:65534:65534:nobody:/var:/bin/
false
57 # Ein paar Dienste schlugen aufgrund der fehlenden Nutzerdatenbank fehl.
58 # Ein reboot waere schoen - aber kann zukuenftig eventuell irgendwann zu einer Schleife fuehren.
59 # Also: manuell einzelne Dienste neu starten.
65 # bis Version v0.4-5 war /etc/rc.local ein Symlink nach /etc/etc_presets/rc.local
66 # In den folgenden Versionen gibt es kein /etc/etc_presets/ mehr.
67 # Der Symlink kann dann durch den ueblichen Kommentar-Text ersetzt werden.
68 fix_rclocal_broken_symlink() {
69 local target=/etc/rc.local
70 # die Datei existiert, bzw. der Symlink zeigt nicht ins Leere
71 [ -e
"$target" ] &&
return 0
72 # falls die Datei kein Symlink ist, dann fassen wir sie lieber nicht an
73 [ -
h "$target" ] ||
return 0
74 # die Datei ist ein kaputter Symlink - wir ersetzen sie
76 # ein huebscheres here-Document mit Tabulator-Bereinigung ("<<-") funktioniert leider nicht mit busybox
78 # Put your custom commands here that should be executed once
79 # the system init finished. By default this file does nothing.
87 # bis Version v0.4-5: "firewall reload" fuehrte auch die "include"-Dateien aus (z.B. /etc/firewall.opennet)
88 # Ab Version v0.5 verwenden wir diese Datei nicht mehr.
90 # uci show firewall | grep @include
91 # firewall.@include[0]=include
92 # firewall.@include[0].path=/etc/firewall.opennet
93 # firewall.@include[1]=include
94 # firewall.@include[1].path=/etc/firewall.user
95 fix_firewall_reload() {
96 local filename=/etc/firewall.opennet
99 uci show firewall | grep
"@include\[[0-9]\+\]\.path=" |
while read line;
do
100 key=$(echo
"$line" | cut -f 1 -
d =)
101 value=$(echo
"$line" | cut -f 2- -d =)
102 [
"$value" !=
"$filename" ] &&
continue
103 # gesamte "include"-Abzweigung loeschen
107 reload_config ||
true
114 # bis Version 0.4-5 sind die folgenden beiden Firewall-Einstellungen gesetzt:
115 # firewall.zone_on_vpn.forward=ACCEPT
116 # firewall.zone_on_mesh.forward=ACCEPT
117 # Dieser erlauben die Paketweiterleitung aus unerwuenschten Netzen heraus.
118 disable_unwanted_forward() {
121 find_all_uci_sections firewall zone |
while read uci_prefix;
do
122 zone_name=$(uci_get
"${uci_prefix}.name")
123 if [
"$zone_name" =
"$ZONE_MESH" -o
"$zone_name" =
"$ZONE_TUNNEL" ]; then
124 forward=$(uci_get
"${uci_prefix}.forward")
125 [
"$forward" =
"ACCEPT" ] && uci
set "${uci_prefix}.forward=REJECT" ||
true
128 # sicherstellen, dass die als Ersatz fuer
"forward=ACCEPT" noetige Weiterleitung existiert
129 add_zone_forward
"$ZONE_MESH" "$ZONE_MESH"
131 reload_config ||
true
135 # bis Version 0.4-5 wurden die folgenden Einstellungen fuer die Reihenfolge der VPN-Gateways verwendet:
136 # * on-openvpn.gateways.vpn_sort_criteria=metric|etx
137 # * on-openvpn.gateways.autosearch=on|off
138 # Die darauffolgenden Firrmware-Versionen verwenden stattdessen die Einstellung
'on-core.settings.service_sorting'.
139 transfer_vpn_sort_criteria_and_autosearch() {
140 local sort_criteria=$(uci_get on-openvpn.gateways.vpn_sort_criteria)
141 local autosearch=$(uci_get on-openvpn.gateways.autosearch)
143 if [ -z
"$autosearch" -a -z
"$sort_criteria" ]; then
144 # die Einstellungen wurden bereits uebertragen
146 elif [
"$autosearch" =
"off" ]; then
148 elif [
"$sort_criteria" =
"metric" ]; then
153 uci
set "on-core.settings.service_sorting=$result"
157 # bis Version 0.4-5 verwendeten wir vollstaendige uci-Sektionen fuer die VPN-Server
158 # z.B. openvpn.opennet_user
159 remove_tunnel_openvpn_settings() {
160 local uci_prefix=openvpn.opennet_user
162 # Abbruch falls die Einstellungen bereits entfernt wurden
163 [ -z
"$(uci_get "$uci_prefix
")" ] &&
return
164 uci
delete "$uci_prefix"
169 # bis Version 0.4-5 wurde folgende Zeile ausgefuehrt:
170 # lua -e "require('luci.model.opennet.on_usergw') upgrade()" 2>/dev/null
171 # Dadurch wurden openvpn-uci-Konfigurationen (z.B. openvpn.opennet_ugw_erina_on_i_de) nach on-usergw.opennet_ugw* übertragen.
172 # Da die openvpn-Konfigurationen nun ein anderes Namensformat haben, loeschen wir sie.
173 remove_usergw_openvpn_configs() {
175 uci show openvpn | grep
"^openvpn\.openvpn_ugw_[^.]\+=openvpn$" | cut -f 1 -d = |
while read uci_prefix;
do
176 uci
delete "$uci_prefix"
182 # Die uci-Sektion on-core.defaults und on-core.openssl wurde nur bis v0.4-5 verwendet.
183 # Anschliessend wanderten diese Einstellungen nach /usr/share/opennet/core.defaults.
184 # Ausserdem sind die folgenden Schluessel nach v0.4-5 nicht mehr in Verwendung:
185 # on-openvpn.gateways.searchmask
186 # on-openvpn.gateways.gw_dns
187 # on-openvpn.gateways.gw_ntp
188 # on-openvpn.gateways.better_gw
189 # on-openvpn.gateways.autosearch
190 # on-openvpn.gateways.vpn_nonworking_timeout
191 # on-openvpn.gateways.vpn_bettergateway_timeout
192 # on-openvpn.gateways.vpn_sort_criteria
193 # on-openvpn.gateways.vpn_recheck_age
194 remove_obsolete_on_core_settings() {
197 on-core.defaults \
on-core.openssl \
on-openvpn.gateways.gateways.searchmask \
on-openvpn.gateways.gateways.gw_dns \
on-openvpn.gateways.gateways.gw_ntp \
on-openvpn.gateways.gateways.better_gw \
on-openvpn.gateways.gateways.autosearch \
on-openvpn.gateways.gateways.vpn_nonworking_timeout \
on-openvpn.gateways.gateways.vpn_bettergateway_timeout \
on-openvpn.gateways.gateways.vpn_sort_criteria \
on-openvpn.gateways.gateways.vpn_recheck_age;
do
198 [ -n
"$(uci_get "$key
")" ] &&
uci_delete "$key" ||
true
204 # bis Version 0.4-5 wurde die Variable "on-usergw.ugwng_hna_mask" verwendet.
205 remove_obsolete_usergw_settings() {
206 [ -n
"$(uci_get "on-usergw.ugwng_hna_mask
")" ] && uci
delete "on-usergw.ugwng_hna_mask"
211 # Die uci-Einstellungen "on-openvpn.gate_XY.*" waren bis Version 0.4-5 in Verwendung.
212 # In den darauffolgenden Firmware-Versionen werden diese Informationen im Dateisystem gespeichert.
213 # Im Zweifelsfall (z.B. falls gerade keine Verbindung zum mesh existiert), werden die
214 # zu uebertragenden Informationen (die Offsets der Gateways oder ihre manuelle Reihenfolge) verworfen.
215 transfer_gateway_uci_settings() {
221 find_all_uci_sections on-openvpn gateway |
while read uci_prefix;
do
222 host=$(uci_get
"${uci_prefix}.ipaddr")
223 offset=$(uci_get
"${uci_prefix}.etx_offset")
224 rank=
"${uci_prefix#on-openvpn.gate_}"
225 # ermittle alle passenden Dienste dieses Hosts (es koennen mehrere Dienste pro Host vorhanden sein)
227 # Offset fuer automatische Sortierung uebertragen
228 [ -n
"$offset" ] && set_service_value
"$service_name" "offset" "$offset"
229 # Rang fuer manuelle Sortierung uebertragen
230 [ -n
"$rank" -a
"$rank" !=
"$uci_prefix" ] && set_service_value
"$service_name" "rank" "$rank" ||
true
235 apply_changes on-openvpn
239 # Bis Version 0.4-5 wurde die Datei /etc/crontabs/root einfach ueberschrieben (bzw. erzeugt).
240 # In Version 0.5 wurde die busybox-Funktion "run-parts" verwendet. Zugunsten der separaten
241 # Paketierung wollen wir dies nicht mehr verwenden.
242 # Fortan werden die Eintraege manuell hinzugefuegt (siehe /etc/uci-defaults/on-core-init).
243 remove_crontab_entries() {
244 local crontab_file=/etc/crontabs/root
245 [ -e
"$crontab_file" ] ||
return 0
246 # Verwendung des alten shell-Skripts
247 sed -i
'/\/usr\/bin\/run-parts\.sh/d' "$crontab_file"
248 # Verwendung der busybox-Funktion
249 sed -i
'/\trun-parts /d' "$crontab_file"
253 # Bis Version 0.4-5 wurde der Port des httpinfo-Plugins mit der Variable "olsrd.@LoadPlugin[1].Port" festgelegt.
254 # uci-typisch sind jedoch Attribute mit Kleinbuchstaben.
255 rename_olsrd_Port_to_port() {
258 find_all_uci_sections olsrd LoadPlugin |
while read uci_prefix;
do
259 library=
"$(uci_get "${uci_prefix}.library
")"
260 # falsche Bibliothek?
261 [
"$library" !=
"${library#olsrd_httpinfo}" ] ||
continue
262 if [ -n
"$(uci_get "${uci_prefix}.Port
")" ]; then
263 # Wert von "Port" nach "port" uebertragen; "Port" loeschen
264 uci
set "${uci_prefix}.port=$(uci_get "${uci_prefix}.Port
")"
271 # Bis Version 0.4-5 gab es anscheinend die veraltete "mtu_fix"-Option in firewall-Weiterleitungen.
272 # Seit OpenWRT 8.09.2 befindet sich diese Option jedoch nicht mehr in den Weiterleitungen, sondern in der Zielzone.
273 move_mtu_fix_to_target_zone() {
277 local zone_uci_prefix
278 find_all_uci_sections firewall forwarding |
while read uci_prefix;
do
279 mtu_value=$(uci_get
"${uci_prefix}.mtu_fix")
280 # leer? Es gibt nichts zu uebertragen ...
281 [ -z
"$mtu_value" ] &&
continue
282 target_zone=$(uci_get
"${uci_prefix}.dest")
283 zone_uci_prefix=$(find_first_uci_section firewall zone
"name=$target_zone")
284 # mtu-Wert uebertragen
285 [ -n
"$zone_uci_prefix" ] && uci
set "${zone_uci_prefix}.mtu_fix=$mtu_value"
286 # alten Wert loeschen
292 # Bis Version 0.4-5 verwendeten wir ntpclient anstelle des integrierten ntpd
293 # Die alten Einstellungen koennen also entfernt werden, da die Hosts automatisch gewaehlt werden.
294 remove_ntpclient_config() {
295 # keine config-Datei? Fertig ...
296 [ -e /etc/config/ntpclient ] ||
return 0
297 # ntpclient ist installiert? Konfiguration belassen ...
298 is_package_installed
"ntpclient" &&
return 0
299 rm -f /etc/config/ntpclient
303 coerce_openvpn_comp_lzo
304 fix_passwd_broken_symlink
305 fix_rclocal_broken_symlink
307 transfer_vpn_sort_criteria_and_autosearch
308 remove_tunnel_openvpn_settings
309 remove_obsolete_on_core_settings
310 remove_obsolete_usergw_settings
311 remove_usergw_openvpn_configs
312 remove_crontab_entries
313 rename_olsrd_Port_to_port
314 remove_ntpclient_config
316 # Bis Version 0.4-5 hiess die Opennet-Mesh-Firewall-Zone "opennet".
317 # Mit Version 0.5 wurde die Zone in "on_mesh" umbenannt.
318 rename_firewall_zone
"opennet" "$ZONE_MESH"
320 disable_unwanted_forward
321 move_mtu_fix_to_target_zone
323 # Bis Version 0.4-5 wurden ins lokale Netz eingehende Pakete (z.B. Portweiterleitungen) via SNAT maskiert.
324 # siehe https://dev.on-i.de/ticket/73
327 # Bis Version 0.4-5 hiess die lokale Zone "local" - bei barrier breaker heisst sie nun "lan"
328 rename_firewall_zone
"local" "$ZONE_LOCAL"
330 # Diese Aktion startet mit 10 Minuten Verzoegerung im Hintergrund, um vorher ein Empfangen der
331 # olsrd-Announcements zu ermoeglichen.
332 run_delayed_in_background 600 transfer_gateway_uci_settings