olsrd.init 19.9 KB
Newer Older
1
#!/bin/sh /etc/rc.common
2
# Copyright (C) 2008-2013 OpenWrt.org
3

4
START=65
5 6 7 8

SERVICE_DAEMONIZE=1
SERVICE_WRITE_PID=1

9 10 11
CONF=/var/etc/olsrd.conf
PID=/var/run/olsrd.pid
PID6=/var/run/olsrd.ipv6.pid
12

13
OLSRD_OLSRD_SCHEMA='ignore:internal config_file:internal DebugLevel=0 AllowNoInt=yes'
14
OLSRD_IPCCONNECT_SCHEMA='ignore:internal Host:list Net:list2'
J
Jo-Philipp Wich 已提交
15
OLSRD_LOADPLUGIN_SCHEMA='ignore:internal library:internal Host4:list Net4:list2 Host:list Net:list2 Host6:list Net6:list2 Ping:list redistribute:list NonOlsrIf:list name:list lat lon latlon_infile HNA:list2 hosts:list2'
16
OLSRD_INTERFACE_SCHEMA='ignore:internal interface:internal AutoDetectChanges:bool'
17
OLSRD_INTERFACE_DEFAULTS_SCHEMA='AutoDetectChanges:bool'
N
Nicolas Thill 已提交
18

19 20 21
T='	'
N='
'
22

23
log() {
24 25 26
	logger -t olsrd -p daemon.info -s "$1"
}

27 28 29 30
error() {
	log "error() ${initscript}: $@"
}

31
validate_varname() {
J
Jo-Philipp Wich 已提交
32
	local varname="$1"
33 34
	[ -z "$varname" -o "$varname" != "${varname%%[!A-Za-z0-9_]*}" ] && return 1
	return 0
35 36
}

37
validate_olsrd_option() {
J
Jo-Philipp Wich 已提交
38
	local str="$1"
39
	[ -z "$str" -o "$str" != "${str%%[! 	0-9A-Za-z./|:_-]*}" ] && return 1
40
	return 0
41 42
}

43
system_config() {
J
Jo-Philipp Wich 已提交
44
	local cfg="$1"
45
	local cfgt hostname latlon oldIFS
46

47
	config_get cfgt "$cfg" TYPE
48

49 50
	if [ "$cfgt" = "system" ]; then
		config_get hostname "$cfg" hostname
J
Jo-Philipp Wich 已提交
51 52
		hostname="${hostname:-OpenWrt}"
		SYSTEM_HOSTNAME="$hostname"
53
	fi
54

55 56
	if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then
		config_get latlon "$cfg" latlon
57
		oldIFS="$IFS"; IFS=" ${T}${N},"; set -- $latlon; IFS="$oldIFS"
J
Jo-Philipp Wich 已提交
58 59 60 61 62 63 64 65 66
		SYSTEM_LAT="$1"
		SYSTEM_LON="$2"
	fi

	if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then
		config_get latlon "$cfg" latitude
		SYSTEM_LAT="$latlon"
		config_get latlon "$cfg" longitude
		SYSTEM_LON="$latlon"
67 68 69
	fi
}

70
olsrd_find_config_file() {
J
Jo-Philipp Wich 已提交
71
	local cfg="$1"
72 73 74 75 76 77 78 79 80 81
	validate_varname "$cfg" || return 0

	config_get_bool ignore "$cfg" ignore 0
	[ "$ignore" -ne 0 ] && return 0
	config_get OLSRD_CONFIG_FILE "$cfg" config_file

	return 0
}

warning_invalid_value() {
82
	local funcname="warning_invalid_value"
J
Jo-Philipp Wich 已提交
83
	local package="$1"
84
	validate_varname "$package" || package=
J
Jo-Philipp Wich 已提交
85
	local config="$2"
86
	validate_varname "$config" || config=
J
Jo-Philipp Wich 已提交
87
	local option="$3"
88 89 90
	validate_varname "$option" || option=

	if [ -n "$package" -a -n "$config" ]; then
91 92 93
		log "$funcname() in option '$package.$config${option:+.}$option', skipped"
	else
		log "$funcname() skipped"
94
	fi
95 96

	return 0
97 98
}

