network.subr revision 100282
1#!/bin/sh -x
2#
3# $FreeBSD: head/etc/network.subr 100282 2002-07-18 05:00:19Z dougb $
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 '
39BEGIN {
40    xlat["files"] = "hosts";
41    xlat["dns"] = "bind";
42    xlat["nis"] = "nis";
43    cont = 0;
44}
45sub(/^[\t ]*hosts:/, "") || cont {
46    if (!cont)
47        srcs = ""
48    sub(/#.*/, "")
49    gsub(/[][]/, " & ")
50    cont = sub(/\\$/, "")
51    srcs = srcs " " $0
52}
53END {
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				;;
79			esac
80		done
81		;;
82	esac
83}
84
85network_start()
86{
87	# set hostname, turn on network
88	#
89	echo -n "Doing initial network setup:"
90
91	# Generate host.conf for compatibility
92	#
93	if [ -f "/etc/nsswitch.conf" ]; then
94		echo -n ' host.conf'
95		generate_host_conf /etc/nsswitch.conf /etc/host.conf
96	fi
97
98	# Convert host.conf to nsswitch.conf if necessary
99	#
100	if [ -f "/etc/host.conf" -a ! -f "/etc/nsswitch.conf" ]; then
101		echo ''
102		echo 'Warning: /etc/host.conf is no longer used'
103		echo '  /etc/nsswitch.conf will be created for you'
104		convert_host_conf /etc/host.conf /etc/nsswitch.conf
105	fi
106
107	# Set the host name if it is not already set
108	#
109	if [ -z "`hostname -s`" ]; then
110		hostname ${hostname}
111		echo -n ' hostname'
112	fi
113
114	# Set the domainname if we're using NIS
115	#
116	if checkyesno nisdomainname ; then
117		domainname ${nisdomainname}
118		echo -n ' domain'
119	fi
120
121	echo '.'
122
123	# Attempt to create cloned interfaces.
124	for ifn in ${cloned_interfaces}; do
125		ifconfig ${ifn} create
126	done
127
128	# gifconfig
129	network_gif_setup
130
131	# Set up all the network interfaces, calling startup scripts if needed
132	#
133	case ${network_interfaces} in
134	[Aa][Uu][Tt][Oo])
135		network_interfaces="`ifconfig -l`"
136		;;
137	*)
138		network_interfaces="${network_interfaces} ${cloned_interfaces}"
139		;;
140	esac
141
142	dhcp_interfaces=""
143	for ifn in ${network_interfaces}; do
144		if [ -r /etc/start_if.${ifn} ]; then
145			. /etc/start_if.${ifn}
146			eval showstat_$ifn=1
147		fi
148
149		# Do the primary ifconfig if specified
150		#
151		eval ifconfig_args=\$ifconfig_${ifn}
152
153		case ${ifconfig_args} in
154		'')
155			;;
156		[Dd][Hh][Cc][Pp])
157			# DHCP inits are done all in one go below
158			dhcp_interfaces="$dhcp_interfaces $ifn"
159			eval showstat_$ifn=1
160			;;
161		*)
162			ifconfig ${ifn} ${ifconfig_args}
163			eval showstat_$ifn=1
164			;;
165		esac
166	done
167
168	if [ ! -z "${dhcp_interfaces}" ]; then
169		${dhcp_program:-/sbin/dhclient} ${dhcp_flags} ${dhcp_interfaces}
170	fi
171
172	for ifn in ${network_interfaces}; do
173		# Check to see if aliases need to be added
174		#
175		alias=0
176		while : ; do
177			eval ifconfig_args=\$ifconfig_${ifn}_alias${alias}
178			if [ -n "${ifconfig_args}" ]; then
179				ifconfig ${ifn} ${ifconfig_args} alias
180				eval showstat_$ifn=1
181				alias=$((${alias} + 1))
182			else
183				break;
184			fi
185		done
186
187		# Do ipx address if specified
188		#
189		eval ifconfig_args=\$ifconfig_${ifn}_ipx
190		if [ -n "${ifconfig_args}" ]; then
191			ifconfig ${ifn} ${ifconfig_args}
192			eval showstat_$ifn=1
193		fi
194	done
195
196	# catch-all for interfaces that haven't been 'ifconfig'ed so far
197	for ifn in ${network_interfaces}; do
198		eval showstat=\$showstat_${ifn}
199		if [ ! -z ${showstat} ]; then
200			ifconfig ${ifn}
201		fi
202	done
203
204	echo '.'
205
206	# Resync ipfilter
207	/etc/rc.d/ipfilter resync
208}
209
210network_stop()
211{
212	echo -n "Stopping network:"
213
214	# flush routes
215	#
216	echo -n " flush routes"
217	route -n flush
218
219	echo '.'
220}
221
222load_rc_config $name
223run_rc_command "$1"
224