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 DeprecatePrefix DecrementLifetimes'
11 RADVD_ROUTE_STRING_OPTIONS
='AdvRouteLifetime AdvRoutePreference'
12 RADVD_ROUTE_BOOLEAN_OPTIONS
='RemoveRoute'
14 RADVD_RDNSS_STRING_OPTIONS
='AdvRDNSSLifetime FlushRDNSS'
16 RADVD_DNSSL_STRING_OPTIONS
='AdvDNSSLLifetime FlushDNSSL'
20 [ -z "$varname" -o "$varname" != "${varname%%[!A-Za-z0-9_]*}" ] && return 1
26 [ -z "$ifname" -o "$ifname" != "${ifname%%[!A-Za-z0-9.:_-]*}" ] && return 1
32 [ -z "$ip6addr" -o "$ip6addr" != "${ip6addr%%[!A-Fa-f0-9.:]*}" ] && return 1
36 validate_ip6prefix
() {
38 [ -z "$ip6prefix" -o "$ip6prefix" != "${ip6prefix%%[!A-Fa-f0-9./:]*}" ] && return 1
42 validate_radvd_string
() {
44 [ -z "$radvd_string" -o "$radvd_string" != "${radvd_string%%[!a-z0-9.:_-]*}" ] && return 1
50 validate_varname
"$interface" ||
return 1
55 config_get cfgt
"$interface" TYPE
56 [ "$cfgt" != "interface" ] && return 1
57 config_get ifname
"$interface" ifname
58 validate_ifname
"$ifname" ||
return 1
59 printf '%s\n' "$ifname"
72 host) iproute2_scope
=host ifconfig_scope
=Host
;;
73 link
) iproute2_scope
=link ifconfig_scope
=Link
;;
74 site
) iproute2_scope
=site ifconfig_scope
=Site
;;
75 global
) iproute2_scope
=global ifconfig_scope
=Global
;;
76 "") get_ip6addr
"$ifname" global || get_ip6addr
"$ifname" site
; return;;
80 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)
81 if [ -z "$ip6addr" ]; then
82 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)
83 [ -z "$ip6addr" ] && return 1
86 printf '%s\n' "$ip6addr"
91 radvd_find_config_file
() {
93 validate_varname
"$cfg" ||
return 0
95 config_get_bool ignore
"$cfg" ignore
0
96 [ "$ignore" -ne 0 ] && return 0
97 config_get RADVD_CONFIG_FILE
"$cfg" config_file
102 radvd_add_interface
() {
104 validate_varname
"$cfg" ||
return 0
111 config_get_bool ignore
"$cfg" ignore
0
112 [ "$ignore" -ne 0 ] && return 0
114 config_get interfaces
"$cfg" interface
115 for interface
in $interfaces; do
116 validate_varname
"$interface" ||
continue
118 for list_interface
in $RADVD_INTERFACES; do
119 [ "$interface" = "$list_interface" ] && exist
=1
121 [ "$exist" -eq 0 ] && RADVD_INTERFACES
="$RADVD_INTERFACES $interface"
127 radvd_write_interface
() {
129 validate_varname
"$cfg" ||
return 0
136 config_get_bool ignore
"$cfg" ignore
0
137 [ "$ignore" -ne 0 ] && return 0
139 config_get interfaces
"$cfg" interface
141 for interface
in $interfaces; do
142 [ "$INTERFACE" = "$interface" ] && exist
=1
144 [ "$exist" -eq 0 ] && return 0
146 for name
in $RADVD_INTERFACE_STRING_OPTIONS; do
147 config_get value
"$cfg" "$name"
148 validate_radvd_string
"$value" ||
continue
149 printf '\t%s %s;\n' "$name" "$value"
152 for name
in $RADVD_INTERFACE_BOOLEAN_OPTIONS; do
153 config_get value
"$cfg" "$name"
154 [ -z "$value" ] && continue
155 config_get_bool value
"$cfg" "$name" 0
156 if [ "$value" -ne 0 ]; then
157 printf '\t%s on;\n' "$name"
159 printf '\t%s off;\n' "$name"
163 config_get clients
"$cfg" client
164 if [ -n "$clients" ]; then
165 printf '\n\tclients\n\t{\n'
167 for client
in $clients; do
168 validate_ip6addr
"$client" ||
continue
169 printf '\t\t%s;\n' "$client"
178 radvd_write_prefix
() {
180 validate_varname
"$cfg" ||
return 0
190 config_get_bool ignore
"$cfg" ignore
0
191 [ "$ignore" -ne 0 ] && return 0
193 config_get interfaces
"$cfg" interface
195 for interface
in $interfaces; do
196 [ "$INTERFACE" = "$interface" ] && exist
=1
198 [ "$exist" -eq 0 ] && return 0
200 config_get prefixes
"$cfg" prefix
201 if [ -z "$prefixes" ]; then
202 prefixes
=$
(get_ip6addr
"$IFNAME") ||
return 0
205 for prefix
in $prefixes; do
206 validate_ip6prefix
"$prefix" ||
continue
207 printf '\n\tprefix %s\n\t{\n' "$prefix"
209 for name
in $RADVD_PREFIX_STRING_OPTIONS; do
210 config_get value
"$cfg" "$name"
211 validate_radvd_string
"$value" ||
continue
212 printf '\t\t%s %s;\n' "$name" "$value"
215 for name
in $RADVD_PREFIX_BOOLEAN_OPTIONS; do
216 config_get value
"$cfg" "$name"
217 [ -z "$value" ] && continue
218 config_get_bool value
"$cfg" "$name" 0
219 if [ "$value" -ne 0 ]; then
220 printf '\t\t%s on;\n' "$name"
222 printf '\t\t%s off;\n' "$name"
226 config_get value
"$cfg" Base6Interface
227 if [ -n "$value" ]; then
228 if ifname
=$
(get_ifname
"$value"); then
229 printf '\t\t%s %s;\n' "Base6Interface" "$ifname"
233 config_get value
"$cfg" Base6to4Interface
234 if [ -n "$value" ]; then
235 if ifname
=$
(get_ifname
"$value"); then
236 printf '\t\t%s %s;\n' "Base6to4Interface" "$ifname"
246 radvd_write_route
() {
248 validate_varname
"$cfg" ||
return 0
257 config_get_bool ignore
"$cfg" ignore
0
258 [ "$ignore" -ne 0 ] && return 0
260 config_get interfaces
"$cfg" interface
262 for interface
in $interfaces; do
263 [ "$INTERFACE" = "$interface" ] && exist
=1
265 [ "$exist" -eq 0 ] && return 0
267 config_get prefixes
"$cfg" prefix
268 for prefix
in $prefixes; do
269 validate_ip6prefix
"$prefix" ||
continue
270 printf '\n\troute %s\n\t{\n' "$prefix"
272 for name
in $RADVD_ROUTE_STRING_OPTIONS; do
273 config_get value
"$cfg" "$name"
274 validate_radvd_string
"$value" ||
continue
275 printf '\t\t%s %s;\n' "$name" "$value"
278 for name
in $RADVD_ROUTE_BOOLEAN_OPTIONS; do
279 config_get value
"$cfg" "$name"
280 [ -z "$value" ] && continue
281 config_get_bool value
"$cfg" "$name" 0
282 if [ "$value" -ne 0 ]; then
283 printf '\t\t%s on;\n' "$name"
285 printf '\t\t%s off;\n' "$name"
295 radvd_write_rdnss
() {
297 validate_varname
"$cfg" ||
return 0
308 config_get_bool ignore
"$cfg" ignore
0
309 [ "$ignore" -ne 0 ] && return 0
311 config_get interfaces
"$cfg" interface
313 for interface
in $interfaces; do
314 [ "$INTERFACE" = "$interface" ] && exist
=1
316 [ "$exist" -eq 0 ] && return 0
318 config_get addrs
"$cfg" addr
320 for addr
in $addrs; do
321 [ "$i" -ge 3 ] && break
322 validate_ip6addr
"$addr" ||
continue
323 addr_list
="$addr_list $addr"
327 if [ -z "$addr_list" ]; then
328 addr
=$
(get_ip6addr
"$IFNAME" link
) ||
return 0
329 addr_list
=" ${addr%%[/]*}"
332 printf '\n\tRDNSS%s\n\t{\n' "$addr_list"
334 for name
in $RADVD_RDNSS_STRING_OPTIONS; do
335 config_get value
"$cfg" "$name"
336 validate_radvd_string
"$value" ||
continue
337 printf '\t\t%s %s;\n' "$name" "$value"
345 radvd_write_dnssl
() {
347 validate_varname
"$cfg" ||
return 0
357 config_get_bool ignore
"$cfg" ignore
0
358 [ "$ignore" -ne 0 ] && return 0
360 config_get interfaces
"$cfg" interface
362 for interface
in $interfaces; do
363 [ "$INTERFACE" = "$interface" ] && exist
=1
365 [ "$exist" -eq 0 ] && return 0
367 config_get suffixes
"$cfg" suffix
368 for suffix
in $suffixes; do
369 validate_radvd_string
"$suffix" ||
continue
370 suffix_list
="$suffix_list $suffix"
373 printf '\n\tDNSSL%s\n\t{\n' "$suffix_list"
375 for name
in $RADVD_DNSSL_STRING_OPTIONS; do
376 config_get value
"$cfg" "$name"
377 validate_radvd_string
"$value" ||
continue
378 printf '\t\t%s %s;\n' "$name" "$value"
386 radvd_write_config
() {
390 config_foreach radvd_add_interface interface
391 config_foreach radvd_add_interface prefix
392 config_foreach radvd_add_interface route
393 config_foreach radvd_add_interface RDNSS
394 config_foreach radvd_add_interface DNSSL
396 for INTERFACE
in $RADVD_INTERFACES; do
397 IFNAME
=$
(get_ifname
"$INTERFACE") ||
continue
398 printf 'interface %s\n{\n' "$IFNAME"
399 config_foreach radvd_write_interface interface
400 config_foreach radvd_write_prefix prefix
401 config_foreach radvd_write_route route
402 config_foreach radvd_write_rdnss rdnss
403 config_foreach radvd_write_dnssl dnssl
414 config_foreach radvd_find_config_file radvd
416 if [ -z "$RADVD_CONFIG_FILE" ]; then
417 mkdir
-p -- /var
/etc
/
418 radvd_write_config
> /var
/etc
/radvd.conf
419 if [ -s "/var/etc/radvd.conf" ]; then
420 RADVD_CONFIG_FILE
=/var
/etc
/radvd.conf
424 [ -z "$RADVD_CONFIG_FILE" ] && return 1
426 sysctl
-w net.ipv6.conf.all.forwarding
=1 > /dev
/null
2> /dev
/null
428 radvd
-C "$RADVD_CONFIG_FILE" -m stderr_syslog
-p /var
/run
/radvd.pid