99
olsrd_write_option() {
J
Jo-Philipp Wich 已提交
100 101
	local param="$1"
	local cfg="$2"
102
	validate_varname "$cfg" || return 1
J
Jo-Philipp Wich 已提交
103
	local option="$3"
104
	validate_varname "$option" || return 1
J
Jo-Philipp Wich 已提交
105 106
	local value="$4"
	local option_type="$5"
107 108 109 110 111 112 113 114

	if [ "$option_type" = bool ]; then
		case "$value" in
			1|on|true|enabled|yes) value=yes;;
			0|off|false|disabled|no) value=no;;
			*) warning_invalid_value olsrd "$cfg" "$option"; return 1;;
		esac
	fi
115

116 117 118 119
	if ! validate_olsrd_option "$value"; then
		warning_invalid_value olsrd "$cfg" "$option"
		return 1
	fi
120

121
	if [ "$value" != "${value%%[G-Zg-z_-]*}" ]; then
122
		if [ "$option" != "Ip6AddrType" -a "$option" != "LinkQualityMult" -a "$value" != "yes" -a "$value" != "no" ]; then
123
			value="\"$value\""
124
		fi
125 126 127
	fi

	echo -n "${N}$param$option $value"
128

129 130 131 132
	return 0
}

olsrd_write_plparam() {
133
	local funcname="olsrd_write_plparam"
J
Jo-Philipp Wich 已提交
134 135
	local param="$1"
	local cfg="$2"
136
	validate_varname "$cfg" || return 1
J
Jo-Philipp Wich 已提交
137
	local option="$3"
138
	validate_varname "$option" || return 1
J
Jo-Philipp Wich 已提交
139 140
	local value="$4"
	local option_type="$5"
141
	local _option oldIFS
142 143 144 145 146 147 148 149 150 151 152 153

	if [ "$option_type" = bool ]; then
		case "$value" in
			1|on|true|enabled|yes) value=yes;;
			0|off|false|disabled|no) value=no;;
			*) warning_invalid_value olsrd "$cfg" "$option"; return 1;;
		esac
	fi

	if ! validate_olsrd_option "$value"; then
		warning_invalid_value olsrd "$cfg" "$option"
		return 1
154
	fi
155

156
	oldIFS="$IFS"; IFS='-_'; set -- $option; IFS="$oldIFS"
157 158
	option="$*"
	_option="$option"
159

160 161
	if [ "$option" = 'hosts' ]; then
		set -- $value
J
Jo-Philipp Wich 已提交
162
		option="$1"
163 164 165
		shift
		value="$*"
	fi
166

167 168
	if [ "$option" = 'NonOlsrIf' ]; then
		if validate_varname "$value"; then
169
			if network_get_device ifname "$value"; then
170
				log "$funcname() Info: mdns Interface '$value' ifname '$ifname' found"
171
			else
172
				log "$funcname() Warning: mdns Interface '$value' not found, skipped"
173 174 175 176 177 178
			fi
		else
			warning_invalid_value olsrd "$cfg" "NonOlsrIf"
		fi
		[ -z "$ifname" ] || value=$ifname
	fi
179 180 181 182

	echo -n "${N}${param}PlParam \"$option\" \"$value\""

	return 0
183 184
}

