Project

General

Profile

Download (13 KB) Statistics
| Branch: | Tag: | Revision:
1
#!/bin/sh
2
#
3
# pfSense-rc
4
#
5
# part of pfSense (https://www.pfsense.org)
6
# Copyright (c) 2004-2013 BSD Perimeter
7
# Copyright (c) 2013-2016 Electric Sheep Fencing
8
# Copyright (c) 2014-2019 Rubicon Communications, LLC (Netgate)
9
# All rights reserved.
10
#
11
# originally based on m0n0wall (http://neon1.net/m0n0wall)
12
# Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>.
13
# All rights reserved.
14
#
15
# Licensed under the Apache License, Version 2.0 (the "License");
16
# you may not use this file except in compliance with the License.
17
# You may obtain a copy of the License at
18
#
19
# http://www.apache.org/licenses/LICENSE-2.0
20
#
21
# Unless required by applicable law or agreed to in writing, software
22
# distributed under the License is distributed on an "AS IS" BASIS,
23
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24
# See the License for the specific language governing permissions and
25
# limitations under the License.
26

    
27
#/bin/stty status '^T'
28
#/bin/stty susp '^-' intr '^-' quit '^-'
29

    
30
#trap : 2
31
#trap : 3
32

    
33
HOME=/
34
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
35
export HOME PATH
36

    
37
get_version ()
38
{
39
	# Set our current version
40
	version=`/bin/cat /etc/version`
41

    
42
	# Version patch
43
	version_patch="0"
44
	if [ -f /etc/version.patch ]; then
45
		version_patch=`/bin/cat /etc/version.patch`
46
	fi
47

    
48
	if [ "${version_patch}" = "0" ]; then
49
		version_patch=""
50
	else
51
		version_patch=" (Patch ${version_patch})"
52
	fi
53
}
54

    
55
get_version
56

    
57
# Setup dumpdev/ddb/savecore"
58
echo "Configuring crash dumps..."
59
/etc/rc.dumpon
60

    
61
if [ -e /root/force_growfs ]; then
62
	/etc/rc.d/growfs onestart
63
fi
64

    
65
#
66
# The file system needs to be unmounted to guarantee a clean operation of fsck.
67
# Pending changes can keep the file system dirty until all the cached data is
68
# flushed to the disk.
69
#
70
/sbin/mount -ur /
71

    
72
fsck_forced_iterations=`/bin/kenv -q pfsense.fsck.force`
73
if [ ! -z "${fsck_forced_iterations}" ]; then
74
	echo "Forcing filesystem check (${fsck_forced_iterations} times)..."
75
	while [ ${fsck_forced_iterations} -gt 0 ]; do
76
		/sbin/fsck -y -t ufs
77
		fsck_forced_iterations=$((fsck_forced_iterations - 1))
78
	done
79
fi
80

    
81
FSCK_ACTION_NEEDED=0
82
/sbin/fsck -p
83
case $? in
84
0)
85
	echo "Filesystems are clean, continuing..."
86
	echo "Mounting filesystems..."
87
	;;
88
8|16)
89
	echo "Preen mode recommended running a check that will be performed now."
90
	FSCK_ACTION_NEEDED=1
91
	;;
92
*)
93
	echo "Stopping boot is recommended because filesystem manual action is needed, nevertheless automated repair of the filesystem will be attempted."
94
	FSCK_ACTION_NEEDED=1
95
	;;
96
esac
97

    
98
if [ ${FSCK_ACTION_NEEDED} = 1 ]; then
99
	echo "WARNING: Trying to recover filesystem from inconsistency..."
100
	/sbin/fsck -y -t ufs
101
fi
102

    
103
/sbin/mount -a 2>/dev/null
104
mount_rc=$?
105
attempts=0
106
while [ ${mount_rc} -ne 0 -a ${attempts} -lt 10 ]; do
107
	/sbin/fsck -y -t ufs
108
	/sbin/mount -a 2>/dev/null
109
	mount_rc=$?
110
	attempts=$((attempts+1))
111
done
112

    
113
if [ ${mount_rc} -ne 0 ]; then
114
	echo "ERROR: Impossible to mount filesystem, use interactive shell to attempt to recover it"
