Opennet Firmware
 Alle Dateien Funktionen Variablen Gruppen Seiten
on-migrations
gehe zur Dokumentation dieser Datei
1 #!/bin/sh
2 #
3 # Dieses Skript enthaelt Funktionen, die fuer Updates altes Firmware-Versionen notwendig sind.
4 # Alle Funktionen muessen idempotent sein.
5 #
6 # Dieses Skript wird nur ein einziges Mal nach einem Upgrade oder der Erstinstallation ausgefuehrt:
7 # http://wiki.openwrt.org/doc/uci#defaults
8 #
9 
10 
11 . "${IPKG_INSTROOT:-}/usr/lib/opennet/on-helper.sh"
12 
13 
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)
17 # Status in v0.4-5:
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() {
24  local new_value
25  local key
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
28  new_value=no
29  echo "$line" | grep -q "1$" && new_value=yes
30  key=$(echo "$line" | cut -f 1 -d =)
31  uci set "$key=$new_value"
32  done
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
36  apply_changes openvpn
37  fi
38 }
39 
40 
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"
48  rm "$target"
49  # ein huebscheres here-Document mit Tabulator-Bereinigung ("<<-") funktioniert leider nicht mit busybox
50  cat >"$target" << EOF
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
56 EOF
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.
60  /etc/init.d/dnsmasq restart
61  fi
62 }
63 
64 
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
75  rm -f "$target"
76  # ein huebscheres here-Document mit Tabulator-Bereinigung ("<<-") funktioniert leider nicht mit busybox
77  cat >"$target" << EOF
78 # Put your custom commands here that should be executed once
79 # the system init finished. By default this file does nothing.
80 
81 exit 0
82 EOF
83  chmod 644 "$target"
84 }
85 
86 
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.
89 # Beispiel (v0.4-5):
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
97  local key
98  local value
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
104  uci_delete "${key%.path}"
105  uci commit firewall
106  rm -f "$filename"
107  reload_config || true
108  break
109  done
110  return 0
111 }
112 
113 
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() {
119  local zone_name
120  local 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
126  fi
127  done
128  # sicherstellen, dass die als Ersatz fuer "forward=ACCEPT" noetige Weiterleitung existiert
129  add_zone_forward "$ZONE_MESH" "$ZONE_MESH"
130  uci commit firewall
131  reload_config || true
132 }
133 
134 
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)
142  local result
143  if [ -z "$autosearch" -a -z "$sort_criteria" ]; then
144  # die Einstellungen wurden bereits uebertragen
145  return 0
146  elif [ "$autosearch" = "off" ]; then
147  result=manual
148  elif [ "$sort_criteria" = "metric" ]; then
149  result=hop
150  else
151  result=etx
152  fi
153  uci set "on-core.settings.service_sorting=$result"
154 }
155 
156 
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
161 
162  # Abbruch falls die Einstellungen bereits entfernt wurden
163  [ -z "$(uci_get "$uci_prefix")" ] && return
164  uci delete "$uci_prefix"
165  uci commit openvpn
166 }
167 
168 
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() {
174  local uci_prefix
175  uci show openvpn | grep "^openvpn\.openvpn_ugw_[^.]\+=openvpn$" | cut -f 1 -d = | while read uci_prefix; do
176  uci delete "$uci_prefix"
177  done
178  return 0
179 }
180 
181 
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() {
195  local key
196  for key in \
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
199  done
200  return 0
201 }
202 
203 
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"
207  return 0
208 }
209 
210 
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() {
216  local uci_prefix
217  local host
218  local offset
219  local rank
220  local service_name
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)
226  get_services "gw" | filter_services_by_value "host" "$host" | while read service_name; do
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
231  done
232  uci_delete "$uci_prefix"
233  done
234  uci_delete on-openvpn.gateways
235  apply_changes on-openvpn
236 }
237 
238 
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"
250 }
251 
252 
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() {
256  local uci_prefix
257  local library
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")"
265  uci_delete "${uci_prefix}.Port"
266  fi
267  done
268 }
269 
270 
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() {
274  local uci_prefix
275  local mtu_value
276  local 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
287  uci_delete "${uci_prefix}.mtu_fix"
288  done
289 }
290 
291 
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
300 }
301 
302 
303 coerce_openvpn_comp_lzo
304 fix_passwd_broken_symlink
305 fix_rclocal_broken_symlink
306 fix_firewall_reload
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
315 
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"
319 
320 disable_unwanted_forward
321 move_mtu_fix_to_target_zone
322 
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
325 uci_delete firewall.zone_local.masq
326 
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"
329 
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
333 
334