185
config_update_schema() {
J
Jo-Philipp Wich 已提交
186
	local schema_varname="$1"
187
	validate_varname "$schema_varname" || return 1
J
Jo-Philipp Wich 已提交
188
	local command="$2"
189
	validate_varname "$command" || return 1
J
Jo-Philipp Wich 已提交
190
	local option="$3"
191
	validate_varname "$option" || return 1
J
Jo-Philipp Wich 已提交
192
	local value="$4"
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
	local schema
	local cur_option

	case "$varname" in
		*_LENGTH) return 0;;
		*_ITEM*) return 0;;
	esac

	eval "export -n -- \"schema=\${$schema_varname}\""

	for cur_option in $schema; do
		[ "${cur_option%%[:=]*}" = "$option" ] && return 0
	done

	if [ "$command" = list ]; then
		set -- $value
		if [ "$#" -ge "3" ]; then
			schema_entry="$option:list3"
		elif [ "$#" -ge "2" ]; then
			schema_entry="$option:list2"
		else
			schema_entry="$option:list"
		fi
	else
		schema_entry="$option"
218
	fi
219 220 221 222

	append "$schema_varname" "$schema_entry"

	return 0
223 224
}

225
config_write_options() {
226
	local funcname="config_write_options"
J
Jo-Philipp Wich 已提交
227 228
	local schema="$1"
	local cfg="$2"
229
	validate_varname "$cfg" || return 1
J
Jo-Philipp Wich 已提交
230
	local write_func="$3"
231
	[ -z "$write_func" ] && output_func=echo
J
Jo-Philipp Wich 已提交
232
	local write_param="$4"
233

234
	local schema_entry option option_length option_type default value list_size list_item list_value i position speed oldIFS
235
	local list_speed_vars="HelloInterval HelloValidityTime TcInterval TcValidityTime MidInterval MidValidityTime HnaInterval HnaValidityTime"
236

237 238 239 240
	get_value_for_entry()
	{
		local schema_entry="$1"

J
Jo-Philipp Wich 已提交
241
		default="${schema_entry#*[=]}"
242
		[ "$default" = "$schema_entry" ] && default=
J
Jo-Philipp Wich 已提交
243
		option="${schema_entry%%[=]*}"
244

245
		oldIFS="$IFS"; IFS=':'; set -- $option; IFS="$oldIFS"
J
Jo-Philipp Wich 已提交
246 247
		option="$1"
		option_type="$2"
248 249 250 251 252

		validate_varname "$option" || return 1
		[ -z "$option_type" ] || validate_varname "$option_type" || return 1
		[ "$option_type" = internal ] && return 1

253
		config_get value "$cfg" "$option"
254
		[ "$option" = "speed" ] && return 1
255

256 257 258
		return 0
	}

259 260 261 262 263 264 265 266 267 268 269
	already_in_schema()
	{
		case " $schema " in
			*" $1 "*)
				return 0
			;;
			*)
				return 1
			;;
		esac
	}
270

271 272
	already_in_schema "speed" && {
		get_value_for_entry "speed"
273

274 275 276 277 278 279 280 281 282 283 284
		if [ 2>/dev/null $value -gt 0 -a $value -le 20 ]; then
			speed="$value"
		else
			log "$funcname() Warning: invalid speed-value: '$value' - allowed integers: 1...20, fallback to 6"
			speed=6
		fi

		for schema_entry in $list_speed_vars; do {
			already_in_schema "$schema_entry" || schema="$schema $schema_entry"
		} done
	}
285

286
	for schema_entry in $schema; do
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
		if [ -n "$speed" ]; then		# like sven-ola freifunk firmware fff-1.7.4
			case "$schema_entry" in
				HelloInterval)
					value="$(( $speed / 2 + 1 )).0"
				;;
				HelloValidityTime)
					value="$(( $speed * 25 )).0"
				;;
				TcInterval)	# todo: not fisheye? -> $(( $speed * 2 ))
					value=$(( $speed / 2 ))
					[ $value -eq 0 ] && value=1
					value="$value.0"
				;;
				TcValidityTime)
					value="$(( $speed * 100 )).0"
				;;
				MidInterval)
					value="$(( $speed * 5 )).0"
				;;
				MidValidityTime)
					value="$(( $speed * 100 )).0"
				;;
				HnaInterval)
					value="$(( $speed * 2 )).0"
				;;
				HnaValidityTime)
					value="$(( $speed * 25 )).0"
				;;
				*)
					get_value_for_entry "$schema_entry" || continue
				;;
			esac

			is_speed_var()
			{
				case " $list_speed_vars " in
					*" $1 "*)
						return 0
					;;
					*)
						return 1
					;;
				esac
			}

			is_speed_var "$schema_entry" && option="$schema_entry"
		else
			get_value_for_entry "$schema_entry" || continue
		fi
