1 #!/bin/sh /etc/rc.common
2 # Copyright (C) 2008 Alina Friedrichsen <x-alina@gmx.net>
5 RADVD_INTERFACE_STRING_OPTIONS
='MaxRtrAdvInterval MinRtrAdvInterval MinDelayBetweenRAs AdvLinkMTU AdvReachableTime AdvRetransTimer AdvCurHopLimit AdvDefaultLifetime AdvDefaultPreference HomeAgentLifetime HomeAgentPreference'
6 RADVD_INTERFACE_BOOLEAN_OPTIONS
='IgnoreIfMissing AdvSendAdvert UnicastOnly AdvManagedFlag AdvOtherConfigFlag AdvSourceLLAddress AdvHomeAgentFlag AdvHomeAgentInfo AdvMobRtrSupportFlag AdvIntervalOpt'
8 RADVD_PREFIX_STRING_OPTIONS
='AdvValidLifetime AdvPreferredLifetime'
9 RADVD_PREFIX_BOOLEAN_OPTIONS
='AdvOnLink AdvAutonomous AdvRouterAddr'
11 RADVD_ROUTE_STRING_OPTIONS
='AdvRouteLifetime AdvRoutePreference'
13 RADVD_RDNSS_STRING_OPTIONS
='AdvRDNSSLifetime'
15 RADVD_DNSSL_STRING_OPTIONS
='AdvDNSSLLifetime'
19 [ -z "$varname" -o "$varname" != "${varname%%[!A-Za-z0-9_]*}" ] && return 1
25 [ -z "$ifname" -o "$ifname" != "${ifname%%[!A-Za-z0-9.:_-]*}" ] && return 1
31 [ -z "$ip6addr" -o "$ip6addr" != "${ip6addr%%[!A-Fa-f0-9.:]*}" ] && return 1
35 validate_ip6prefix
() {
37 [ -z "$ip6prefix" -o "$ip6prefix" != "${ip6prefix%%[!A-Fa-f0-9./:]*}" ] && return 1
41 validate_radvd_string
() {
43 [ -z "$radvd_string" -o "$radvd_string" != "${radvd_string%%[!a-z0-9.:_-]*}" ] && return 1
49 validate_varname
"$interface" ||
return 1
54 config_get cfgt
"$interface" TYPE
55 [ "$cfgt" != "interface" ] && return 1
56 config_get ifname
"$interface" ifname
57 validate_ifname
"$ifname" ||
return 1
58 printf '%s\n' "$ifname"
71 host) iproute2_scope
=host ifconfig_scope
=Host
;;
72 link
) iproute2_scope
=link ifconfig_scope
=Link
;;
73 site
) iproute2_scope
=site ifconfig_scope
=Site
;;
74 global
) iproute2_scope
=global ifconfig_scope
=Global
;;
75 "") get_ip6addr
"$ifname" global || get_ip6addr
"$ifname" site
; return;;
79 ip6addr
=$
(LANG
=C ip
-f inet6
-- addr show dev
"$ifname" 2> /dev
/null |
sed -n -e 's/^ *inet6 \([A-Fa-f0-9.:]*[/][0-9]*\) scope '"$iproute2_scope"' $/\1/p' |
head -n 1)
80 if [ -z "$ip6addr" ]; then
81 ip6addr
=$
(LANG
=C ifconfig
"$ifname" 2> /dev
/null |
sed -n -e 's/^ *inet6 addr: \([A-Fa-f0-9.:]*[/][0-9]*\) Scope:'"$ifconfig_scope"'$/\1/p' |
tail -n 1)
82 [ -z "$ip6addr" ] && return 1
85 printf '%s\n' "$ip6addr"
90 radvd_find_config_file
() {
92 validate_varname
"$cfg" ||
return 0
94 config_get_bool ignore
"$cfg" ignore
0
95 [ "$ignore" -ne 0 ] && return 0
96 config_get RADVD_CONFIG_FILE
"$cfg" config_file
101 radvd_add_interface
() {
103 validate_varname
"$cfg" ||
return 0
110 config_get_bool ignore
"$cfg" ignore
0
111 [ "$ignore" -ne 0 ] && return 0
113 config_get interfaces
"$cfg" interface
114 for interface
in $interfaces; do
115 validate_varname
"$interface" ||
continue
117 for list_interface
in $RADVD_INTERFACES; do
118 [ "$interface" = "$list_interface" ] && exist
=1
120 [ "$exist" -eq 0 ] && RADVD_INTERFACES
="$RADVD_INTERFACES $interface"
126 radvd_write_interface
() {
128 validate_varname
"$cfg" ||
return 0
135 config_get_bool ignore
"$cfg" ignore
0
136 [ "$ignore" -ne 0 ] && return 0
138 config_get interfaces
"$cfg" interface
140 for interface
in $interfaces; do
141 [ "$INTERFACE" = "$interface" ] && exist
=1
143 [ "$exist" -eq 0 ] && return 0
145 for name
in $RADVD_INTERFACE_STRING_OPTIONS; do
146 config_get value
"$cfg" "$name"
147 validate_radvd_string
"$value" ||
continue
148 printf '\t%s %s;\n' "$name" "$value"
151 for name
in $RADVD_INTERFACE_BOOLEAN_OPTIONS; do
152 config_get value
"$cfg" "$name"
153 [ -z "$value" ] && continue
154 config_get_bool value
"$cfg" "$name" 0
155 if [ "$value" -ne 0 ]; then
156 printf '\t%s on;\n' "$name"
158 printf '\t%s off;\n' "$name"
162 config_get clients
"$cfg" client
163 if [ -n "$clients" ]; then
164 printf '\n\tclients\n\t{\n'
166 for client
in $clients; do
167 validate_ip6addr
"$client" ||
continue
168 printf '\t\t%s;\n' "$client"
177 radvd_write_prefix
() {
179 validate_varname
"$cfg" ||
return 0
189 config_get_bool ignore
"$cfg" ignore
0
190 [ "$ignore" -ne 0 ] && return 0
192 config_get interfaces
"$cfg" interface
194 for interface
in $interfaces; do
195 [ "$INTERFACE" = "$interface" ] && exist
=1
197 [ "$exist" -eq 0 ] && return 0
199 config_get prefixes
"$cfg" prefix
200 if [ -z "$prefixes" ]; then
201 prefixes
=$
(get_ip6addr
"$IFNAME") ||
return 0
204 for prefix
in $prefixes; do
205 validate_ip6prefix
"$prefix" ||
continue
206 printf '\n\tprefix %s\n\t{\n' "$prefix"
208 for name
in $RADVD_PREFIX_STRING_OPTIONS; do
209 config_get value
"$cfg" "$name"
210 validate_radvd_string
"$value" ||
continue
211 printf '\t\t%s %s;\n' "$name" "$value"
214 for name
in $RADVD_PREFIX_BOOLEAN_OPTIONS; do
215 config_get value
"$cfg" "$name"
216 [ -z "$value" ] && continue
217 config_get_bool value
"$cfg" "$name" 0
218 if [ "$value" -ne 0 ]; then
219 printf '\t\t%s on;\n' "$name"
221 printf '\t\t%s off;\n' "$name"
225 config_get value
"$cfg" Base6to4Interface
226 if [ -n "$value" ]; then
227 if ifname
=$
(get_ifname
"$value"); then
228 printf '\t\t%s %s;\n' "Base6to4Interface" "$ifname"
238 radvd_write_route
() {
240 validate_varname
"$cfg" ||
return 0
249 config_get_bool ignore
"$cfg" ignore
0
250 [ "$ignore" -ne 0 ] && return 0
252 config_get interfaces
"$cfg" interface
254 for interface
in $interfaces; do
255 [ "$INTERFACE" = "$interface" ] && exist
=1
257 [ "$exist" -eq 0 ] && return 0
259 config_get prefixes
"$cfg" prefix
260 for prefix
in $prefixes; do
261 validate_ip6prefix
"$prefix" ||
continue
262 printf '\n\troute %s\n\t{\n' "$prefix"
264 for name
in $RADVD_ROUTE_STRING_OPTIONS; do
265 config_get value
"$cfg" "$name"
266 validate_radvd_string
"$value" ||
continue
267 printf '\t\t%s %s;\n' "$name" "$value"
276 radvd_write_rdnss
() {
278 validate_varname
"$cfg" ||
return 0
289 config_get_bool ignore
"$cfg" ignore
0
290 [ "$ignore" -ne 0 ] && return 0
292 config_get interfaces
"$cfg" interface
294 for interface
in $interfaces; do
295 [ "$INTERFACE" = "$interface" ] && exist
=1
297 [ "$exist" -eq 0 ] && return 0
299 config_get addrs
"$cfg" addr
301 for addr
in $addrs; do
302 [ "$i" -ge 3 ] && break
303 validate_ip6addr
"$addr" ||
continue
304 addr_list
="$addr_list $addr"
308 if [ -z "$addr_list" ]; then
309 addr
=$
(get_ip6addr
"$IFNAME" link
) ||
return 0
310 addr_list
=" ${addr%%[/]*}"
313 printf '\n\tRDNSS%s\n\t{\n' "$addr_list"
315 for name
in $RADVD_RDNSS_STRING_OPTIONS; do
316 config_get value
"$cfg" "$name"
317 validate_radvd_string
"$value" ||
continue
318 printf '\t\t%s %s;\n' "$name" "$value"
326 radvd_write_dnssl
() {
328 validate_varname
"$cfg" ||
return 0
338 config_get_bool ignore
"$cfg" ignore
0
339 [ "$ignore" -ne 0 ] && return 0
341 config_get interfaces
"$cfg" interface
343 for interface
in $interfaces; do
344 [ "$INTERFACE" = "$interface" ] && exist
=1
346 [ "$exist" -eq 0 ] && return 0
348 config_get suffixes
"$cfg" suffix
349 for suffix
in $suffixes; do
350 validate_radvd_string
"$suffix" ||
continue
351 suffix_list
="$suffix_list $suffix"
354 printf '\n\tDNSSL%s\n\t{\n' "$suffix_list"
356 for name
in $RADVD_DNSSL_STRING_OPTIONS; do
357 config_get value
"$cfg" "$name"
358 validate_radvd_string
"$value" ||
continue
359 printf '\t\t%s %s;\n' "$name" "$value"
367 radvd_write_config
() {
371 config_foreach radvd_add_interface interface
372 config_foreach radvd_add_interface prefix
373 config_foreach radvd_add_interface route
374 config_foreach radvd_add_interface RDNSS
375 config_foreach radvd_add_interface DNSSL
377 for INTERFACE
in $RADVD_INTERFACES; do
378 IFNAME
=$
(get_ifname
"$INTERFACE") ||
continue
379 printf 'interface %s\n{\n' "$IFNAME"
380 config_foreach radvd_write_interface interface
381 config_foreach radvd_write_prefix prefix
382 config_foreach radvd_write_route route
383 config_foreach radvd_write_rdnss rdnss
384 config_foreach radvd_write_dnssl dnssl
395 config_foreach radvd_find_config_file radvd
397 if [ -z "$RADVD_CONFIG_FILE" ]; then
398 mkdir
-p -- /var
/etc
/
399 radvd_write_config
> /var
/etc
/radvd.conf
400 if [ -s "/var/etc/radvd.conf" ]; then
401 RADVD_CONFIG_FILE
=/var
/etc
/radvd.conf
405 [ -z "$RADVD_CONFIG_FILE" ] && return 1
407 sysctl
-w net.ipv6.conf.all.forwarding
=1 > /dev
/null
2> /dev
/null
409 radvd
-C "$RADVD_CONFIG_FILE" -m stderr_syslog
-p /var
/run
/radvd.pid