aboutsummaryrefslogtreecommitdiff
path: root/net/ocserv/files/ocserv.init
blob: 2cd16c08480094035033ea9d67a8dd59447fbe39 (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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#!/bin/sh /etc/rc.common

START=50
USE_PROCD=1

. $IPKG_INSTROOT/lib/functions/network.sh

setup_config() {
	config_get port         $1 port "4443"
	config_get max_clients  $1 max_clients "8"
	config_get max_same     $1 max_same "2"
	config_get dpd          $1 dpd "120"
	config_get predictable_ips  $1 predictable_ips "1"
	config_get compression  $1 compression "0"
	config_get udp          $1 udp "1"
	config_get udp_port     $1 udp_port ""
	config_get auth         $1 auth "plain"
	config_get cisco_compat $1 cisco_compat "1"
	config_get ipaddr       $1 ipaddr ""
	config_get netmask      $1 netmask ""
	config_get ip6addr      $1 ip6addr ""
	config_get proxy_arp    $1 proxy_arp "0"
	config_get ping_leases  $1 ping_leases "0"
	config_get split_dns    $1 split_dns "0"
	config_get default_domain  $1 default_domain ""

	# Enable proxy arp, and make sure that ping leases is set to true in that case,
	# to prevent conflicts.
	if test "$proxy_arp" = 1;then
		local ip
		# IP address is empty. Auto-configure LAN + VPN.
		if test -z "$ipaddr";then
			local mask
			mask=$(uci get network.lan.netmask)
			if test "$mask" = "255.255.255.0";then
				uci set dhcp.lan.start=100
				uci set dhcp.lan.limit=91
			fi
			network_get_ipaddr ip lan
			ipaddr="$(echo $ip|cut -d . -f1,2,3).192"
			netmask="255.255.255.192"
		fi

		if test -z "$ip6addr";then
			network_get_ipaddr6 ip6addr lan
			# Append ipv6 prefix
			test -n "$ip6addr" && ip6addr="$ip6addr/96"
		fi

		ping_leases=1
		local ifname
		if network_get_device ifname lan; then
			test -n "$ipaddr" && sysctl -w "net.ipv4.conf.$ifname.proxy_arp"=1 >/dev/null
			test -n "$ip6addr" && sysctl -w "net.ipv6.conf.$ifname.proxy_ndp"=1 >/dev/null
		fi
	else
		test -z "$ipaddr" && ipaddr="192.168.100.0"
		test -z "$netmask" && netmask="255.255.255.0"
	fi

	enable_default_domain="#"
	enable_udp="#"
	enable_compression="#"
	enable_split_dns="#"
	test $predictable_ips = "0" && predictable_ips="false"
	test $predictable_ips = "1" && predictable_ips="true"
	test $cisco_compat = "0" && cisco_compat="false"
	test $cisco_compat = "1" && cisco_compat="true"
	test $ping_leases = "0" && ping_leases="false"
	test $ping_leases = "1" && ping_leases="true"
	test $udp = "1" && enable_udp=""
	test $split_dns = "1" && enable_split_dns=""
	test $compression = "1" && enable_compression=""

	test -z $udp_port && udp_port="$port"
	test -z $default_domain && default_domain=$(uci get dhcp.@dnsmasq[0].domain)
	test -n $default_domain && enable_default_domain=""
	test -z $ip6addr && enable_ipv6="#"

	test $auth = "plain" && authsuffix="\[passwd=/var/etc/ocpasswd\]"

	dyndns="false"
	hostname=`uci show ddns 2>/dev/null|grep domain|head -1|cut -d '=' -f 2`
	[ -n "$hostname" ] && dyndns="true"

	mkdir -p /var/etc
	sed -e "s#|PORT|#$port#g" \
	    -e "s#|UDP_PORT|#$udp_port#g" \
	    -e "s#|MAX_CLIENTS|#$max_clients#g" \
	    -e "s#|MAX_SAME|#$max_same#g" \
	    -e "s#|DPD|#$dpd#g" \
	    -e "s#|AUTH|#$auth$authsuffix#g" \
	    -e "s#|DYNDNS|#$dyndns#g" \
	    -e "s#|PREDICTABLE_IPS|#$predictable_ips#g" \
	    -e "s#|DEFAULT_DOMAIN|#$default_domain#g" \
	    -e "s#|ENABLE_DEFAULT_DOMAIN|#$enable_default_domain#g" \
	    -e "s#|ENABLE_SPLIT_DNS|#$enable_split_dns#g" \
	    -e "s#|CISCO_COMPAT|#$cisco_compat#g" \
	    -e "s#|PING_LEASES|#$ping_leases#g" \
	    -e "s#|UDP|#$enable_udp#g" \
	    -e "s#|COMPRESSION|#$enable_compression#g" \
	    -e "s#|IPV4ADDR|#$ipaddr#g" \
	    -e "s#|NETMASK|#$netmask#g" \
	    -e "s#|IPV6ADDR|#$ip6addr#g" \
	    -e "s#|ENABLE_IPV6|#$enable_ipv6#g" \
	    /etc/ocserv/ocserv.conf.template > /var/etc/ocserv.conf

	test -f /etc/ocserv/ocserv.conf.local && cat /etc/ocserv/ocserv.conf.local >> /var/etc/ocserv.conf
}

setup_users() {
	local name
	local group
	local password

	config_get name $1 name
	config_get group $1 group '*'
	config_get password $1 password

	[ -z "$name" -o -z "$password" ] && return

	echo "$name:$group:$password" >> /var/etc/ocpasswd
}

setup_routes() {
	local routes

	config_get ip $1 ip
	config_get netmask $1 netmask

	[ -z "$ip" -o -z "$netmask" ] && return

	echo "route = $ip/$netmask" >> /var/etc/ocserv.conf
}

setup_dns() {
	local routes

	config_get ip $1 ip

	[ -z "$ip" ] && return

	echo "dns = $ip" >> /var/etc/ocserv.conf
}

start_service() {
	local hostname iface

	hostname=`uci show ddns 2>/dev/null|grep domain|head -1|cut -d '=' -f 2`
	[ -z "$hostname" ] && hostname=`uci get system.@system[0].hostname 2>/dev/null`

	[ -f /etc/config/ocserv-dir/ca-key.pem ] && mv /etc/config/ocserv-dir/ca-key.pem /etc/ocserv/ca-key.pem
	[ -f /etc/config/ocserv-dir/ca.pem ] && mv /etc/config/ocserv-dir/ca.pem /etc/ocserv/ca.pem
	[ -f /etc/config/ocserv-dir/server-key.pem ] && mv /etc/config/ocserv-dir/server-key.pem /etc/ocserv/server-key.pem
	[ -f /etc/config/ocserv-dir/server-cert.pem ] && mv /etc/config/ocserv-dir/server-cert.pem /etc/ocserv/server-cert.pem
	[ -d /etc/config/ocserv-dir ] && rmdir /etc/config/ocserv-dir

	[ ! -f /etc/ocserv/ca-key.pem ] && [ -x /usr/bin/certtool ] && {
		logger -t ocserv "Generating CA certificate..."
		mkdir -p /etc/ocserv/pki/
		certtool --bits 2048 --generate-privkey --outfile /etc/ocserv/ca-key.pem >/dev/null 2>&1
		echo "cn=$hostname CA" >/etc/ocserv/pki/ca.tmpl
		echo "expiration_days=-1" >>/etc/ocserv/pki/ca.tmpl
		echo "serial=1" >>/etc/ocserv/pki/ca.tmpl
		echo "ca" >>/etc/ocserv/pki/ca.tmpl
		echo "cert_signing_key" >>/etc/ocserv/pki/ca.tmpl

		certtool --template /etc/ocserv/pki/ca.tmpl \
			--generate-self-signed --load-privkey /etc/ocserv/ca-key.pem \
			--outfile /etc/ocserv/ca.pem >/dev/null 2>&1
	}

	#generate server certificate/key
	[ ! -f /etc/ocserv/server-key.pem ] && [ -x /usr/bin/certtool ] && {
		logger -t ocserv "Generating server certificate..."
		mkdir -p /etc/ocserv/pki/
		certtool --bits 2048 --generate-privkey --outfile /etc/ocserv/server-key.pem >/dev/null 2>&1
		echo "cn=$hostname" >/etc/ocserv/pki/server.tmpl
		echo "serial=2" >>/etc/ocserv/pki/server.tmpl
		echo "expiration_days=-1" >>/etc/ocserv/pki/server.tmpl
		echo "signing_key" >>/etc/ocserv/pki/server.tmpl
		echo "encryption_key" >>/etc/ocserv/pki/server.tmpl
		certtool --template /etc/ocserv/pki/server.tmpl \
			--generate-certificate --load-privkey /etc/ocserv/server-key.pem \
			--load-ca-certificate /etc/ocserv/ca.pem --load-ca-privkey \
			/etc/ocserv/ca-key.pem --outfile /etc/ocserv/server-cert.pem >/dev/null 2>&1
	}

	[ -f /var/run/ocserv.pid ] || {
		touch /var/run/ocserv.pid
		chown ocserv:ocserv /var/run/ocserv.pid
	}
	[ -d /var/lib/ocserv ] || {
		mkdir -m 0755 -p /var/lib/ocserv
		chmod 0700 /var/lib/ocserv
		chown ocserv:ocserv /var/lib/ocserv
	}

	config_load "ocserv"

	rm -f /var/etc/ocserv.conf
	touch /var/etc/ocserv.conf
	setup_config config
	config_foreach setup_routes routes
	config_foreach setup_dns dns

	rm -f /var/etc/ocpasswd
	touch /var/etc/ocpasswd
	chmod 600 /var/etc/ocpasswd
	config_foreach setup_users ocservusers

	procd_open_instance
	procd_set_param command /usr/sbin/ocserv -f -c /var/etc/ocserv.conf
	procd_set_param respawn
	procd_close_instance
}