336

337
		if [ -z "$value" ]; then
338
			oldIFS="$IFS"; IFS='+'; set -- $default; IFS="$oldIFS"
339 340 341 342
			value=$*
		elif [ "$value" = '-' -a -n "$default" ]; then
			continue
		fi
343

344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
		[ -z "$value" ] && continue

		case "$option_type" in
			list) list_size=1;;
			list2) list_size=2;;
			list3) list_size=3;;
			*) list_size=0;;
		esac

		if [ "$list_size" -gt 0 ]; then
			config_get option_length "$cfg" "${option}_LENGTH"
			if [ -n "$option_length" ]; then
				i=1
				while [ "$i" -le "$option_length" ]; do
					config_get list_value "$cfg" "${option}_ITEM$i"
					"$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break
					i=$((i + 1))
361
				done
362 363 364 365 366 367 368 369 370 371
			else
				list_value=
				i=0
				for list_item in $value; do
					append "list_value" "$list_item"
					i=$((i + 1))
					position=$((i % list_size))
					if [ "$position" -eq 0 ]; then
						"$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break
						list_value=
372 373
					fi
				done
374
				[ "$position" -ne 0 ] && "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type"
375
			fi
376 377
		else
			"$write_func" "$write_param" "$cfg" "$option" "$value" "$option_type"
378 379 380
		fi
	done

381
	return 0
382 383
}

384
olsrd_write_olsrd() {
J
Jo-Philipp Wich 已提交
385
	local cfg="$1"
386 387
	validate_varname "$cfg" || return 0
	local ignore
388

389 390
	config_get_bool ignore "$cfg" ignore 0
	[ "$ignore" -ne 0 ] && return 0
391

392
	[ "$OLSRD_COUNT" -gt 0 ] && return 0
393

J
Jo-Philipp Wich 已提交
394 395 396 397 398
	config_get ipversion "$cfg" IpVersion
	if [ "$ipversion" = "6and4" ]; then
		OLSRD_IPVERSION_6AND4=1
		config_set "$cfg" IpVersion '6'
	fi
399 400
	config_get smartgateway "$cfg" SmartGateway
	config_get smartgatewayuplink "$cfg" SmartGatewayUplink
J
Jo-Philipp Wich 已提交
401

402 403 404 405 406
	config_write_options "$OLSRD_OLSRD_SCHEMA" "$cfg" olsrd_write_option
	echo
	OLSRD_COUNT=$((OLSRD_COUNT + 1))
	return 0
}
407

408
olsrd_write_ipcconnect() {
J
Jo-Philipp Wich 已提交
409
	local cfg="$1"
410 411
	validate_varname "$cfg" || return 0
	local ignore
412

413 414
	config_get_bool ignore "$cfg" ignore 0
	[ "$ignore" -ne 0 ] && return 0
415

416 417 418 419 420 421 422 423
	[ "$IPCCONNECT_COUNT" -gt 0 ] && return 0

	echo -n "${N}IpcConnect${N}{"
	config_write_options "$OLSRD_IPCCONNECT_SCHEMA" "$cfg" olsrd_write_option "${T}"
	echo "${N}}"
	IPCCONNECT_COUNT=$((IPCCONNECT_COUNT + 1))

	return 0
424 425
}