115
	/bin/sh
116
	/sbin/reboot
117
fi
118

    
119
# Handle ZFS read-only case
120
unset USE_ZFS
121
if /sbin/kldstat -qm zfs; then
122
	ZFSFSAVAILABLE=$(/sbin/zfs mount 2>/dev/null | wc -l)
123
	if [ $ZFSFSAVAILABLE -eq 0 ]; then
124
		/sbin/kldunload zfs
125
	else
126
		USE_ZFS=1
127
		ZFSROOT=$(/sbin/zfs mount | /usr/bin/awk '$2 == "/" {print $1}')
128
		if [ -n "$ZFSROOT" ]; then
129
			/sbin/zfs set readonly=off $ZFSROOT
130
		fi
131
		/sbin/zfs mount -a
132
		# If /bootpool is present, then there is an additional zfs pool to import
133
		# See https://redmine.pfsense.org/issues/8063
134
		if [ -d /bootpool ]; then
135
			/sbin/zpool import -f bootpool
136
		fi
137
	fi
138
fi
139

    
140
# If /conf is a directory, convert it to a symlink to /cf/conf
141
if [ -d "/conf" ]; then
142
	# If item is not a symlink then rm and recreate
143
	CONFPOINTSTO=`readlink /conf`
144
	if ! test "x$CONFPOINTSTO" = "x/cf/conf"; then
145
		/bin/rm -rf /conf
146
		/bin/ln -s /cf/conf /conf
147
	fi
148
fi
149

    
150
USE_MFS_TMPVAR=$(/usr/local/sbin/read_xml_tag.sh boolean system/use_mfs_tmpvar)
151

    
152
unset MOVE_PKG_DATA
153
# If use MFS var is disabled, move files back to place
154
if [ "${USE_MFS_TMPVAR}" != "true" -a -f /root/var/db/pkg/local.sqlite ]; then
155
	MOVE_PKG_DATA=1
156
	rm -rf /var/db/pkg 2>/dev/null
157
	rm -rf /var/cache/pkg 2>/dev/null
158
	mv -f /root/var/db/pkg /var/db
159
	mv -f /root/var/cache/pkg /var/cache
160
# If use MFS var is enabled, move files to a safe place
161
elif [ "${USE_MFS_TMPVAR}" = "true" -a -f /var/db/pkg/local.sqlite ]; then
162
	MOVE_PKG_DATA=1
163
	rm -rf /root/var/db/pkg 2>/dev/null
164
	rm -rf /root/var/cache/pkg 2>/dev/null
165
	/bin/mkdir -p /root/var/db /root/var/cache
166
	mv -f /var/db/pkg /root/var/db
167
	mv -f /var/cache/pkg /root/var/cache
168
fi
169

    
170
# Mount /var and /tmp on ZFS filesystems when it's necessary
171
if [ -n "${USE_ZFS}" -a "${USE_MFS_TMPVAR}" = "true" ]; then
172
	zfs list -H -o name,mountpoint |
173
	    while read volume mountpoint; do
174
		[ "${mountpoint}" != "/var" -a "${mountpoint}" != "/tmp" ] \
175
			&& continue
176

    
177
		/sbin/zfs umount ${volume}
178
	done
179
fi
180

    
181
if [ "${USE_MFS_TMPVAR}" = "true" ]; then
182
	/etc/rc.embedded
183
fi
184

    
185
if [ -n "${MOVE_PKG_DATA}" -o "${USE_MFS_TMPVAR}" = "true" ]; then
186
	/bin/mkdir -p /var/db /var/cache
187
	ln -sf ../../root/var/db/pkg /var/db/pkg
188
	ln -sf ../../root/var/cache/pkg /var/cache/pkg
189
fi
190

    
191
# Read product_name from $g, defaults to pfSense
192
# Use php -n here because we are not ready to load extensions yet
193
product=$(/usr/local/bin/php -n /usr/local/sbin/read_global_var product_name pfSense)
194

    
195
# Setup ddb on all platforms.
196
if [ ! -z "`sysctl -Nq debug.ddb.scripting.scripts`" ]; then
197
	/sbin/ddb /etc/${product}-ddb.conf
