summaryrefslogtreecommitdiff
blob: 35d6775b4f438941f58729b87dda969da64d86f2 (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
#!/bin/bash
# Copyright (c) 2004-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

# Contributed by Roy Marples (uberlord@gentoo.org)

action="$1"
service="net.${interface}"

. /sbin/functions.sh
. "${svclib}/net.modules.d/helpers.d/module-loader"

# Bring the interface up
interface_is_up "${interface}" || interface_up "${interface}"

case "${action}" in
	bound|renew)
		# We handle these actions below
		;;
	deconfig|leasefail)
		# Just remove IPv4 / inet addresses
		interface_del_addresses "${interface}" true
		service_started "${service}" && mark_service_inactive "net.${interface}"
		remove_state "${interface}"
		if [[ ${RC_AUTO_INTERFACE} == "yes" ]]; then
			best_interface=$( select_best_interface )
			apply_state "${best_interface}"
		fi
		echo "${action}"
		exit 0
		;;
	nak)
		echo "${action}"
		exit 0
		;;
	*)
		echo "${action}"
		echo "We don't handle that action" >&2
		exit 1
		;;
esac

# Map MAC address variables to interface variables
macnet_pre_start "${interface}" 1>/dev/null

# Map wireless ESSID variables to interface variables
if [[ -n ${wireless_module} ]]; then
	if wireless_exists "${interface}" ; then
		essidnet_pre_start "${interface}" 1>/dev/null
	fi
fi

# Calculate the metric for our routes
ifvar=$( bash_variable "${interface}" )
metric="metric_${ifvar}"
metric="${!metric}"
if [[ -z ${metric} ]]; then
	if [[ ${RC_AUTO_INTERFACE} == "yes" ]]; then
		metric=$( calculate_metric "${interface}" )
	else
		metric="0"
	fi
	eval metric_${ifvar}="${metric}"
fi

# Configure our IP address
ip="${ip// /}"
subnet="${subnet// /}"
cidr=$( netmask2cidr "${subnet}" )
broadcast="${broadcast// /}"
[[ -n ${broadcast} ]] && broadcast="broadcast ${broadcast}"

# If we don't have our address then we flush it and then add our new one
curip=$( interface_get_address "${interface}" )
if [[ ${curip} != "${ip}/${cidr}" ]] ; then
	# Just remove IPv4 / inet addresses
	interface_del_addresses "${interface}" true
	interface_add_address "${interface}" "${ip}/${cidr}" "${broadcast}"
fi

# Store the address in a cache for future usage
echo "${ip}" > "/var/cache/dhcp-${interface}.lease"
chmod 600 "/var/cache/dhcp-${interface}.lease"

d="dhcp_${ifvar}"
d=" ${!d} "
[[ ${d} == "  " ]] && d=" ${dhcp} "

# Configure our default route - we only have 1 default route
if [[ ${d} != *" nogateway "* ]]; then
	for r in ${routers}; do
		interface_default_route "${interface}" "${r}" "${metric:-0}" && break
	done
fi

# Configure our hostname - but only if we need it
if [[ -n ${hostname} ]]; then
	x=$( hostname )
	[[ ${x} == "(none)" || ${x} == "localhost" ]] && hostname "${hostname}"
fi

[[ ! -d "${statedir}/${interface}" ]] \
	&& mkdir -m 0755 -p "${statedir}/${interface}"

# Only setup the information we're told to
# By default that's everything
[[ ${d} != *" nodns "* ]] && system_dns "${interface}"
[[ ${d} != *" nontp "* ]] && system_ntp "${interface}"
[[ ${d} != *" nonis "* ]] && system_nis "${interface}"

if [[ ${RC_AUTO_INTERFACE} == "yes" ]]; then
	best_interface=$( select_best_interface )
	apply_state "${best_interface}"
else
	apply_state "${interface}"
fi

! service_stopping "${service}" && mark_service_started "${service}"

echo "${action}"
exit 0

# vim:ts=4