426
olsrd_write_hna4() {
J
Jo-Philipp Wich 已提交
427
	local cfg="$1"
428 429
	validate_varname "$cfg" || return 0
	local ignore
430

431 432 433 434 435 436 437
	config_get_bool ignore "$cfg" ignore 0
	[ "$ignore" -ne 0 ] && return 0

	config_get netaddr "$cfg" netaddr
	if ! validate_olsrd_option "$netaddr"; then
		warning_invalid_value olsrd "$cfg" "netaddr"
		return 0
438
	fi
439 440 441 442 443 444 445 446

	config_get netmask "$cfg" netmask
	if ! validate_olsrd_option "$netmask"; then
		warning_invalid_value olsrd "$cfg" "netmask"
		return 0
	fi

	[ "$HNA4_COUNT" -le 0 ] && echo -n "${N}Hna4${N}{"
447
	echo -n "${N}${T}${T}$netaddr $netmask"
448 449 450
	HNA4_COUNT=$((HNA4_COUNT + 1))

	return 0
451 452
}

453
olsrd_write_hna6() {
J
Jo-Philipp Wich 已提交
454
	local cfg="$1"
455 456
	validate_varname "$cfg" || return 0
	local ignore
457

458 459
	config_get_bool ignore "$cfg" ignore 0
	[ "$ignore" -ne 0 ] && return 0
460

461 462 463 464 465
	config_get netaddr "$cfg" netaddr
	if ! validate_olsrd_option "$netaddr"; then
		warning_invalid_value olsrd "$cfg" "netaddr"
		return 0
	fi
466

467 468 469 470 471
	config_get prefix "$cfg" prefix
	if ! validate_olsrd_option "$prefix"; then
		warning_invalid_value olsrd "$cfg" "prefix"
		return 0
	fi
472

473
	[ "$HNA6_COUNT" -le 0 ] && echo -n "${N}Hna6${N}{"
474
	echo -n "${N}${T}${T}$netaddr $prefix"
475
	HNA6_COUNT=$((HNA6_COUNT + 1))
476

477 478
	return 0
}
479

480
olsrd_write_loadplugin() {
481
	local funcname="olsrd_write_loadplugin"
J
Jo-Philipp Wich 已提交
482
	local cfg="$1"
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
	validate_varname "$cfg" || return 0
	local ignore
	local name
	local suffix
	local lat
	local lon
	local latlon_infile

	config_get_bool ignore "$cfg" ignore 0
	[ "$ignore" -ne 0 ] && return 0

	config_get library "$cfg" library
	if ! validate_olsrd_option "$library"; then
		warning_invalid_value olsrd "$cfg" "library"
		return 0
	fi
	if ! [ -x "/lib/$library" -o -x "/usr/lib/$library" -o -x "/usr/local/lib/$library" ]; then
500
		log "$funcname() Warning: Plugin library '$library' not found, skipped"
501 502 503
		return 0
	fi

504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525
	case "$library" in
		olsrd_nameservice.*)
			config_get name "$cfg" name
			[ -z "$name" ] && config_set "$cfg" name $SYSTEM_HOSTNAME

			config_get suffix "$cfg" suffix
			[ -z "$suffix" ] && config_set "$cfg" suffix '.olsr'

			config_get lat "$cfg" lat
			config_get lon "$cfg" lon
			config_get latlon_infile "$cfg" latlon_infile
			if [ \( -z "$lat" -o -z "$lat" \) -a -z "$latlon_infile" ]; then
				if [ -f '/var/run/latlon.txt' ]; then
					config_set "$cfg" lat ''
					config_set "$cfg" lon ''
					config_set "$cfg" latlon_infile '/var/run/latlon.txt'
				else
					config_set "$cfg" lat "$SYSTEM_LAT"
					config_set "$cfg" lon "$SYSTEM_LON"
				fi
			fi

526 527 528 529
			for f in latlon_file hosts_file services_file resolv_file macs_file; do
				config_get $f "$cfg" $f
			done

530 531
			[ -z "$latlon_file" ] && config_set "$cfg" latlon_file '/var/run/latlon.js'
		;;
532 533 534
		olsrd_watchdog.*)
			config_get wd_file "$cfg" file
		;;
535 536 537 538 539 540 541 542 543 544
	esac

	echo -n "${N}LoadPlugin \"$library\"${N}{"
	config_write_options "$OLSRD_LOADPLUGIN_SCHEMA" "$cfg" olsrd_write_plparam "${T}"
	echo "${N}}"

	return 0
}

