Projet

Général

Profil

Télécharger (113 ko) Statistiques
| Branche: | Révision:

univnautes-tools / builder_scripts / builder_common.sh @ 814df256

1
#!/bin/sh
2
#
3
#  builder_common.sh
4
#  Copyright (C) 2004-2011 Scott Ullrich
5
#  Copyright (C) 2014 Ermal Luçi
6
#  All rights reserved.
7
#
8
#  NanoBSD portions of the code
9
#  Copyright (c) 2005 Poul-Henning Kamp.
10
#  and copied from nanobsd.sh
11
#  All rights reserved.
12
#
13
#  FreeSBIE portions of the code
14
#  Copyright (c) 2005 Dario Freni
15
#  and copied from FreeSBIE project
16
#  All rights reserved.
17
#  
18
#  Redistribution and use in source and binary forms, with or without
19
#  modification, are permitted provided that the following conditions are met:
20
#  
21
#  1. Redistributions of source code must retain the above copyright notice,
22
#     this list of conditions and the following disclaimer.
23
#  
24
#  2. Redistributions in binary form must reproduce the above copyright
25
#     notice, this list of conditions and the following disclaimer in the
26
#     documentation and/or other materials provided with the distribution.
27
#  
28
#  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
29
#  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
30
#  AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
31
#  AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
32
#  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33
#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34
#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35
#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36
#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37
#  POSSIBILITY OF SUCH DAMAGE.
38
#
39
#  This is the brains of the builder and is included
40
#  by the various pfSense builder scripts such as
41
#  build_iso.sh and build_nano.sh, etc.
42
#
43
# Crank up error reporting, debugging.
44
# set -e
45
# set -x
46

    
47
if [ "$MAKEOBJDIRPREFIXFINAL" != "" ]; then
48
	mkdir -p $MAKEOBJDIRPREFIXFINAL
49
else
50
	echo "MAKEOBJDIRPREFIXFINAL is not defined"
51
	print_error_pfS
52
fi
53

    
54
# This routine will post a tweet to twitter
55
post_tweet() {
56
	TWEET_MESSAGE="$1"
57
	if [ "$TWITTER_USERNAME" ="" ]; then
58
		echo ">>> ERROR: Could not find TWITTER_USERNAME -- tweet cancelled."
59
		return
60
	fi
61
	if [ "$TWITTER_PASSWORD" = "" ]; then
62
		echo ">>> ERROR: Could not find TWITTER_PASSWORD -- tweet cancelled."
63
		return
64
	fi
65
	if [ ! -f "/usr/local/bin/curl" ]; then
66
		echo ">>> ERROR: Could not find /usr/local/bin/curl -- tweet cancelled."
67
		return
68
	fi
69
	echo -n ">>> Posting tweet to twitter: $TWEET_MESSAGE"
70
	`/usr/local/bin/curl --silent --basic --user "$TWITTER_USERNAME:$TWITTER_PASSWORD" --data status="$TWEET_MESSAGE" http://twitter.com/statuses/update.xml`
71
	echo "Done!"
72
}
73

    
74
get_date_string() {
75
	# This is used for detecting updates.
76
	echo "$BUILTDATESTRING" > $PFSENSEISODIR/etc/version.buildtime
77
}
78

    
79
git_last_commit() {
80
        if [ -d "${GIT_REPO_DIR}/pfSenseGITREPO" ]; then
81
                CURRENT_COMMIT=$(cd ${GIT_REPO_DIR}/pfSenseGITREPO && git log | head -n1 | cut -d' ' -f2)
82
                CURRENT_AUTHOR=$(cd ${GIT_REPO_DIR}/pfSenseGITREPO && git log | head -n3 | grep "Author" | cut -d':' -f2 | cut -d'<' -f1)
83
		echo ">>> Last known commit $CURRENT_AUTHOR - $CURRENT_COMMIT"
84
		echo "$CURRENT_COMMIT" > $SCRATCHDIR/build_commit_info.txt
85
        else
86
                echo ">>> WARNING: pfSenseGITREPO variable not set! Previous commit functions disabled."
87
        fi
88
}
89

    
90
# This routine handles the athstats directory since it lives in
91
# SRCDIR/tools/tools/ath/athstats and changes from various freebsd
92
# versions which makes adding this to pfPorts difficult.
93
handle_tools_stats_crypto() {
94
	if [ -d $SRCDIR/tools/tools/crypto ]; then
95
		echo -n ">>> Building tools/crytpo..."
96
		(cd $SRCDIR/tools/tools/crypto && make clean && make cleandir && env SRCCONF=${SRC_CONF} make && env SRCCONF=${SRC_CONF} make install) 2>&1 | egrep -wi '(^>>>|error)'
97
		echo "Done!"
98
	fi
99

    
100
}
101

    
102
# This routine will output that something went wrong
103
print_error_pfS() {
104
	echo
105
	echo "####################################"
106
	echo "Something went wrong, check errors!" >&2
107
	echo "####################################"
108
	echo
109
	echo "NOTE: a lot of times you can run './build.sh --clean-builder' to resolve."
110
	echo
111
	if [ "$1" != "" ]; then
112
		echo $1
113
	fi
114
    [ -n "${LOGFILE:-}" ] && \
115
        echo "Log saved on ${LOGFILE}" && \
116
		tail -n20 ${LOGFILE} >&2
117
	report_error_pfsense
118
	echo
119
	echo "Press enter to continue."
120
    read ans
121
    kill $$
122
}
123

    
124
prestage_on_ram_setup() {
125
	_AVAIL_MEM=$(($(sysctl -n hw.usermem) / 1024 / 1024))
126
	if [ $_AVAIL_MEM -lt 1400 ]; then
127
		echo ">>> Builder has less than 1.4GiB RAM skipping memory disks"
128
		return
129
	else
130
		echo "######################################################################################"
131
		echo
132
		echo ">>> Builder has more than 1.4GiB RAM enabling memory disks"
133
		echo ">>> WARNING: Remember to remove these memory disks by running $0 --disable-memorydisks"
134
		echo
135
		echo "######################################################################################"
136
	fi
137

    
138
	MOUNT_PRESTAGE=$(mount | grep prestagebacking | grep -v grep | wc -l)
139
	if [ $MOUNT_PRESTAGE -eq 0 ]; then
140
		mdconfig -a -t swap -u 10001 -s ${MEMORYDISK_SIZE}
141
		mkdir -p ${PFSENSESTAGEDIR}
142
		newfs -L prestagebacking -U /dev/md10001
143
		mount /dev/ufs/prestagebacking ${PFSENSESTAGEDIR}
144
	else
145
		echo ">>> Detected preexisting memory disk enabled for ${PFSENSESTAGEDIR}."
146
	fi
147

    
148
	MOUNT_STAGE=$(mount | grep finalstagebacking | grep -v grep | wc -l)
149
	if [ $MOUNT_STAGE -eq 0 ]; then
150
		mdconfig -a -t swap -u 10002 -s ${MEMORYDISK_SIZE}
151
		mkdir -p ${PFSENSEISODIR}
152
		newfs -L finalstagebacking -U /dev/md10002
153
		mount /dev/ufs/finalstagebacking ${PFSENSEISODIR}
154
	else
155
		echo ">>> Detected preexisting memory disk enabled for ${PFSENSEISODIR}."
156
	fi
157

    
158

    
159
	unset MOUNT_PRESTAGE
160
	unset MOUNT_STAGE
161
}
162

    
163
prestage_on_ram_cleanup() {
164
	if [ -c /dev/md10001 ]; then
165
		if [ -d ${PFSENSESTAGEDIR} ]; then
166
			umount ${PFSENSESTAGEDIR}
167
		fi
168
		mdconfig -d -u 10001
169
	fi
170
	if [ -c /dev/md10002 ]; then
171
		if [ -d ${PFSENSEISODIR} ]; then
172
			umount ${PFSENSEISODIR}
173
		fi
174
		mdconfig -d -u 10002
175
	fi
176
}
177

    
178
# This routine will verify that the kernel has been
179
# installed OK to the staging area.
180
ensure_kernel_exists() {
181
	if [ ! -f "$1/boot/kernel/kernel.gz" ]; then
182
		echo ">>> ERROR: Could not locate $1/boot/kernel.gz"
183
		print_error_pfS
184
		kill $$
185
	fi
186
	KERNEL_SIZE=`ls -la $1/boot/kernel/kernel.gz | awk '{ print $5 }'`
187
	if [ "$KERNEL_SIZE" -lt 3500 ]; then
188
		echo ">>> ERROR: Kernel $1/boot/kernel.gz appears to be smaller than it should be: $KERNEL_SIZE"
189
		print_error_pfS
190
		kill $$
191
	fi
192
}
193

    
194
fixup_kernel_options() {
195
	if [ -d "$KERNEL_DESTDIR/boot" ]; then
196
		chflags -R noschg $KERNEL_DESTDIR/boot/
197
		rm -rf $KERNEL_DESTDIR/boot/*
198
	fi
199

    
200
	# Create area where kernels will be copied on LiveCD
201
	mkdir -p $PFSENSESTAGEDIR/kernels/
202
	# Make sure directories exist
203
	mkdir -p $KERNEL_DESTDIR/boot/kernel
204
	mkdir -p $KERNEL_DESTDIR/boot/defaults
205

    
206
	if [ "$TARGET_ARCH" = "" ]; then
207
		TARGET_ARCH=$TARGET
208
	fi
209

    
210
	# Add APIC options for i386 platform
211
	if [ "$TARGET" = "i386" ]; then
212
		echo "device 		apic" >> $KERNELCONF
213
	fi
214

    
215
	if [ "$EXTRA_DEVICES" != "" ]; then
216
		echo "devices	$EXTRA_DEVICES" >> $KERNELCONF
217
	fi
218
	if [ "$NOEXTRA_DEVICES" != "" ]; then
219
		echo "nodevices	$NOEXTRA_DEVICES" >> $KERNELCONF
220
	fi
221
	if [ "$EXTRA_OPTIONS" != "" ]; then
222
		echo "options	$EXTRA_OPTIONS" >> $KERNELCONF
223
	fi
224
	if [ "$NOEXTRA_OPTIONS" != "" ]; then
225
		echo "nooptions	$NOEXTRA_OPTIONS" >> $KERNELCONF
226
	fi
227

    
228
	# NOTE!  If you remove this, you WILL break booting!  These file(s) are read
229
	#        by FORTH and for some reason installkernel with DESTDIR does not
230
	#        copy this file over and you will end up with a blank file?
231
	cp $SRCDIR/sys/boot/forth/loader.conf $KERNEL_DESTDIR/boot/defaults
232
	if [ -f $SRCDIR/sys/$TARGET/conf/GENERIC.hints ]; then
233
		cp $SRCDIR/sys/$TARGET/conf/GENERIC.hints	$KERNEL_DESTDIR/boot/device.hints
234
	fi
235
	if [ -f $SRCDIR/sys/$TARGET/conf/$KERNCONF.hints ]; then
236
		cp $SRCDIR/sys/$TARGET/conf/$KERNCONF.hints $KERNEL_DESTDIR/boot/device.hints
237
	fi
238
	# END NOTE.
239

    
240
	# Danger will robinson -- 7.2+ will NOT boot if these files are not present.
241
	# the loader will stop at |
242
	touch $KERNEL_DESTDIR/boot/loader.conf
243

    
244
}
245

    
246
# This routine builds all pfSense related kernels
247
build_all_kernels() {
248

    
249
	# Set KERNEL_BUILD_PATH if it has not been set
250
	if [ -z "${KERNEL_BUILD_PATH}" ]; then
251
		KERNEL_BUILD_PATH=$SCRATCHDIR/kernels
252
		echo ">>> KERNEL_BUILD_PATH has not been set. Setting to ${KERNEL_BUILD_PATH}!"
253
	fi
254

    
255
	# Build embedded kernel
256
	for BUILD_KERNEL in $BUILD_KERNELS; do
257
		unset KERNCONF
258
		unset KERNEL_DESTDIR
259
		unset KERNELCONF
260
		unset KERNEL_NAME
261
		export KERNCONF=$BUILD_KERNEL
262
		export KERNEL_DESTDIR="$KERNEL_BUILD_PATH/$BUILD_KERNEL"
263
		export KERNELCONF="$SRCDIR/sys/${TARGET}/conf/$BUILD_KERNEL"
264

    
265
		LOGFILE="${BUILDER_LOGS}/kernel.${KERNCONF}.${TARGET}.log"
266
		echo ">>> Building $BUILD_KERNEL kernel."  | tee -a ${LOGFILE}
267

    
268
		# Copy pfSense kernel configuration files over to $SRCDIR/sys/$TARGET/conf
269
		cp $BUILDER_TOOLS/builder_scripts/conf/kernel/$KERNCONF $KERNELCONF
270
		if [ ! -f "$KERNELCONF" ]; then
271
			echo ">>> ERROR: Could not find $KERNELCONF"
272
			print_error_pfS
273
		fi
274
		echo "" >> $KERNELCONF
275

    
276
		# Use kernel INSTALL_NAME if it exists
277
		KERNEL_INSTALL_NAME=$(cat $BUILDER_TOOLS/builder_scripts/conf/kernel/$KERNCONF | /usr/bin/sed -e '/INSTALL_NAME/!d; s/^.*INSTALL_NAME[[:blank:]]*//' \
278
			| /usr/bin/head -n 1)
279

    
280
		if [ -z "${KERNEL_INSTALL_NAME}" ]; then
281
			export KERNEL_NAME=$(echo ${BUILD_KERNEL} | sed -e 's/pfSense_//; s/\.[0-9].*$//')
282
		else
283
			export KERNEL_NAME=${KERNEL_INSTALL_NAME}
284
			unset KERNEL_INSTALL_NAME
285
		fi
286

    
287
		if [ -n "${NO_BUILDKERNEL:-}" -a -f $KERNEL_BUILD_PATH/kernels/kernel_${KERNEL_NAME}.gz ]; then
288
			echo ">>> NO_BUILDKERNEL set, skipping build" | tee -a ${LOGFILE}
289
			continue
290
		fi
291

    
292
		# Common fixup code
293
		fixup_kernel_options
294
		export SRC_CONF=${SRC_CONF}
295
		buildkernel
296

    
297
		OSRC_CONF=${SRC_CONF}
298
		if [ -n "${SRC_CONF_INSTALL:-}" ]; then
299
			export SRC_CONF=$SRC_CONF_INSTALL
300
		fi
301

    
302
		echo ">>> Staging $BUILD_KERNEL kernel..." | tee -a ${LOGFILE}
303
		installkernel
304

    
305
		SRC_CONF=${OSRC_CONF}
306

    
307
		ensure_kernel_exists $KERNEL_DESTDIR
308

    
309
		echo -n ">>> Creating archive of $KERNEL_NAME kernel to staging area..."  | tee -a ${LOGFILE}
310
		chflags -R noschg $KERNEL_DESTDIR/boot/ 2>&1 >/dev/null
311
		mkdir -p $KERNEL_BUILD_PATH/kernels
312
		(cd $KERNEL_DESTDIR/boot/ && tar czf $KERNEL_BUILD_PATH/kernels/kernel_${KERNEL_NAME}.gz .)
313
		rm -rf $KERNEL_DESTDIR 2>&1 1>/dev/null
314

    
315
		echo ".Done" | tee -a ${LOGFILE}
316
	done
