network.subr revision 107774
1#!/bin/sh -x
2#
3# $FreeBSD: head/etc/network.subr 107774 2002-12-12 09:31:10Z imp $
4#
5
6# PROVIDE: network1
7# REQUIRE: atm1 ipfilter mountcritlocal pccard serial sppp sysctl tty
8# KEYWORD: FreeBSD
9
10. /etc/rc.subr
11
12name="network1"
13start_cmd="network_start"
14stop_cmd="network_stop"
15
16convert_host_conf()
17{
18	host_conf=$1; shift;
19	nsswitch_conf=$1; shift;
20	awk '                                                               \
21	/^[:blank:]*#/       { next }                                       \
22	/(hosts|local|file)/ { nsswitch[c] = "files"; c++; next }           \
23	/(dns|bind)/         { nsswitch[c] = "dns";   c++; next }           \
24	/nis/                { nsswitch[c] = "nis";   c++; next }           \
25	{ printf "Warning: unrecognized line [%s]", $0 > "/dev/stderr" }    \
26	END {                                                               \
27		printf "hosts: ";                                           \
28		for (i in nsswitch) printf "%s ", nsswitch[i];              \
29		printf "\n";                                                \
30	}' < $host_conf > $nsswitch_conf
31}
32
33generate_host_conf()
34{
35	nsswitch_conf=$1; shift;
36	host_conf=$1; shift;
37
38	awk '
39	BEGIN {
40		xlat["files"] = "hosts";
41		xlat["dns"] = "bind";
42		xlat["nis"] = "nis";
43		cont = 0;
44	}
45	sub(/^[\t ]*hosts:/, "") || cont {
46		if (!cont)
47			srcs = ""
48		sub(/#.*/, "")
49		gsub(/[][]/, " & ")
50		cont = sub(/\\$/, "")
51		srcs = srcs " " $0
52	}
53	END {
54		print "# Auto-generated from nsswitch.conf, do not edit"
55		ns = split(srcs, s)
56		for (n = 1; n <= ns; ++n) {
57			if (s[n] in xlat)
58			    print xlat[s[n]]
59		}
60	}
61	' <$nsswitch_conf >$host_conf
62}
63
64network_gif_setup() {
65	case ${gif_interfaces} in
66	[Nn][Oo] | '')
67		;;
68	*)
69		for i in ${gif_interfaces}; do
70			eval peers=\$gifconfig_$i
71			case ${peers} in
72			'')
73				continue
74				;;
75			*)
76				ifconfig $i create >/dev/null 2>&1
77				ifconfig $i tunnel ${peers}
78				ifconfig $i up
79				;;
80			esac
81		done
82		;;
83	esac
84}
85
86network_start()
87{
88	# set hostname, turn on network
89	#
90	echo -n "Doing initial network setup:"
91
92	# Generate host.conf for compatibility
93	#
94	if [ -f "/etc/nsswitch.conf" ]; then
95		echo -n ' host.conf'
96		generate_host_conf /etc/nsswitch.conf /etc/host.conf
97	fi
98
99	# Convert host.conf to nsswitch.conf if necessary
100	#
101	if [ -f "/etc/host.conf" -a ! -f "/etc/nsswitch.conf" ]; then
102		echo ''
103		echo 'Warning: /etc/host.conf is no longer used'
104		echo '  /etc/nsswitch.conf will be created for you'
105		convert_host_conf /etc/host.conf /etc/nsswitch.conf
106	fi
107
108	# Set the host name if it is not already set
109	#
110	if [ -z "`hostname -s`" ]; then
111		hostname ${hostname}
112		echo -n ' hostname'
113	fi
114
115	# Set the domainname if we're using NIS
116	#
117	case ${nisdomainname} in
118	[Nn][Oo]|'')
119		;;
120	*)
121		domainname ${nisdomainname}
122		echo -n ' domain'
123		;;
124	esac
125
126	echo '.'
127
128	# Attempt to create cloned interfaces.
129	for ifn in ${cloned_interfaces}; do
130		ifconfig ${ifn} create
131	done
132
133	# gifconfig
134	network_gif_setup
135
136	# Set up all the network interfaces, calling startup scripts if needed
137	#
138	case ${network_interfaces} in
139	[Aa][Uu][Tt][Oo])
140		network_interfaces="`ifconfig -l`"
141		;;
142	*)
143		network_interfaces="${network_interfaces} ${cloned_interfaces}"
144		;;
145	esac
146
147	dhcp_interfaces=""
148	for ifn in ${network_interfaces}; do
149		if ifconfig ${ifn} | grep -s UP, > /dev/null 2>&1; then
150			# Interface is already up, so ignore it.
151			continue;
152		fi
153
154		if [ -r /etc/start_if.${ifn} ]; then
155			. /etc/start_if.${ifn}
156			eval showstat_$ifn=1
157		fi
158
159		# Do the primary ifconfig if specified
160		#
161		eval ifconfig_args=\$ifconfig_${ifn}
162
163		case ${ifconfig_args} in
164		'')
165			;;
166		[Dd][Hh][Cc][Pp])
167			# DHCP inits are done all in one go below
168			dhcp_interfaces="$dhcp_interfaces $ifn"
169			eval showstat_$ifn=1
170			;;
171		*)
172			ifconfig ${ifn} ${ifconfig_args}
173			eval showstat_$ifn=1
174			;;
175		esac
176	done
177
178	if [ ! -z "${dhcp_interfaces}" ]; then
179		${dhcp_program:-/sbin/dhclient} ${dhcp_flags} ${dhcp_interfaces}
180	fi
181
182	for ifn in ${network_interfaces}; do
183		# Check to see if aliases need to be added
184		#
185		alias=0
186		while : ; do
187			eval ifconfig_args=\$ifconfig_${ifn}_alias${alias}
188			if [ -n "${ifconfig_args}" ]; then
189				ifconfig ${ifn} ${ifconfig_args} alias
190				eval showstat_$ifn=1
191				alias=$((${alias} + 1))
192			else
193				break;
194			fi
195		done
196
197		# Do ipx address if specified
198		#
199		eval ifconfig_args=\$ifconfig_${ifn}_ipx
200		if [ -n "${ifconfig_args}" ]; then
201			ifconfig ${ifn} ${ifconfig_args}
202			eval showstat_$ifn=1
203		fi
204	done
205
206	# Display ifconfiged interfaces
207	for ifn in ${network_interfaces}; do
208		eval showstat=\$showstat_${ifn}
209		if [ ! -z ${showstat} ]; then
210			ifconfig ${ifn}
211		fi
212	done
213
214	# Resync ipfilter
215	/etc/rc.d/ipfilter resync
216}
217
218network_stop()
219{
220	echo -n "Stopping network:"
221
222	# flush routes
223	#
224	echo -n " flush routes"
225	route -n flush
226
227	echo '.'
228}
229
230load_rc_config $name
231run_rc_command "$1"
232