summaryrefslogtreecommitdiffstats
path: root/package/network/ipv6/6relayd/files/6relayd.init
blob: b26d6c5e3dc7cec72754bbfd80eaff6dc6212c66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/bin/sh /etc/rc.common
# Copyright (c) 2011-2012 OpenWrt.org
START=80
args=""

add_static_lease() {
	local cfg="$1"

	local duid id
	config_get duid "$cfg" duid
	config_get id "$cfg" id

	[ -n "$duid" -a -n "$id" ] && append args "-a$duid:$id"

}

start_6relayd() {
	local cfg="$1"
	local mode="$2"
	args="-l/tmp/hosts/6relayd,/usr/sbin/6relayd-update"

	SERVICE_DAEMONIZE=1
	SERVICE_WRITE_PID=1
	SERVICE_PID_FILE="/var/run/6relayd-$cfg.pid"
	[ -f "$SERVICE_PID_FILE" ] && {
		if grep -q 6relayd "/proc/$(cat $SERVICE_PID_FILE)/cmdline"; then
			return 0
		else
			rm -f "$SERVICE_PID_FILE"
		fi
	}

	# Detect master interface
	local master masterif
	config_get masterif "$cfg" master
	network_get_device master "$masterif"
	[ -z "$master" ] && master="."

	# Detect slave interfaces
	local slaves=""
	local slaveifs
	config_get slaveifs "$cfg" network
	for slaveif in $slaveifs; do
		local slave
		network_get_device slave "$slaveif"
		# Compatibility with old config format
		if [ "$mode" = "relay" -a "$master" = "." ]; then
			[ -z "$slave" ] && return 0
			master="$slave"
		else
			[ -n "$slave" ] && append slaves "$slave"
		fi
	done

	# Bail if no slaves are active
	[ -z "$slaves" ] && return 0

	# Configure services
	local rd dhcpv6 ndp
	config_get rd "$cfg" rd
	config_get dhcpv6 "$cfg" dhcpv6
	config_get ndp "$cfg" ndp

	# Test for fallback mode
	local fallback fallback_relay
	config_get fallback_relay "$cfg" fallback_relay

	if [ -n "$fallback_relay" -a "$master" != "." ]; then
		local prefix
		network_get_prefix6 prefix "$masterif"
		[ -z "$prefix" ] && fallback=1
	fi

	if [ -n "$fallback" ]; then
		for service in $fallback_relay; do
			eval "$service=relay"
		done
	fi

	# Configure feature options
	local always_rewrite_dns rewrite_dns_addr
	config_get_bool always_rewrite_dns "$cfg" always_rewrite_dns 0
	config_get rewrite_dns_addr "$cfg" rewrite_dns_addr
	[ "$always_rewrite_dns" -eq 1 -o -n "$rewrite_dns_addr" ] && append args "-n$rewrite_dns_addr"

	local always_assume_default
	config_get_bool always_assume_default "$cfg" always_assume_default 0
	[ "$always_assume_default" -eq 1 ] && append args "-u"

	local compat_ula
	config_get_bool compat_ula "$cfg" compat_ula 0
	[ "$compat_ula" -eq 1 ] && append args "-c"

	local management_level
	config_get management_level "$cfg" management_level
	[ -n "$management_level" ] && append args "-m$management_level"

	config_foreach add_static_lease lease

	[ "$ndp" = "relay" ] && append args "-N -s"
	[ "$rd" = "relay" ] && append args "-Rrelay"
	[ "$rd" = "server" ] && append args "-Rserver"
	[ "$dhcpv6" = "relay" ] && append args "-Drelay"
	[ "$dhcpv6" = "server" ] && append args "-Dserver"
	[ "$ndp" != "relay" -a "$rd" != "relay" -a "$dhcpv6" != "relay" ] && master="."

	service_start /usr/sbin/6relayd $args $master $slaves
}

restart_affected_6relayd() {
	local cfg="$1"
	local net="$2"
	local mode="$3"

	local master slaves
	config_get master "$cfg" master
	config_get slaves "$cfg" network

	for iface in $master $slaves; do
		if [ "$iface" = "$net" ]; then
			SERVICE_PID_FILE="/var/run/6relayd-$cfg.pid"
			service_stop /usr/sbin/6relayd
			rm -f "$SERVICE_PID_FILE"
			start_6relayd "$cfg" "$mode"
		fi
	done
}

restart_affected() {
	. /lib/functions/service.sh
	. /lib/functions/network.sh
	local net="$1"
	config_load 6relayd
	config_foreach restart_affected_6relayd server "$net"
	config_foreach restart_affected_6relayd relay "$net" "relay"
}

stop() {
	. /lib/functions/service.sh
	for pid in /var/run/6relayd-*.pid; do
		SERVICE_PID_FILE="$pid"
		service_stop /usr/sbin/6relayd
		rm -f "$SERVICE_PID_FILE"
	done
}

start() {
	. /lib/functions/service.sh
	. /lib/functions/network.sh
	config_load 6relayd
	config_foreach start_6relayd server
	config_foreach start_6relayd relay relay
}