rc revision 58566
118334Speter#!/bin/sh
252284Sobrien# $FreeBSD: head/etc/rc 58566 2000-03-25 16:17:53Z dan $
318334Speter#	From: @(#)rc	5.27 (Berkeley) 6/5/91
418334Speter
518334Speter# System startup script run by init on autoboot
618334Speter# or after single-user.
718334Speter# Output and error are redirected to console by init,
818334Speter# and the console is the controlling terminal.
918334Speter
1018334Speter# Note that almost all of the user-configurable behavior is no longer in
1118334Speter# this file, but rather in /etc/defaults/rc.conf.  Please check that file
1218334Speter# first before contemplating any changes here.  If you do need to change
1318334Speter# this file for some reason, we would like to know about it.
1418334Speter
1518334Speterstty status '^T'
1618334Speter
1718334Speter# Set shell to ignore SIGINT (2), but not children;
1818334Speter# shell catches SIGQUIT (3) and returns to single user after fsck.
1918334Speter#
2018334Spetertrap : 2
2118334Spetertrap : 3	# shouldn't be needed
2218334Speter
2350397SobrienHOME=/
2450397SobrienPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin
2550397Sobrienexport HOME PATH
2618334Speter
2718334Speter# BOOTP diskless boot.  We have to run the rc file early in order to
2818334Speter# retarget various config files.
2918334Speter#
3018334Speterif [ -r /etc/rc.diskless1 ]; then
3118334Speter	dlv=`/sbin/sysctl -n vfs.nfs.diskless_valid 2> /dev/null`
3218334Speter	if [ ${dlv:=0} != 0 ]; then
3318334Speter		. /etc/rc.diskless1
3450397Sobrien	fi
3550397Sobrienfi
3650397Sobrien
3752284Sobrien# If there is a global system configuration file, suck it in.
3818334Speter#
3918334Speterif [ -r /etc/defaults/rc.conf ]; then
4018334Speter	. /etc/defaults/rc.conf
4118334Speterelif [ -r /etc/rc.conf ]; then
4218334Speter	. /etc/rc.conf
4318334Speterfi
4418334Speter
4518334Speter# Configure ccd devices.
4618334Speter#
4718334Speterif [ -r /etc/ccd.conf ]; then
4818334Speter	ccdconfig -C
4918334Speterfi
5018334Speter
5118334Spetercase ${start_vinum} in
5218334Speter[Yy][Ee][Ss])
5318334Speter	vinum start
5418334Speter	;;
5518334Speteresac
5618334Speter
5718334Speterswapon -a
5818334Speter
5918334Spetercase $1 in
6018334Speterautoboot)
6118334Speter	echo Automatic reboot in progress...
6218334Speter	fsck -p
6318334Speter	case $? in
6418334Speter	0)
6518334Speter		;;
6618334Speter	2)
6718334Speter		exit 1
6818334Speter		;;
6918334Speter	4)
7018334Speter		reboot
7118334Speter		echo "reboot failed... help!"
7218334Speter		exit 1
7318334Speter		;;
7418334Speter	8)
7518334Speter		echo "Automatic file system check failed... help!"
7618334Speter		exit 1
7718334Speter		;;
7818334Speter	12)
7918334Speter		echo "Reboot interrupted"
8018334Speter		exit 1
8118334Speter		;;
8218334Speter	130)
8318334Speter		# interrupt before catcher installed
8418334Speter		exit 1
8518334Speter		;;
8618334Speter	*)
8718334Speter		echo "Unknown error in reboot"
8818334Speter		exit 1
8918334Speter		;;
9018334Speter	esac
9118334Speter	;;
9218334Speter*)
9318334Speter	echo Skipping disk checks ...
9418334Speter	;;
9518334Speteresac
9618334Speter
9718334Speterset -T
9818334Spetertrap "echo 'Reboot interrupted'; exit 1" 3
9918334Speter
10018334Speter# root normally must be read/write, but if this is a BOOTP NFS
10118334Speter# diskless boot it does not have to be.
10218334Speter#
10318334Spetercase ${root_rw_mount} in
10418334Speter[Nn][Oo] | '')
10518334Speter	;;
10618334Speter*)
10718334Speter	if ! mount -u -o rw / ; then
10818334Speter		echo "Mounting root filesystem rw failed, startup aborted"
10918334Speter		exit 1
11018334Speter	fi
11118334Speter	;;
11218334Speteresac
11318334Speter
11418334Speterumount -a >/dev/null 2>&1
11518334Speter
11618334Speter# Mount everything except nfs filesystems.
11718334Spetermount -a -t nonfs
11818334Speter
11918334Spetercase $? in
12018334Speter0)
12118334Speter	;;
12218334Speter*)
12318334Speter	echo "Mounting /etc/fstab filesystems failed, startup aborted"
12418334Speter	exit 1
12518334Speter	;;
12618334Speteresac
12718334Speter
12818334Speter# Run custom disk mounting function here
12918334Speter#
13018334Speterif [ -n "${diskless_mount}" -a -r "${diskless_mount}" ]; then
13118334Speter		sh ${diskless_mount}
13218334Speterfi
13318334Speter
13418334Speteradjkerntz -i
13518334Speter
13618334Speterclean_var() {
13718334Speter	if [ ! -f /var/run/clean_var ]; then
13818334Speter		rm -rf /var/run/*
13918334Speter		rm -f /var/spool/lock/*
14018334Speter		rm -rf /var/spool/uucp/.Temp/*
14118334Speter		# Keep a copy of the boot messages around
14218334Speter		dmesg >/var/run/dmesg.boot
14318334Speter		# And an initial utmp file
14418334Speter		(cd /var/run && cp /dev/null utmp && chmod 644 utmp;)
14518334Speter		>/var/run/clean_var
14618334Speter	fi
14718334Speter}
14818334Speter
14918334Speterif [ -d /var/run -a -d /var/spool/lock -a -d /var/spool/uucp/.Temp ]; then
15018334Speter	# network_pass1() *may* end up writing stuff to /var - we don't want to
15118334Speter	# remove it immediately afterwards - *nor* to we want to fail to clean
15218334Speter	# an nfs-mounted /var.
15318334Speter	clean_var
15418334Speterfi
15518334Speter
15618334Speter# Add additional swapfile, if configured.
15718334Speter#
15818334Spetercase ${swapfile} in
15918334Speter[Nn][Oo] | '')
16018334Speter	;;
16118334Speter*)
16218334Speter	if [ -w "${swapfile}" -a -c /dev/vn0b ]; then
16318334Speter		echo "Adding ${swapfile} as additional swap."
16418334Speter		vnconfig /dev/vn0b ${swapfile} && swapon /dev/vn0b
16518334Speter	fi
16618334Speter	;;
16718334Speteresac
16818334Speter
16918334Speter# Set sysctl variables as early as we can
17018334Speter#
17118334Speterif [ -r /etc/rc.sysctl ]; then
17218334Speter	. /etc/rc.sysctl
17318334Speterfi
17418334Speter
17518334Speter# Configure serial devices
17618334Speter#
17718334Speterif [ -r /etc/rc.serial ]; then
17818334Speter	. /etc/rc.serial
17918334Speterfi
18018334Speter
18118334Speter# Start up PC-card configuration
18218334Speter#
18318334Speterif [ -r /etc/rc.pccard ]; then
18418334Speter	. /etc/rc.pccard
18518334Speterfi
18618334Speter
18718334Speter# Start up the initial network configuration.
18818334Speter#
18918334Speterif [ -r /etc/rc.network ]; then
19018334Speter	. /etc/rc.network	# We only need to do this once.
19118334Speter	network_pass1
19218334Speterfi
19318334Speter
19418334Spetercase ${ipv6_enable} in
19518334Speter[Yy][Ee][Ss])
19618334Speter	if [ -r /etc/rc.network6 ]; then
19718334Speter		. /etc/rc.network6	# We only need to do this once also.
19850397Sobrien		network6_pass1
19950397Sobrien	fi
20050397Sobrien	;;
20150397Sobrienesac
20250397Sobrien
20318334Speter# Mount NFS filesystems if present in /etc/fstab
20418334Speterif mount -d -a -t nfs | grep nfs >/dev/null 2>&1; then
20518334Speter	echo -n "Mounting NFS file systems"
20618334Speter	mount -a -t nfs
20718334Speter	echo .
20818334Speterfi
20918334Speter
21018334Speter# Whack the pty perms back into shape.
21118334Speter#
21218334Speterchflags 0 /dev/tty[pqrsPQRS]*
21350397Sobrienchmod 666 /dev/tty[pqrsPQRS]*
21418334Speterchown root:wheel /dev/tty[pqrsPQRS]*
21518334Speter
21618334Speter# Clean up left-over files
21718334Speter#
21818334Speterclean_var			# If it hasn't already been done
21918334Speterrm /var/run/clean_var
22018334Speter
22118334Speter# Clearing /tmp at boot-time seems to have a long tradition.  It doesn't
22218334Speter# help in any way for long-living systems, and it might accidentally
22318334Speter# clobber files you would rather like to have preserved after a crash
22418334Speter# (if not using mfs /tmp anyway).
22518334Speter#
22618334Speter# See also the example of another cleanup policy in /etc/periodic/daily.
22718334Speter#
22818334Spetercase ${clear_tmp_enable} in
22918334Speter[Yy][Ee][Ss])
23018334Speter	echo clearing /tmp
23118334Speter	# prune quickly with one rm, then use find to clean up /tmp/[lq]*
23218334Speter	# (not needed with mfs /tmp, but doesn't hurt there...)
23318334Speter	(cd /tmp && rm -rf [a-km-pr-zA-Z]* &&
23418334Speter		find -d . ! -name . ! -name lost+found ! -name quota.user \
23518334Speter		! -name quota.group -exec rm -rf -- {} \;)
23618334Speter	;;
23718334Speteresac
23818334Speter
23918334Speter# Remove X lock files, since they will prevent you from restarting X11
24018334Speter# after a system crash.
24118334Speter#
24218334Speterrm -f /tmp/.X*-lock /tmp/.X11-unix/*
24318334Speter
24418334Speter# Snapshot any kernel -c changes back to disk here <someday>.
24518334Speter# This has changed with ELF and /kernel.config.
24618334Speter
24718334Speterecho -n 'additional daemons:'
24818334Speter
24918334Speter# Start system logging and name service.  Named needs to start before syslogd
25018334Speter# if you don't have a /etc/resolv.conf.
25118334Speter#
25218334Spetercase ${syslogd_enable} in
25318334Speter[Yy][Ee][Ss])
25418334Speter	# Transitional symlink (for the next couple of years :) until all
25518334Speter	# binaries have had a chance to move towards /var/run/log.
25618334Speter	if [ ! -h /dev/log ]; then
25718334Speter		# might complain for r/o root f/s
25818334Speter		ln -sf /var/run/log /dev/log
25918334Speter	fi
26018334Speter
26118334Speter	rm -f /var/run/log
26218334Speter	echo -n ' syslogd';	syslogd ${syslogd_flags}
26318334Speter	;;
26418334Speteresac
26518334Speter
26618334Speterecho '.'
26718334Speter
26818334Speter# Enable dumpdev so that savecore can see it.
26918334Speter# /var/crash should be a directory or a symbolic link
27018334Speter# to the crash directory if core dumps are to be saved.
27118334Speter#
27218334Spetercase ${dumpdev} in
27318334Speter[Nn][Oo] | '')
27418334Speter	;;
27518334Speter*)
27618334Speter	if [ -e "${dumpdev}" -a -d /var/crash ]; then
27718334Speter		dumpon ${dumpdev}
27850397Sobrien		echo -n checking for core dump...
27950397Sobrien		savecore /var/crash
28018334Speter	fi
28118334Speter	;;
28218334Speteresac
28318334Speter
28418334Speterif [ -n "${network_pass1_done}" ]; then
28518334Speter	network_pass2
28618334Speterfi
28718334Speter
28818334Speter# Enable/Check the quotas (must be after ypbind if using NIS)
28952284Sobrien#
29052284Sobriencase ${enable_quotas} in
29152284Sobrien[Yy][Ee][Ss])
29252284Sobrien	case ${check_quotas} in
29352284Sobrien	[Yy][Ee][Ss])
29452284Sobrien		echo -n 'checking quotas:'
29552284Sobrien		quotacheck -a
29652284Sobrien		echo ' done.'
29752284Sobrien		;;
29818334Speter	esac
29952284Sobrien
30052284Sobrien	echo -n 'enabling quotas:'
30152284Sobrien	quotaon -a
30252284Sobrien	echo ' done.'
30352284Sobrien	;;
30418334Speteresac
30552284Sobrien
30652284Sobrienif [ -n "${network_pass2_done}" ]; then
30752284Sobrien	network_pass3
30818334Speterfi
30952284Sobrien
31052284Sobrien# Build ps databases
31118334Speter#
31252284Sobriendev_mkdb
31352284Sobrien
31452284Sobrien# Check the password temp/lock file
31552284Sobrien#
31652284Sobrienif [ -e /etc/ptmp ]; then
31752284Sobrien	logger -s -p auth.err \
31852284Sobrien	"password file may be incorrect -- /etc/ptmp exists"
31952284Sobrienfi
32018334Speter
32118334Spetercase ${accounting_enable} in
32218334Speter[Yy][Ee][Ss])
32318334Speter	if [ -d /var/account ]; then
32418334Speter		echo 'turning on accounting'
32518334Speter		if [ ! -e /var/account/acct ]; then
32618334Speter			touch /var/account/acct
32718334Speter		fi
32818334Speter		accton /var/account/acct
32918334Speter	fi
33018334Speter	;;
33118334Speteresac
33218334Speter
33318334Speter# Make shared lib searching a little faster.  Leave /usr/lib first if you
33418334Speter# add your own entries or you may come to grief.
33518334Speter#
33618334Speterif [ -x /sbin/ldconfig ]; then
33718334Speter	case `/usr/bin/objformat` in
33818334Speter	elf)
33918334Speter		_LDC=/usr/lib
34018334Speter		for i in ${ldconfig_paths}; do
34118334Speter			if [ -d "${i}" ]; then
34218334Speter				_LDC="${_LDC} ${i}"
34318334Speter			fi
34418334Speter		done
34518334Speter		echo 'setting ELF ldconfig path:' ${_LDC}
34618334Speter		ldconfig -elf ${_LDC}
34718334Speter		;;
34818334Speter	esac
34918334Speter
35018334Speter	# Legacy aout support for i386 only
35118334Speter	case `sysctl -n hw.machine` in
35218334Speter	i386)
35318334Speter		# Default the a.out ldconfig path.
35418334Speter		: ${ldconfig_paths_aout=${ldconfig_paths}}
35518334Speter		_LDC=/usr/lib/aout
35618334Speter		for i in ${ldconfig_paths_aout}; do
35718334Speter			if [ -d "${i}" ]; then
35818334Speter				_LDC="${_LDC} ${i}"
35918334Speter			fi
36018334Speter		done
36118334Speter		echo 'setting a.out ldconfig path:' ${_LDC}
36218334Speter		ldconfig -aout ${_LDC}
36318334Speter		;;
36418334Speter	esac
36518334Speterfi
36618334Speter
36718334Speter# Now start up miscellaneous daemons that don't belong anywhere else
36818334Speter#
36918334Speterecho -n starting standard daemons:
37018334Spetercase ${inetd_enable} in
37118334Speter[Nn][Oo])
37218334Speter	;;
37318334Speter*)
37418334Speter	echo -n ' inetd';	inetd ${inetd_flags}
37518334Speter	;;
37618334Speteresac
37718334Speter
37818334Spetercase ${cron_enable} in
37918334Speter[Nn][Oo])
38018334Speter	;;
38118334Speter*)
38218334Speter	echo -n ' cron';	cron
38318334Speter	;;
38418334Speteresac
38518334Speter
38618334Spetercase ${lpd_enable} in
38718334Speter[Yy][Ee][Ss])
38818334Speter	echo -n ' printer';	${lpd_program:-/usr/sbin/lpd} ${lpd_flags}
38918334Speter	;;
39018334Speteresac
39118334Speter
39218334Spetercase ${sendmail_enable} in
39318334Speter[Yy][Ee][Ss])
39418334Speter	if [ -r /etc/mail/sendmail.cf ]; then
39518334Speter		echo -n ' sendmail';	/usr/sbin/sendmail ${sendmail_flags}
39618334Speter	fi
39718334Speter	;;
39818334Speteresac
39918334Speter
40018334Spetercase ${sshd_enable} in
40118334Speter[Yy][Ee][Ss])
40218334Speter	if [ -x ${sshd_program:-/usr/sbin/sshd} ]; then
40318334Speter		echo -n ' sshd';
40418334Speter		${sshd_program:-/usr/sbin/sshd} ${sshd_flags}
40518334Speter	fi
40618334Speter	;;
40718334Speteresac
40818334Speter
40918334Spetercase ${usbd_enable} in
41018334Speter[Yy][Ee][Ss])
41118334Speter	echo -n ' usbd';	/usr/sbin/usbd ${usbd_flags}
41218334Speter	;;
41318334Speteresac
41418334Speter
41518334Speterecho '.'
41618334Speter
41718334Speter# Recover vi editor files.
41818334Speterfind /var/tmp/vi.recover ! -type f -a ! -type d -delete
41918334Spetervibackup=`echo /var/tmp/vi.recover/vi.*`
42018334Speterif [ "${vibackup}" != '/var/tmp/vi.recover/vi.*' ]; then
42118334Speter	echo 'Recovering vi editor sessions'
42218334Speter	for i in /var/tmp/vi.recover/vi.*; do
42318334Speter		# Only test files that are readable.
42418334Speter		if [ ! -r "${i}" ]; then
42518334Speter			continue
42618334Speter		fi
42718334Speter
42818334Speter		# Unmodified nvi editor backup files either have the
42918334Speter		# execute bit set or are zero length.  Delete them.
43018334Speter		if [ -x "${i}" -o ! -s "${i}" ]; then
43118334Speter			rm -f "${i}"
43218334Speter		fi
43318334Speter	done
43418334Speter
43518334Speter	# It is possible to get incomplete recovery files, if the editor
43618334Speter	# crashes at the right time.
43718334Speter	virecovery=`echo /var/tmp/vi.recover/recover.*`
43818334Speter	if [ "${virecovery}" != "/var/tmp/vi.recover/recover.*" ]; then
43918334Speter		for i in /var/tmp/vi.recover/recover.*; do
44018334Speter			# Only test files that are readable.
44118334Speter			if [ ! -r "${i}" ]; then
44218334Speter				continue
44318334Speter			fi
44418334Speter
44518334Speter			# Delete any recovery files that are zero length,
44618334Speter			# corrupted, or that have no corresponding backup file.
44718334Speter			# Else send mail to the user.
44818334Speter			recfile=`awk '/^X-vi-recover-path:/{print $2}' < "${i}"`
44918334Speter			if [ -n "${recfile}" -a -s "${recfile}" ]; then
45018334Speter				sendmail -t < "${i}"
45118334Speter			else
45218334Speter				rm -f "${i}"
45318334Speter			fi
45418334Speter		done
45552284Sobrien	fi
45618334Speterfi
45718334Speter
45818334Speter# Make a bounds file for msgs(1) if there isn't one already
45918334Speter# "Delete important files with symlink" security hole?
46018334Speter#
46118334Speterif [ -d /var/msgs -a ! -f /var/msgs/bounds ]; then
46218334Speter	echo 0 > /var/msgs/bounds
46318334Speterfi
46418334Speter
46518334Spetercase ${update_motd} in
46618334Speter[Nn][Oo] | '')
46718334Speter	;;
46818334Speter*)
46918334Speter	if T=`mktemp /tmp/_motd.XXXXXX`; then
47018334Speter		uname -v | sed -e 's,^\([^#]*\) #\(.* [1-2][0-9][0-9][0-9]\).*/\([^\]*\) $,\1 (\3) #\2,' > ${T}
47118334Speter		awk '{if (NR == 1) {if ($1 == "FreeBSD") {next} else {print "\n"$0}} else {print}}' < /etc/motd >> ${T}
47218334Speter		cmp -s ${T} /etc/motd || {
47318334Speter			cp ${T} /etc/motd
47418334Speter			chmod 644 /etc/motd
47518334Speter		}
47618334Speter		rm -f ${T}
47718334Speter	fi
47818334Speter	;;
47918334Speteresac
48018334Speter
48118334Speter# Configure implementation specific stuff
48218334Speter#
48318334Speterarch=`uname -m`
48418334Speterif [ -r /etc/rc.${arch} ]; then
48518334Speter	. /etc/rc.${arch}
48618334Speterfi
48718334Speter
48818334Speter# Run rc.devfs if readable to customize devfs
48918334Speter#
49018334Speterif [ -r /etc/rc.devfs ]; then
49118334Speter	sh /etc/rc.devfs
49218334Speterfi
49350397Sobrien
49450397Sobrien# Do traditional (but rather obsolete) rc.local file if it exists.  If you
49550397Sobrien# use this file and want to make it programmatic, source /etc/defaults/rc.conf
49650397Sobrien# in /etc/rc.local and add your custom variables to /etc/rc.conf, as
49750397Sobrien# shown below.  Please do not put local extensions into /etc/rc itself.
49850397Sobrien# Use /etc/rc.local
49918334Speter#
50052284Sobrien# ---- rc.local ----
50152284Sobrien#	if [ -r /etc/defaults/rc.conf ]; then
50252284Sobrien#		. /etc/defaults/rc.conf
50352284Sobrien#	fi
50452284Sobrien#
50552284Sobrien#	... additional startup conditionals ...
50652284Sobrien# ---- rc.local ----
50752284Sobrien#
50852284Sobrienif [ -r /etc/rc.local ]; then
50952284Sobrien	echo -n 'starting local daemons:'
51052284Sobrien	sh /etc/rc.local
51152284Sobrien	echo '.'
51252284Sobrienfi
51352284Sobrien
51452284Sobrien# For each valid dir in $local_startup, search for init scripts matching *.sh
51552284Sobrien#
51652284Sobriencase ${local_startup} in
51752284Sobrien[Nn][Oo] | '')
51852284Sobrien	;;
51918334Speter*)
52018334Speter	echo -n 'Local package initialization:'
52118334Speter	for dir in ${local_startup}; do
52252284Sobrien		if [ -d "${dir}" ]; then
52318334Speter			for script in ${dir}/*.sh; do
52450397Sobrien				if [ -x "${script}" ]; then
52550397Sobrien					(set -T
52650397Sobrien					 trap 'exit 1' 2
52750397Sobrien					 ${script} start)
52850397Sobrien				fi
52950397Sobrien			done
53050397Sobrien		fi
53150397Sobrien	done
53250397Sobrien	echo .
53350397Sobrien	;;
53418334Speteresac
53518334Speter
53618334Speterif [ -n "${network_pass3_done}" ]; then
53718334Speter	network_pass4
53818334Speterfi
53918334Speter
54018334Speter# Raise kernel security level.  This should be done only after `fsck' has
54118334Speter# repaired local file systems if you want the securelevel to be greater than 1.
54218334Speter#
54318334Spetercase ${kern_securelevel_enable} in
54418334Speter[Yy][Ee][Ss])
54518334Speter	if [ "${kern_securelevel}" -ge 0 ]; then
54618334Speter		echo 'Raising kernel security level'
54718334Speter		sysctl -w kern.securelevel=${kern_securelevel}
54818334Speter	fi
54918334Speter	;;
55018334Speteresac
55118334Speter
55218334Speterdate
55318334Speterexit 0
55418334Speter