68816b765f52264f90259d9cfd7ca8170d4e28e5
[openwrt.git] / package / network / ipv6 / 6relayd / files / 6relayd.init
1 #!/bin/sh /etc/rc.common
2 # Copyright (c) 2011-2012 OpenWrt.org
3 START=80
4 args=""
5
6 add_static_lease() {
7         local cfg="$1"
8
9         local duid id
10         config_get duid "$cfg" duid
11         config_get id "$cfg" id
12
13         [ -n "$duid" -a -n "$id" ] && append args "-a$duid:$id"
14
15 }
16
17 start_6relayd() {
18         local cfg="$1"
19         local mode="$2"
20         args="-l/tmp/hosts/6relayd,/usr/sbin/6relayd-update"
21
22         SERVICE_DAEMONIZE=1
23         SERVICE_WRITE_PID=1
24         SERVICE_PID_FILE="/var/run/6relayd-$cfg.pid"
25         [ -f "$SERVICE_PID_FILE" ] && {
26                 if grep -q 6relayd "/proc/$(cat $SERVICE_PID_FILE)/cmdline"; then
27                         return 0
28                 else
29                         rm -f "$SERVICE_PID_FILE"
30                 fi
31         }
32
33         # Detect master interface
34         local master masterif
35         config_get masterif "$cfg" master
36         network_get_device master "$masterif"
37         [ -z "$master" -o "$master" = "$masterif" ] && master="."
38
39         # Detect slave interfaces
40         local slaves=""
41         local slaveifs
42         config_get slaveifs "$cfg" network
43         for slaveif in $slaveifs; do
44                 local slave
45                 network_get_device slave "$slaveif"
46                 # Compatibility with old config format
47                 if [ "$mode" = "relay" -a "$master" = "." ]; then
48                         [ -z "$slave" -o "$slave" = "$slaveif" ] && return 0
49                         master="$slave"
50                 else
51                         [ -n "$slave" -o "$slave" = "$slaveif" ] && append slaves "$slave"
52                 fi
53         done
54
55         # Bail if no slaves are active
56         [ -z "$slaves" ] && return 0
57
58         # Configure services
59         local rd dhcpv6 ndp
60         config_get rd "$cfg" rd
61         config_get dhcpv6 "$cfg" dhcpv6
62         config_get ndp "$cfg" ndp
63
64         # Test for fallback mode
65         local fallback fallback_relay
66         config_get fallback_relay "$cfg" fallback_relay
67
68         if [ -n "$fallback_relay" -a "$master" != "." ]; then
69                 local prefix
70                 network_get_prefix6 prefix "$masterif"
71                 [ -z "$prefix" ] && fallback=1
72         fi
73
74         if [ -n "$fallback" ]; then
75                 for service in $fallback_relay; do
76                         eval "$service=relay"
77                 done
78         fi
79
80         # Configure feature options
81         local always_rewrite_dns rewrite_dns_addr
82         config_get_bool always_rewrite_dns "$cfg" always_rewrite_dns 0
83         config_get rewrite_dns_addr "$cfg" rewrite_dns_addr
84         [ "$always_rewrite_dns" -eq 1 -o -n "$rewrite_dns_addr" ] && append args "-n$rewrite_dns_addr"
85
86         local always_assume_default
87         config_get_bool always_assume_default "$cfg" always_assume_default 0
88         [ "$always_assume_default" -eq 1 ] && append args "-u"
89
90         local compat_ula
91         config_get_bool compat_ula "$cfg" compat_ula 0
92         [ "$compat_ula" -eq 1 ] && append args "-c"
93
94         local management_level
95         config_get management_level "$cfg" management_level
96         [ -n "$management_level" ] && append args "-m$management_level"
97
98         local management_offlink
99         config_get_bool management_offlink "$cfg" management_offlink 0
100         [ "$management_offlink" -eq 1 ] && append args "-o"
101
102         local management_preference
103         config_get management_preference "$cfg" management_preference
104         [ -n "$management_preference" ] && append args "-i$management_preference"
105
106         config_foreach add_static_lease lease
107
108         [ "$ndp" = "relay" ] && append args "-N -s"
109         [ "$rd" = "relay" ] && append args "-Rrelay"
110         [ "$rd" = "server" ] && append args "-Rserver"
111         [ "$dhcpv6" = "relay" ] && append args "-Drelay"
112         [ "$dhcpv6" = "server" ] && append args "-Dserver"
113         [ "$ndp" != "relay" -a "$rd" != "relay" -a "$dhcpv6" != "relay" ] && master="."
114
115         service_start /usr/sbin/6relayd $args $master $slaves
116 }
117
118 restart_affected_6relayd() {
119         local cfg="$1"
120         local net="$2"
121         local mode="$3"
122
123         local master slaves
124         config_get master "$cfg" master
125         config_get slaves "$cfg" network
126
127         for iface in $master $slaves; do
128                 if [ "$iface" = "$net" ]; then
129                         SERVICE_PID_FILE="/var/run/6relayd-$cfg.pid"
130                         service_stop /usr/sbin/6relayd
131                         rm -f "$SERVICE_PID_FILE"
132                         start_6relayd "$cfg" "$mode"
133                 fi
134         done
135 }
136
137 restart_affected() {
138         . /lib/functions/service.sh
139         . /lib/functions/network.sh
140         local net="$1"
141         config_load 6relayd
142         config_foreach restart_affected_6relayd server "$net"
143         config_foreach restart_affected_6relayd relay "$net" "relay"
144 }
145
146 stop() {
147         . /lib/functions/service.sh
148         for pid in /var/run/6relayd-*.pid; do
149                 SERVICE_PID_FILE="$pid"
150                 service_stop /usr/sbin/6relayd
151                 rm -f "$SERVICE_PID_FILE"
152         done
153 }
154
155 start() {
156         . /lib/functions/service.sh
157         . /lib/functions/network.sh
158         config_load 6relayd
159         config_foreach start_6relayd server
160         config_foreach start_6relayd relay relay
161 }