317
}
318

    
319
install_default_kernel() {
320
	if [ -z "${1}" ]; then
321
		echo ">>> ERROR: install_default_kernel called without a kernel config name"| tee -a ${LOGFILE}
322
		print_error_pfS
323
	fi
324

    
325
	# Use kernel INSTALL_NAME if it exists
326
	if [ -f $BUILDER_TOOLS/builder_scripts/conf/kernel/${1} ]; then
327
		KERNEL_INSTALL_NAME=$(cat $BUILDER_TOOLS/builder_scripts/conf/kernel/${1} \
328
			| /usr/bin/sed -e '/INSTALL_NAME/!d; s/^.*INSTALL_NAME[[:blank:]]*//' \
329
			| /usr/bin/head -n 1)
330
	fi
331

    
332
	if [ -z "${KERNEL_INSTALL_NAME}" ]; then
333
		export KERNEL_NAME=$(echo ${1} | sed -e 's/pfSense_//; s/\.[0-9].*$//')
334
	else
335
		export KERNEL_NAME=${KERNEL_INSTALL_NAME}
336
		unset KERNEL_INSTALL_NAME
337
	fi
338

    
339
	echo -n ">>> Installing kernel to be used by image ${KERNEL_NAME}..." | tee -a ${LOGFILE}
340
	# If something is missing complain
341
	if [ ! -f $KERNEL_BUILD_PATH/kernels/kernel_${KERNEL_NAME}.gz ]; then
342
		echo ">>> ERROR: The kernel archive($PFSENSESTAGEDIR/kernels/kernel_${KERNEL_NAME}.gz) to install as default does not exist" | tee -a ${LOGFILE}
343
		print_error_pfS
344
	fi
345

    
346
	# Just to make sure
347
	mkdir -p $PFSENSEISODIR/boot
348
	(cd $PFSENSEISODIR/boot/ && tar xzf $KERNEL_BUILD_PATH/kernels/kernel_${KERNEL_NAME}.gz -C $PFSENSEISODIR/boot/)
349

    
350
	if [ ! -f $PFSENSEISODIR/boot/kernel/kernel.gz ]; then
351
		echo ">>> ERROR: No kernel installed on $PFSENSEISODIR and the resulting image will be unusable. STOPPING!" | tee -a ${LOGFILE}
352
		print_error_pfS
353
	fi
354
	mkdir -p $PFSENSEISODIR/kernels
355
	if [ -z "${2}" -o -n "${INSTALL_EXTRA_KERNELS}" ]; then
356
		cp $KERNEL_BUILD_PATH/kernels/kernel_${KERNEL_NAME}.gz $PFSENSEISODIR/kernels
357
		if [ -n "${INSTALL_EXTRA_KERNELS}" ]; then
358
			for _EXTRA_KERNEL in $INSTALL_EXTRA_KERNELS; do
359
				KERNEL_NAME=$(echo ${_EXTRA_KERNEL} | sed -e 's/pfSense_//; s/\.[0-9].*$//')
360
				if [ -f "${KERNEL_BUILD_PATH}/kernels/kernel_${KERNEL_NAME}.gz" ]; then
361
					echo -n ". adding kernel_${KERNEL_NAME}.gz on image /kernels folder"
362
					cp $KERNEL_BUILD_PATH/kernels/kernel_${KERNEL_NAME}.gz $PFSENSEISODIR/kernels
363
				else
364
					echo ">>> ERROR: Requested kernel kernel_${KERNEL_NAME}.gz was not found to be put on image /kernels folder!"
365
					print_error_pfS
366
				fi
367
			done
368
		fi
369
	fi
370
	echo "Done." | tee -a ${LOGFILE}
371

    
372
	unset KERNEL_NAME
373
}
374

    
375
# This routine rebuilds all pfPorts files which are generally
376
# in /home/pfsense/tools/pfPorts/
377
recompile_pfPorts() {
378

    
379
	if [ ! -d /usr/ports/ ]; then
380
		echo "==> Please wait, grabbing port files from FreeBSD.org..."
381
		portsnap fetch
382
		echo "==> Please wait, extracting port files..."
383
		portsnap extract
384
	fi
385

    
386
	if [ ! -f $SCRATCHDIR/pfSense_do_not_build_pfPorts ] || [ "$1" != "" ]; then
387

    
388
		# Set some neede variables
389
		PFPORTS_CONF_DIR="${BUILDER_TOOLS}/builder_scripts/conf/pfPorts"
390
		if [ -n "$PFSPORTSFILE" ]; then
391
			USE_PORTS_FILE="${PFPORTS_CONF_DIR}/${PFSPORTSFILE}"
392
		else
393
			USE_PORTS_FILE="${PFPORTS_CONF_DIR}/buildports.${PFSENSETAG}"
394
		fi
395

    
396
		if [ ! -f "${USE_PORTS_FILE}" ]; then
397
			echo ">>> ERROR: Ports file doesn't exist: '${USE_PORTS_FILE}'"
398
			exit 1
399
		fi
400

    
401
		PFPORTSBASENAME=$(basename ${USE_PORTS_FILE})
402

    
403
		echo "--> Preparing for pfPorts build ${PFPORTSBASENAME}"
404
		if [ "$1" = "" ]; then
405
			update_freebsd_sources_and_apply_patches
406

    
407
			# Warn user about make includes operation
408
			echo "--> WARNING!  We are about to run make includes."
409
			echo -n "--> Press CTRl-C to abort this operation"
410
			echo -n "."
411
			sleep 1
412
			echo -n "."
413
			sleep 1
414
			echo -n "."
415
			sleep 1
416
			echo -n "."
417
			sleep 1
418
			echo "."
419
			sleep 1
420

    
421
			# Since we are using NAT-T and custom patches
422
			# to the build this is needed.
423
			# The other option is to create build env for ports and
424
			# not pollute the host
425
			echo "==> Starting make includes operation..."
426
			( cd $SRCDIR && env SRCCONF=${SRC_CONF} make includes ) | egrep -wi '(^>>>|error)'
427
		else
428
			echo "--> Skipping the make includes run for a single port build."
429
		fi
430

    
431
		echo "==> Compiling pfPorts..."
432
		DCPUS=`sysctl kern.smp.cpus | cut -d' ' -f2`
433
		CPUS=`expr $DCPUS '*' 2`
434
		echo SUBTHREADS="${CPUS}" > $SCRATCHDIR/pfPorts_make.conf
435
		if [ "$TARGET" = "mips" ]; then
436
			echo "WITHOUT_PERL_MALLOC=1" >> $SCRATCHDIR/pfPorts_make.conf
437
			echo "TARGET_BIG_ENDIAN=yes" >> $SCRATCHDIR/pfPorts_make.conf
438
		fi
439
		if [ -f "${PFPORTS_CONF_DIR}/make.conf" ]; then
440
			cat ${PFPORTS_CONF_DIR}/make.conf >> $SCRATCHDIR/pfPorts_make.conf
441
		fi
442

    
443
		export FORCE_PKG_REGISTER=yo
444
		export BATCH=yo
445
		export DISABLE_VULNERABILITIES=yo
446

    
447
		echo ">>> Executing $PFPORTSBASENAME"
448

    
449
		if [ "$1" != "" ]; then
450
			( ${BUILDER_TOOLS}/builder_scripts/scripts/buildports.sh \
451
				-l ${USE_PORTS_FILE} -P ${1} -J "${MAKEJ_PORTS}" \
452
				-m $SCRATCHDIR/pfPorts_make.conf ${CHECK_PORTS_INSTALLED} ) 2>&1
453
		else
454
			( ${BUILDER_TOOLS}/builder_scripts/scripts/buildports.sh \
455
			       -l ${USE_PORTS_FILE} -J "${MAKEJ_PORTS}" \
456
			       -m $SCRATCHDIR/pfPorts_make.conf ${CHECK_PORTS_INSTALLED} ) 2>&1 \
457
				| egrep -wi "(^>>>|error)"
458
		fi
459

    
460
		handle_tools_stats_crypto
461

    
462
		if [ "$1" = "" ]; then
463
			touch $SCRATCHDIR/pfSense_do_not_build_pfPorts
464
			echo "==> End of pfPorts..."
465
		fi
466

    
467
	else
468
		echo "--> $SCRATCHDIR/pfSense_do_not_build_pfPorts is set, skipping pfPorts build..."
469
	fi
470
}
471

    
472
# This routine overlays needed binaries found in the
473
# CUSTOM_COPY_LIST variable.  Clog and syslgod are handled
474
# specially.
475
cust_overlay_host_binaries() {
476
	# Ensure directories exist
477
	# BEGIN required by gather_pfPorts_binaries_in_tgz
478
	mkdir -p ${PFSENSESTAGEDIR}/lib/geom
479
	mkdir -p ${PFSENSESTAGEDIR}/usr/local/lib/php/20060613/
480
	mkdir -p ${PFSENSESTAGEDIR}/usr/local/share/rrdtool/fonts/
481
	mkdir -p ${PFSENSESTAGEDIR}/usr/local/share/smartmontools/
482
	mkdir -p ${PFSENSESTAGEDIR}/usr/local/lib/lighttpd/
483
	mkdir -p ${PFSENSESTAGEDIR}/usr/share/man/man8
484
	mkdir -p ${PFSENSESTAGEDIR}/usr/share/man/man5
485
	# END required by gather_pfPorts_binaries_in_tgz
486
	mkdir -p ${PFSENSESTAGEDIR}/bin
487
	mkdir -p ${PFSENSESTAGEDIR}/sbin
488
	mkdir -p ${PFSENSESTAGEDIR}/usr/bin
489
	mkdir -p ${PFSENSESTAGEDIR}/usr/sbin
490
	mkdir -p ${PFSENSESTAGEDIR}/usr/lib
491
	mkdir -p ${PFSENSESTAGEDIR}/usr/sbin
492
	mkdir -p ${PFSENSESTAGEDIR}/usr/libexec
493
	mkdir -p ${PFSENSESTAGEDIR}/usr/local/bin
494
	mkdir -p ${PFSENSESTAGEDIR}/usr/local/sbin
495
	mkdir -p ${PFSENSESTAGEDIR}/usr/local/lib
496
	mkdir -p ${PFSENSESTAGEDIR}/usr/local/lib/mysql
497
	mkdir -p ${PFSENSESTAGEDIR}/usr/local/libexec
498
	if [ ! -d $PFSENSESTAGEDIR/tank ]; then
499
		mkdir $PFSENSESTAGEDIR/tank
500
	fi
501
	mkdir -p ${BUILDER_LOGS}/pfPort
502

    
503
	# Create a copy of this file just in case
504
	cp $PFSENSESTAGEDIR/etc/gettytab $PFSENSESTAGEDIR/etc/gettytab.bak
505

    
506
	if [ ! -z "${CUSTOM_COPY_LIST:-}" ]; then
507
		echo ">>> Using ${CUSTOM_COPY_LIST:-}..."
508
		FOUND_FILES=`cat ${CUSTOM_COPY_LIST:-}`
509
	else
510
		echo ">>> Using copy.list.${PFSENSETAG}..."
511
		FOUND_FILES=`cat conf/copylist/copy.list.${PFSENSETAG}`
512
	fi
513

    
514
	if [ -f ${BUILDER_LOGS}/pfPort/copy.list ]; then
515
		rm ${BUILDER_LOGS}/pfPort/copy.list
516
		touch ${BUILDER_LOGS}/pfPort/copy.list
517
	else
518
		touch ${BUILDER_LOGS}/pfPort/copy.list
519
	fi
520

    
521
	if [ "${TARGET}" = "${BUILDER_HOST_TARGET}" ]; then
522
		# XXX: handle syslogd
523
		if [ ! -f $PFSENSESTAGEDIR/usr/sbin/syslogd ]; then
524
			echo ">>> Syslogd is missing on staging area copying from host " | tee -a ${LOGFILE}
525
			install /usr/sbin/syslogd $PFSENSESTAGEDIR/usr/sbin/
526
		fi
527

    
528
		# Process base system libraries
529
		NEEDEDLIBS=""
530
		echo ">>> Populating newer binaries found on host jail/os (usr/local)..."
531
		for TEMPFILE in $FOUND_FILES; do
532
			if [ -f /${TEMPFILE} ]; then
533
				FILETYPE=`file /$TEMPFILE | egrep "(dynamically|shared)" | wc -l | awk '{ print $1 }'`
534
				mkdir -p `dirname ${PFSENSESTAGEDIR}/${TEMPFILE}`
535
				if [ "$FILETYPE" -gt 0 ]; then
536
					NEEDLIB=`ldd /${TEMPFILE} | grep "=>" | awk '{ print $3 }'`
537
					NEEDEDLIBS="$NEEDEDLIBS $NEEDLIB" 
538
					if [ ! -f ${PFSENSESTAGEDIR}/${TEMPFILE} ] || [ /${TEMPFILE} -nt ${PFSENSESTAGEDIR}/${TEMPFILE} ]; then
539
						cp /${TEMPFILE} ${PFSENSESTAGEDIR}/${TEMPFILE}
540
						chmod a+rx ${PFSENSESTAGEDIR}/${TEMPFILE}
541
					fi
542
					for NEEDL in $NEEDLIB; do
543
						if [ -f $NEEDL ]; then
544
							if [ ! -f ${PFSENSESTAGEDIR}${NEEDL} ] || [ $NEEDL -nt ${PFSENSESTAGEDIR}${NEEDL} ]; then
545
								if [ ! -d "$(dirname ${PFSENSESTAGEDIR}${NEEDL})" ]; then
546
									mkdir -p $(dirname ${PFSENSESTAGEDIR}${NEEDL})
547
								fi
548
								cp $NEEDL ${PFSENSESTAGEDIR}${NEEDL}
549
							fi
550
						fi
551
					done
552
				else
553
					cp /${TEMPFILE} ${PFSENSESTAGEDIR}/$TEMPFILE
554
				fi
555
			else
556
				if [ -f ${GIT_REPO_DIR}/pfSenseGITREPO/${TEMPFILE} ]; then
557
					FILETYPE=`file ${GIT_REPO_DIR}/pfSenseGITREPO/${TEMPFILE} | grep dynamically | wc -l | awk '{ print $1 }'`
558
					if [ "$FILETYPE" -gt 0 ]; then
559
						NEEDEDLIBS="$NEEDEDLIBS `ldd ${GIT_REPO_DIR}/pfSenseGITREPO/${TEMPFILE} | grep "=>" | awk '{ print $3 }'`"
560
					fi
561
				else
562
					echo "Could not locate $TEMPFILE" >> ${BUILDER_LOGS}/pfPort/copy.list				
563
				fi
564
			fi
565
		done
566
		#export DONTSTRIP=1
567
		echo ">>> Installing collected library information, please wait..."
568
		# Unique the libraries so we only copy them once
569
		NEEDEDLIBS=`for LIB in ${NEEDEDLIBS} ; do echo $LIB ; done |sort -u`
570
		for NEEDLIB in $NEEDEDLIBS; do
571
			if [ -f $NEEDLIB ]; then
572
				if [ ! -f ${PFSENSESTAGEDIR}${NEEDLIB} ] || [ ${NEEDLIB} -nt ${PFSENSESTAGEDIR}${NEEDLIB} ]; then
573
					install ${NEEDLIB} ${PFSENSESTAGEDIR}${NEEDLIB}
574
				fi
575
			fi
576
		done
577
		#unset DONTSTRIP
578
	else
579
		echo ">>> NOTE: Cross compiling detected so binaries overlayed cannot be checked for missing libraries to be copied from host!" | tee -a ${LOGFILE}
580
	fi
581

    
582
	echo ">>> Deleting files listed in ${PRUNE_LIST}" | tee -a ${LOGFILE}
583
	(cd ${PFSENSESTAGEDIR} && sed 's/^#.*//g' ${PRUNE_LIST} | xargs rm -rvf > /dev/null 2>&1)
584

    
585
	# Check for zero sized files.
586
	echo ">>> Checking and reporting zero size files..." | tee -a ${LOGFILE}
587
	check_for_zero_size_files ${PFSENSESTAGEDIR}
588
}
589

    
590
# This routine notes any files that are 0 sized.
591
check_for_zero_size_files() {
592
	if [ -f $BUILDER_LOGS/zero_sized_files.txt ]; then
593
		rm -f $BUILDER_LOGS/zero_sized_files.txt
594
	fi
595
	if [ -n "${1}" ]; then
596
		(find ${1} -perm -+x -type f -size 0 > $BUILDER_LOGS/zero_sized_files.txt)
597
		if  [ -f $BUILDER_LOGS/zero_sized_files.txt ]; then
598
			cat $BUILDER_LOGS/zero_sized_files.txt | tee -a ${LOGFILE}
599
		fi
600
	fi
601
}
602

    
603
# Install custom BSDInstaller bits for pfSense
604
cust_populate_installer_bits() {
605
	# Add lua installer items
606
	echo ">>> Using FreeBSD ${FREEBSD_VERSION} BSDInstaller dfuibelua structure." | tee -a ${LOGFILE}
607
	mkdir -p $PFSENSEISODIR/usr/local/share/dfuibe_lua/install/
608
	mkdir -p $PFSENSEISODIR/scripts/
609
	# This is now ready for general consumption! \o/
610
	mkdir -p $PFSENSEISODIR/usr/local/share/dfuibe_lua/conf/
611
	cp -r $BUILDER_TOOLS/installer/conf \
612
		$PFSENSEISODIR/usr/local/share/dfuibe_lua/
613
	# Rebrand installer!
614
	if [ "${PRODUCT_NAME}" != "" ]; then
615
		sed -i "" -e "s/name = \"pfSense\"/name = \"${PRODUCT_NAME}\"/" $PFSENSEISODIR/usr/local/share/dfuibe_lua/conf/pfSense.lua
616
	fi
617
	if [ "${PFSENSE_VERSION}" != "" ]; then
618
		sed -i "" -e "s/version = \"1.2RC3\"/version = \"${PFSENSE_VERSION}\"/" $PFSENSEISODIR/usr/local/share/dfuibe_lua/conf/pfSense.lua
619
	fi
620

    
621
	# 597_ belongs in installation directory
622
	cp $BUILDER_TOOLS/installer/installer_root_dir7/597* \
623
		$PFSENSEISODIR/usr/local/share/dfuibe_lua/install/
624
	# 599_ belongs in installation directory
625
	cp $BUILDER_TOOLS/installer/installer_root_dir7/599* \
626
		$PFSENSEISODIR/usr/local/share/dfuibe_lua/install/
627
	# 300_ belongs in dfuibe_lua/
628
	cp $BUILDER_TOOLS/installer/installer_root_dir7/300* \
629
		$PFSENSEISODIR/usr/local/share/dfuibe_lua/
630
	# 500_ belongs in dfuibe_lua/
631
	cp $BUILDER_TOOLS/installer/installer_root_dir7/500* \
632
		$PFSENSEISODIR/usr/local/share/dfuibe_lua/
633
	# Copy Centipede Networks sponsored easy-install into place
634
	cp -r $BUILDER_TOOLS/installer/easy_install \
635
		$PFSENSEISODIR/usr/local/share/dfuibe_lua/
636
	# Copy Centipede Networks sponsored easy-install into place
637
	cp $BUILDER_TOOLS/installer/installer_root_dir7/150_easy_install.lua \
638
		$PFSENSEISODIR/usr/local/share/dfuibe_lua/
639
	# Override the base installers welcome and call the Install step "Custom Install"
640
	cp $BUILDER_TOOLS/installer/installer_root_dir7/200_install.lua \
641
		$PFSENSEISODIR/usr/local/share/dfuibe_lua/
642
	# Copy custom 950_reboot.lua script which touches $SCRATCHDIR/install_complete
643
	cp $BUILDER_TOOLS/installer/installer_root_dir7/950_reboot.lua \
644
		$PFSENSEISODIR/usr/local/share/dfuibe_lua/
645
	# Copy cleargpt.sh utility
646
	cp $BUILDER_TOOLS/installer/cleargpt.sh \
647
		$PFSENSEISODIR/usr/sbin/
648
	chmod a+rx $PFSENSEISODIR/usr/sbin/cleargpt.sh
649
	# Copy installer launcher scripts
650
	cp $BUILDER_TOOLS/installer/scripts/pfi $PFSENSEISODIR/scripts/
651
	cp $BUILDER_TOOLS/installer/scripts/lua_installer $PFSENSEISODIR/scripts/lua_installer
652
	cp $BUILDER_TOOLS/installer/scripts/freebsd_installer $PFSENSEISODIR/scripts/
653
	cp $BUILDER_TOOLS/installer/scripts/lua_installer_rescue $PFSENSEISODIR/scripts/
654
	cp $BUILDER_TOOLS/installer/scripts/lua_installer_rescue $PFSENSEISODIR/scripts/
655
	cp $BUILDER_TOOLS/installer/scripts/lua_installer_full $PFSENSEISODIR/scripts/
656
	chmod a+rx $PFSENSEISODIR/scripts/*
657
	mkdir -p $PFSENSEISODIR/usr/local/bin/
658
	cp $BUILDER_TOOLS/installer/scripts/after_installation_routines.sh \
659
		$PFSENSEISODIR/usr/local/bin/after_installation_routines.sh
660
	chmod a+rx $PFSENSEISODIR/scripts/*
661
}
662

    
663
# Copies all extra files to the repository staging
664
# area and ISO staging area (as needed)
665
cust_populate_extra() {
666
	echo ">>> Phase populate_extra..."  | tee -a ${LOGFILE}
667

    
668
	mkdir -p ${PFSENSEISODIR}/home
669
	mkdir -p ${PFSENSEISODIR}/lib
670

    
671
	if [ ! -f ${PFSENSEISODIR}/usr/lib/pam_unix.so ]; then
672
		echo ">>> pam_unix.so is missing copying from host " | tee -a ${LOGFILE}
673
		if [ -f /usr/lib/pam_unix.so ]; then
674
			install -s /usr/lib/pam_unix.so ${PFSENSEISODIR}/usr/lib/
675
		fi
676
	fi
677

    
678
	STRUCTURE_TO_CREATE="root etc usr/local/pkg/parse_config var/run scripts conf usr/local/share/dfuibe_installer root usr/local/bin usr/local/sbin usr/local/lib usr/local/etc usr/local/lib/php/20060613 usr/local/lib/lighttpd"
679

    
680
	for TEMPDIR in $STRUCTURE_TO_CREATE; do
681
		mkdir -p ${PFSENSEISODIR}/${TEMPDIR}
682
	done
683

    
684
	# bsnmpd
685
	mkdir -p $PFSENSEISODIR/usr/share/snmp/defs/
686
	cp -R /usr/share/snmp/defs/ $PFSENSEISODIR/usr/share/snmp/defs/
687

    
688
	# Set buildtime
689
	get_date_string
690

    
691
	# Record last commit info if it is available.
692
	if [ -f $SCRATCHDIR/build_commit_info.txt ]; then
693
		cp $SCRATCHDIR/build_commit_info.txt $PFSENSEISODIR/etc/version.lastcommit
694
	fi
695
}
696

    
697
# Copy a custom defined config.xml used commonly
698
# in rebranding and such applications.
699
cust_install_config_xml() {
700
	if [ ! -z "${USE_CONFIG_XML:-}" ]; then
701
		if [ -f "$USE_CONFIG_XML" ]; then
702
			echo ">>> Using custom config.xml file ${USE_CONFIG_XML} ..." | tee -a ${LOGFILE}
703
			cp ${USE_CONFIG_XML} ${PFSENSEISODIR}/cf/conf/config.xml
704
			cp ${USE_CONFIG_XML} ${PFSENSEISODIR}/conf.default/config.xml 2>/dev/null
705
		fi
706
	fi
707
}
708

    
709
# This routine will copy over $custom_overlay onto
710
# the staging area.  It is commonly used for rebranding
711
# and or custom appliances.
712
install_custom_overlay() {
713
	# Extract custom overlay if it's defined.
714
	if [ ! -z "${custom_overlay:-}" ]; then
715
		echo -n ">>> Custom overlay defined - " | tee -a ${LOGFILE}
716
		if [ -d $custom_overlay ]; then
717
			echo " found directory, $custom_overlay copying..."  | tee -a ${LOGFILE}
718
			for i in $custom_overlay/*
719
			do
720
			    if [ -d "$i" ]; then
721
			        echo ">>> Copying dir: $i ..."  | tee -a ${LOGFILE}
722
			        cp -R $i $PFSENSEISODIR
723
			    else
724
			        echo ">>> Copying file: $i ..."  | tee -a ${LOGFILE}
725
			        cp $i $PFSENSEISODIR
726
			    fi
727
			done
728
		elif [ -f $custom_overlay ]; then
729
			echo " found file, $custom_overlay extracting..."  | tee -a ${LOGFILE}
730
			tar xzpf $custom_overlay -C $PFSENSEISODIR
731
		else
732
			echo "ERROR: file not found $custom_overlay"  | tee -a ${LOGFILE}
733
			print_error_pfS
734
		fi
735
	fi
736
	if [ ! -z "${custom_overlay_archive:-}" ]; then
737
		echo -n ">>> Custom overlay archive defined - "  | tee -a ${LOGFILE}
738
		if [ -d $custom_overlay_archive ]; then
739
			echo " found directory, $custom_overlay_archive extracting files..."  | tee -a ${LOGFILE}
740
			for i in $custom_overlay_archive/*
741
			do
742
			    if [ -f "$i" ]; then
743
			        echo ">>> Extracting file: $i ..."  | tee -a ${LOGFILE}
744
			        tar xzpf $i -C $PFSENSEISODIR
745
			    fi
746
			done
747
		elif [ -f $custom_overlay_archive ]; then
748
			echo " found file, $custom_overlay_archive extracting..."  | tee -a ${LOGFILE}
749
			tar xzpf $custom_overlay_archive -C $PFSENSEISODIR
750
		else
751
			echo ">>> ERROR: file not found $custom_overlay_archive"  | tee -a ${LOGFILE}
752
			print_error_pfS
753
		fi
754
	fi
755
}
756

    
757
# This rotine will overlay $custom_overlay_final when
758
# the build is 99% completed.  Used to overwrite globals.inc
759
# and other files when we need to install packages from pfSense
760
# which would require a normal globals.inc.
761
install_custom_overlay_final() {
762
	# Extract custom overlay if it's defined.
763
	if [ ! -z "${custom_overlay_final:-}" ]; then
764
		echo -n ">>> Custom overlay defined - "
765
		if [ -d $custom_overlay_final ]; then
766
			echo " found directory, $custom_overlay_final copying..."
767
			for i in $custom_overlay_final/*
768
			do
769
		    		if [ -d $i ]; then
770
		       			echo ">>> Copying dir: $i $PFSENSEISODIR ..." | tee -a ${LOGFILE}
771
		        		cp -R $i $PFSENSEISODIR
772
		    		else
773
		        		echo ">>> Copying file: $i $PFSENSEISODIR ..." | tee -a ${LOGFILE}
774
		        		cp $i $PFSENSEISODIR
775
		    		fi
776
			done
777
		elif [ -f $custom_overlay_final ]; then
778
			echo " found file, $custom_overlay_final extracting..." |tee -a ${LOGFILE}
779
			tar xzpf $custom_overlay_final -C $PFSENSEISODIR
780
		else
781
			echo ">>> ERROR: file not found $custom_overlay_final" | tee -a ${LOGFILE}
782
			print_error_pfS
783
		fi
784
	fi
785
}
786

    
787
setup_serial_hints() {
788
    #    When using the serial port as a boot console, be sure to update
789
    #    /boot/device.hints and /etc/ttys before booting the new kernel.
790
    #    If you forget to do so, you can still manually specify the hints
791
    #    at the loader prompt:
792
	if [ ! -f $PFSENSEISODIR/boot/device.hints ]; then
793
		touch $PFSENSEISODIR/boot/device.hints
794
	fi
795
	echo -n ">>> Setting uart hints on device.hints..." | tee -a ${LOGFILE}
796
	echo 'hint.uart.0.at="isa"' >> $PFSENSEISODIR/boot/device.hints
797
	echo 'hint.uart.0.port="0x3F8"' >> $PFSENSEISODIR/boot/device.hints
798
	echo 'hint.uart.0.flags="0x10"' >> $PFSENSEISODIR/boot/device.hints
799
	echo 'hint.uart.0.irq="4"' >> $PFSENSEISODIR/boot/device.hints	
800
	echo "Done." | tee -a ${LOGFILE}
801
}
802

    
803
# Items that need to be fixed up that are
804
# specific to nanobsd builds
805
cust_fixup_nanobsd() {
806
	_NANO_WITH_VGA="${1}"
807
	_FLASH_SIZE="${2}"
808

    
809
	echo ">>> Fixing up NanoBSD Specific items..." | tee -a ${LOGFILE}
810
	if [ "${_NANO_WITH_VGA}" = "nanobsd" ]; then
811
		cp $PFSENSEISODIR/boot/loader.conf_wrap $PFSENSEISODIR/boot/loader.conf
812
		cp $PFSENSEISODIR/etc/ttys_wrap $PFSENSEISODIR/etc/ttys
813
	fi
814

    
815
	# Be sure loader.conf exists, to avoid errors
816
	touch $PFSENSEISODIR/boot/loader.conf
817

    
818
	# create diskless marker file
819
	touch ${PFSENSEISODIR}/etc/diskless
820
	touch ${PFSENSEISODIR}/nanobuild
821

    
822
	# Make root filesystem R/O by default
823
	echo "root_rw_mount=NO" >> ${PFSENSEISODIR}/etc/defaults/rc.conf
824

    
825
	echo "" > $PFSENSEISODIR/etc/motd
826

    
827
	mkdir -p $PFSENSEISODIR/cf/conf/backup
828

    
829
	rm -f $PFSENSEISODIR/usr/local/bin/after_installation_routines.sh 2>/dev/null
830

    
831
	echo "nanobsd" > $PFSENSEISODIR/etc/platform
832

    
833
	if [ "${_NANO_WITH_VGA}" = "nanobsd" ]; then
834
		# Tell loader to use serial console early.
835
		echo "-h" >> $PFSENSEISODIR/boot.config
836

    
837
		# Enable getty on console
838
		sed -i "" -e /ttyd0/s/off/on/ ${PFSENSEISODIR}/etc/ttys
839

    
840
		# Disable getty on syscons devices
841
		sed -i "" -e '/^ttyv[0-8]/s/    on/     off/' ${PFSENSEISODIR}/etc/ttys
842
	else
843
		# Empty file to identify nanobsd_vga images
844
		touch ${PFSENSEISODIR}/etc/nano_use_vga.txt
845
	fi
846

    
847
	unset _NANO_WITH_VGA
848
	unset _FLASH_SIZE
849
}
850

    
851
# This routine will verify that PHP is sound and that it
852
# can open and read config.xml and ensure the hostname
853
test_php_install() {
854
	if [ "${TARGET}" != "${BUILDER_HOST_TARGET}" ]; then
855
		echo ">>> WARNING: Cannot test PHP installation due to different platform ABIs... Skipping!" | tee -a ${LOGFILE}
856
		return
857
	fi
858

    
859
	# We might need to setup php.ini
860
	if test -f "/boot/kernel/ng_socket.ko" && !(kldstat -m ng_socket 2>&1 1>/dev/null); then
861
		echo ">>> Loading ng_socket.ko needed for testing php." | tee -a ${LOGFILE}
862
		kldload -v /boot/kernel/ng_socket.ko 2>/dev/null
863
		if [ $? -ne 0 ]; then
864
			echo ">>> ERROR: root priviledges required for this operation please preload this if running as non-root or check why ng_socket.ko cannot be loaded!" | tee -a ${LOGFILE}
865
			print_error_pfS
866
		fi
867
	fi
868

    
869
	echo -n ">>> Testing PHP installation in ${PFSENSEISODIR}:" | tee -a ${LOGFILE}
870

    
871
	# backup original conf dir
872
	if [ -d $PFSENSEISODIR/conf ]; then
873
		/bin/mv $PFSENSEISODIR/conf $PFSENSEISODIR/conf.org
874
		mkdir -p $PFSENSEISODIR/tmp/
875
		/usr/bin/touch $PFSENSEISODIR/tmp/restore_conf_dir
876
	fi
877

    
878
	# test whether conf dir is already a symlink
879
	if [ ! -L $PFSENSEISODIR/conf ]; then
880
		# install the symlink as it would exist on a live system
881
		(chroot $PFSENSEISODIR /bin/ln -s /conf.default /conf 2>&1) >> ${LOGFILE}
882
		(chroot $PFSENSEISODIR /bin/ln -s /conf.default /cf 2>&1) >> ${LOGFILE}
883
		/usr/bin/touch $PFSENSEISODIR/tmp/remove_conf_symlink
884
	fi
885

    
886
	if [ -f "$PFSENSEISODIR/etc/rc.php_ini_setup" ]; then
887
		mkdir -p $PFSENSEISODIR/usr/local/lib/ $PFSENSEISODIR/usr/local/etc/
888
		(chroot $PFSENSEISODIR /etc/rc.php_ini_setup) 2>/dev/null
889
	fi
890

    
891
	if [ ${FREEBSD_VERSION} -lt 10 ]; then
892
		cp $BUILDER_SCRIPTS/scripts/test_php.php $PFSENSEISODIR/
893
		chmod a+rx $PFSENSEISODIR/test_php.php
894
		HOSTNAME=`env SHELL=/bin/sh chroot $PFSENSEISODIR /test_php.php`
895
		echo -n " $HOSTNAME "
896
		if [ "$HOSTNAME" != "FCGI-PASSED PASSED" ]; then
897
			echo
898
			echo
899
			echo ">>> ERROR: An error occured while testing the php installation in $PFSENSEISODIR"  | tee -a ${LOGFILE}
900
			echo
901
			print_error_pfS
902
			die
903
		else
904
			echo " [OK]" | tee -a ${LOGFILE}
905
		fi
906
	else
907
		echo " [ UNKOWN] since a new test needs to be written for php-fpm" | tee -a ${LOGFILE}
908
	fi
909

    
910
	#
911
	# Cleanup, aisle 7!
912
	#
913
	if [ -f $PFSENSEISODIR/tmp/remove_platform ]; then
914
		/bin/rm $PFSENSEISODIR/etc/platform
915
		/bin/rm $PFSENSEISODIR/tmp/remove_platform
916
	fi
917

    
918
	if [ -f $PFSENSEISODIR/tmp/remove_conf_symlink ]; then
919
		/bin/rm $PFSENSEISODIR/conf
920
		if [ -L $PFSENSEISODIR/cf ]; then
921
			/bin/rm $PFSENSEISODIR/cf
922
		fi
923
		/bin/rm $PFSENSEISODIR/tmp/remove_conf_symlink
924
	fi
925

    
926
	if [ -f $PFSENSEISODIR/tmp/restore_conf_dir ]; then
927
		/bin/mv $PFSENSEISODIR/conf.org $PFSENSEISODIR/conf
928
		/bin/rm $PFSENSEISODIR/tmp/restore_conf_dir
929
	fi
930

    
931
	if [ -f $PFSENSEISODIR/tmp/platform ]; then
932
		mv $PFSENSEISODIR/tmp/platform $PFSENSEISODIR/etc/platform
933
	fi
934

    
935
	if [ -f $PFSENSEISODIR/tmp/config.cache ]; then
936
		/bin/rm $PFSENSEISODIR/tmp/config.cache
937
	fi
938

    
939
	if [ -f $PFSENSEISODIR/tmp/php.ini ]; then
940
		cp /tmp/php.ini $PFSENSEISODIR/usr/local/lib/php.ini
941
		cp /tmp/php.ini $PFSENSEISODIR/usr/local/etc/php.ini
942
	fi
943
	
944
	rm $PFSENSEISODIR/test_php.php 2>/dev/null
945
	rm $PFSENSEISODIR/tmp/*.cache 2>/dev/null
946
	rm $PFSENSEISODIR/tmp/*.lock 2>/dev/null
947
}
948

    
949
# This routine creates a on disk summary of all file
950
# checksums which could be used to verify that a file
951
# is indeed how it was shipped.
952
create_md5_summary_file() {
953
	if [ "${TARGET}" != "${BUILDER_HOST_TARGET}" ]; then
954
		echo ">>> WARNING: cross compiling detected, skipping generation of md5 summaries!" | tee -a ${LOGFILE}
955
		return
956
	fi
957
	echo -n ">>> Creating md5 summary of files present..."  | tee -a ${LOGFILE}
958
	rm -f $PFSENSEISODIR/etc/pfSense_md5.txt
959
	echo "#!/bin/sh" > $PFSENSEISODIR/chroot.sh
960
	echo "find / -type f | /usr/bin/xargs /sbin/md5 >> /etc/pfSense_md5.txt" >> $PFSENSEISODIR/chroot.sh
961
	chmod a+rx $PFSENSEISODIR/chroot.sh
962
	(chroot $PFSENSEISODIR /chroot.sh) 2>&1 | egrep -wi '(^>>>|errors)'
963
	rm $PFSENSEISODIR/chroot.sh
964
	echo "Done."  | tee -a ${LOGFILE}
965
}
966

    
967
# This routine creates an mtree file that can be used to check
968
# and correct file permissions post-install, to correct for the
969
# fact that the ISO image doesn't support some permissions.
970
create_mtree_summary_file() {
971
	if [ "${TARGET}" != "${BUILDER_HOST_TARGET}" ]; then
972
		echo ">>> WARNING: cross compiling detected, skipping generation of md5 summaries!" | tee -a ${LOGFILE}
973
		return
974
	fi
975
	echo -n ">>> Creating mtree summary of files present..."  | tee -a ${LOGFILE}
976
	rm -f $PFSENSEISODIR/etc/installed_filesystem.mtree
977
	echo "#!/bin/sh" > $PFSENSEISODIR/chroot.sh
978
	echo "cd /" >> $PFSENSEISODIR/chroot.sh
979
	echo "/tmp" >> $PFSENSEISODIR/tmp/installed_filesystem.mtree.exclude
980
	echo "/dev" >> $PFSENSEISODIR/tmp/installed_filesystem.mtree.exclude
981
	echo "/usr/sbin/mtree -c -k uid,gid,mode,size,sha256digest -p / -X /tmp/installed_filesystem.mtree.exclude > /tmp/installed_filesystem.mtree" >> $PFSENSEISODIR/chroot.sh
982
	echo "/bin/chmod 600 /tmp/installed_filesystem.mtree" >> $PFSENSEISODIR/chroot.sh
983
	echo "/bin/mv /tmp/installed_filesystem.mtree /etc/" >> $PFSENSEISODIR/chroot.sh
984

    
985
	chmod a+rx $PFSENSEISODIR/chroot.sh
986
	(chroot $PFSENSEISODIR /chroot.sh) 2>&1 | egrep -wi '(^>>>|errors)'
987
	rm $PFSENSEISODIR/chroot.sh
988
	echo "Done."  | tee -a ${LOGFILE}
989
}
990

    
991
# Creates a full update file
992
create_pfSense_Full_update_tarball() {
993
	mkdir -p $UPDATESDIR
994

    
995
	OLDPWD=`pwd`
996

    
997
	customize_stagearea_for_image "fullupdate"
998
	install_default_kernel ${DEFAULT_KERNEL}
999

    
1000
	rm -rf ${PFSENSEISODIR}/cf
1001
	rm -rf ${PFSENSEISODIR}/conf
1002
	rm -f ${PFSENSEISODIR}/etc/rc.conf
1003
	rm -f ${PFSENSEISODIR}/etc/motd
1004
	rm -f ${PFSENSEISODIR}/etc/pwd.db 2>/dev/null
1005
	rm -f ${PFSENSEISODIR}/etc/group 2>/dev/null
1006
	rm -f ${PFSENSEISODIR}/etc/spwd.db 2>/dev/null
1007
	rm -f ${PFSENSEISODIR}/etc/passwd 2>/dev/null
1008
	rm -f ${PFSENSEISODIR}/etc/master.passwd 2>/dev/null
1009
	rm -f ${PFSENSEISODIR}/etc/fstab 2>/dev/null
1010
	rm -f ${PFSENSEISODIR}/etc/ttys 2>/dev/null
1011
	rm -f ${PFSENSEISODIR}/etc/bogons 2>/dev/null
1012
	# Remove loader.conf and friends.  Ticket #560
1013
	rm ${PFSENSEISODIR}/boot/loader.conf 2>/dev/null
1014
	rm ${PFSENSEISODIR}/boot/loader.conf.local 2>/dev/null
1015

    
1016

    
1017
	mkdir -p ${PFSENSEISODIR}/usr/local/livefs/lib/
1018

    
1019
	echo ">>> Creating ${UPDATES_TARBALL_FILENAME} ..." | tee -a ${LOGFILE}
1020
	cd ${PFSENSEISODIR} && tar czPf ${UPDATES_TARBALL_FILENAME} .
1021

    
1022
	cd $OLDPWD
1023
	unset OLDPWD
1024
}
1025

    
1026
# Does the work of checking out the specific branch of pfSense
1027
checkout_pfSense_git() {
1028

    
1029
	mkdir -p ${GIT_REPO_DIR}/pfSenseGITREPO
1030

    
1031
	branch_exists=`(cd ${GIT_REPO_DIR}/pfSenseGITREPO \
1032
		&& git branch -a | grep "${PFSENSETAG}\$")`
1033
	tag_exists=`(cd ${GIT_REPO_DIR}/pfSenseGITREPO \
1034
		&& git tag -l | grep "^${PFSENSETAG}\$")`
1035

    
1036
	if [ -z "${branch_exists}" -a -z "${tag_exists}" ]; then
1037
		BRANCH=master
1038
	else
1039
		BRANCH="${PFSENSETAG}"
1040
	fi
1041

    
1042
	# If we are using a git tag, don't specify origin/ in the remote.
1043
	if [ -z "${tag_exists}" ]; then
1044
		ORIGIN=origin/
1045
	fi
1046

    
1047
	echo -n ">>> Checking out tag ${BRANCH} ..."
1048
	if [ "${BRANCH}" = "master" ]; then
1049
        	(cd ${GIT_REPO_DIR}/pfSenseGITREPO && git checkout master) \
1050
			2>&1 | egrep -wi '(^>>>|error)'
1051
	elif [ -z "${branch_exists}" ]; then
1052
		(cd ${GIT_REPO_DIR}/pfSenseGITREPO \
1053
			&& git checkout -b "${PFSENSETAG}" "${ORIGIN}${PFSENSETAG}") \
1054
			2>&1 | egrep -wi '(^>>>|error)'
1055
	else
1056
		(cd ${GIT_REPO_DIR}/pfSenseGITREPO \
1057
			&& git checkout "${PFSENSETAG}") 2>&1 \
1058
			| egrep -wi '(^>>>|error)'
1059
	fi
1060
	echo 'Done!'
1061

    
1062
	echo -n '>>> Making sure we are in the right branch...'
1063
	selected_branch=`cd ${GIT_REPO_DIR}/pfSenseGITREPO && \
1064
		git branch | grep '^\*' | cut -d' ' -f2`
1065
	if [ "${selected_branch}" = "${BRANCH}" ]; then
1066
		echo " [OK] (${BRANCH})"
1067
	else
1068
		tag_exists=`(cd ${GIT_REPO_DIR}/pfSenseGITREPO \
1069
			&& git tag -l | grep "^${PFSENSETAG}\$")`
1070

    
1071
		if [ -z "${tag_exists}" ] || [ "${selected_branch}" != "(no" ]; then
1072
			echo " [FAILED!] (${BRANCH})"
1073
			print_error_pfS 'Checked out branch/tag differs from configured BRANCH, something is wrong with the build system!'
1074
			kill $$
1075
		fi
1076
	fi
1077
}
1078

    
1079
# Outputs various set variables aka env
1080
print_flags() {
1081

    
1082
	echo
1083
	printf "            MAKEOBJDIRPREFIX: %s\n" $MAKEOBJDIRPREFIX
1084
	printf "             pfSense version: %s\n" $PFSENSE_VERSION
1085
	printf "                    BASE_DIR: %s\n" $BASE_DIR
1086
	printf "                   Stage DIR: %s\n" $PFSENSESTAGEDIR	
1087
	printf "                 Updates dir: %s\n" $UPDATESDIR
1088
	printf " Image Preparation Stage DIR: %s\n" $PFSENSEISODIR
1089
	printf "              Custom overlay: %s\n" $custom_overlay
1090
	printf "                  Source DIR: %s\n" $SRCDIR
1091
	printf "          FreeBSD repository: %s\n" $FREEBSD_REPO_BASE
1092
	printf "             FreeBSD version: %s\n" $FREEBSD_VERSION
1093
	printf "              FreeBSD branch: %s\n" $FREEBSD_BRANCH
1094
	printf "               BUILD_KERNELS: %s\n" $BUILD_KERNELS
1095
	printf "              Git Repository: %s\n" $GIT_REPO_PFSENSE
1096
	printf "                 pfSense Tag: %s\n" $PFSENSETAG
1097
	printf "            MODULES_OVERRIDE: %s\n" $MODULES_OVERRIDE
1098
	printf "               Custom Config: %s\n" $USE_CONFIG_XML
1099
	printf "        BUILD_COMPLETED_MAIL: %s\n" $BUILD_COMPLETED_MAIL
1100
	printf "            BUILD_ERROR_MAIL: %s\n" $BUILD_ERROR_MAIL
1101
	printf "                 OVADISKSIZE: %s\n" $OVADISKSIZE
1102
	printf "                OVABLOCKSIZE: %s\n" $OVABLOCKSIZE
1103
	printf "         OVA_FIRST_PART_SIZE: %s\n" $OVA_FIRST_PART_SIZE
1104
	printf "          OVA_SWAP_PART_SIZE: %s\n" $OVA_SWAP_PART_SIZE
1105
	printf "                     OVFFILE: %s\n" $OVFFILE
1106
	printf "                     OVAFILE: %s\n" $OVAFILE
1107
	printf "                     OVFVMDK: %s\n" $OVFVMDK
1108
	printf "                  OVFSTRINGS: %s\n" $OVFSTRINGS
1109
	printf "                       OVFMF: %s\n" $OVFMF
1110
	printf "                     OVFCERT: %s\n" $OVFCERT 
1111
	printf "                    SRC_CONF: %s\n" $SRC_CONF
1112
	printf "                 Remove list: %s\n" $CUSTOM_REMOVE_LIST
1113
	printf "                   Copy list: %s\n" $CUSTOM_COPY_LIST
1114
	printf "                     ISOPATH: %s\n" $ISOPATH
1115
	printf "                MEMSTICKPATH: %s\n" $MEMSTICKPATH
1116
	printf "    UPDATES_TARBALL_FILENAME: %s\n" $UPDATES_TARBALL_FILENAME
1117
	printf "        PKG_INSTALL_PORTSPFS: %s\n" $PKG_INSTALL_PORTSPFS
1118
	printf "  CUSTOM_CALL_SHELL_FUNCTION: %s\n" $CUSTOM_CALL_SHELL_FUNCTION
1119
if [ -n "$SHOW_ENV" ]; then
1120
	for LINE in `env | grep -v "terminal" | grep -v "PASS" | grep -v "NAME" | grep -v "USER" | grep -v "SSH" | grep -v "GROUP" | grep -v "HOST"`; do
1121
		echo "SHOW_ENV: $LINE"
1122
	done
1123
fi
1124
	echo
1125
	
1126
}
1127

    
1128
# This updates the pfSense sources
1129
update_pfSense_repository() {
1130
	if [ ! -d "${GIT_REPO_DIR}" ]; then
1131
		echo ">>> Creating ${GIT_REPO_DIR}"
1132
		mkdir -p ${GIT_REPO_DIR}
1133
	fi
1134

    
1135
	OLDPWD=`pwd`
1136

    
1137
	echo ">>> Using GIT to checkout ${PFSENSETAG}"
1138
	echo -n ">>> "
1139

    
1140
	if [ ! -d "${GIT_REPO_DIR}/pfSenseGITREPO/.git" ]; then
1141
		echo -n ">>> Cloning ${GIT_REPO_PFSENSE} ..."
1142
		(cd ${GIT_REPO_DIR} && /usr/local/bin/git clone ${GIT_REPO_PFSENSE} pfSenseGITREPO) 2>&1 | egrep -B3 -A3 -wi '(error)'
1143
		if [ -d "${GIT_REPO_DIR}/pfSenseGITREPO" ]; then
1144
			if [ ! -d "${GIT_REPO_DIR}/pfSenseGITREPO/conf.default" ]; then
1145
				echo
1146
				echo "!!!! An error occured while checking out pfSense"
1147
				echo "     Could not locate ${GIT_REPO_DIR}/pfSenseGITREPO/conf.default"
1148
				echo
1149
				print_error_pfS
1150
				kill $$
1151
			fi
1152
		else
1153
			echo
1154
			echo "!!!! An error occured while checking out pfSense"
1155
			echo "     Could not locate ${GIT_REPO_DIR}/pfSenseGITREPO"
1156
			echo
1157
			print_error_pfS
1158
			kill $$
1159
		fi
1160
		echo "Done!"
1161
	else
1162
		# Fetch an update of the repository
1163
		# Proper branch checkout will be done from checkout_pfSense_git
1164
		( cd ${GIT_REPO_DIR}/pfSenseGITREPO && git checkout master; git fetch origin; git reset --hard; git clean -fxd; git rebase origin ) 2>&1 | grep -C3 -i 'error'
1165
	fi
1166
	checkout_pfSense_git
1167
	if [ $? != 0 ]; then
1168
		echo ">>> ERROR: Something went wrong while checking out GIT."
1169
		print_error_pfS
1170
	fi
1171

    
1172
	cd $OLDPWD
1173
	unset OLDPWD
1174
}
1175

    
1176
# This builds FreeBSD (make buildworld)
1177
# Imported from FreeSBIE
1178
make_world() {
1179

    
1180
	LOGFILE=${BUILDER_LOGS}/buildworld.${TARGET}
1181
	if [ -n "${NO_BUILDWORLD:-}" ]; then
1182
	    echo ">>> NO_BUILDWORLD set, skipping build" | tee -a ${LOGFILE}
1183
	    return
1184
	fi
1185

    
1186
	export MAKE_CONF="__MAKE_CONF=$MAKE_CONF"
1187

    
1188
	if [ ! -z ${MAKEOBJDIRPREFIX:-} ]; then
1189
		# FreeBSD 8 has issues with putting this in MAKE opt rather than environment
1190
		#export MAKE_CONF="${MAKE_CONF} MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX}"
1191
		mkdir -p $MAKEOBJDIRPREFIX
1192
	fi
1193

    
1194
	# Set default serial speed
1195
	if [ ${FREEBSD_VERSION} -ge 10 ]; then
1196
		export MAKE_CONF="${MAKE_CONF} BOOT_COMCONSOLE_SPEED=115200"
1197
	fi
1198

    
1199
	# Check if the world and kernel are already built and set
1200
	# the NO variables accordingly
1201
	if [ -d "${MAKEOBJDIRPREFIX}" ]; then
1202
		ISINSTALLED=`find ${MAKEOBJDIRPREFIX}/ -name init | wc -l`
1203
		if [ "$ISINSTALLED" -gt 0 ]; then
1204
			export MAKE_CONF="${MAKE_CONF} NO_CLEAN=yes"
1205
		fi
1206
	fi
1207

    
1208
	if [ -z "${TARGET}" -o "${BUILDER_HOST_TARGET}" = "${TARGET}" ]; then
1209
		export MAKE_CONF="${MAKE_CONF} WITHOUT_CROSS_COMPILER=yes"
1210
	else
1211
		if [ -f ${MAKEOBJDIRPREFIX}/${TARGET}.${TARGET_ARCH}/${SRCDIR}/tmp/usr/bin/cc ]; then
1212
			export MAKE_CONF="${MAKE_CONF} NO_CLEAN=yes "
1213
		fi
1214
		if [ "${TARGET}" = "mips" ]; then
1215
                        MAKEJ_WORLD=""
1216
                fi
1217
		echo "** --------------------------------------------- ***"
1218
		echo ">>> Cross compiling settings defined building environment." | tee -a ${LOGFILE}
1219
		echo ">>> Building toolchain for ${TARGET} architecture... (Starting - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1220
		echo ">>> Builder is running the command: env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${MAKEOPT} ${MAKE_CONF} SRCCONF=${SRC_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} toolchain" | tee -a ${LOGFILE}
1221
		if [ -z "${NO_BUILDTOOLCHAIN}" ]; then
1222
			(cd $SRCDIR; env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${MAKEOPT} ${MAKE_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} toolchain || print_error_pfS;) | egrep '^>>>' | tee -a ${LOGFILE}
1223
			cd $BUILDER_SCRIPTS
1224
			echo ">>> Building toolchain for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1225
		else
1226
			echo ">>> NO_BUILDTOOLCHAIN set SKIPPING - Building toolchain for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1227
		fi
1228

    
1229
		echo ">>> Building kernel-toolchain for ${TARGET} architecture... (Starting - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1230
		echo ">>> Builder is running the command: env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${MAKEOPT} ${MAKE_CONF} SRCCONF=${SRC_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} kernel-toolchain" | tee -a ${LOGFILE}
1231
		if [ -z "${NO_BUILDTOOLCHAIN}" ]; then
1232
			(cd $SRCDIR; env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${MAKEOPT} ${MAKE_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} kernel-toolchain || print_error_pfS;) | egrep '^>>>' | tee -a ${LOGFILE}
1233
		cd $BUILDER_SCRIPTS
1234
			echo ">>> Building kernel-toolchain for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1235
		else
1236
			echo ">>> NO_BUILDTOOLCHAIN set SKIPPING - Building kernel-toolchain for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1237
		fi
1238
		echo "** --------------------------------------------- ***"
1239
	fi
1240

    
1241
	# Set SRC_CONF variable if it's not already set.
1242
	if [ -z "${SRC_CONF:-}" ]; then
1243
		echo ">>> SRC_CONF is unset make sure this is what you want!" | tee -a ${LOGFILE}
1244
	else
1245
		echo ">>> Setting SRC_CONF to $SRC_CONF" | tee -a ${LOGFILE}
1246
	fi
1247

    
1248
	echo ">>> LOGFILE set to $LOGFILE." | tee -a ${LOGFILE}
1249
	makeargs="${MAKEOPT:-} ${MAKEJ_WORLD:-} ${MAKE_CONF} SRCCONF=${SRC_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH}"
1250
	echo ">>> Building world for ${TARGET} architecture... (Starting - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1251
	echo ">>> Builder is running the command: env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} buildworld" | tee -a ${LOGFILE}
1252
	cd $SRCDIR
1253
	(env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} buildworld || print_error_pfS;) | egrep '^>>>' | tee -a ${LOGFILE}
1254
	cd $BUILDER_SCRIPTS
1255
	echo ">>> Building world for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1256

    
1257
	OSRC_CONF=${SRC_CONF}
1258
	if [ -n "${SRC_CONF_INSTALL:-}" ]; then
1259
		export SRC_CONF=$SRC_CONF_INSTALL
1260
	fi
1261

    
1262
	LOGFILE=${BUILDER_LOGS}/installworld.${TARGET}
1263
	echo ">>> LOGFILE set to $LOGFILE." | tee -a ${LOGFILE}
1264
	# Create if cleaned up
1265
	mkdir -p ${PFSENSESTAGEDIR}
1266
	makeargs="${MAKEOPT:-} ${MAKEJ_WORLD:-} ${MAKE_CONF} SRCCONF=${SRC_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} DESTDIR=${PFSENSESTAGEDIR}"
1267
	echo ">>> Installing world for ${TARGET} architecture... (Starting - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1268
	echo ">>> Builder is running the command: env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} installworld" | tee -a ${LOGFILE}
1269
	cd $SRCDIR
1270
	(env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} installworld || print_error_pfS;) | egrep '^>>>' | tee -a ${LOGFILE}
1271
	cd $BUILDER_SCRIPTS
1272
	echo ">>> Installing world for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1273

    
1274
	makeargs="${MAKEOPT:-} ${MAKEJ_WORLD:-} ${MAKE_CONF} SRCCONF=${SRC_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} DESTDIR=${PFSENSESTAGEDIR}"
1275
	echo ">>> Distribution world for ${TARGET} architecture... (Starting - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1276
	echo ">>> Builder is running the command: env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} distribution " | tee -a ${LOGFILE}
1277
	cd $SRCDIR
1278
	(env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} distribution  || print_error_pfS;) | egrep '^>>>' | tee -a ${LOGFILE}
1279
	cd $BUILDER_SCRIPTS
1280
	echo ">>> Distribution world for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1281

    
1282
	unset MAKE_CONF
1283
	unset makeargs
1284

    
1285
	SRC_CONF=${OSRC_CONF}
1286
}
1287

    
1288
# This routine originated in nanobsd.sh
1289
FlashDevice () {
1290
	a1=`echo $1 | tr '[:upper:]' '[:lower:]'`
1291
	a2=`echo $2 | tr '[:upper:]' '[:lower:]'`
1292
	case $a1 in
1293
	integral)
1294
		# Source: mich@FreeBSD.org
1295
		case $a2 in
1296
		256|256m|256mb)
1297
			NANO_MEDIASIZE=`expr 259596288 / 512`
1298
			NANO_HEADS=16
1299
			NANO_SECTS=63
1300
			;;
1301
		*)
1302
			echo "Unknown Integral i-Pro Flash capacity"
1303
			exit 2
1304
			;;
1305
		esac
1306
		;;
1307
	memorycorp)
1308
		# Source: simon@FreeBSD.org
1309
		case $a2 in
1310
		512|512m|512mb)
1311
			# MC512CFLS2
1312
			NANO_MEDIASIZE=`expr 519192576 / 512`
1313
			NANO_HEADS=16
1314
			NANO_SECTS=63
1315
			;;
1316
		*)
1317
			echo "Unknown Memory Corp Flash capacity"
1318
			exit 2
1319
			;;
1320
		esac
1321
		;;
1322
	sandisk)
1323
		# Source:
1324
		#	SanDisk CompactFlash Memory Card
1325
		#	Product Manual
1326
		#	Version 10.9
1327
		#	Document No. 20-10-00038
1328
		#	April 2005
1329
		# Table 2-7
1330
		# NB: notice math error in SDCFJ-4096-388 line.
1331
		#
1332
		case $a2 in
1333
		32|32m|32mb)
1334
			NANO_MEDIASIZE=`expr 32112640 / 512`
1335
			NANO_HEADS=4
1336
			NANO_SECTS=32
1337
			;;
1338
		64|64m|64mb)
1339
			NANO_MEDIASIZE=`expr 64225280 / 512`
1340
			NANO_HEADS=8
1341
			NANO_SECTS=32
1342
			;;
1343
		128|128m|128mb)
1344
			NANO_MEDIASIZE=`expr 128450560 / 512`
1345
			NANO_HEADS=8
1346
			NANO_SECTS=32
1347
			;;
1348
		256|256m|256mb)
1349
			NANO_MEDIASIZE=`expr 256901120 / 512`
1350
			NANO_HEADS=16
1351
			NANO_SECTS=32
1352
			;;
1353
		512|512m|512mb)
1354
			NANO_MEDIASIZE=`expr 512483328 / 512`
1355
			NANO_HEADS=16
1356
			NANO_SECTS=63
1357
			;;
1358
		1024|1024m|1024mb|1g)
1359
			NANO_MEDIASIZE=`expr 997129216 / 512`
1360
			NANO_HEADS=16
1361
			NANO_SECTS=63
1362
			;;
1363
		2048|2048m|2048mb|2g)
1364
			NANO_MEDIASIZE=`expr 1989999616 / 512`
1365
			NANO_HEADS=16
1366
			NANO_SECTS=63
1367
			;;
1368
		3670|3670m|3670mb|3.5g)
1369
			NANO_MEDIASIZE=`expr -e 3758096384 / 512`
1370
			NANO_HEADS=16
1371
			NANO_SECTS=63
1372
			;;
1373
		4096|4096m|4096mb|4g)
1374
			NANO_MEDIASIZE=`expr -e 3989999616 / 512`
1375
			NANO_HEADS=16
1376
			NANO_SECTS=63
1377
			;;
1378
		8192|8192m|8192mb|8g)
1379
			NANO_MEDIASIZE=`expr -e 7989999616 / 512`
1380
			NANO_HEADS=16
1381
			NANO_SECTS=63
1382
			;;
1383
		16384|16384m|16384mb|16g)
1384
			NANO_MEDIASIZE=`expr -e 15989999616 / 512`
1385
			NANO_HEADS=16
1386
			NANO_SECTS=63
1387
			;;
1388
		*)
1389
			echo "Unknown Sandisk Flash capacity"
1390
			exit 2
1391
			;;
1392
		esac
1393
		;;
1394
	siliconsystems)
1395
		case $a2 in
1396
		4096|4g)
1397
			NANO_MEDIASIZE=`expr -e 4224761856 / 512`
1398
			NANO_HEADS=16
1399
			NANO_SECTS=63
1400
			;;
1401
		*)
1402
			echo "Unknown SiliconSystems Flash capacity"
1403
			exit 2
1404
			;;
1405
		esac
1406
		;;
1407
	soekris)
1408
		case $a2 in
1409
		net4526 | 4526 | net4826 | 4826 | 64 | 64mb)
1410
			NANO_MEDIASIZE=125056
1411
			NANO_HEADS=4
1412
			NANO_SECTS=32
1413
			;;
1414
		*)
1415
			echo "Unknown Soekris Flash capacity"
1416
			exit 2
1417
			;;
1418
		esac
1419
		;;
1420
	generic-hdd)
1421
		case $a2 in
1422
		4096|4g)
1423
        	NANO_HEADS=64
1424
        	NANO_SECTS=32
1425
        	NANO_MEDIASIZE="7812500"
1426
			;;
1427
		*)
1428
			echo "Unknwon generic-hdd capacity"
1429
			exit 2
1430
			;;
1431
		esac
1432
		;;
1433
	transcend)
1434
		case $a2 in
1435
		dom064m)
1436
			NANO_MEDIASIZE=125184
1437
			NANO_HEADS=4
1438
			NANO_SECTS=32
1439
			;;
1440
		2048|2g)
1441
			NANO_MEDIASIZE=3980592
1442
			NANO_HEADS=16
1443
			NANO_SECTS=63
1444
			;;
1445
		*)
1446
			echo "Unknown Transcend Flash capacity"
1447
			exit 2
1448
			;;
1449
		esac
1450
		;;
1451
	*)
1452
		echo "Unknown Flash manufacturer"
1453
		exit 2
1454
		;;
1455
	esac
1456
	echo ">>> [nanoo] $1 $2"
1457
	echo ">>> [nanoo] NANO_MEDIASIZE: $NANO_MEDIASIZE"
1458
	echo ">>> [nanoo] NANO_HEADS: $NANO_HEADS"
1459
	echo ">>> [nanoo] NANO_SECTS: $NANO_SECTS"
1460
	echo ">>> [nanoo] NANO_BOOT0CFG: $NANO_BOOT0CFG"
1461
}
1462

    
1463
pprint() {
1464
	echo $2 >> $BUILDER_LOGS/nanobsd_cmds.sh
1465
}
1466

    
1467
create_mips_diskimage()
1468
{
1469
	echo ">>> building NanoBSD disk image (mips)..."
1470
	echo ">>> Log file can be found in $BUILDER_LOGS/nanobsd_cmds.sh"
1471
	echo "`date`" > $BUILDER_LOGS/nanobsd_cmds.sh
1472

    
1473
	NANO_MAKEFS="makefs -B big -o bsize=4096,fsize=512,density=8192,optimization=space"
1474
	NANO_MD_BACKING="file"
1475
	NANO_BOOTLOADER="boot/boot0sio"
1476
	NANO_WORLDDIR=${PFSENSEISODIR}/
1477
	NANO_CFGDIR=${PFSENSEISODIR}/cf
1478

    
1479
	pprint 2 "build diskimage"
1480
	pprint 3 "log: ${MAKEOBJDIRPREFIXFINAL}/_.di"
1481
	pprint 2 "NANO_MEDIASIZE:	$NANO_MEDIASIZE"
1482
	pprint 2 "NANO_IMAGES:		$NANO_IMAGES"
1483
	pprint 2 "NANO_SECTS:		$NANO_SECTS"
1484
	pprint 2 "NANO_HEADS:		$NANO_HEADS"
1485
	pprint 2 "NANO_CODESIZE:	$NANO_CODESIZE"
1486
	pprint 2 "NANO_CONFSIZE:	$NANO_CONFSIZE"
1487
	pprint 2 "NANO_DATASIZE:	$NANO_DATASIZE"
1488

    
1489
	echo $NANO_MEDIASIZE \
1490
		$NANO_IMAGES \
1491
		$NANO_SECTS \
1492
		$NANO_HEADS \
1493
		$NANO_CODESIZE \
1494
		$NANO_CONFSIZE \
1495
		$NANO_DATASIZE |
1496
awk '
1497
{
1498
	printf "# %s\n", $0
1499

    
1500
	# size of cylinder in sectors
1501
	cs = $3 * $4
1502

    
1503
	# number of full cylinders on media
1504
	cyl = int ($1 / cs)
1505

    
1506
	# output fdisk geometry spec, truncate cyls to 1023
1507
	if (cyl <= 1023)
1508
		print "g c" cyl " h" $4 " s" $3
1509
	else
1510
		print "g c" 1023 " h" $4 " s" $3
1511

    
1512
	if ($7 > 0) {
1513
		# size of data partition in full cylinders
1514
		dsl = int (($7 + cs - 1) / cs)
1515
	} else {
1516
		dsl = 0;
1517
	}
1518

    
1519
	# size of config partition in full cylinders
1520
	csl = int (($6 + cs - 1) / cs)
1521

    
1522
	if ($5 == 0) {
1523
		# size of image partition(s) in full cylinders
1524
		isl = int ((cyl - dsl - csl) / $2)
1525
	} else {
1526
		isl = int (($5 + cs - 1) / cs)
1527
	}
1528

    
1529
	# First image partition start at second track
1530
	print "p 1 165 " $3, isl * cs - $3
1531
	c = isl * cs;
1532

    
1533
	# Second image partition (if any) also starts offset one
1534
	# track to keep them identical.
1535
	if ($2 > 1) {
1536
		print "p 2 165 " $3 + c, isl * cs - $3
1537
		c += isl * cs;
1538
	}
1539

    
1540
	# Config partition starts at cylinder boundary.
1541
	print "p 3 165 " c, csl * cs
1542
	c += csl * cs
1543

    
1544
	# Data partition (if any) starts at cylinder boundary.
1545
	if ($7 > 0) {
1546
		print "p 4 165 " c, dsl * cs
1547
	} else if ($7 < 0 && $1 > c) {
1548
		print "p 4 165 " c, $1 - c
1549
	} else if ($1 < c) {
1550
		print "Disk space overcommitted by", \
1551
		    c - $1, "sectors" > "/dev/stderr"
1552
		exit 2
1553
	}
1554

    
1555
	# Force slice 1 to be marked active. This is necessary
1556
	# for booting the image from a USB device to work.
1557
	print "a 1"
1558
}
1559
	' > ${MAKEOBJDIRPREFIXFINAL}/_.fdisk
1560

    
1561
	pprint 2 "${MAKEOBJDIRPREFIXFINAL}/_.fdisk"
1562
	pprint 2 "`cat ${MAKEOBJDIRPREFIXFINAL}/_.fdisk`"
1563

    
1564
	IMG=${MAKEOBJDIRPREFIXFINAL}/nanobsd.full.img
1565
	BS=${NANO_SECTS}b
1566

    
1567
	if [ "${NANO_MD_BACKING}" = "swap" ] ; then
1568
		pprint 2 "Creating swap backing file ..."
1569
		MD=`mdconfig -a -t swap -s ${NANO_MEDIASIZE} -x ${NANO_SECTS} -y ${NANO_HEADS}`
1570
		pprint 2 "mdconfig -a -t swap -s ${NANO_MEDIASIZE} -x ${NANO_SECTS} -y ${NANO_HEADS}"
1571
	else
1572
		pprint 2 "Creating md backing file ${IMG} ..."
1573
		_c=`expr ${NANO_MEDIASIZE} / ${NANO_SECTS}`
1574
		pprint 2 "dd if=/dev/zero of=${IMG} bs=${BS} count=0 seek=${_c}"
1575
		dd if=/dev/zero of=${IMG} bs=${BS} count=0 seek=${_c}
1576
		pprint 2 "mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} -y ${NANO_HEADS}"
1577
		MD=`mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} -y ${NANO_HEADS}`
1578
	fi
1579

    
1580
	trap "mdconfig -d -u $MD" 1 2 15 EXIT
1581

    
1582
	pprint 2 "Write partition table ${MAKEOBJDIRPREFIXFINAL}/_.fdisk ..."
1583
	FDISK=${MAKEOBJDIRPREFIXFINAL}/_.fdisk
1584
	pprint 2 "fdisk -i -f ${FDISK} ${MD}"
1585
	fdisk -i -f ${FDISK} ${MD}
1586
	pprint 2 "fdisk ${MD}"
1587
	fdisk ${MD}
1588

    
1589
	# Create first image
1590
	IMG1=${MAKEOBJDIRPREFIXFINAL}/_.disk.image1
1591
	pprint 2 "Create first image ${IMG1} ..."
1592
	SIZE=`awk '/^p 1/ { print $5 "b" }' ${FDISK}`
1593
	pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${IMG1} ${NANO_WORLDDIR}"
1594
	${NANO_MAKEFS} -s ${SIZE} ${IMG1} ${NANO_WORLDDIR}
1595
	pprint 2 "dd if=${IMG1} of=/dev/${MD}s1 bs=${BS}"
1596
	dd if=${IMG1} of=/dev/${MD}s1 bs=${BS}
1597
	pprint 2 "tunefs -L pfsense0 /dev/${MD}s1"
1598
	tunefs -L pfsense0 /dev/${MD}s1
1599

    
1600
	if [ $NANO_IMAGES -gt 1 -a $NANO_INIT_IMG2 -gt 0 ] ; then
1601
		IMG2=${MAKEOBJDIRPREFIXFINAL}/_.disk.image2
1602
		pprint 2 "Create second image ${IMG2}..."
1603
		for f in ${NANO_WORLDDIR}/etc/fstab
1604
		do
1605
			sed -i "" "s/${NANO_DRIVE}s1/${NANO_DRIVE}s2/g" $f
1606
		done
1607
		SIZE=`awk '/^p 2/ { print $5 "b" }' ${FDISK}`
1608
		pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${IMG2} ${NANO_WORLDDIR}"
1609
		${NANO_MAKEFS} -s ${SIZE} ${IMG2} ${NANO_WORLDDIR}
1610
		pprint 2 "dd if=${IMG2} of=/dev/${MD}s2 bs=${BS}"
1611
		dd if=${IMG1} of=/dev/${MD}s2 bs=${BS}
1612
	fi
1613

    
1614
	# Create Config slice
1615
	if [ $NANO_CONFSIZE -gt 0 ] ; then
1616
		CFG=${MAKEOBJDIRPREFIXFINAL}/_.disk.cfg
1617
		pprint 2 "Creating config partition ${CFG}..."
1618
		SIZE=`awk '/^p 3/ { print $5 "b" }' ${FDISK}`
1619
		pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${CFG} ${NANO_CFGDIR}"
1620
		${NANO_MAKEFS} -s ${SIZE} ${CFG} ${NANO_CFGDIR}
1621
		pprint 2 "dd if=${CFG} of=/dev/${MD}s3 bs=${BS}"
1622
		dd if=${CFG} of=/dev/${MD}s3 bs=${BS}
1623
		pprint 2 "tunefs -L cf /dev/${MD}s3"
1624
		tunefs -L cf /dev/${MD}s3
1625
		pprint 2 "rm ${CFG}"
1626
		rm ${CFG}; CFG=			# NB: disable printing below
1627
	else
1628
		pprint 2 ">>> [nanoo] NANO_CONFSIZE is not set. Not adding a /conf partition.. You sure about this??"
1629
	fi
1630

    
1631
	# Create Data slice, if any.
1632
	# Note the changing of the variable to NANO_CONFSIZE
1633
	# from NANO_DATASIZE.  We also added glabel support
1634
	# and populate the pfSense configuration from the /cf
1635
	# directory located in PFSENSEISODIR
1636
	#if [ $NANO_CONFSIZE -gt 0 ] ; then
1637
	#	DATA=${MAKEOBJDIRPREFIXFINAL}/_.disk.data
1638
	#	echo ""; echo "Creating data partition ${DATA}..."
1639
	#	SIZE=`awk '/^p 4/ { print $5 "b" }' ${FDISK}`
1640
	#	# XXX: fill from where ?
1641
	#	pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${DATA} /var/empty"
1642
	#	${NANO_MAKEFS} -s ${SIZE} ${DATA} /var/empty
1643
	#	pprint 2 "dd if=${DATA} of=/dev/${MD}s4 bs=${BS}"
1644
	#	dd if=${DATA} of=/dev/${MD}s4 bs=${BS}
1645
	#	pprint 2 "rm ${DATA}"
1646
	#	rm ${DATA}; DATA=	# NB: disable printing below
1647
	#else
1648
	#	">>> [nanoo] NANO_CONFSIZE is not set. Not adding a /conf partition.. You sure about this??"
1649
	#fi
1650

    
1651
	if [ "${NANO_MD_BACKING}" = "swap" ] ; then
1652
		pprint 2 "Writing out ${IMG}..."
1653
		dd if=/dev/${MD} of=${IMG} bs=${BS}
1654
	fi
1655

    
1656
	pprint 2 "IMG1:             $IMG1"
1657
	pprint 2 "IMG2:             $IMG2"
1658
	pprint 2 "`date`"
1659
	pprint 2 "Full disk:         ${IMG}"
1660
	pprint 2 "Primary partition: ${IMG1}"
1661
	test "${IMG2}" && pprint 2 "2ndary partition:  ${IMG2}"
1662
	test "${CFG}" &&  pprint 2 "/cfg partition:    ${CFG}"
1663
	test "${DATA}" && pprint 2 "/data partition:   ${DATA}"
1664

    
1665
	#) > ${MAKEOBJDIRPREFIXFINAL}/_.di 2>&1
1666

    
1667
}
1668

    
1669
# This routine originated in nanobsd.sh
1670
create_nanobsd_diskimage () {
1671
	if [ -z "${1}" ]; then
1672
		echo ">>> ERROR: Type of image has not been specified"
1673
		print_error_pfS
1674
	fi
1675
	if [ -z "${2}" ]; then
1676
		echo ">>> ERROR: Size of image has not been specified"
1677
		print_error_pfS
1678
	fi
1679

    
1680
	if [ "${1}" = "nanobsd" ]; then
1681
		# It's serial
1682
		export NANO_BOOTLOADER="boot/boot0sio"
1683
	elif [ "${1}" = "nanobsd-vga" ]; then
1684
		# It's vga
1685
		export NANO_BOOTLOADER="boot/boot0"
1686
	else
1687
		echo ">>> ERROR: Type of image to create unkown"
1688
		print_error_pfS
1689
	fi
1690

    
1691
	if [ -z "${2}" ]; then
1692
		echo ">>> ERROR: Media size(s) not specified."
1693
		print_error_pfS
1694
	fi
1695

    
1696
	if [ -z "${FLASH_MODEL}" -o -z "${2}" ]; then
1697
		echo ">>> ERROR: either FLASH_MODEL=${FLASH_MODEL} or FLASH_SIZE=${2} is not set."
1698
		print_error_pfS
1699
	fi
1700

    
1701
	LOGFILE=${BUILDER_LOGS}/${1}.${TARGET}
1702
	# Prepare folder to be put in image
1703
	customize_stagearea_for_image "${1}"
1704
	install_default_kernel ${DEFAULT_KERNEL} "no"
1705

    
1706
	# Must be run after customize_stagearea_for_image
1707
	cust_fixup_nanobsd ${1} $NANO_MEDIASIZE
1708

    
1709
	for _NANO_MEDIASIZE in ${2}; do
1710
		if [ -z "${_NANO_MEDIASIZE}" ]; then
1711
			continue;
1712
		fi
1713

    
1714
		echo ">>> building NanoBSD(${1}) disk image with size ${_NANO_MEDIASIZE} for platform (${TARGET})..." | tee -a ${LOGFILE}
1715
		echo "" > $BUILDER_LOGS/nanobsd_cmds.sh
1716

    
1717
		IMG="${MAKEOBJDIRPREFIXFINAL}/${PRODUCT_NAME}-${PFSENSE_VERSION}-${_NANO_MEDIASIZE}-${TARGET}-${1}-${DATESTRING}.img"
1718
		IMGUPDATE="${MAKEOBJDIRPREFIXFINAL}/${PRODUCT_NAME}-${PFSENSE_VERSION}-${_NANO_MEDIASIZE}-${TARGET}-${1}-upgrade-${DATESTRING}.img"
1719

    
1720
		FlashDevice ${FLASH_MODEL} ${_NANO_MEDIASIZE}
1721

    
1722
		# These are defined in FlashDevice and on builder_default.sh
1723
		echo $NANO_MEDIASIZE \
1724
			$NANO_IMAGES \
1725
			$NANO_SECTS \
1726
			$NANO_HEADS \
1727
			$NANO_CODESIZE \
1728
			$NANO_CONFSIZE \
1729
			$NANO_DATASIZE |
1730
awk '
1731
{
1732
	printf "# %s\n", $0
1733

    
1734
	# size of cylinder in sectors
1735
	cs = $3 * $4
1736

    
1737
	# number of full cylinders on media
1738
	cyl = int ($1 / cs)
1739

    
1740
	# output fdisk geometry spec, truncate cyls to 1023
1741
	if (cyl <= 1023)
1742
		print "g c" cyl " h" $4 " s" $3
1743
	else
1744
		print "g c" 1023 " h" $4 " s" $3
1745

    
1746
	if ($7 > 0) {
1747
		# size of data partition in full cylinders
1748
		dsl = int (($7 + cs - 1) / cs)
1749
	} else {
1750
		dsl = 0;
1751
	}
1752

    
1753
	# size of config partition in full cylinders
1754
	csl = int (($6 + cs - 1) / cs)
1755

    
1756
	if ($5 == 0) {
1757
		# size of image partition(s) in full cylinders
1758
		isl = int ((cyl - dsl - csl) / $2)
1759
	} else {
1760
		isl = int (($5 + cs - 1) / cs)
1761
	}
1762

    
1763
	# First image partition start at second track
1764
	print "p 1 165 " $3, isl * cs - $3
1765
	c = isl * cs;
1766

    
1767
	# Second image partition (if any) also starts offset one
1768
	# track to keep them identical.
1769
	if ($2 > 1) {
1770
		print "p 2 165 " $3 + c, isl * cs - $3
1771
		c += isl * cs;
1772
	}
1773

    
1774
	# Config partition starts at cylinder boundary.
1775
	print "p 3 165 " c, csl * cs
1776
	c += csl * cs
1777

    
1778
	# Data partition (if any) starts at cylinder boundary.
1779
	if ($7 > 0) {
1780
		print "p 4 165 " c, dsl * cs
1781
	} else if ($7 < 0 && $1 > c) {
1782
		print "p 4 165 " c, $1 - c
1783
	} else if ($1 < c) {
1784
		print "Disk space overcommitted by", \
1785
		    c - $1, "sectors" > "/dev/stderr"
1786
		exit 2
1787
	}
1788

    
1789
	# Force slice 1 to be marked active. This is necessary
1790
	# for booting the image from a USB device to work.
1791
	print "a 1"
1792
}
1793
	' > ${MAKEOBJDIRPREFIXFINAL}/_.fdisk
1794

    
1795
		MNT=${MAKEOBJDIRPREFIXFINAL}/_.mnt
1796
		mkdir -p ${MNT}
1797

    
1798
		dd if=/dev/zero of=${IMG} bs=${NANO_SECTS}b \
1799
		    count=0 seek=`expr ${NANO_MEDIASIZE} / ${NANO_SECTS}` 2>&1 >> ${LOGFILE}
1800

    
1801
		MD=$(mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} -y ${NANO_HEADS})
1802
		trap "mdconfig -d -u ${MD}; return" 1 2 15 EXIT
1803

    
1804
		fdisk -i -f ${MAKEOBJDIRPREFIXFINAL}/_.fdisk ${MD} 2>&1 >> ${LOGFILE}
1805
		fdisk ${MD} 2>&1 >> ${LOGFILE}
1806

    
1807
		boot0cfg -B -b ${PFSENSEISODIR}/${NANO_BOOTLOADER} ${NANO_BOOT0CFG} ${MD} 2>&1 >> ${LOGFILE}
1808

    
1809
		# Create first image
1810
		bsdlabel -m i386 -w -B -b ${PFSENSEISODIR}/boot/boot ${MD}s1 2>&1 >> ${LOGFILE}
1811
		bsdlabel -m i386 ${MD}s1 2>&1 >> ${LOGFILE}
1812
		newfs -L pfsense0 ${NANO_NEWFS} /dev/${MD}s1a 2>&1 >> ${LOGFILE}
1813
		mount /dev/ufs/pfsense0 ${MNT}
1814
		if [ $? -ne 0 ]; then
1815
			echo ">>> ERROR: Something wrong happened during mount of first slice image creation. STOPPING!" | tee -a ${LOGFILE}
1816
			print_error_pfS
1817
			kill $$
1818
		fi
1819
		# Consider the unmounting as well
1820
		trap "umount /dev/ufs/pfsense0; mdconfig -d -u ${MD}; return" 1 2 15 EXIT
1821

    
1822
		clone_directory_contents ${PFSENSEISODIR} ${MNT}
1823

    
1824
		# Set NanoBSD image size
1825
		echo "${_NANO_MEDIASIZE}" > ${MNT}/etc/nanosize.txt
1826
		rm -f $MNT/cf/conf/* 2>/dev/null
1827

    
1828
		echo "/dev/ufs/pfsense0 / ufs ro,sync,noatime 1 1" > ${MNT}/etc/fstab
1829
		if [ $NANO_CONFSIZE -gt 0 ] ; then
1830
			echo "/dev/ufs/cf /cf ufs ro,sync,noatime 1 1" >> ${MNT}/etc/fstab
1831
		fi
1832

    
1833
		umount ${MNT}
1834
		sync
1835
		# Restore the original trap
1836
		trap "mdconfig -d -u ${MD}; return" 1 2 15 EXIT
1837

    
1838
		# Setting NANO_IMAGES to 1 and NANO_INIT_IMG2 will tell
1839
		# NanoBSD to only create one partition.  We default to 2
1840
		# partitions in case anything happens to the first the
1841
		# operator can boot from the 2nd and should be OK.
1842

    
1843
		# Before just going to use dd for duplicate think!
1844
		# The images are created as sparse so lets take advantage
1845
		# of that by just exec some commands.
1846
		if [ $NANO_IMAGES -gt 1 -a $NANO_INIT_IMG2 -gt 0 ] ; then
1847
			# Duplicate to second image (if present)
1848
			echo ">>> Creating NanoBSD second slice by duplicating first slice." | tee -a ${LOGFILE}
1849
			# Create second image
1850
			dd if=/dev/${MD}s1 of=/dev/${MD}s2 conv=sparse bs=64k 2>&1 >> ${LOGFILE}
1851
			tunefs -L pfsense1 /dev/${MD}s2a 2>&1 >> ${LOGFILE}
1852
			mount /dev/ufs/pfsense1 ${MNT}
1853
			if [ $? -ne 0 ]; then
1854
				echo ">>> ERROR: Something wrong happened during mount of second slice image creation. STOPPING!" | tee -a ${LOGFILE}
1855
				print_error_pfS
1856
				kill $$
1857
			fi
1858
			# Consider the unmounting as well
1859
			trap "umount /dev/ufs/pfsense1; mdconfig -d -u ${MD}; return" 1 2 15 EXIT
1860

    
1861
			# Set NanoBSD image size
1862
			echo "${_NANO_MEDIASIZE}" > ${MNT}/etc/nanosize.txt
1863

    
1864
			echo "/dev/ufs/pfsense1 / ufs ro,sync,noatime 1 1" > ${MNT}/etc/fstab
1865
			if [ $NANO_CONFSIZE -gt 0 ] ; then
1866
				echo "/dev/ufs/cf /cf ufs ro,sync,noatime 1 1" >> ${MNT}/etc/fstab
1867
			fi
1868

    
1869
			umount ${MNT}
1870
			# Restore the trap back
1871
			trap "mdconfig -d -u ${MD}; return" 1 2 15 EXIT
1872
		fi
1873

    
1874
		# Create Data slice, if any.
1875
		# Note the changing of the variable to NANO_CONFSIZE
1876
		# from NANO_DATASIZE.  We also added glabel support
1877
		# and populate the pfSense configuration from the /cf
1878
		# directory located in PFSENSEISODIR
1879
		if [ $NANO_CONFSIZE -gt 0 ] ; then
1880
			echo ">>> Creating /cf area to hold config.xml"
1881
			newfs -L cf ${NANO_NEWFS} /dev/${MD}s3 2>&1 >> ${LOGFILE}
1882
			# Mount data partition and copy contents of /cf
1883
			# Can be used later to create custom default config.xml while building
1884
			mount /dev/ufs/cf ${MNT}
1885
			if [ $? -ne 0 ]; then
1886
				echo ">>> ERROR: Something wrong happened during mount of cf slice image creation. STOPPING!" | tee -a ${LOGFILE}
1887
				print_error_pfS
1888
				kill $$
1889
			fi
1890
			# Consider the unmounting as well
1891
			trap "umount /dev/ufs/cf; mdconfig -d -u ${MD}; return" 1 2 15 EXIT
1892

    
1893
			clone_directory_contents ${PFSENSEISODIR}/cf ${MNT}
1894

    
1895
			umount ${MNT}
1896
			# Restore the trap back
1897
			trap "mdconfig -d -u ${MD}; return" 1 2 15 EXIT
1898
		else
1899
			">>> [nanoo] NANO_CONFSIZE is not set. Not adding a /conf partition.. You sure about this??" | tee -a ${LOGFILE}
1900
		fi
1901

    
1902
		echo ">>> [nanoo] Creating NanoBSD upgrade file from first slice..." | tee -a ${LOGFILE}
1903
		dd if=/dev/${MD}s1 of=$IMGUPDATE conv=sparse bs=64k 2>&1 >> ${LOGFILE}
1904

    
1905
		mdconfig -d -u $MD
1906
		# Restore default action
1907
		trap "-" 1 2 15 EXIT
1908

    
1909
		# Check each image and ensure that they are over
1910
		# 3 megabytes.  If either image is under 20 megabytes
1911
		# in size then error out.
1912
		IMGSIZE=`ls -la $IMG | awk '{ print $5 }'`
1913
		IMGUPDATESIZE=`ls -la $IMGUPDATE | awk '{ print $5 }'`
1914
		CHECKSIZE="20040710"
1915
		if [ "$IMGSIZE" -lt "$CHECKSIZE" ]; then
1916
			echo ">>> ERROR: Something went wrong when building NanoBSD.  The image size is under 20 megabytes!" | tee -a ${LOGFILE}
1917
			print_error_pfS
1918
			kill $$
1919
		fi
1920
		if [ "$IMGUPDATESIZE" -lt "$CHECKSIZE" ]; then
1921
			echo ">>> ERROR: Something went wrong when building NanoBSD upgrade image.  The image size is under 20 megabytes!" | tee -a ${LOGFILE}
1922
			print_error_pfS	
1923
			kill $$
1924
		fi
1925

    
1926
		# Wrap up the show, Johnny
1927
		echo ">>> NanoBSD Image completed for flash type: $FLASH_MODEL size: $_NANO_MEDIASIZE." | tee -a ${LOGFILE}
1928

    
1929
		gzip -f $IMG &
1930
		gzip -f $IMGUPDATE &
1931
	done
1932

    
1933
	unset IMG
1934
	unset IMGUPDATE
1935
	unset IMGUPDATESIZE
1936
	unset IMGSIZE
1937

    
1938
	ls -lah $MAKEOBJDIRPREFIXFINAL
1939
}
1940

    
1941
# This routine creates a ova image that contains
1942
# a ovf and vmdk file. These files can be imported 
1943
# right into vmware or virtual box.
1944
# (and many other emulation platforms)
1945
# http://www.vmware.com/pdf/ovf_whitepaper_specification.pdf
1946
create_ova_image() {
1947
	# XXX create a .ovf php creator that you can pass:
1948
	#     1. populatedSize
1949
	#     2. license 
1950
	#     3. product name
1951
	#     4. version
1952
	#     5. number of network interface cards
1953
	#     6. allocationUnits
1954
	#     7. capacity
1955
	#     8. capacityAllocationUnits
1956

    
1957
	LOGFILE=${BUILDER_LOGS}/ova.${TARGET}.log
1958

    
1959
	# Prepare folder to be put in image
1960
	export PKG_INSTALL_PORTSPFS="${PKG_INSTALL_PORTSPFS} /usr/ports/emulators/open-vm-tools-nox11"
1961
	customize_stagearea_for_image "ova"
1962
	install_default_kernel ${DEFAULT_KERNEL}
1963

    
1964
	ova_prereq_check
1965
	ova_remove_old_tmp_files
1966
	ova_setup_ovf_file
1967
	ova_create_raw_backed_file
1968
	/bin/echo -n ">>> Creating mdconfig image ${OVFPATH}/${OVFVMDK}.raw... " | tee -a ${LOGFILE}
1969
	MD=`mdconfig -a -t vnode -f ${OVFPATH}/${OVFVMDK}.raw`
1970
	# Just in case
1971
	trap "mdconfig -d -u ${MD}" 1 2 15 EXIT
1972

    
1973
	# comment out if using pc-sysinstall
1974
	ova_partition_gpart $MD
1975
	ova_set_default_network_interfaces
1976
	ova_mount_mnt $MD
1977
	ova_cpdup_files
1978
	ova_setup_platform_specific # after cpdup
1979
	ova_calculate_mnt_size
1980
	ova_umount_mnt $MD
1981
	# Restore default action
1982
	trap "-" 1 2 15 EXIT
1983
	ova_umount_mdconfig $MD
1984
	# We use vbox because it compresses the vmdk on export
1985
	ova_create_vbox_image
1986
	# We repack the file with a more universal xml file that
1987
	# works in both virtual box and esx server
1988
	ova_repack_vbox_image
1989
}
1990

    
1991
ova_repack_vbox_image() {
1992
	BUILDPLATFORM=`uname -p`
1993
	POPULATEDSIZE=`du -d0 -h $PFSENSEISODIR | awk '{ print \$1 }' | cut -dM -f1`
1994
	POPULATEDSIZEBYTES=`echo "${POPULATEDSIZE}*1024^2" | bc`
1995
	REFERENCESSIZE=`ls -la ${OVFPATH}/${OVFVMDK} | awk '{ print \$5 }'`
1996
	echo ">>> Setting REFERENCESSIZE to ${REFERENCESSIZE}..." | tee -a ${LOGFILE}
1997
	file_search_replace REFERENCESSIZE ${REFERENCESSIZE} ${OVFPATH}/${PRODUCT_NAME}.ovf
1998
	echo ">>> Setting POPULATEDSIZEBYTES to ${POPULATEDSIZEBYTES}..." | tee -a ${LOGFILE}
1999
	#  OperatingSystemSection (pfSense.ovf)
2000
	#  42   FreeBSD 32-Bit
2001
	#  78   FreeBSD 64-Bit 
2002
	if [ "$BUILDPLATFORM" = "i386" ]; then
2003
		file_search_replace '"101"' '"42"' ${OVFPATH}/${PRODUCT_NAME}.ovf
2004
		file_search_replace 'FreeBSD XX-Bit' 'FreeBSD' ${OVFPATH}/${PRODUCT_NAME}.ovf
2005
	fi
2006
	if [ "$BUILDPLATFORM" = "amd64" ]; then
2007
		file_search_replace '"101"' '"78"' ${OVFPATH}/${PRODUCT_NAME}.ovf
2008
		file_search_replace 'FreeBSD XX-Bit' 'FreeBSD 64-Bit' ${OVFPATH}/${PRODUCT_NAME}.ovf
2009
	fi
2010
	file_search_replace DISKSECTIONPOPULATEDSIZE $POPULATEDSIZEBYTES ${OVFPATH}/${PRODUCT_NAME}.ovf
2011
	# 10737254400 = 10240MB = virtual box vmdk file size XXX grab this value from vbox creation
2012
	# 10737418240 = 10GB
2013
	echo ">>> Setting DISKSECTIONALLOCATIONUNITS to 10737254400..." | tee -a ${LOGFILE}
2014
	file_search_replace DISKSECTIONALLOCATIONUNITS $OVA_DISKSECTIONALLOCATIONUNITS ${OVFPATH}/${PRODUCT_NAME}.ovf
2015
	echo ">>> Setting DISKSECTIONCAPACITY to 10737418240..." | tee -a ${LOGFILE}
2016
	file_search_replace DISKSECTIONCAPACITY $OVADISKSIZE ${OVFPATH}/${PRODUCT_NAME}.ovf
2017
	echo ">>> Repacking OVA with universal OVF file..." | tee -a ${LOGFILE}
2018
	mv ${OVFPATH}/${OVFVMDK} ${OVFPATH}/${PRODUCT_NAME}-disk1.vmdk
2019
	OWD=`pwd`
2020
	cd ${OVFPATH} && tar cpf ${PRODUCT_NAME}.ova ${PRODUCT_NAME}.ovf ${PRODUCT_NAME}-disk1.vmdk
2021
	cd ${OWD}
2022
	rm $OVFPATH/${PRODUCT_NAME}-disk1.vmdk
2023
	ls -lah ${OVFPATH}/${PRODUCT_NAME}*ov*
2024
}
2025

    
2026
# called from create_ova_image
2027
ova_umount_mnt() {
2028
	# Unmount /dev/mdX
2029
	umount /mnt
2030
	sync ; sync
2031
}
2032

    
2033
# called from create_ova_image
2034
ova_umount_mdconfig() {
2035
	MD=$1
2036
	# Show gpart info
2037
	gpart show $MD	
2038
	echo ">>> Unmounting ${MD}..." | tee -a ${LOGFILE}
2039
	mdconfig -d -u $MD
2040
	sync ; sync
2041
}
2042

    
2043
# called from create_ova_image
2044
ova_mount_mnt() {
2045
	MD=$1
2046
	echo ">>> Mounting image to /mnt..." | tee -a ${LOGFILE}
2047
	mount -o rw /dev/${MD}p2 /mnt/
2048
}
2049

    
2050
# called from create_ova_image
2051
ova_setup_ovf_file() {
2052
	if [ -f ${OVFFILE} ]; then
2053
		cp ${OVFFILE} ${OVFPATH}/${PRODUCT_NAME}.ovf
2054
	fi
2055
		
2056
	if [ ! -f ${OVFPATH}/${PRODUCT_NAME}.ovf ]; then
2057
		cp ${BUILDER_SCRIPTS}/conf/ovf/pfSense.ovf ${OVFPATH}/${PRODUCT_NAME}.ovf
2058
		file_search_replace PFSENSE_VERSION $PFSENSE_VERSION ${OVFPATH}/${PRODUCT_NAME}.ovf
2059
	fi
2060
}
2061

    
2062
# called from create_ova_image
2063
ova_prereq_check() {
2064
	if [ ! -f /usr/local/bin/qemu-img]; then
2065
		echo ">>> ERROR: qemu-img is not present please check port emulators/qemu installation" | tee -a ${LOGFILE}
2066
		print_error_pfS
2067
	fi
2068
	sysctl kern.geom.debugflags=16
2069
}
2070

    
2071
disable_lan_disable_dhcpd_enable_sshd() {
2072
	if [ "${TARGET}" != "${BUILDER_HOST_TARGET}" ]; then
2073
		echo ">>> ERROR: Cannot perform the modifications since cross compiling!" | tee -a ${LOGFILE}
2074
		print_error_pfS
2075
	fi
2076

    
2077
	cat <<EOF >$PFSENSEISODIR/remove_lan.php
2078
#!/usr/local/bin/php -f
2079
<?php
2080
require_once("globals.inc");
2081
require_once("functions.inc");
2082
require_once("config.inc");
2083
require_once("util.inc");
2084
\$config = parse_config(true);
2085
echo ">>> Disabling LAN interface...\n";
2086
unset(\$config['interfaces']['lan']);
2087
echo ">>> Disabling DHCPD on LAN interface...\n";
2088
unset(\$config['dhcpd']['lan']['enable']);
2089
\$config['system']['enablesshd'] = true;
2090
echo ">>> Adding allow all rule to WAN...\n";
2091
\$filterent = array();
2092
\$filterent["type"] = "pass";
2093
\$filterent["interface"] = "wan";
2094
\$filterent["source"]["any"] = "";
2095
\$filterent["destination"]["any"] = "";
2096
\$filterent["statetype"] = "keep state";
2097
\$filterent["os"] = "";
2098
\$filterent["descr"] = "Allow all via DevBuilder";
2099
\$config["filter"]["rule"][] = \$filterent;
2100
echo ">>> Turning off block private networks (if on)...\n";
2101
unset(\$config["interfaces"]["wan"]["blockpriv"]);
2102
unset(\$config['interfaces']['wan']['blockbogons']);
2103
unlink_if_exists("/tmp/config.cache");
2104
echo ">>> Writing config...\n";
2105
write_config("DevBuilder changes.");
2106
\$config = parse_config(true);
2107
echo ">>> Finished with config.xml modificaitons...\n";
2108
?>
2109
EOF
2110

    
2111
	# Setup config environment
2112
	cp $PFSENSEISODIR/cf/conf/config.xml $PFSENSEISODIR/conf/
2113
	mkdir -p $PFSENSEISODIR/conf/backup
2114
	mkdir -p $PFSENSEISODIR/cf/conf/backup
2115
	chmod a+rx $PFSENSEISODIR/remove_lan.php
2116
	# chroot in and do the operations
2117
	chroot $PFSENSEISODIR /remove_lan.php
2118
	# copy the altered config.xml into place
2119
	cp $PFSENSEISODIR/cf/conf/config.xml $PFSENSEISODIR/conf.default/config.xml
2120
	# Break environment back down
2121
	rm -rf $PFSENSEISODIR/cf/conf/backup
2122
	rm -rf $PFSENSEISODIR/conf/*
2123
	rm -rf $PFSENSEISODIR/tmp/*
2124
	rm $PFSENSEISODIR/remove_lan.php
2125
}
2126

    
2127
# called from create_ova_image
2128
ova_calculate_mnt_size() {
2129
	/bin/echo -n ">>> Calculating size of /mnt..." | tee -a ${LOFGILE}
2130
	INSTALLSIZE=`du -s /mnt/ | awk '{ print $1 }'`
2131
	INSTALLSIZEH=`du -d0 -h /mnt/ | awk '{ print $1 }'`
2132
	echo $INSTALLSIZEH
2133
}
2134

    
2135
# called from create_ova_image
2136
ova_create_raw_backed_file() {
2137
	DISKSIZE=$OVADISKSIZE
2138
	BLOCKSIZE=$OVABLOCKSIZE
2139
	COUNT=`expr -e $DISKSIZE / $BLOCKSIZE`
2140
	DISKFILE=${OVFPATH}/${OVFVMDK}.raw
2141
	echo ">>> Creating raw backing file ${DISKFILE} (Disk Size: ${DISKSIZE}, Block Size: ${BLOCKSIZE}, Count: ${COUNT})..." | tee -a ${LOGFILE}
2142
	dd if=/dev/zero of=$DISKFILE bs=$BLOCKSIZE count=0 seek=$COUNT
2143
}
2144

    
2145
# called from create_ova_image
2146
ova_remove_old_tmp_files() {
2147
	rm ${OVFPATH}/*.ovf.final 2>/dev/null
2148
	rm ${OVFPATH}/*.ova 2>/dev/null	
2149
}
2150

    
2151
# called from create_ova_image
2152
ova_set_default_network_interfaces() {
2153
	echo ">>> Setting default interfaces to em0 and em1 in config.xml..." | tee -a ${LOGFILE}
2154
	file_search_replace vr0 em0 ${PFSENSEISODIR}/conf.default/config.xml
2155
	file_search_replace vr1 em1 ${PFSENSEISODIR}/conf.default/config.xml
2156
}
2157

    
2158
# called from create_ova_image
2159
ova_create_vbox_image() {
2160
	# VirtualBox
2161
	echo ">>> Creating image using qemu-img..." | tee -a ${LOGFILE}
2162
	rm ${OVFPATH}/${OVFVMDK} 2>/dev/null
2163
	qemu-img convert -f raw -O vmdk ${OVFPATH}/${OVFVMDK}.raw ${OVFPATH}/${OVFVMDK}
2164
	rm -rf ${OVFPATH}/${OVFVMDK}.raw
2165
	echo ">>> ${OVFPATH}/${OVFVMDK} created." | tee -a ${LOGFILE}
2166
}
2167

    
2168
# called from create_ova_image
2169
ova_cpdup_files() {
2170
	echo ">>> Populating vmdk staging area..."	
2171
	cpdup -o ${PFSENSEISODIR}/COPYRIGHT /mnt/COPYRIGHT
2172
	cpdup -o ${PFSENSEISODIR}/boot /mnt/boot
2173
	cpdup -o ${PFSENSEISODIR}/bin /mnt/bin
2174
	cpdup -o ${PFSENSEISODIR}/conf /mnt/conf
2175
	cpdup -o ${PFSENSEISODIR}/conf.default /mnt/conf.default
2176
	cpdup -o ${PFSENSEISODIR}/dev /mnt/dev
2177
	cpdup -o ${PFSENSEISODIR}/etc /mnt/etc
2178
	cpdup -o ${PFSENSEISODIR}/home /mnt/home
2179
	cpdup -o ${PFSENSEISODIR}/kernels /mnt/kernels
2180
	cpdup -o ${PFSENSEISODIR}/libexec /mnt/libexec
2181
	cpdup -o ${PFSENSEISODIR}/lib /mnt/lib
2182
	cpdup -o ${PFSENSEISODIR}/root /mnt/root
2183
	cpdup -o ${PFSENSEISODIR}/sbin /mnt/sbin
2184
	cpdup -o ${PFSENSEISODIR}/usr /mnt/usr
2185
	cpdup -o ${PFSENSEISODIR}/var /mnt/var
2186
	sync ; sync ; sync ; sync
2187
}
2188

    
2189
ova_setup_platform_specific() {
2190
	echo ">>> Installing platform specific items..." | tee -a ${LOGFILE}
2191
	echo "/dev/label/${PRODUCT_NAME}	/	ufs		rw	0	0" > /mnt/etc/fstab
2192
	echo "/dev/label/swap0	none	swap	sw	0	0" >> /mnt/etc/fstab
2193
	echo pfSense > /mnt/etc/platform
2194
	rmdir /mnt/conf
2195
	mkdir -p /mnt/cf
2196
	mkdir -p /mnt/cf/conf
2197
	cp /mnt/conf.default/config.xml /mnt/cf/conf/
2198
	chroot /mnt /bin/ln -s /cf/conf /conf
2199
	mkdir -p /mnt/tmp
2200
}
2201

    
2202
# called from create_ova_image
2203
ova_partition_gpart() {
2204
	# XXX: Switch to mkimg tool!!
2205
	MD=$1
2206
	echo ">>> Creating GPT..." | tee -a ${LOGFILE}
2207
	gpart create -s gpt $MD
2208
	echo ">>> Embedding GPT bootstrap into protective MBR..." | tee -a ${LOGFILE}
2209
	gpart bootcode -b /boot/pmbr $MD
2210
	echo ">>> Creating GPT boot partition..." | tee -a ${LOGFILE}
2211
	gpart add -b 34 -s 128 -t freebsd-boot $MD
2212
	gpart bootcode -p /boot/gptboot -i 1 $MD
2213
	echo ">>> Setting up disk slices: ${MD}p2 (Size: ${OVA_FIRST_PART_SIZE})..." | tee -a ${LOGFILE}
2214
	gpart add -s $OVA_FIRST_PART_SIZE -t freebsd-ufs -i 2 $MD
2215
	echo ">>> Setting up disk slices: ${MD}p3 (swap) (Size: ${OVA_SWAP_PART_SIZE})..." | tee -a ${LOGFILE}
2216
	gpart add -s $OVA_SWAP_PART_SIZE -t freebsd-swap -i 3 $MD
2217
	echo ">>> Running newfs..." | tee -a ${LOGFILE}
2218
	newfs -U /dev/${MD}p2
2219
	sync ; sync ; sync ; sync
2220
	echo ">>> Labeling partitions: ${MD}p2..."  | tee -a ${LOGFILE}
2221
	glabel label ${PRODUCT_NAME} ${MD}p2
2222
	sync ; sync
2223
	echo ">>> Labeling partitions: ${MD}p3..." | tee -a ${LOGFILE}
2224
	glabel label swap0 ${MD}p3
2225
	sync ; sync
2226
}
2227

    
2228
# called from create_ova_image
2229
# This routine will replace a string in a file
2230
file_search_replace() {
2231
	SEARCH=$1
2232
	REPLACE=$2
2233
	FILENAME=$3
2234
	sed "s/${SEARCH}/${REPLACE}/g" $3 > $FILENAME.$$
2235
	mv $FILENAME.$$ $FILENAME
2236
}
2237

    
2238
# This routine installs pfSense packages into the staging area.
2239
# Packages such as squid, snort, autoconfigbackup, etc.
2240
pfsense_install_custom_packages_exec() {
2241
	# Function originally written by Daniel S. Haischt
2242
	#	Copyright (C) 2007 Daniel S. Haischt <me@daniel.stefan.haischt.name>
2243
	#   Copyright (C) 2009 Scott Ullrich <sullrich@gmail.com>
2244

    
2245
	if [ "${TARGET}" != "${BUILDER_HOST_TARGET}" ]; then
2246
		echo ">>> WARNING: Cannot install pfSense packages since cross building!" | tee -a ${LOGFILE}
2247
		return
2248
	fi
2249

    
2250
	if [ ${FREEBSD_VERSION} -ge 10 ]; then
2251
		PFSDESTNAME="pkgnginstall.sh"
2252
	else
2253
		PFSDESTNAME="pkginstall.sh"
2254
	fi
2255
	PFSTODIR="${PFSENSEISODIR}"
2256

    
2257
	# Extra package list if defined.
2258
	if [ ! -z "${custom_package_list:-}" ]; then
2259
		# Notes:
2260
		# ======
2261
		# devfs mount is required cause PHP requires /dev/stdin
2262
		# php.ini needed to make PHP argv capable
2263
		#
2264
		/bin/echo ">>> Installing custom packages to: ${PFSTODIR} ..."
2265

    
2266
		cp ${PFSTODIR}/etc/platform ${PFSTODIR}/tmp/
2267

    
2268
		/sbin/mount -t devfs devfs ${PFSTODIR}/dev
2269

    
2270
		/bin/mkdir -p ${PFSTODIR}/var/etc/
2271
		/bin/cp /etc/resolv.conf ${PFSTODIR}/etc/
2272

    
2273
		/bin/echo ${custom_package_list} > ${PFSTODIR}/tmp/pkgfile.lst
2274

    
2275
		/bin/cp ${BUILDER_TOOLS}/builder_scripts/scripts/pfspkg_installer ${PFSTODIR}/tmp
2276
		/bin/chmod a+x ${PFSTODIR}/tmp/pfspkg_installer
2277

    
2278
		cp ${PFSTODIR}/usr/local/lib/php.ini $SCRATCHDIR
2279
		if [ -f $SCRATCHDIR/php.ini ]; then
2280
			cat $SCRATCHDIR/php.ini | grep -v apc > ${PFSTODIR}/usr/local/lib/php.ini
2281
			cat $SCRATCHDIR/php.ini | grep -v apc > ${PFSTODIR}/usr/local/etc/php.ini
2282
		fi
2283

    
2284
	# setup script that will be run within the chroot env
2285
	/bin/cat > ${PFSTODIR}/${PFSDESTNAME} <<EOF
2286
#!/bin/sh
2287
#
2288
# ------------------------------------------------------------------------
2289
# ATTENTION: !!! This script is supposed to be run within a chroot env !!!
2290
# ------------------------------------------------------------------------
2291
#
2292
#
2293
# Setup
2294
#
2295

    
2296
# Handle php.ini if /etc/rc.php_ini_setup exists
2297
if [ -f "/etc/rc.php_ini_setup" ]; then
2298
	mkdir -p /usr/local/lib/ /usr/local/etc/
2299
	/etc/rc.php_ini_setup 2>/dev/null
2300
	cat /usr/local/etc/php.ini | grep -v apc > /tmp/php.ini.new
2301
	cp /tmp/php.ini.new /usr/local/etc/php.ini 2>/dev/null
2302
	cp /tmp/php.ini.new /usr/local/lib/php.ini 2>/dev/null
2303
fi
2304

    
2305
if [ ! -f "/usr/local/bin/php" ]; then
2306
	echo
2307
	echo
2308
	echo
2309
	echo "ERROR.  A copy of php does not exist in /usr/local/bin/"
2310
	echo
2311
	echo "This script cannot continue."
2312
	echo
2313
	while [ /bin/true ]; do
2314
		sleep 65535
2315
	done
2316
fi
2317

    
2318
if [ ! -f "/COPYRIGHT" ]; then
2319
	echo
2320
	echo
2321
	echo
2322
	echo "ERROR.  Could not detect the correct CHROOT environment (missing /COPYRIGHT)."
2323
	echo
2324
	echo "This script cannot continue."
2325
	echo
2326
	while [ /bin/true ]; do
2327
		sleep 65535
2328
	done
2329
fi
2330

    
2331
# backup original conf dir
2332
if [ -d /conf ]; then
2333
	/bin/mv /conf /conf.org
2334
	/usr/bin/touch /tmp/restore_conf_dir
2335
fi
2336

    
2337
# test whether conf dir is already a symlink
2338
if [ ! -h /conf ]; then
2339
	# install the symlink as it would exist on a live system
2340
	/bin/ln -s /cf/conf /conf 2>/dev/null
2341
	/usr/bin/touch /tmp/remove_conf_symlink
2342
fi
2343

    
2344
# now that we do have the symlink in place create
2345
# a backup dir if necessary.
2346
if [ ! -d /conf/backup ]; then
2347
	/bin/mkdir -p /conf/backup
2348
	/usr/bin/touch /tmp/remove_backup
2349
fi
2350

    
2351
#
2352
# Assemble package list if necessary
2353
#
2354
(/tmp/pfspkg_installer -q -m config -l /tmp/pkgfile.lst -p .:/etc/inc:/usr/local/www:/usr/local/captiveportal:/usr/local/pkg) | egrep -wi '(^>>>|error)'
2355

    
2356
#
2357
# Exec PHP script which installs pfSense packages in place
2358
#
2359
(/tmp/pfspkg_installer -q -m install -l /tmp/pkgfile.lst -p .:/etc/inc:/usr/local/www:/usr/local/captiveportal:/usr/local/pkg) > /tmp/pfspkg_installer.out 2>&1
2360

    
2361
rc=\$?
2362

    
2363
egrep -wi '(^>>>|error)' /tmp/pfspkg_installer.out 2>/dev/null
2364
rm -f /tmp/pfspkg_installer.out
2365

    
2366
#
2367
# Check if pfspkg_installer returned 0
2368
#
2369
[ "\$rc" != "0" ] && exit 1
2370

    
2371
# Copy config.xml to conf.default/
2372
cp /conf/config.xml conf.default/
2373

    
2374
#
2375
# Cleanup, aisle 7!
2376
#
2377
if [ -f /tmp/remove_platform ]; then
2378
	/bin/rm /etc/platform
2379
	/bin/rm /tmp/remove_platform
2380
fi
2381

    
2382
if [ -f /tmp/remove_backup ]; then
2383
	/bin/rm -rf /conf/backup
2384
	/bin/rm /tmp/remove_backup
2385
fi
2386

    
2387
if [ -f /tmp/remove_conf_symlink ]; then
2388
	/bin/rm /conf
2389
	if [ -h /cf ]; then
2390
		/bin/rm /cf
2391
	fi
2392
	/bin/rm /tmp/remove_conf_symlink
2393
fi
2394

    
2395
if [ -f /tmp/restore_conf_dir ]; then
2396
	/bin/mv /conf.org /conf
2397
	/bin/rm /tmp/restore_conf_dir
2398
fi
2399

    
2400
if [ -f /tmp/platform ]; then
2401
	mv /tmp/platform /etc/platform
2402
fi
2403

    
2404
/bin/rm /tmp/pfspkg_installer
2405

    
2406
/bin/rm /tmp/pkgfile.lst
2407

    
2408
/bin/rm /tmp/*.log /tmp/*.tbz 2>/dev/null
2409

    
2410
if [ -f /tmp/config.cache ]; then
2411
	/bin/rm /tmp/config.cache
2412
fi
2413

    
2414
/bin/rm /etc/resolv.conf
2415

    
2416
/bin/rm /${PFSDESTNAME}
2417

    
2418
if [ -f /tmp/php.ini ]; then
2419
	cp /tmp/php.ini /usr/local/lib/php.ini
2420
	cp /tmp/php.ini /usr/local/etc/php.ini
2421
fi
2422

    
2423
EOF
2424

    
2425
		echo ">>> Installing custom pfSense-XML packages inside chroot ..." | tee -a ${LOGFILE}
2426
		chmod a+rx ${PFSTODIR}/${PFSDESTNAME}
2427
		chroot ${PFSTODIR} /bin/sh /${PFSDESTNAME}
2428
		rc=$?
2429
		echo ">>> Unmounting ${PFSTODIR}/dev ..." | tee -a ${LOGFILE}
2430
		umount -f ${PFSTODIR}/dev
2431

    
2432
		if [ "${rc}" != "0" ]; then
2433
			echo ">>> ERROR: Error installing custom packages" | tee -a ${LOGFILE}
2434
			print_error_pfS
2435
		fi
2436
	fi
2437
}
2438

    
2439
# Cleans up previous builds
2440
pfSense_clean_obj_dir() {
2441
	# Clean out directories
2442
	echo ">>> Cleaning up previous build environment...Please wait!"
2443

    
2444
	staginareas_clean_each_run
2445

    
2446
	if [ -d "${PFSENSESTAGEDIR}" ]; then
2447
		BASENAME=`basename ${PFSENSESTAGEDIR}`
2448
		echo -n ">>> Cleaning ${PFSENSESTAGEDIR} ..."
2449
		chflags -R noschg ${PFSENSESTAGEDIR} 2>&1 >/dev/null
2450
		rm -rf ${PFSENSESTAGEDIR} 2>/dev/null
2451
		echo "Done."
2452
	fi
2453
	mkdir -p ${PFSENSESTAGEDIR}
2454

    
2455
	if [ -z "${NO_CLEANFREEBSDOBJDIR}" ]; then
2456
		if [ -d "$MAKEOBJDIRPREFIX" ]; then
2457
			echo -n ">>> Cleaning FreeBSD objects dir staging..."
2458
			echo -n "."
2459
			chflags -R noschg ${MAKEOBJDIRPREFIX} 2>&1 >/dev/null
2460
			echo -n "."
2461
			rm -rf ${MAKEOBJDIRPREFIX}/*
2462
			echo "Done!"
2463
		fi
2464
		if [ -n "${KERNEL_DESTDIR}" -a -d "${KERNEL_BUILD_PATH}" ]; then
2465
			echo -n ">>> Cleaning previously built kernel stage area..."
2466
			rm -rf $KERNEL_BUILD_PATH/*
2467
			echo "Done!"
2468
		fi
2469
	fi
2470
	mkdir -p $MAKEOBJDIRPREFIX
2471
	mkdir -p $KERNEL_BUILD_PATH
2472

    
2473

    
2474
	echo -n ">>> Cleaning previously built images..."
2475
	rm -rf $MAKEOBJDIRPREFIXFINAL/*
2476
	echo "Done!"
2477

    
2478
	if [ -z "${NO_CLEANREPOS}" ]; then
2479
		if [ -d "${GIT_REPO_DIR}/pfSenseGITREPO" ]; then
2480
			echo -n ">>> Cleaning pfSense repo checkout..."
2481
			echo -n "."
2482
			rm -rf "${GIT_REPO_DIR}/pfSenseGITREPO"
2483
			echo "Done!"
2484
		fi
2485

    
2486
		if [ -d "$SRCDIR" ]; then
2487
			echo -n ">>> Ensuring $SRCDIR is clean..."
2488
			rm -rf ${SRCDIR}
2489
			echo "Done!"
2490
		fi
2491
	fi
2492

    
2493
	echo -n ">>> Cleaning previous builder logs..."
2494
	if [ -d "$BUILDER_LOGS" ]; then
2495
		rm -rf ${BUILDER_LOGS}
2496
	fi
2497
	mkdir -p ${BUILDER_LOGS}
2498

    
2499
	echo "Done!"
2500

    
2501
	echo ">>> Cleaning of builder environment has finished."
2502
}
2503

    
2504
# This copies the default config.xml to the location on
2505
# disk as the primary configuration file.
2506
copy_config_xml_from_conf_default() {
2507
	# XXX: Wouldn't this overwrite any pre-installed pacakge info and customization as called so late today!!??
2508
	if [ ! -f "${PFSENSEISODIR}/cf/conf/config.xml" ]; then
2509
		if [ ! -f "${PFSENSEISODIR}/conf.default/config.xml" ]; then
2510
			echo ">>> ERROR: There is no config.xml in the stage area ${PFSENSEISODIR}...STOPPING!" | tee -a ${LOGFILE}
2511
			print_error_pfS
2512
			kill $$
2513
		fi
2514
		echo ">>> Copying config.xml from conf.default/ to cf/conf/" | tee -a ${LOGFILE}
2515
		cp ${PFSENSEISODIR}/conf.default/config.xml ${PFSENSEISODIR}/cf/conf/
2516
	fi
2517
}
2518

    
2519
# Rebuilds and installs the BSDInstaller which populates
2520
# the Ports directory sysutils/bsdinstaller, etc.
2521
rebuild_bsdinstaller() {
2522
	# Add BSDInstaller
2523
	cd ${BUILDER_SCRIPTS}
2524
	BSDINSTALLPKG=$(make -C /usr/ports/sysutils/bsdinstaller -V PKGNAME)
2525
	if [ -f "/usr/ports/packages/All/$BSDINSTALLPKG.txz" -o -f "/usr/ports/packages/All/$BSDINSTALLPKG.tgz" -o -f "/usr/ports/packages/All/$BSDINSTALLPKG.tbz" ]; then
2526
		echo ">>> Found $BSDINSTALLPKG pre-built package using that not rebuilding from source!"
2527
	else
2528
		${BUILDER_SCRIPTS}/scripts/rebuild_bsdinstaller.sh
2529
	fi
2530
	unset BSDINSTALLPKG
2531
}
2532

    
2533
# This routine ensures that the $SRCDIR has sources
2534
# and is ready for action / building.
2535
ensure_source_directories_present() {
2536
	# Sanity check
2537
	if [ ! -d "${PFSPATCHDIR}" ]; then
2538
		echo ">>> ERROR: PFSPATCHDIR=${PFSPATCHDIR} is not a directory -- Please fix."
2539
		print_error_pfS
2540
		kill $$
2541
	fi
2542

    
2543
	update_freebsd_sources_and_apply_patches
2544

    
2545
	update_pfSense_repository
2546

    
2547
	# BSDInstaller is treated when needed
2548
	${BUILDER_SCRIPTS}/scripts/get_bsdinstaller.sh
2549
}
2550

    
2551
clone_directory_contents() {
2552
	if [ ! -d $1 -o ! -d $2 ]; then
2553
		if [ -z "${LOGFILE}" ]; then 
2554
			echo ">>> ERROR: Argument $1 supplied is not a directory!"
2555
		else
2556
			echo ">>> ERROR: Argument $1 supplied is not a directory!" | tee -a ${LOGFILE}
2557
		fi
2558
		print_error_pfS
2559
		kill $$
2560
	fi
2561
	OLDPWD=`pwd`
2562
	echo -n ">>> Using TAR to clone $1 to $2 ..."
2563
	cd ${1}
2564
	tar -c -f - * | ( cd $2; tar -x -p -f -)
2565
	echo "Done!"
2566
	cd $OLDPWD
2567
	unset OLDPWD
2568
}
2569

    
2570
clone_to_staging_area() {
2571

    
2572
	OLDPWD=`pwd`
2573
	# Clone everything to the final staging area
2574
	echo -n ">>> Cloning everything to ${PFSENSESTAGEDIR} staging area..."
2575
	LOGFILE=${BUILDER_LOGS}/cloning.${TARGET}.log
2576

    
2577
	if [ ! -d ${GIT_REPO_DIR}/pfSenseGITREPO ]; then
2578
		echo "ERROR!"
2579
		echo ">>> ERROR: pfSense repository does not seem to be there please fix...STOPPING!" | tee -a ${LOGFILE}
2580
		print_error_pfS
2581
	fi
2582

    
2583
	cd ${GIT_REPO_DIR}/pfSenseGITREPO
2584
	tar --exclude=\.git -c -f - * | ( cd $PFSENSESTAGEDIR; tar -x -p -f -)
2585

    
2586
	if [ -f ${PFSENSESTAGEDIR}/etc/master.passwd ]; then 
2587
		chroot ${PFSENSESTAGEDIR} cap_mkdb /etc/master.passwd
2588
		chroot ${PFSENSESTAGEDIR} pwd_mkdb /etc/master.passwd
2589
	fi
2590
	cd $OLDPWD
2591
	mkdir -p ${PFSENSESTAGEDIR}/etc/mtree
2592
	mtree -Pcp ${PFSENSESTAGEDIR}/root > ${PFSENSESTAGEDIR}/etc/mtree/root.dist
2593
	mtree -Pcp ${PFSENSESTAGEDIR}/var > ${PFSENSESTAGEDIR}/etc/mtree/var.dist
2594
	mtree -Pcp ${PFSENSESTAGEDIR}/etc > ${PFSENSESTAGEDIR}/etc/mtree/etc.dist
2595
	if [ -d ${PFSENSESTAGEDIR}/usr/local/etc ]; then
2596
		mtree -Pcp ${PFSENSESTAGEDIR}/usr/local/etc > ${PFSENSESTAGEDIR}/etc/mtree/localetc.dist
2597
	fi
2598
	echo "Done!"
2599
	unset OLDPWD
2600
}
2601

    
2602
create_final_staging_area() {
2603
	if [ -z "${PFSENSEISODIR}" ]; then
2604
		echo ">>> ERROR: PFSENSEISODIR is not set, cannot continue!" | tee -a ${LOGFILE}
2605
		print_error_pfS
2606
	fi
2607

    
2608
	if [ -d "${PFSENSEISODIR}" ]; then
2609
		echo -n ">>> Previous ${PFSENSEISODIR} detected cleaning up..." | tee -a ${LOGFILE}
2610
		chflags -R noschg ${PFSENSEISODIR} 2>&1 1>/dev/null
2611
		rm -rf ${PFSENSEISODIR}/* 2>&1 1>/dev/null
2612
		echo "Done." | tee -a ${LOGFILE}
2613
	fi
2614
	mkdir -p ${PFSENSEISODIR}
2615

    
2616
	echo ">>> Preparing Final image staging area: `LC_ALL=C date` - from ${PFSENSESTAGEDIR} to ${PFSENSEISODIR}" 2>&1 | tee -a ${LOGFILE}
2617
	if [ -z "${NO_COMPRESSEDFS:-}" ]; then
2618
		mkdir -p ${PFSENSEISODIR}/uzip
2619
		mkdir -p ${PFSENSEISODIR}/usr
2620
		DIRSIZE=$(($(du -kd 0 $PFSENSESTAGEDIR | cut -f 1)))
2621
		FSSIZE=$(($DIRSIZE + ($DIRSIZE/5)))
2622
		if [ -f ${PFSENSEISODIR}/uzip/usr.ufs ]; then
2623
			rm -f ${PFSENSEISODIR}/uzip/usr.ufs
2624
		fi
2625
		dd if=/dev/zero of=${PFSENSEISODIR}/uzip/usr.ufs bs=1k count=1 seek=$((${FSSIZE} - 1)) 2>&1 | tee -a ${LOGFILE}
2626
		MD=`mdconfig -a -t vnode -f ${PFSENSEISODIR}/uzip/usr.ufs`
2627
		# Just in case
2628
		trap "mdconfig -d -u ${MD}" 1 2 15 EXIT
2629
		newfs -o space /dev/${MD} 2>&1 | tee -a ${LOGFILE}
2630
		mount -o noatime /dev/${MD} ${PFSENSEISODIR}/usr 2>&1 | tee -a ${LOGFILE}
2631
		trap "umount -f ${PFSENSEISODIR}/usr; mdconfig -d -u ${MD}" 1 2 15 EXIT
2632
	fi
2633

    
2634
	clone_directory_contents ${PFSENSESTAGEDIR} ${PFSENSEISODIR}
2635

    
2636
	# Create a copy of this file just in case
2637
	cp $PFSENSEISODIR/etc/gettytab $PFSENSEISODIR/etc/gettytab.bak
2638

    
2639
	if [ ! -f $PFSENSEISODIR/sbin/init ]; then
2640
		echo ">>> ERROR: Something went wrong during cloning -- Please verify!" 2>&1 | tee -a ${LOGFILE}
2641
                print_error_pfS
2642
                kill $$
2643
	fi
2644

    
2645
	if [ -z "${NO_COMPRESSEDFS:-}" ]; then
2646
		umount -f ${PFSENSEISODIR}/usr
2647
		mdconfig -d -u ${MD}
2648
		# Restore functionality
2649
		trap "-" 1 2 15 EXIT
2650

    
2651
		echo -n ">>> Compressing ${PFSENSEISODIR}/uzip/ufs.ufs ..."
2652
		mkuzip -s 65536 -o ${PFSENSEISODIR}/uzip/usr.uzip ${PFSENSEISODIR}/uzip/usr.ufs 2>&1 | tee -a ${LOGFILE}
2653
		if [ $? -ne 0 ]; then
2654
			echo ">>> ERROR: Something went wrong during compressing -- Please verify!" 2>&1 | tee -a ${LOGFILE}
2655
			print_error_pfS
2656
			kill $$
2657
		fi
2658
		echo "Done!"
2659
	fi
2660

    
2661
	echo -n ">>> Copying rc.d needed scripts..."
2662
	# Copy file needed by iso image
2663
	for file in uzip etcmfs varmfs rootmfs; do
2664
		cp ${BUILDER_SCRIPTS}/scripts/rc.d/$file ${PFSENSEISODIR}/etc/rc.d/ 2>&1 | tee -a ${LOGFILE}
2665
		chmod 555 ${PFSENSEISODIR}/etc/rc.d/$file 2>&1 | tee -a ${LOGFILE}
2666
	done
2667
	echo "Done!"
2668

    
2669
	mkdir -p ${PFSENSEISODIR}/dist
2670
	mtree -Pcp ${PFSENSEISODIR} | bzip2 -9 > ${PFSENSEISODIR}/dist/root.dist.bz2
2671
}
2672

    
2673
customize_stagearea_for_image() {
2674
	# Prepare final stage area
2675
	create_final_staging_area
2676

    
2677
	# This check is for supporting create memstick/ova images
2678
	if [ "${1}" = "iso" -o "${1}" = "memstick" -o "${1}" = "memstickserial" ]; then
2679
		# Fetch BSDInstaller and rebuild
2680
		rebuild_bsdinstaller
2681

    
2682
		echo ">>> Searching for BSDInstaller..." | tee -a ${LOGFILE}
2683
		if [ "$PFSPKGFILE" = "" ]; then
2684
			PFSPKGFILE=${SCRATCHDIR}/pfspackages
2685
			echo ">> PFSPKGFILE is not defined.  Setting to ${PFSPKGFILE}." | tee -a ${LOGFILE}
2686
		fi
2687
		(${PKG_INFO} | grep bsdinstaller) > $PFSPKGFILE
2688
		(${PKG_INFO} | grep lua) >> $PFSPKGFILE
2689

    
2690
		echo $PFSPKGFILE >> ${LOGFILE}
2691
		echo ">>> Installing BSDInstaller: " | tee -a ${LOGFILE}
2692
		if [ ${FREEBSD_VERSION} -ge 10 ]; then
2693
			(${BUILDER_SCRIPTS}/scripts/pkgnginstall.sh)
2694
		else
2695
			(${BUILDER_SCRIPTS}/scripts/pkginstall.sh)
2696
		fi
2697

    
2698
		# Add installer bits
2699
		cust_populate_installer_bits
2700

    
2701
		# Check to see if we have a healthy installer
2702
		ensure_healthy_installer
2703
	else
2704
		echo ">>> BSDInstaller not being put into image type: ${1}" | tee -a ${LOGFILE}
2705
	fi
2706

    
2707
	# Add extra files such as buildtime of version, bsnmpd, etc.
2708
	cust_populate_extra
2709

    
2710
	install_custom_overlay
2711

    
2712
	# Check for custom config.xml
2713
	cust_install_config_xml
2714

    
2715
	# Install custom pfSense-XML packages from a chroot
2716
	pfsense_install_custom_packages_exec
2717

    
2718
	# Overlay final files
2719
	install_custom_overlay_final
2720

    
2721
	# Ensure config.xml exists
2722
	copy_config_xml_from_conf_default
2723

    
2724
	# Test PHP installation
2725
	test_php_install
2726

    
2727
	# Overlay any loader.conf customziations
2728
	install_extra_loader_conf_options
2729

    
2730
	# Create md5 summary file listing checksums
2731
	create_md5_summary_file
2732

    
2733
	# Create mtree summary file listing owner/permissions/sha256 and similar
2734
	create_mtree_summary_file
2735

    
2736
	# Setup serial port helper hints
2737
	setup_serial_hints
2738

    
2739
	# Allow a custom function to be called from pfsense-build.conf
2740
	# example: disable_lan_disable_dhcpd_enable_sshd
2741
	if [ -n "$CUSTOM_CALL_SHELL_FUNCTION"  ]; then
2742
		eval $CUSTOM_CALL_SHELL_FUNCTION
2743
	fi
2744

    
2745
}
2746

    
2747
create_iso_image() {
2748
	LOGFILE=${BUILDER_LOGS}/isoimage.${TARGET}
2749
	echo ">>> Building bootable ISO image for ${TARGET}" | tee -a ${LOGFILE}
2750
	if [ -z "${DEFAULT_KERNEL}" ]; then
2751
		echo ">>> ERROR: Could not identify DEFAULT_KERNEL to install on image!" | tee -a ${LOGFILE}
2752
		print_error_pfS
2753
	fi
2754

    
2755
	customize_stagearea_for_image "iso"
2756
	install_default_kernel ${DEFAULT_KERNEL}
2757

    
2758
	echo cdrom > $PFSENSEISODIR/etc/platform
2759

    
2760
	FSLABEL=`echo ${PRODUCT_NAME} | tr '[:lower:]' '[:upper:]'`
2761
	echo "/dev/iso9660/${FSLABEL} / cd9660 ro 0 0" > ${PFSENSEISODIR}/etc/fstab
2762

    
2763
	# This check is for supporting create memstick/ova images
2764
	echo -n ">>> Running command: script -aq $LOGFILE makefs -t cd9660 -o bootimage=\"i386;${PFSENSEISODIR}/boot/cdboot \"-o no-emul-boot -o rockridge " | tee -a ${LOGFILE}
2765
	echo "-o label=${FSLABEL} -o publisher=\"${PRODUCT_NAME} project.\" $ISOPATH ${PFSENSEISODIR}" | tee -a ${LOGFILE}
2766
	makefs -t cd9660 -o bootimage="i386;${PFSENSEISODIR}/boot/cdboot" -o no-emul-boot -o rockridge \
2767
				-o label=${FSLABEL} -o publisher="${PRODUCT_NAME} project." $ISOPATH ${PFSENSEISODIR} 2>&1 >> ${LOGFILE}
2768
	if [ $? -ne 0 -o ! -f $ISOPATH ]; then
2769
		if [ -f ${ISOPATH} ]; then
2770
			rm -f $ISOPATH
2771
		fi
2772
		echo ">>> ERROR: Something wrong happened during ISO image creation. STOPPING!" | tee -a ${LOGFILE}
2773
		print_error_pfS
2774
		kill $$
2775
	fi
2776
	gzip -qf $ISOPATH &
2777

    
2778
	echo ">>> ISO created: `LC_ALL=C date`" | tee -a ${LOGFILE}
2779
}
2780

    
2781
create_memstick_image() {
2782

    
2783
	LOGFILE=${BUILDER_LOGS}/memstick.${TARGET}
2784
	if [ "${MEMSTICKPATH}" = "" ]; then
2785
		echo ">>> MEMSTICKPATH is empty skipping generation of memstick image!" | tee -a ${LOGFILE}
2786
		return
2787
	fi
2788

    
2789
	if [ ! -d ${PFSENSEISODIR}/boot ]; then
2790
		customize_stagearea_for_image "memstick"
2791
		install_default_kernel ${DEFAULT_KERNEL}
2792
	fi
2793

    
2794
	echo cdrom > $PFSENSEISODIR/etc/platform
2795

    
2796
	echo ">>> Creating memstick to ${MEMSTICKPATH}." 2>&1 | tee -a ${LOGFILE}
2797
	echo "/dev/ufs/${PRODUCT_NAME} / ufs ro 0 0" > ${PFSENSEISODIR}/etc/fstab
2798
	echo "kern.cam.boot_delay=10000" >> ${PFSENSEISODIR}/boot/loader.conf.local
2799
	if [ $FREEBSD_VERSION -lt 10 ]; then
2800
		makefs -B little ${MEMSTICKPATH} ${PFSENSEISODIR}
2801
	else
2802
		makefs -B little -o label=${PRODUCT_NAME} ${MEMSTICKPATH} ${PFSENSEISODIR}
2803
	fi
2804
	if [ $? -ne 0 ]; then
2805
		if [ -f ${MEMSTICKPATH} ]; then
2806
			rm -f $MEMSTICKPATH
2807
		fi
2808
		echo ">>> ERROR: Something wrong happened during MEMSTICK image creation. STOPPING!" | tee -a ${LOGFILE}
2809
		print_error_pfS
2810
		kill $$
2811
	fi
2812
	MD=$(mdconfig -a -t vnode -f $MEMSTICKPATH)
2813
	# Just in case
2814
	trap "mdconfig -d -u ${MD}" 1 2 15 EXIT
2815
	gpart create -s BSD ${MD} 2>&1 >> ${LOGFILE}|
2816
	gpart bootcode -b ${PFSENSEISODIR}/boot/boot ${MD} 2>&1 >> ${LOGFILE}
2817
	gpart add -t freebsd-ufs ${MD} 2>&1 >> ${LOGFILE}
2818
	if [ $FREEBSD_VERSION -lt 10 ]; then
2819
		tunefs -L ${PRODUCT_NAME} /dev/${MD}
2820
	fi
2821
	trap "-" 1 2 15 EXIT
2822
	mdconfig -d -u ${MD} 2>&1 | tee -a ${LOGFILE}
2823
	gzip -qf $MEMSTICKPATH &
2824

    
2825
	echo ">>> MEMSTICK created: `LC_ALL=C date`" | tee -a ${LOGFILE}
2826
}
2827

    
2828
create_memstick_serial_image() {
2829
	LOGFILE=${BUILDER_LOGS}/memstickserial.${TARGET}
2830
	if [ "${MEMSTICKSERIALPATH}" = "" ]; then
2831
		echo ">>> MEMSTICKSERIALPATH is empty skipping generation of memstick image!" | tee -a ${LOGFILE}
2832
		return
2833
	fi
2834

    
2835
	if [ ! -d ${PFSENSEISODIR}/boot ]; then
2836
		customize_stagearea_for_image "memstickserial"
2837
		install_default_kernel ${DEFAULT_KERNEL}
2838
	fi
2839

    
2840
	echo cdrom > $PFSENSEISODIR/etc/platform
2841

    
2842
	echo "/dev/ufs/${PRODUCT_NAME} / ufs ro 0 0" > ${PFSENSEISODIR}/etc/fstab
2843
	echo "kern.cam.boot_delay=10000" >> ${PFSENSEISODIR}/boot/loader.conf.local
2844

    
2845
	echo ">>> Creating serial memstick to ${MEMSTICKSERIALPATH}." 2>&1 | tee -a ${LOGFILE}
2846

    
2847
	BOOTCONF=${PFSENSEISODIR}/boot.config
2848
	LOADERCONF=${PFSENSEISODIR}/boot/loader.conf
2849
	ACTIVECONF=${PFSENSEISODIR}/cf/conf/config.xml
2850
	DEFAULTCONF=${PFSENSEISODIR}/conf.default/config.xml
2851
	TTYS=${PFSENSEISODIR}/etc/ttys
2852

    
2853
	echo ">>>   Activating serial console..." 2>&1 | tee -a ${LOGFILE}
2854
	# Activate serial console in boot.config
2855
	if [ -f ${BOOTCONF} ]; then
2856
		sed -i "" '/-D$/d' ${BOOTCONF}
2857
	fi
2858
	if [ ${FREEBSD_VERSION} -ge 10 ]; then
2859
		echo -n "-S115200 " >> ${BOOTCONF}
2860
	fi
2861
	echo "-D" >> ${BOOTCONF}
2862

    
2863
	# Activate serial console in config.xml
2864
	# If it was there before, clear the setting to be sure we don't add it twice.
2865
	sed -i "" -e "/		<enableserial\/>/d" ${ACTIVECONF}
2866
	# Enable serial in the config
2867
	sed -i "" -e "s/	<\/system>/		<enableserial\/>\\`echo -e \\\n`	<\/system>/" ${ACTIVECONF}
2868
	# Make sure to update the default config as well.
2869
	cp ${ACTIVECONF} ${DEFAULTCONF}
2870

    
2871
	# Remove old console options if present.
2872
	sed -i "" -Ee "/(console|boot_multicons|boot_serial)/d" ${LOADERCONF}
2873
	# Activate serial console+video console in loader.conf
2874
	echo 'boot_multicons="YES"' >>  ${LOADERCONF}
2875
	echo 'boot_serial="YES"' >> ${LOADERCONF}
2876
	echo 'console="comconsole,vidconsole"' >> ${LOADERCONF}
2877
	if [ ${FREEBSD_VERSION} -ge 10 ]; then
2878
		echo 'comconsole_speed="115200"' >> ${LOADERCONF}
2879
	fi
2880

    
2881
	# Activate serial console TTY
2882
	sed -i "" -Ee "s/^ttyu0.*$/ttyu0	\"\/usr\/libexec\/getty bootupcli\"	cons25	on	secure/" ${TTYS}
2883

    
2884
	if [ $FREEBSD_VERSION -lt 10 ]; then
2885
		makefs -B little ${MEMSTICKSERIALPATH} ${PFSENSEISODIR}
2886
	else
2887
		makefs -B little -o label=${PRODUCT_NAME} ${MEMSTICKSERIALPATH} ${PFSENSEISODIR}
2888
	fi
2889
	if [ $? -ne 0 ]; then
2890
		if [ -f ${MEMSTICKSERIALPATH} ]; then
2891
			rm -f $MEMSTICKSERIALPATH
2892
		fi
2893
		echo ">>> ERROR: Something wrong happened during MEMSTICKSERIAL image creation. STOPPING!" | tee -a ${LOGFILE}
2894
		print_error_pfS
2895
		kill $$
2896
	fi
2897
	MD=$(mdconfig -a -t vnode -f $MEMSTICKSERIALPATH)
2898
	# Just in case
2899
	trap "mdconfig -d -u ${MD}" 1 2 15 EXIT
2900
	gpart create -s BSD ${MD} 2>&1 >> ${LOGFILE}
2901
	gpart bootcode -b ${PFSENSEISODIR}/boot/boot ${MD} 2>&1 >> ${LOGFILE}
2902
	gpart add -t freebsd-ufs ${MD} 2>&1 >> ${LOGFILE}
2903
	if [ $FREEBSD_VERSION -lt 10 ]; then
2904
		tunefs -L ${PRODUCT_NAME} /dev/${MD}
2905
	fi
2906
	trap "-" 1 2 15 EXIT
2907
	mdconfig -d -u ${MD} 2>&1 >> ${LOGFILE}
2908
	gzip -qf $MEMSTICKSERIALPATH &
2909

    
2910
	echo ">>> MEMSTICKSERIAL created: `LC_ALL=C date`" | tee -a ${LOGFILE}
2911
}
2912

    
2913
# This routine ensures any ports / binaries that the builder
2914
# system needs are on disk and ready for execution.
2915
install_required_builder_system_ports() {
2916
	# No ports exist, use portsnap to bootstrap.
2917
	if [ ! -d "/usr/ports/" ]; then
2918
		echo -n  ">>> Grabbing FreeBSD port sources, please wait..."
2919
		(/usr/sbin/portsnap fetch) 2>&1 | egrep -B3 -A3 -wi '(error)'
2920
		(/usr/sbin/portsnap extract) 2>&1 | egrep -B3 -A3 -wi '(error)'
2921
		echo "Done!"
2922
	fi
2923

    
2924
	OIFS=$IFS
2925
	IFS="
2926
"
2927

    
2928
	for PKG_STRING in `cat ${PFSBUILDERREQUIREDPORTS} ${PFSBUILDERREQUIREDPORTS}.${FREEBSD_VERSION} 2>/dev/null`
2929
	do
2930
		PKG_STRING_T=`echo $PKG_STRING | sed "s/[ ]+/ /g"`
2931
		CHECK_ON_DISK=`echo $PKG_STRING_T | awk '{ print $1 }'`
2932
		PORT_LOCATION=`echo $PKG_STRING_T | awk '{ print $2 }'`
2933
		UNSET_OPTS=`echo $PKG_STRING_T | awk '{ print $2 }' | sed 's/,/ /g'`
2934
		if [ ! -f "$CHECK_ON_DISK" ]; then
2935
			echo -n ">>> Building $PORT_LOCATION ..."
2936
			(cd $PORT_LOCATION && env -u TARGET -u TARGET_ARCH make BATCH=yes deinstall clean) 2>&1 | egrep -B3 -A3 -wi '(error)'
2937
			(cd $PORT_LOCATION && env -u TARGET -u TARGET_ARCH make ${MAKEJ_PORTS} WITHOUT="X11 DOCS EXAMPLES MAN INFO SDL ${UNSET_OPTS}" BATCH=yes FORCE_PKG_REGISTER=yes install clean) 2>&1 | egrep -B3 -A3 -wi '(error)'
2938
			echo "Done!"
2939
		fi
2940
	done
2941

    
2942
	IFS=$OIFS
2943
}
2944

    
2945
# Updates FreeBSD sources and applies any custom
2946
# patches that have been defined.
2947
update_freebsd_sources_and_apply_patches() {
2948
	# No need to obtain sources or patch
2949
	# on subsequent build runs.
2950

    
2951
	if [ ! -d "${SRCDIR}" ]; then
2952
		mkdir -p ${SRCDIR}
2953
	fi
2954

    
2955
	if [ -n "${NO_BUILDWORLD:-}" -a -n "${NO_BUILDKERNEL:-}" ]; then
2956
		echo ">>> NO_BUILDWORLD and NO_BUILDKERNEL set, skipping update of freebsd sources and patch applying" | tee -a ${LOGFILE}
2957
		return
2958
	fi
2959

    
2960
	OLDPWD=`pwd`
2961

    
2962
	echo -n ">>> Obtaining FreeBSD sources ${FREEBSD_BRANCH}..."
2963
	if [ -n "${USE_SVN}" ]; then
2964
		if [ -f /usr/bin/svnlite ]; then
2965
			SVN_BIN=/usr/bin/svnlite
2966
		else
2967
			SVN_BIN=svn
2968
		fi
2969

    
2970
		# If src is already there
2971
		if [ -d "${SRCDIR}/.svn" ]; then
2972
			# Remove orphan files
2973
			(cd ${SRCDIR} && ${SVN_BIN} status --no-ignore | awk '{print $2}' | xargs rm -rf)
2974
			# Revert possible changed files
2975
			(cd ${SRCDIR} && ${SVN_BIN} revert -R . 2>&1) | grep -i 'error'
2976
			# Update src
2977
			(cd ${SRCDIR} && ${SVN_BIN} up 2>&1) | grep -i 'error'
2978
		else
2979
			(${SVN_BIN} co ${FREEBSD_REPO_BASE}/${FREEBSD_BRANCH} ${SRCDIR} 2>&1) | grep -i 'error'
2980
		fi
2981
	else
2982
		local _FREEBSD_BRANCH=${FREEBSD_BRANCH:-"master"}
2983
		local _CLONE=1
2984

    
2985
		if [ -d "${SRCDIR}/.git" ]; then
2986
			CUR_BRANCH=$(cd ${SRCDIR} && git branch | grep '^\*' | cut -d' ' -f2)
2987
			if [ "${CUR_BRANCH}" = "${_FREEBSD_BRANCH}" ]; then
2988
				_CLONE=0
2989
				( cd ${SRCDIR} && git fetch origin; git reset --hard; git clean -fxd; git rebase origin/${_FREEBSD_BRANCH} ) 2>&1 | grep -C3 -i 'error'
2990
			elif (cd ${SRCDIR} && git branch 2>&1 | grep -q "${_FREEBSD_BRANCH}"); then
2991
				_CLONE=0
2992
				( cd ${SRCDIR} && git fetch origin; git reset --hard; git clean -fxd; git checkout ${_FREEBSD_BRANCH}; git rebase origin/${_FREEBSD_BRANCH} ) 2>&1 | grep -C3 -i 'error'
2993
			else
2994
				rm -rf ${SRCDIR}
2995
			fi
2996
		fi
2997

    
2998
		if [ ${_CLONE} -eq 1 ]; then
2999
			( git clone --branch ${_FREEBSD_BRANCH} --single-branch ${FREEBSD_REPO_BASE} ${SRCDIR} ) 2>&1 | grep -C3 -i 'error'
3000
		fi
3001

    
3002
		if [ -n "${GIT_FREEBSD_COSHA1}" ]; then 
3003
			( cd ${SRCDIR} && git checkout ${GIT_FREEBSD_COSHA1} ) 2>&1 | grep -C3 -i 'error'
3004
		fi
3005
	fi
3006
	echo "Done!"
3007

    
3008
	# Loop through and remove files
3009
	echo ">>> Removing files listed for FreeBSD version: ${FREEBSD_VERSION} file-name: ${PFSPATCHFILE}"
3010
	for LINE in `cat ${PFSPATCHFILE}`
3011
	do
3012
		PATCH_RM=`echo $LINE | cut -d~ -f4`
3013
		PATCH_RM_LENGTH=`echo $PATCH_RM | wc -c`
3014
		DIR_CREATE=`echo $LINE | cut -d~ -f5`
3015
		if [ $PATCH_RM_LENGTH -gt "2" ]; then
3016
			rm -rf ${SRCDIR}${PATCH_RM}
3017
		fi
3018
		if [ "$DIR_CREATE" != "" ]; then
3019
			mkdir -p ${SRCDIR}/${DIR_CREATE}
3020
		fi
3021
	done
3022

    
3023
	echo -n ">>> Applying patches from $PFSPATCHFILE please wait..."
3024
	# Loop through and patch files
3025
	for LINE in `cat ${PFSPATCHFILE}`
3026
	do
3027
		PATCH_DEPTH=`echo $LINE | cut -d~ -f1`
3028
		PATCH_DIRECTORY=`echo $LINE | cut -d~ -f2`
3029
		PATCH_FILE=`echo $LINE | cut -d~ -f3`
3030
		PATCH_FILE_LEN=`echo $PATCH_FILE | wc -c`
3031
		MOVE_FILE=`echo $LINE | cut -d~ -f4`
3032
		MOVE_FILE_LEN=`echo $MOVE_FILE | wc -c`
3033
		IS_TGZ=`echo $LINE | grep -v grep | grep .tgz | wc -l`
3034
		if [ ${PATH_FILE} == ""]; then
3035
			
3036
		elif [ ! -f "${PFSPATCHDIR}/${PATCH_FILE}" ]; then
3037
			echo
3038
			echo "ERROR!  Patch file(${PATCH_FILE}) not found!  Please fix before building!"
3039
			echo
3040
			print_error_pfS
3041
			kill $$
3042
		fi
3043

    
3044
		if [ $PATCH_FILE_LEN -gt "2" ]; then
3045
			if [ $IS_TGZ -gt "0" ]; then
3046
				(cd ${SRCDIR}/${PATCH_DIRECTORY} && tar xzvpf ${PFSPATCHDIR}/${PATCH_FILE}) 2>&1 \
3047
				| egrep -wi '(warning|error)'
3048
			else
3049
				(cd ${SRCDIR}/${PATCH_DIRECTORY} && patch --quiet -f ${PATCH_DEPTH} < ${PFSPATCHDIR}/${PATCH_FILE} 2>&1 );
3050
				if [ "$?" != "0" ]; then
3051
					echo "failed to apply ${PATCH_FILE}";
3052
				fi
3053
			fi
3054
		fi
3055
		if [ $MOVE_FILE_LEN -gt "2" ]; then
3056
			#cp ${SRCDIR}/${MOVE_FILE} ${SRCDIR}/${PATCH_DIRECTORY}
3057
		fi
3058
	done
3059
	echo "Done!"
3060

    
3061
	echo ">>> Finding patch rejects..."
3062
	REJECTED_PATCHES=`find $SRCDIR -name "*.rej" | wc -l`
3063
	if [ $REJECTED_PATCHES -gt 0 ]; then
3064
		echo
3065
		echo "WARNING!  Rejected patches found!  Please fix before building!"
3066
		echo
3067
		find $SRCDIR -name "*.rej"
3068
		echo
3069
		if [ "$BUILD_ERROR_MAIL" != "" ]; then
3070
			LOGFILE="$SCRATCHDIR/patches.failed.apply"
3071
			find $SRCDIR -name "*.rej" > $LOGFILE
3072
			print_error_pfS
3073

    
3074
		fi
3075
		print_error_pfS
3076
		kill $$
3077
	fi
3078

    
3079
	cd $OLDPWD
3080
	unset OLDPWD
3081
}
3082

    
3083
# Email when an error has occured and BUILD_ERROR_MAIL is defined
3084
report_error_pfsense() {
3085
    if [ ! -z ${BUILD_ERROR_MAIL:-} ]; then
3086
		HOSTNAME=`hostname`
3087
		IPADDRESS=`ifconfig | grep inet | grep netmask | grep broadcast | awk '{ print $2 }'`
3088
		cat ${LOGFILE} | \
3089
		    mail -s "Builder (${PRODUCT_NAME}) build error in ${TARGET} phase ${IPADDRESS} - ${HOSTNAME} " \
3090
		    	${BUILD_ERROR_MAIL}
3091
    fi
3092
}
3093

    
3094
# Email when an operation is completed IE build run
3095
email_operation_completed() {
3096
    if [ ! -z ${BUILD_COMPLETED_MAIL:-} ]; then
3097
		HOSTNAME=`hostname`
3098
		IPADDRESS=`ifconfig | grep inet | grep netmask | grep broadcast | awk '{ print $2 }'`
3099
		echo "Build / operation completed ${IPADDRESS} - ${HOSTNAME}" | \
3100
		mail -s "Builder (${PRODUCT_NAME}) operation completed ${IPADDRESS} - ${HOSTNAME}" \
3101
	    	${BUILD_COMPLETED_MAIL}
3102
    fi
3103
}
3104

    
3105
# This ensures installer is healthy.
3106
ensure_healthy_installer() {
3107
	echo -n ">>> Checking BSDInstaller health..." | tee -a ${LOGFILE}
3108
	INSTALLER_ERROR=0
3109
	if [ ! -f "$PFSENSEISODIR/usr/local/sbin/dfuife_curses" ]; then
3110
		INSTALLER_ERROR=1
3111
		echo -n " dfuife_curses missing " | tee -a ${LOGFILE}
3112
	fi
3113
	if [ ! -d "$PFSENSEISODIR/usr/local/share/dfuibe_lua" ]; then
3114
		INSTALLER_ERROR=1
3115
		echo -n " dfuibe_lua missing " | tee -a ${LOGFILE}
3116
	fi
3117
	if [ ! -f "$PFSENSEISODIR/usr/local/share/dfuibe_lua/conf/pfSense.lua" ]; then
3118
		INSTALLER_ERROR=1
3119
		echo " pfSense_lua missing " | tee -a ${LOGFILE}
3120
	fi
3121
	if [ "$INSTALLER_ERROR" -gt 0 ]; then
3122
		echo ">>> ERROR: " |  tee -a ${LOGFILE}
3123
		print_error_pfS
3124
		kill $$
3125
	else
3126
		echo "[OK]" | tee -a ${LOGFILE}
3127
	fi
3128
}
3129

    
3130
# Check to see if a forced pfPorts run has been requested.
3131
# If so, rebuild pfPorts.  set_version.sh uses this.
3132
check_for_forced_pfPorts_build() {
3133
	if [ -f "$SCRATCHDIR/pfPorts_forced_build_required" ]; then
3134
		# Ensure that we build
3135
		rm -f $SCRATCHDIR/pfSense_do_not_build_pfPorts
3136
		recompile_pfPorts
3137
		# Remove file that could trigger 2 pfPorts
3138
		# builds in one run
3139
		rm $SCRATCHDIR/pfPorts_forced_build_required
3140
	fi
3141
}
3142

    
3143
# Print basenames
3144
print_basenames() {
3145
	for NAME in "$1"; do
3146
		echo `basename $NAME`
3147
	done
3148
}
3149

    
3150
# Put extra options in loader.conf.local if needed
3151
install_extra_loader_conf_options() {
3152
	if [ ! -z ${LOADER_CONF_CUSTOM} ]; then
3153
		if [ -f ${LOADER_CONF_CUSTOM} ]; then
3154
			echo -n  ">>> loader.conf custom option addition..."
3155
			cat ${LOADER_CONF_CUSTOM} >> $PFSENSEISODIR/boot/loader.conf.local
3156
			echo "Done!"
3157
		fi
3158
	fi
3159
}
3160

    
3161
# This routine assists with installing various
3162
# freebsd ports files into the pfsenese-fs staging
3163
# area.  The various ports are built prior to install.
3164
install_pkg_install_ports() {
3165
	if [ "$PKG_INSTALL_PORTSPFS" = "" ]; then
3166
		return
3167
	fi
3168
	OLDPWD=`pwd`
3169
	# port build log files will be stored here
3170
	mkdir -p ${BUILDER_LOGS}/pfPorts
3171
	ALREADYBUILT="${BUILDER_LOGS}/pfPorts/install_pkg_install_ports"
3172
	if [ -d $ALREADYBUILT ]; then
3173
		rm -rf $ALREADYBUILT
3174
	fi
3175
	mkdir -p $ALREADYBUILT
3176
	# Some ports are unhappy with cross building and fail spectacularly.
3177
	OLDTGTARCH=${TARGET_ARCH}
3178
	unset TARGET_ARCH
3179
	export PFS_PKG_ALL="/usr/ports/packages/All/"
3180
	PFS_PKG_OLD="/usr/ports/packages/Old/"
3181
	VAR_DB_PKG_TMP="$SCRATCHDIR/vardbpkg/"
3182
	VAR_DB_PKG="/var/db/pkg/"
3183
	mkdir -p ${PFS_PKG_ALL}
3184
	mkdir -p ${PFS_PKG_OLD}
3185
	mkdir -p ${VAR_DB_PKG_TMP}
3186
	# Make a backup of existing packages so we can figure out
3187
	# which packages need to be installed in pfsense-fs chroot.
3188
	# otherwise you will get a bunch of extra pkgs that where
3189
	# on the system prior to invoking this build run.
3190
	mv ${PFS_PKG_ALL}* ${PFS_PKG_OLD}/ 2>/dev/null
3191
	mkdir -p ${PFS_PKG_ALL} 2>/dev/null
3192

    
3193
	echo ">>> Building ports: (starting)"
3194
	for PORTDIRPFS in $PKG_INSTALL_PORTSPFS; do
3195
		install_pkg_install_ports_build $PORTDIRPFS
3196
	done
3197

    
3198
	mkdir -p $PFSENSESTAGEDIR/tmp/pkg/
3199
	cp ${PFS_PKG_ALL}/* $PFSENSESTAGEDIR/tmp/pkg/
3200
	echo ">>> Building ports: (finished)"
3201

    
3202
	echo ">>> Installing built ports (packages) in chroot (${PFSENSESTAGEDIR})... (starting)"
3203
	mv ${VAR_DB_PKG}/* ${VAR_DB_PKG_TMP} || true 2>/dev/null
3204
	cp ${BUILDER_SCRIPTS}/scripts/install_tmp_pkgs_in_chroot.sh $PFSENSESTAGEDIR/pkg.sh
3205
	chmod a+rx $PFSENSESTAGEDIR/pkg.sh
3206
	# chroot into staging area and pkg_add all of the packages
3207
	script ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt /sbin/mount -t devfs devfs ${PFSENSESTAGEDIR}/dev
3208
	script -a ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt chroot $PFSENSESTAGEDIR /pkg.sh
3209
	script -a ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt /sbin/umount ${PFSENSESTAGEDIR}/dev
3210
	echo ">>> Result of installing packages in the chroot is:"
3211
	echo "--------------------------------------------------"
3212
	cat ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt
3213
	echo "--------------------------------------------------"
3214
	echo ">>> Installing built ports (packages) in chroot (${PFSENSESTAGEDIR})... (finshied)"
3215

    
3216
	# Restore the previously backed up items
3217
	mv ${PFS_PKG_OLD}* ${PFS_PKG_ALL} || true 2>/dev/null
3218
	mv ${VAR_DB_PKG_TMP}/* ${VAR_DB_PKG} || true 2>/dev/null
3219
	rm -rf $PFSENSESTAGEDIR/tmp/pkg
3220
	rm -f $PFSENSESTAGEDIR/pkg.sh
3221

    
3222
	echo ">>> Building ports: (Done)"
3223
	TARGET_ARCH=${OLDTGTARCH}
3224
	cd $OLDPWD
3225
	unset OLDPWD
3226
}
3227

    
3228
install_pkg_install_ports_build() {
3229
	local PORTDIRPFSA
3230
	local PORTNAME
3231
	local _PORTNAME
3232
	local BUILT_PKGNAME
3233

    
3234
	PORTDIRPFSA="$1"
3235

    
3236
	# XXX: Maybe remove this code as its already done above!
3237
	PORTNAME="`basename $PORTDIRPFSA`"
3238
	if [ "$PORTNAME" = "" ]; then
3239
		echo ">>> ERROR: PORTNAME is blank.  Cannot continue."
3240
		print_error_pfS
3241
		kill $$
3242
	fi
3243

    
3244
	if [ -d $pfSPORTS_BASE_DIR/${PORTNAME} ]; then
3245
		echo -n ">>> Overlaying port $PORTNAME from pfPorts..."
3246
		# Cleanup to avoid issues with extra/different patches
3247
		rm -rf $PORTDIRPFSA/*
3248
		cp -R $pfSPORTS_BASE_DIR/${PORTNAME}/* $PORTDIRPFSA
3249
		echo "Done!"
3250
	fi
3251
	ALREADYBUILT="${BUILDER_LOGS}/pfPorts/install_pkg_install_ports"
3252
	BUILT_PKGNAME="`make -C $PORTDIRPFSA -V PKGNAME`"
3253
	if [ ! -f $ALREADYBUILT/$BUILT_PKGNAME ]; then
3254

    
3255
		# Install the required port for the build environment
3256
                for EXTRAPORT in `cd $PORTDIRPFSA && make build-depends-list | sort | uniq | xargs /bin/echo -n `; do
3257
                        _PORTNAME="`basename $EXTRAPORT`"
3258
                        if [ "$_PORTNAME" = "" ]; then
3259
                                echo ">>> ERROR: _PORTNAME is blank.  Cannot continue."
3260
                                print_error_pfS
3261
                                kill $$
3262
                        fi
3263
                        if [ -d $pfSPORTS_BASE_DIR/${_PORTNAME} ]; then
3264
                                echo -n ">>> Overlaying port $PORTNAME from pfPorts..."
3265
                                # Cleanup to avoid issues with extra/different patches
3266
                                rm -rf $EXTRAPORT/*
3267
                                cp -R $pfSPORTS_BASE_DIR/${_PORTNAME}/* $EXTRAPORT
3268
                                echo "Done!"
3269
                        fi
3270
                        _BUILT_PKGNAME="`make -C $EXTRAPORT -V PKGNAME`"
3271
			${PKG_QUERY} $_BUILT_PKGNAME
3272
			if [ $? -ne 0 ]; then
3273
				echo -n ">>> Building port $_PORTNAME($_BUILT_PKGNAME) as build dependency of ($PORTNAME)..."
3274
				script ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt env -u TARGET -u TARGET_ARCH make -C $EXTRAPORT $PKG_INSTALL_PFSMAKEENV WITHOUT="X11 DOCS EXAMPLES MAN INFO SDL" BATCH=yes FORCE_PKG_REGISTER=yes clean install clean 2>&1 1>/dev/null || true 2>&1 >/dev/null
3275
				if [ "$?" != "0" ]; then
3276
					echo
3277
					echo
3278
					echo "!!! Something went wrong while building ${EXTRAPORT}"
3279
					echo "    Press RETURN/ENTER to view the log from this build."
3280
					read inputline
3281
					more ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
3282
				else
3283
					echo "Done!"
3284
				fi
3285
			else
3286
				echo ">>> Port ${EXTRAPORT}($_BUILT_PKGNAME) as build dependency of ($PORTNAME)...already installed...skipping."
3287
			fi
3288
                done
3289
                        
3290
                # Package up what's needed to execute and run
3291
                for EXTRAPORT in `cd $PORTDIRPFSA && make run-depends-list | sort | uniq | xargs /bin/echo -n `; do
3292
                        _PORTNAME="`basename $EXTRAPORT`"
3293
                        if [ "$_PORTNAME" = "" ]; then
3294
                                echo ">>> ERROR: Run list _PORTNAME is blank.  Cannot continue."
3295
                                print_error_pfS
3296
                                kill $$
3297
                        fi
3298
                        if [ -d $pfSPORTS_BASE_DIR/${_PORTNAME} ]; then
3299
                                echo -n ">>> Overlaying port $_PORTNAME from pfPorts..."
3300
                                # Cleanup to avoid issues with extra/different patches
3301
                                rm -rf $EXTRAPORT/*
3302
                                cp -R $pfSPORTS_BASE_DIR/${_PORTNAME}/* $EXTRAPORT
3303
                                echo "Done!"
3304
                        fi
3305
                        install_pkg_install_ports_build $EXTRAPORT
3306
                        _BUILT_PKGNAME="`make -C $EXTRAPORT -V PKGNAME`"
3307
			echo ">>> Building port $_PORTNAME($_BUILT_PKGNAME) as runtime dependency of ($PORTNAME)...Done!"
3308
                done
3309

    
3310
		echo -n ">>> Building package $PORTNAME($BUILT_PKGNAME)..."
3311
		if [ -f /usr/ports/packages/Old/${BUILT_PKGNAME}.tbz ]; then
3312
			echo -n " Using already built port found in cache... "
3313
			cp -R /usr/ports/packages/Old/${BUILT_PKGNAME}.tbz \
3314
				/usr/ports/packages/All/
3315
			touch $ALREADYBUILT/$BUILT_PKGNAME
3316
			echo "Done!"
3317
			return;
3318
		fi
3319

    
3320
		script ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt env -u TARGET -u TARGET_ARCH make -C $PORTDIRPFSA ${MAKEJ_PORTS} $PKG_INSTALL_PFSMAKEENV WITHOUT="X11 DOCS EXAMPLES MAN INFO SDL LATEST_LINK" BATCH=yes FORCE_PKG_REGISTER=yes clean install clean 2>&1 1>/dev/null || true 2>&1 >/dev/null
3321
		if [ "$?" != "0" ]; then
3322
			echo
3323
			echo
3324
			echo "!!! Something went wrong while building ${PORTNAME}"
3325
			echo "    Press RETURN/ENTER to view the log from this build."
3326
			read inputline
3327
			more {$BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
3328
		fi
3329

    
3330
		if [ ${FREEBSD_VERSION} -gt 9 ]; then
3331
			script -a ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt pkg create -f tbz -o $PFS_PKG_ALL $BUILT_PKGNAME 
3332
		else
3333
			script -a ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt pkg_create -b $BUILT_PKGNAME $PFS_PKG_ALL/${BUILT_PKGNAME}.tbz
3334
		fi
3335
		if [ "$?" != "0" ]; then
3336
			echo
3337
			echo
3338
			echo "!!! Something went wrong while building package($BUILT_PKGNAME) for ${PORTNAME}"
3339
			echo "    Press RETURN/ENTER to view the log from this build."
3340
			read inputline
3341
			more ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
3342
		fi
3343
		echo "Done!"
3344
	fi
3345
	touch $ALREADYBUILT/$BUILT_PKGNAME
3346
}
3347

    
3348
staginareas_clean_each_run() {
3349
	if [ -f ${PFSPKGFILE} ]; then
3350
		rm -f ${PFSPKGFILE}
3351
	fi
3352
	echo -n ">>> Cleaning build directories: "
3353
	if [ -d "${PFSENSEISODIR}" ]; then
3354
		BASENAME=`basename ${PFSENSEISODIR}`
3355
		echo -n "$BASENAME "
3356
		chflags -R noschg ${PFSENSEISODIR} 2>&1 >/dev/null
3357
		rm -rf ${PFSENSEISODIR} 2>/dev/null
3358
	fi
3359
	echo "Done!"
3360
}
3361

    
3362
# Imported from FreeSBIE
3363
buildkernel() {
3364
	if [ -n "${NO_BUILDKERNEL:-}" ]; then
3365
	    echo ">>> NO_BUILDKERNEL set, skipping build" | tee -a ${LOGFILE}
3366
	    return
3367
	fi
3368

    
3369
	if [ -z "${KERNCONF:-}" ]; then
3370
		echo ">>> ERROR: No kernel configuration defined probably this is not what you want! STOPPING!" | tee -a ${LOGFILE}
3371
		print_error_pfS
3372
		kill $$
3373
	fi
3374

    
3375
	if [ -n "${KERNELCONF:-}" ]; then
3376
	    export KERNCONFDIR=$(dirname ${KERNELCONF})
3377
	    export KERNCONF=$(basename ${KERNELCONF})
3378
	fi
3379

    
3380
	SRCCONFBASENAME=`basename ${SRC_CONF}`
3381
	echo ">>> KERNCONFDIR: ${KERNCONFDIR}"
3382
	echo ">>> ARCH:        ${TARGET}"
3383
	echo ">>> SRC_CONF:    ${SRCCONFBASENAME}"
3384

    
3385
	makeargs="${MAKEOPT:-} ${MAKEJ_KERNEL:-} SRCCONF=${SRC_CONF} TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET}"
3386
	echo ">>> Builder is running the command: env $MAKE_CONF script -aq $LOGFILE make $makeargs buildkernel KERNCONF=${KERNCONF} NO_KERNELCLEAN=yo" | tee -a $LOGFILE
3387
	(cd $SRCDIR; env $MAKE_CONF script -q $LOGFILE make $makeargs buildkernel KERNCONF=${KERNCONF} NO_KERNELCLEAN=yo || print_error_pfS;) | egrep '^>>>'
3388
	cd $BUILDER_SCRIPTS
3389

    
3390
}
3391

    
3392
# Imported from FreeSBIE
3393
installkernel() {
3394
	if [ -z "${KERNCONF:-}" ]; then
3395
		echo ">>> ERROR: No kernel configuration defined probably this is not what you want! STOPPING!" | tee -a ${LOGFILE}
3396
		print_error_pfS
3397
		kill $$
3398
	fi
3399

    
3400
	if [ -n "${KERNELCONF:-}" ]; then
3401
	    export KERNCONFDIR=$(dirname ${KERNELCONF})
3402
	    export KERNCONF=$(basename ${KERNELCONF})
3403
	fi
3404

    
3405
	mkdir -p ${PFSENSESTAGEDIR}/boot
3406
	makeargs="${MAKEOPT:-} ${MAKEJ_KERNEL:-} SRCCONF=${SRC_CONF} TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET} DESTDIR=${KERNEL_DESTDIR}"
3407
	echo ">>> Builder is running the command: env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} installkernel KERNCONF=${KERNCONF}"  | tee -a $LOGFILE
3408
	cd ${SRCDIR}
3409
	(cd $SRCDIR; env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} installkernel KERNCONF=${KERNCONF} || print_error_pfS;) | egrep '^>>>'
3410
	gzip -f9 $KERNEL_DESTDIR/boot/kernel/kernel
3411
	cd $BUILDER_SCRIPTS
3412
}
3413

    
3414
# Launch is ran first to setup a few variables that we need
3415
# Imported from FreeSBIE
3416
launch() {
3417

    
3418
	if [ ! -f $SCRATCHDIR/pfSense_builder_set_time ]; then
3419
		echo ">>> Updating system clock..."
3420
		ntpdate 0.pfsense.pool.ntp.org
3421
		touch $SCRATCHDIR/pfSense_builder_set_time
3422
	fi
3423

    
3424
	if [ "`id -u`" != "0" ]; then
3425
	    echo "Sorry, this must be done as root."
3426
	    kill $$
3427
	fi
3428

    
3429
	echo ">>> Operation $0 has started at `date`"
3430
}
3431

    
3432
finish() {
3433
	echo ">>> Operation $0 has ended at `date`"
3434
	killall -9 check_reload_status 2>/dev/null
3435
}
3436

    
(3-3/7)