olsrd_write_interface() {
545
	local funcname="olsrd_write_interface"
J
Jo-Philipp Wich 已提交
546
	local cfg="$1"
547 548 549 550 551 552 553 554 555 556 557
	validate_varname "$cfg" || return 0
	local ignore
	local interfaces
	local interface
	local ifnames

	config_get_bool ignore "$cfg" ignore 0
	[ "$ignore" -ne 0 ] && return 0

	ifnames=
	config_get interfaces "$cfg" interface
558

559 560
	for interface in $interfaces; do
		if validate_varname "$interface"; then
561
			if network_get_device IFNAME "$interface"; then
562
				ifnames="$ifnames \"$IFNAME\""
563
				ifsglobal="$ifsglobal $IFNAME"
564
			else
565
				log "$funcname() Warning: Interface '$interface' not found, skipped"
566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581
			fi
		else
			warning_invalid_value olsrd "$cfg" "interface"
		fi
	done

	[ -z "$ifnames" ] && return 0

	echo -n "${N}Interface$ifnames${N}{"
	config_write_options "$OLSRD_INTERFACE_SCHEMA" "$cfg" olsrd_write_option "${T}"
	echo "${N}}"
	INTERFACES_COUNT=$((INTERFACES_COUNT + 1))

	return 0
}

582 583 584 585 586 587 588 589 590 591 592
olsrd_write_interface_defaults() {
	local cfg="$1"
	validate_varname "$cfg" || return 0

	echo -n "${N}InterfaceDefaults$ifnames${N}{"
	config_write_options "$OLSRD_INTERFACE_DEFAULTS_SCHEMA" "$cfg" olsrd_write_option "${T}"
	echo "${N}}"

	return 1
}

593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608
olsrd_update_schema() {
	local command="$1"
	validate_varname "$command" || return 0
	local varname="$2"
	validate_varname "$varname" || return 0
	local value="$3"
	local cfg="$CONFIG_SECTION"
	local cfgt
	local cur_varname

	config_get cfgt "$cfg" TYPE
	case "$cfgt" in
		olsrd) config_update_schema OLSRD_OLSRD_SCHEMA "$command" "$varname" "$value";;
		IpcConnect) config_update_schema OLSRD_IPCCONNECT_SCHEMA "$command" "$varname" "$value";;
		LoadPlugin) config_update_schema OLSRD_LOADPLUGIN_SCHEMA "$command" "$varname" "$value";;
		Interface) config_update_schema OLSRD_INTERFACE_SCHEMA "$command" "$varname" "$value";;
609
		InterfaceDefaults) config_update_schema OLSRD_INTERFACE_DEFAULTS_SCHEMA "$command" "$varname" "$value";;
610 611 612 613 614 615
	esac

	return 0
}

olsrd_write_config() {
J
Jo-Philipp Wich 已提交
616
	OLSRD_IPVERSION_6AND4=0
617 618 619 620
	OLSRD_COUNT=0
	config_foreach olsrd_write_olsrd olsrd
	IPCCONNECT_COUNT=0
	config_foreach olsrd_write_ipcconnect IpcConnect
621
	HNA4_COUNT=0
622 623
	config_foreach olsrd_write_hna4 Hna4
	[ "$HNA4_COUNT" -gt 0 ] && echo "${N}}"
624
	HNA6_COUNT=0
625 626 627 628
	config_foreach olsrd_write_hna6 Hna6
	[ "$HNA6_COUNT" -gt 0 ] && echo "${N}}"
	config_foreach olsrd_write_loadplugin LoadPlugin
	INTERFACES_COUNT=0
629
	config_foreach olsrd_write_interface_defaults InterfaceDefaults
630 631 632 633
	config_foreach olsrd_write_interface Interface
	echo

	return 0
634 635
}