198
fi
199

    
200
# Restore contents of the RAM disk store
201
/etc/rc.restore_ramdisk_store
202

    
203
# Make sure /home exists
204
[ -d /home ] \
205
	|| mkdir /home
206

    
207
/bin/rm -f /root/force_fsck
208
/bin/rm -f /root/force_growfs
209
/bin/rm -f /root/TRIM_set
210
/bin/rm -f /root/TRIM_unset
211

    
212
# Disable APM on ATA drives. Leaving this on will kill drives long-term, especially laptop drives, by generating excessive Load Cycles.
213
if [ -f /etc/rc.disable_hdd_apm ]; then
214
	/etc/rc.disable_hdd_apm
215
fi
216

    
217
# Eject CD devices on 3G modems
218
MANUFACTURER="huawei|zte"
219
CDDEVICE=`dmesg |egrep -ie "($MANUFACTURER)" | awk -F: '/cd/ {print $1}'`
220
if [ "$CDDEVICE" != "" ]; then
221
	cdcontrol -f /dev/"$CDDEVICE" eject
222
fi
223

    
224
# Use php -n here because we are not ready to load extensions yet
225
varrunpath=$(/usr/local/bin/php -n /usr/local/sbin/read_global_var varrun_path "/var/run")
226

    
227
if [ "${USE_MFS_TMPVAR}" != "true" ]; then
228
	/sbin/mdmfs -S -M -s 4m md $varrunpath
229
fi
230

    
231
echo
232
cat /usr/local/share/pfSense/ascii-art/pfsense-logo-small.txt
233
echo
234
echo
235
echo "Welcome to ${product} ${version}${version_patch}..."
236
echo
237

    
238
/sbin/conscontrol mute off >/dev/null
239

    
240
SWAPDEVICE=`/bin/cat /etc/fstab | /usr/bin/grep swap | /usr/bin/cut -f1 | /usr/bin/head -n 1`
241
if [ -n "${SWAPDEVICE}" ]; then
242
	/bin/rm -f /tmp/fstab.swap
243
	if ! [ -c ${SWAPDEVICE} ]; then
244
		# Keep the original device, in case it is special, such as encrypted+mirrored zfs swap
245
		echo "${SWAPDEVICE}	none	swap	sw	0	0" >> /tmp/fstab.swap
246
		# The swap device in fstab does not exist, look for other valid entries and update fstab
247
		for SWAPLABEL in /dev/label/swap* /dev/mirror/swap*; do
248
			if [ -c ${SWAPLABEL} ]; then
249
				echo "${SWAPLABEL}	none	swap	sw	0	0" >> /tmp/fstab.swap
250
			fi
251
		done
252
	else
253
		/bin/cp /etc/fstab /tmp/fstab.swap
254
	fi
255
	/sbin/swapon -F /tmp/fstab.swap -a 2>/dev/null >/dev/null
256
	/etc/rc.savecore
