aboutsummaryrefslogtreecommitdiff
path: root/net.Linux/ifconfig.sh
blob: 0bd5da2986ef688d49a3a203228d9e99b6fa26f0 (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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
# Copyright 2004-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

ifconfig_depend() {
	program /sbin/ifconfig
	provide interface
}

_up() {
	ifconfig "${IFACE}" up
}

_down() {
	ifconfig "${IFACE}" down
}

_exists() {
	grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/dev
}

_ifindex() {
	local line= i=-2
	while read line ; do
		i=$((${i} + 1))
		[ ${i} -lt 1 ] && continue
		case "${line}" in
			"${IFACE}:"*) echo "${i}"; return 0;;
		esac
	done < /proc/net/dev
	return 1
}

_is_wireless() {
	# Support new sysfs layout
	[ -d /sys/class/net/"${IFACE}"/wireless ] && return 0

	[ ! -e /proc/net/wireless ] && return 1
	grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/wireless
}

_get_mac_address() {
	local mac=$(LC_ALL=C ifconfig "${IFACE}" | \
	sed -n -e 's/.* HWaddr \(..:..:..:..:..:..\).*/\1/p')


	case "${mac}" in
		00:00:00:00:00:00) ;;
		44:44:44:44:44:44) ;;
		FF:FF:FF:FF:FF:FF) ;;
		"") ;;
		*) echo "${mac}"; return 0 ;;
	esac

	return 1
}

_set_mac_address() {
	ifconfig "${IFACE}" hw ether "$1"
}

_get_inet_address() {
	set -- $(LC_ALL=C ifconfig "${IFACE}" |
	sed -n -e 's/.*inet addr:\([^ ]*\).*Mask:\([^ ]*\).*/\1 \2/p')
	[ -z "$1" ] && return 1

	echo -n "$1"
	shift
	echo "/$(_netmask2cidr "$1")"
}

_get_inet_addresses() {
	local iface=${IFACE} i=0
	local addrs="$(_get_inet_address)"

	while true ; do
		local IFACE="${iface}:${i}"
		_exists || break
		local addr="$(_get_inet_address)"
		[ -n "${addr}" ] && addrs="${addrs}${addrs:+ }${addr}"
		i=$((${i} + 1))
	done
	echo "${addrs}"
}

_cidr2netmask() {
	local cidr="$1" netmask="" done=0 i=0 sum=0 cur=128
	local octets= frac=

	local octets=$((${cidr} / 8))
	local frac=$((${cidr} % 8))
	while [ ${octets} -gt 0 ] ; do
		netmask="${netmask}.255"
		octets=$((${octets} - 1))
		done=$((${done} + 1))
	done

	if [ ${done} -lt 4 ] ; then
		while [ ${i} -lt ${frac} ] ; do
			sum=$((${sum} + ${cur}))
			cur=$((${cur} / 2))
			i=$((i + 1))
		done
		netmask="${netmask}.${sum}"
		done=$((${done} + 1))

		while [ ${done} -lt 4 ] ; do
			netmask="${netmask}.0"
			done=$((${done} + 1))
		done
	fi

	echo "${netmask#.*}"
}

_add_address() {
	if [ "$1" = "127.0.0.1/8" -a "${IFACE}" = "lo" ] ; then
		ifconfig "${IFACE}" "$@" 2>/dev/null
		return 0
	fi

	case "$1" in 
		*:*) ifconfig "${IFACE}" inet6 add "$@"; return $?;;
	esac

	# IPv4 is tricky - ifconfig requires an aliased device
	# for multiple addresses
	local iface="${IFACE}"
	if LC_ALL=C ifconfig "${iface}" | grep -Eq "\<inet addr:.*" ; then
		# Get the last alias made for the interface and add 1 to it
		i=$(ifconfig | sed '1!G;h;$!d' | grep -m 1 -o "^${iface}:[0-9]*" \
			| sed -n -e 's/'"${iface}"'://p')
		i=$((${i:-0} + 1))
		iface="${iface}:${i}"
	fi

	# ifconfig doesn't like CIDR addresses
	local ip="${1%%/*}" cidr="${1##*/}" netmask=
	if [ -n "${cidr}" -a "${cidr}" != "${ip}" ]; then
		netmask="$(_cidr2netmask "${cidr}")"
		shift
		set -- "${ip}" netmask "${netmask}" "$@"
	fi

#		# Support iproute2 style config where possible
#		r="${config[@]}"
#		config=( ${r//brd +/} )
#		config=( "${config[@]//brd/broadcast}" )
#		config=( "${config[@]//peer/pointopoint}" )
#	fi

	ifconfig "${iface}" "$@"
}

_add_route() {
	if [ $# -eq 3 ] ; then
		set -- "$1" "$2" gw "$3"
	elif [ "$3" = "via" ] ; then
		local one=$1 two=$2
		shift ; shift; shift
		set -- "${one}" "${two}" gw "$@"
	fi

	if [ -n "${metric}" ] ; then
		set -- "$@" metric ${metric}
	fi

	route add "$@"
}

_delete_addresses() {
	# We don't remove addresses from aliases
	case "${IFACE}" in
		*:*) return 0 ;;
	esac

	einfo "Removing addresses"
	eindent
	# iproute2 can add many addresses to an iface unlike ifconfig ...
	# iproute2 added addresses cause problems for ifconfig
	# as we delete an address, a new one appears, so we have to
	# keep polling
	while true ; do
		local addr=$(LC_ALL=C ifconfig "${IFACE}" |
			sed -n -e 's/.*inet addr:\([^ ]*\).*/\1/p')

		[ -z "${addr}" ] && break
		
		if [ "${addr}" = "127.0.0.1/8" ] ; then
			# Don't delete the loopback address
			[ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ] && break
		fi
		ifconfig "${IFACE}" 0.0.0.0 || break
	done

	# Remove IPv6 addresses
	local addr=
	for addr in $(LC_ALL=C ifconfig "${IFACE}" | \
		sed -n -e 's/^.*inet6 addr: \([^ ]*\) Scope:[^L].*/\1/p') ; do
		[ "${addr}" = "::1/128" -a "${IFACE}" = "lo" ] && continue
		einfo "${addr}"
		ifconfig "${IFACE}" inet6 del "${addr}"
	done
	
	return 0
}

_has_carrier() {
	return 0
}

_tunnel() {
	iptunnel "$@"
}

ifconfig_pre_start() {
	# MTU support
	local mtu=
	eval mtu=\$mtu_${IFVAR}
	[ -n "${mtu}" ] && ifconfig "${IFACE}" mtu "${mtu}"

	local tunnel=

	eval tunnel=\$iptunnel_${IFVAR}
	[ -z "${tunnel}" ] && return 0

	# Set our base metric to 1000
	metric=1000
	
	ebegin "Creating tunnel ${IFVAR}"
	iptunnel add "${tunnel}"
	eend $?
}

ifconfig_post_stop() {
	# Don't delete sit0 as it's a special tunnel
	[ "${IFACE}" = "sit0" ] && return 0

	[ -z "$(iptunnel show "${IFACE}" 2>/dev/null)" ] && return 0

	ebegin "Destroying tunnel ${IFACE}"
	iptunnel del "${IFACE}"
	eend $?
}

# vim: set ts=4 :