636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666
get_wan_ifnames()
{
	local wanifnames word catch_next

	which ip >/dev/null || return 1

	set -- $( ip route list exact 0.0.0.0/0 table all )
	for word in $*; do
		case "$word" in
			dev)
				catch_next="true"
			;;
			*)
				[ -n "$catch_next" ] && {
					case "$wanifnames" in
						*" $word "*)
						;;
						*)
							wanifnames="$wanifnames $word "
						;;
					esac

					catch_next=
				}
			;;
		esac
	done

	echo "$wanifnames"
}

667
olsrd_setup_smartgw_rules() {
668
	local funcname="olsrd_setup_smartgw_rules"
669
	# Check if ipip is installed
670 671
	[ -e /etc/modules.d/[0-9]*-ipip ] || {
		log "$funcname() Warning: kmod-ipip is missing. SmartGateway will not work until you install it."
672
		return 1
673
	}
674

675 676
	local wanifnames="$( get_wan_ifnames )"

677 678
	if [ -z "$wanifnames" ]; then
		nowan=1
679 680
	else
		nowan=0
681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
	fi

	IP4T=$(which iptables)
	IP6T=$(which ip6tables)

	# Delete smartgw firewall rules first
	for IPT in $IP4T $IP6T; do
		while $IPT -D forwarding_rule -o tnl_+ -j ACCEPT 2> /dev/null; do :;done
		for IFACE in $wanifnames; do
			while $IPT -D forwarding_rule -i tunl0 -o $IFACE -j ACCEPT 2> /dev/null; do :; done
		done
		for IFACE in $ifsglobal; do
			while $IPT -D input_rule -i $IFACE -p 4 -j ACCEPT 2> /dev/null; do :; done
		done
	done
	while $IP4T -t nat -D postrouting_rule -o tnl_+ -j MASQUERADE 2> /dev/null; do :;done

	if [ "$smartgateway" == "yes" ]; then
699
		log "$funcname() Notice: Inserting firewall rules for SmartGateway"
700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742
		if [ ! "$smartgatewayuplink" == "none" ]; then
			if [ "$smartgatewayuplink" == "ipv4" ]; then
				# Allow everything to be forwarded to tnl_+ and use NAT for it
				$IP4T -I forwarding_rule -o tnl_+ -j ACCEPT
				$IP4T -t nat -I postrouting_rule -o tnl_+ -j MASQUERADE
				# Allow forwarding from tunl0 to (all) wan-interfaces
				if [ "$nowan"="0" ]; then
					for IFACE in $wanifnames; do
						$IP4T -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
					done
				fi
				# Allow incoming ipip on all olsr-interfaces
				for IFACE in $ifsglobal; do
					$IP4T -I input_rule -i $IFACE -p 4 -j ACCEPT
				done
			elif [ "$smartgatewayuplink" == "ipv6" ]; then
				$IP6T -I forwarding_rule -o tnl_+ -j ACCEPT
				if [ "$nowan"="0" ]; then
					for IFACE in $wanifnames; do
						$IP6T -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
					done
				fi
				for IFACE in $ifsglobal; do
					$IP6T -I input_rule -i $IFACE -p 4 -j ACCEPT
				done
			else
				for IPT in $IP4T $IP6T; do
					$IPT -I forwarding_rule -o tnl_+ -j ACCEPT
					$IPT -t nat -I postrouting_rule -o tnl_+ -j MASQUERADE
					if [ "$nowan"="0" ]; then
						for IFACE in $wanifnames; do
							$IPT -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
						done
					fi
					for IFACE in $ifsglobal; do
						$IPT -I input_rule -i $IFACE -p 4 -j ACCEPT
					done
				done
			fi
		fi
	fi
}