257
fi
258

    
259
# make some directories in /var
260
/bin/mkdir -p $varrunpath /var/log /var/etc /var/db/entropy /var/db/rrd /var/at/jobs/ /var/empty /var/log/nginx 2>/dev/null
261

    
262
# turn off the immutable flag, set /var/empty to read-only, make it immutable again
263
chflags noschg /var/empty
264
chmod 0555 /var/empty
265
chflags schg /var/empty
266

    
267
/bin/rm -rf $varrunpath/*
268

    
269
# Cleanup configuration files from previous instance
270
/bin/rm -rf /var/etc/*
271

    
272
# Workaround for ipsec symlinks, otherwise it's going to break
273
# strongswan pkg upgrade
274

    
275
if [ -L /usr/local/etc/ipsec.d ]; then
276
	rm -f /usr/local/etc/ipsec.d
277
fi
278
if [ -L /usr/local/etc/ipsec.conf ]; then
279
	rm -f /usr/local/etc/ipsec.conf
280
fi
281
if [ -L /usr/local/etc/strongswan.d ]; then
282
	rm -f /usr/local/etc/strongswan.d
283
fi
284
if [ -L /usr/local/etc/strongswan.conf ]; then
285
	rm -f /usr/local/etc/strongswan.conf
286
fi
287

    
288
# Remove deprecated symlinks - #5538
289
for f in /etc/hosts \
290
    /etc/resolv.conf \
291
    /etc/resolvconf.conf \
292
    /etc/syslog.conf; do
293
	if [ -L "${f}" ]; then
294
		rm -f ${f}
295
	fi
296
done
297

    
298
# Make sure our /tmp is 777 + Sticky
299
/bin/chmod 1777 /tmp
300

    
301
if [ ! -L /etc/dhclient.conf ]; then
302
	/bin/rm -rf /etc/dhclient.conf
303
fi
304

    
305
if [ ! -d /var/tmp ]; then
306
	/bin/mkdir -p /var/tmp
307
fi
308
# Make sure our /var/tmp is 777 + Sticky
309
/bin/chmod 1777 /var/tmp
310

    
311
set -T
312
trap "echo 'Reboot interrupted'; exit 1" 3
313

    
314
echo -n "."
315
DISABLESYSLOGCLOG=$(/usr/local/sbin/read_xml_tag.sh boolean system/disablesyslogclog)
316
LOG_FILES="system filter dhcpd vpn poes l2tps openvpn portalauth ipsec ppp wireless nginx ntpd gateways resolver routing"
317

    
318
DEFAULT_LOG_FILE_SIZE=$(/usr/local/sbin/read_xml_tag.sh string syslog/logfilesize)
319
DEFAULT_LOG_FILE_SIZE=${DEFAULT_LOG_FILE_SIZE:-"511488"}
320

    
321
for logfile in $LOG_FILES; do
322
	if [ "$DISABLESYSLOGCLOG" = "true" ]; then
323
		/usr/bin/touch /var/log/$logfile.log
324
	else
325
		if [ ! -f /var/log/$logfile.log ]; then
326
			/usr/local/sbin/clog -i -s ${DEFAULT_LOG_FILE_SIZE} /var/log/$logfile.log
327
		fi
328
	fi
329
done
330

    
331
# change permissions on newly created log files.
332
/bin/chmod 0600 /var/log/*.log
333

    
334
echo -n "."
335
DEVFS=`/sbin/mount | /usr/bin/grep devfs | /usr/bin/wc -l | /usr/bin/cut -d" " -f8`
336
if [ "$DEVFS" = "0" ]; then
337
	mount_devfs devfs /dev
338
fi
339

    
340
# Create an initial utmp file
341
cd $varrunpath && /bin/cp /dev/null utmp && /bin/chmod 644 utmp
342

    
343
echo -n "."
344
/sbin/ldconfig -elf /usr/lib /usr/local/lib /lib
345
/etc/rc.d/ldconfig start 2>/dev/null
346

    
347
# Launching kbdmux(4)
348
if [ -f "/dev/kbdmux0" ]; then
349
	echo -n "."
350
	/usr/sbin/kbdcontrol -k /dev/kbdmux0 < /dev/console
351
	[ -c "/dev/atkbd0" ] && kbdcontrol -a atkbd0 < /dev/console
352
	[ -c "/dev/ukbd0" ] && kbdcontrol -a ukbd0 < /dev/console
353
fi
354

    
355
# Fire up unionfs if mount points exist.
356
if [ -f /dist/uniondirs ]; then
357
	echo -n "."
358
	/etc/rc.d/unionfs start
359
fi
360

    
361
echo "done."
362

    
363
# Recreate capabilities DB
364
/usr/bin/cap_mkdb /etc/login.conf
365

    
366
if [ -f /cf/conf/needs_package_sync ]; then
367
	skip_packages=1
368
fi
369

    
370
# Second upgrade stage
371
[ -z "$skip_packages" ] \
372
	&& /usr/local/sbin/${product}-upgrade -y -U -b 2
373

    
374
# Copy default openssl config file
375
[ -d /etc/ssl ] \
376
	|| mkdir -p /etc/ssl
377
[ -f /usr/local/share/${product}/ssl/openssl.cnf ] \
378
	&& cp -f /usr/local/share/${product}/ssl/openssl.cnf /etc/ssl
379
mkdir -p /usr/local/openssl >/dev/null 2>&1
380
ln -sf /etc/ssl/openssl.cnf \
381
	/usr/local/openssl/openssl.cnf
382

    
383
# Run the php.ini setup file and populate
384
# /usr/local/etc/php.ini
385
/etc/rc.php_ini_setup 2>/tmp/php_errors.txt
386
/usr/local/sbin/php-fpm -c /usr/local/etc/php.ini -y /usr/local/lib/php-fpm.conf -RD 2>&1 >/dev/null
387

    
388
# Launch external configuration loader
389
/usr/local/sbin/fcgicli -f /etc/ecl.php
390

    
391
if [ -f /etc/rc.custom_boot_early ]; then
392
	/bin/echo -n "Launching /etc/rc.custom_boot_early...";
393
	/etc/rc.custom_boot_early
394
	echo "Done"
395
fi
396

    
397
export fcgipath=/var/run/php-fpm.socket
398
/usr/bin/nice -n20 /usr/local/sbin/check_reload_status
399

    
400
# let the PHP-based configuration subsystem set up the system now
401
echo -n "Launching the init system..."
402
/bin/rm -f /cf/conf/backup/backup.cache
403
/usr/bin/touch $varrunpath/booting
404

    
405
# Copy custom logo over if it's present
406
if [ -d /usr/local/share/${product}/custom_logos ]; then
407
	cp -f /usr/local/share/${product}/custom_logos/*svg \
408
		/usr/local/www
409
	cp -f /usr/local/share/${product}/custom_logos/*css \
410
		/usr/local/www/css
411
fi
412

    
413
# Apply CPU microcode update
414
[ -x /usr/local/etc/rc.d/microcode_update ] \
415
	&& /usr/local/etc/rc.d/microcode_update onestart
416

    
417
/etc/rc.bootup
418

    
419
# /etc/rc.bootup unset $g['booting'], and removes file
420
# Be sure the file is removed to not create troubles after
421
if [ -f $varrunpath/booting ]; then
422
	/bin/rm $varrunpath/booting
423
fi
424

    
425
echo -n "Starting CRON... "
426
cd /tmp && /usr/sbin/cron -s 2>/dev/null
427
echo "done."
428

    
429
/bin/rm -rf /usr/local/pkg/pf/CVS
430

    
431
# Start ping handler every 240 seconds
432
/usr/local/bin/minicron 240 $varrunpath/ping_hosts.pid /usr/local/bin/ping_hosts.sh
433

    
434
# Start account expire handler every hour
435
/usr/local/bin/minicron 3600 $varrunpath/expire_accounts.pid '/usr/local/sbin/fcgicli -f /etc/rc.expireaccounts'
436

    
437
# Start alias url updater every 24 hours
438
/usr/local/bin/minicron 86400 $varrunpath/update_alias_url_data.pid '/usr/local/sbin/fcgicli -f /etc/rc.update_alias_url_data'
439

    
440
/bin/chmod a+rw /tmp/.
441

    
442
# Check for GEOM mirrors
443
GMIRROR_STATUS=`/sbin/gmirror status`
444
if [ "${GMIRROR_STATUS}" != "" ]; then
445
	# Using a flag file at bootup saves an expensive exec/check on each page load.
446
	/usr/bin/touch /var/run/gmirror_active
447
	# Setup monitoring/notifications
448
	/usr/local/bin/minicron 60 /var/run/gmirror_status_check.pid /usr/local/sbin/gmirror_status_check.php
449
fi
450

    
451
[ -z "$skip_packages" ] \
452
	&& /usr/local/sbin/${product}-upgrade -y -U -b 3
453

    
454
# Start packages
455
[ -z "$skip_packages" ] \
456
	&& /usr/local/sbin/fcgicli -f /etc/rc.start_packages
457

    
458
# Update pkg metadata
459
/etc/rc.update_pkg_metadata now
460

    
461
# Log product version to syslog
462
get_version
463
BUILDTIME=`cat /etc/version.buildtime`
464
ARCH=`uname -m`
465
echo "$product ${version}${version_patch} $ARCH $BUILDTIME"
466

    
467
echo "Bootup complete"
468

    
469
/usr/local/bin/beep.sh start 2>&1 >/dev/null
470

    
471
# Reset the cache.  read-only requires this.
472
/bin/rm -f /tmp/config.cache
473

    
474
exit 0
(13-13/80)