743
start() {
744 745 746 747 748 749 750 751 752 753 754 755 756 757
	SYSTEM_HOSTNAME=
	SYSTEM_LAT=
	SYSTEM_LON=
	config_load system
	config_foreach system_config system

	option_cb() {
		olsrd_update_schema "option" "$@"
	}

	list_cb() {
		olsrd_update_schema "list" "$@"
	}

758 759
	. /lib/functions/network.sh

760 761 762 763 764 765 766 767 768 769 770 771 772
	config_load olsrd
	reset_cb

	OLSRD_CONFIG_FILE=
	config_foreach olsrd_find_config_file olsrd

	if [ -z "$OLSRD_CONFIG_FILE" ]; then
		mkdir -p -- /var/etc/
		olsrd_write_config > /var/etc/olsrd.conf
		if [ "$INTERFACES_COUNT" -gt 0 -a "$OLSRD_COUNT" -gt 0 ]; then
			OLSRD_CONFIG_FILE=/var/etc/olsrd.conf
		fi
	fi
773

774
	[ -z "$OLSRD_CONFIG_FILE" ] && return 1
775

J
Jo-Philipp Wich 已提交
776 777 778
	local bindv6only='0'
	if [ "$OLSRD_IPVERSION_6AND4" -ne 0 ]; then
		bindv6only="$(sysctl -n net.ipv6.bindv6only)"
779 780
		sysctl -w net.ipv6.bindv6only=1 > /dev/null
		sed -e '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/d' < "$OLSRD_CONFIG_FILE" > /var/etc/olsrd.conf.ipv6
781
		sed -e 's/^IpVersion[ ][ ]*6$/IpVersion 4/' -e 's/^\t\t[A-Fa-f0-9.:]*[:][A-Fa-f0-9.:]*[ ][0-9]*$//' < "$OLSRD_CONFIG_FILE" > /var/etc/olsrd.conf.ipv4
782 783 784 785 786 787 788 789
		rm $OLSRD_CONFIG_FILE

		# some filenames should get the suffix .ipv6
		for file in $latlon_file $hosts_file $services_file $resolv_file $macs_file $wd_file;do
			f=$(echo $file|sed 's/\//\\\//g')
			sed -i "s/$f/$f.ipv6/g" /var/etc/olsrd.conf.ipv6
		done

790 791
		SERVICE_PID_FILE="$PID6"
		if service_check /usr/sbin/olsrd; then
792
			error "there is already an IPv6 instance of olsrd running (pid: '$(cat $PID6)'), not starting."
793
		else
794
			service_start /usr/sbin/olsrd -f /var/etc/olsrd.conf.ipv6 -nofork
795 796
		fi

797 798
		SERVICE_PID_FILE="$PID"
		if service_check /usr/sbin/olsrd; then
799
			error "there is already an IPv4 instance of olsrd running (pid: '$(cat $PID)'), not starting."
800
		else
801
			service_start /usr/sbin/olsrd -f /var/etc/olsrd.conf.ipv4 -nofork
802 803
		fi

J
Jo-Philipp Wich 已提交
804
		sleep 3
805 806
		sysctl -w net.ipv6.bindv6only="$bindv6only" > /dev/null

807
	else
808 809 810 811 812

		if [ "$ipversion" = "6" ]; then
			sed -i '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/d' "$OLSRD_CONFIG_FILE"
		fi

813 814
		SERVICE_PID_FILE="$PID"
		if service_check /usr/sbin/olsrd; then
815
			error "there is already an IPv4 instance of olsrd running (pid: '$(cat $PID)'), not starting."
816 817
			return 1
		else
818
			service_start /usr/sbin/olsrd -f "$OLSRD_CONFIG_FILE" -nofork
819 820 821
			service_check /usr/sbin/olsrd || {
				log "startup-error: check via: '/usr/sbin/olsrd -f \"$OLSRD_CONFIG_FILE\" -nofork'"
			}
822
		fi
J
Jo-Philipp Wich 已提交
823
	fi
824

825
	olsrd_setup_smartgw_rules
826
}
N
Nicolas Thill 已提交
827

828
stop() {
829 830 831 832 833
	SERVICE_PID_FILE="$PID"
	service_stop /usr/sbin/olsrd

	SERVICE_PID_FILE="$PID6"
	service_stop /usr/sbin/olsrd
834
}