Projet

Général

Profil

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

univnautes-tools / builder_scripts / builder_common.sh @ d4a5c43c

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 runinng $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 prexsisting 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 prexsisting 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
		fi
285

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

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

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

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

    
304
		SRC_CONF=${OSRC_CONF}
305

    
306
		ensure_kernel_exists $KERNEL_DESTDIR
307

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

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

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

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

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

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

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

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

    
370
	unset KERNEL_NAME
371
}
372

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

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

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

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

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

    
399
		PFPORTSBASENAME=$(basename ${USE_PORTS_FILE})
400

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

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

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

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

    
441
		export FORCE_PKG_REGISTER=yo
442
		export BATCH=yo
443
		export DISABLE_VULNERABILITIES=yo
444

    
445
		echo ">>> Executing $PFPORTSBASENAME"
446

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

    
458
		handle_tools_stats_crypto
459

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
666
	mkdir -p ${PFSENSEISODIR}/home
667
	mkdir -p ${PFSENSEISODIR}/lib
668

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

    
676
	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"
677

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

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

    
686
	# Set buildtime
687
	get_date_string
688

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

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

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

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

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

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

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

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

    
816
	# create diskless marker file
817
	touch ${PFSENSEISODIR}/etc/diskless
818
	touch ${PFSENSEISODIR}/nanobuild
819

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

    
823
	echo "" > $PFSENSEISODIR/etc/motd
824

    
825
	mkdir -p $PFSENSEISODIR/cf/conf/backup
826

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

    
829
	echo "nanobsd" > $PFSENSEISODIR/etc/platform
830

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

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

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

    
845
	unset _NANO_WITH_VGA
846
	unset _FLASH_SIZE
847
}
848

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

    
857
	# We might need to setup php.ini
858
	if test -f "/boot/kernel/ng_socket.ko" && !(kldstat -m ng_socket 2>&1 1>/dev/null); then
859
		echo ">>> Loading ng_socket.ko needed for testing php." | tee -a ${LOGFILE}
860
		kldload -v /boot/kernel/ng_socket.ko 2>/dev/null
861
		if [ $? -ne 0 ]; then
862
			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}
863
			print_error_pfS
864
		fi
865
	fi
866

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
993
	OLDPWD=`pwd`
994

    
995
	customize_stagearea_for_image "fullupdate"
996
	install_default_kernel ${DEFAULT_KERNEL}
997

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

    
1014

    
1015
	mkdir -p ${PFSENSEISODIR}/usr/local/livefs/lib/
1016

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

    
1020
	cd $OLDPWD
1021
	unset OLDPWD
1022
}
1023

    
1024
# Does the work of checking out the specific branch of pfSense
1025
checkout_pfSense_git() {
1026

    
1027
	mkdir -p ${GIT_REPO_DIR}/pfSenseGITREPO
1028

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

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

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

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

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

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

    
1077
# Outputs various set variables aka env
1078
print_flags() {
1079

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

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

    
1133
	OLDPWD=`pwd`
1134

    
1135
	echo ">>> Using GIT to checkout ${PFSENSETAG}"
1136
	echo -n ">>> "
1137

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

    
1170
	cd $OLDPWD
1171
	unset OLDPWD
1172
}
1173

    
1174
# This builds FreeBSD (make buildworld)
1175
# Imported from FreeSBIE
1176
make_world() {
1177

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

    
1184
	export MAKE_CONF="__MAKE_CONF=$MAKE_CONF"
1185

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

    
1192
	# Check if the world and kernel are already built and set
1193
	# the NO variables accordingly
1194
	if [ -d "${MAKEOBJDIRPREFIX}" ]; then
1195
		ISINSTALLED=`find ${MAKEOBJDIRPREFIX}/ -name init | wc -l`
1196
		if [ "$ISINSTALLED" -gt 0 ]; then
1197
			export MAKE_CONF="${MAKE_CONF} NO_CLEAN=yes"
1198
		fi
1199
	fi
1200

    
1201
	if [ -z "${TARGET}" -o "${BUILDER_HOST_TARGET}" = "${TARGET}" ]; then
1202
		export MAKE_CONF="${MAKE_CONF} WITHOUT_CROSS_COMPILER=yes"
1203
	else
1204
		if [ -f ${MAKEOBJDIRPREFIX}/${TARGET}.${TARGET_ARCH}/${SRCDIR}/tmp/usr/bin/cc ]; then
1205
			export MAKE_CONF="${MAKE_CONF} NO_CLEAN=yes "
1206
		fi
1207
		if [ "${TARGET}" = "mips" ]; then
1208
                        MAKEJ_WORLD=""
1209
                fi
1210
		echo "** --------------------------------------------- ***"
1211
		echo ">>> Cross compiling settings defined building environment." | tee -a ${LOGFILE}
1212
		echo ">>> Building toolchain for ${TARGET} architecture... (Starting - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1213
		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}
1214
		if [ -z "${NO_BUILDTOOLCHAIN}" ]; then
1215
			(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}
1216
			cd $BUILDER_SCRIPTS
1217
			echo ">>> Building toolchain for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1218
		else
1219
			echo ">>> NO_BUILDTOOLCHAIN set SKIPPING - Building toolchain for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1220
		fi
1221

    
1222
		echo ">>> Building kernel-toolchain for ${TARGET} architecture... (Starting - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1223
		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}
1224
		if [ -z "${NO_BUILDTOOLCHAIN}" ]; then
1225
			(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}
1226
		cd $BUILDER_SCRIPTS
1227
			echo ">>> Building kernel-toolchain for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1228
		else
1229
			echo ">>> NO_BUILDTOOLCHAIN set SKIPPING - Building kernel-toolchain for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
1230
		fi
1231
		echo "** --------------------------------------------- ***"
1232
	fi
1233

    
1234
	# Set SRC_CONF variable if it's not already set.
1235
	if [ -z "${SRC_CONF:-}" ]; then
1236
		echo ">>> SRC_CONF is unset make sure this is what you want!" | tee -a ${LOGFILE}
1237
	else
1238
		echo ">>> Setting SRC_CONF to $SRC_CONF" | tee -a ${LOGFILE}
1239
	fi
1240

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

    
1250
	OSRC_CONF=${SRC_CONF}
1251
	if [ -n "${SRC_CONF_INSTALL:-}" ]; then
1252
		export SRC_CONF=$SRC_CONF_INSTALL
1253
	fi
1254

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

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

    
1275
	unset MAKE_CONF
1276
	unset makeargs
1277

    
1278
	SRC_CONF=${OSRC_CONF}
1279
}
1280

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

    
1456
pprint() {
1457
	echo $2 >> $BUILDER_LOGS/nanobsd_cmds.sh
1458
}
1459

    
1460
create_mips_diskimage()
1461
{
1462
	echo ">>> building NanoBSD disk image (mips)..."
1463
	echo ">>> Log file can be found in $BUILDER_LOGS/nanobsd_cmds.sh"
1464
	echo "`date`" > $BUILDER_LOGS/nanobsd_cmds.sh
1465

    
1466
	NANO_MAKEFS="makefs -B big -o bsize=4096,fsize=512,density=8192,optimization=space"
1467
	NANO_MD_BACKING="file"
1468
	NANO_BOOTLOADER="boot/boot0sio"
1469
	NANO_WORLDDIR=${PFSENSEISODIR}/
1470
	NANO_CFGDIR=${PFSENSEISODIR}/cf
1471

    
1472
	pprint 2 "build diskimage"
1473
	pprint 3 "log: ${MAKEOBJDIRPREFIXFINAL}/_.di"
1474
	pprint 2 "NANO_MEDIASIZE:	$NANO_MEDIASIZE"
1475
	pprint 2 "NANO_IMAGES:		$NANO_IMAGES"
1476
	pprint 2 "NANO_SECTS:		$NANO_SECTS"
1477
	pprint 2 "NANO_HEADS:		$NANO_HEADS"
1478
	pprint 2 "NANO_CODESIZE:	$NANO_CODESIZE"
1479
	pprint 2 "NANO_CONFSIZE:	$NANO_CONFSIZE"
1480
	pprint 2 "NANO_DATASIZE:	$NANO_DATASIZE"
1481

    
1482
	echo $NANO_MEDIASIZE \
1483
		$NANO_IMAGES \
1484
		$NANO_SECTS \
1485
		$NANO_HEADS \
1486
		$NANO_CODESIZE \
1487
		$NANO_CONFSIZE \
1488
		$NANO_DATASIZE |
1489
awk '
1490
{
1491
	printf "# %s\n", $0
1492

    
1493
	# size of cylinder in sectors
1494
	cs = $3 * $4
1495

    
1496
	# number of full cylinders on media
1497
	cyl = int ($1 / cs)
1498

    
1499
	# output fdisk geometry spec, truncate cyls to 1023
1500
	if (cyl <= 1023)
1501
		print "g c" cyl " h" $4 " s" $3
1502
	else
1503
		print "g c" 1023 " h" $4 " s" $3
1504

    
1505
	if ($7 > 0) {
1506
		# size of data partition in full cylinders
1507
		dsl = int (($7 + cs - 1) / cs)
1508
	} else {
1509
		dsl = 0;
1510
	}
1511

    
1512
	# size of config partition in full cylinders
1513
	csl = int (($6 + cs - 1) / cs)
1514

    
1515
	if ($5 == 0) {
1516
		# size of image partition(s) in full cylinders
1517
		isl = int ((cyl - dsl - csl) / $2)
1518
	} else {
1519
		isl = int (($5 + cs - 1) / cs)
1520
	}
1521

    
1522
	# First image partition start at second track
1523
	print "p 1 165 " $3, isl * cs - $3
1524
	c = isl * cs;
1525

    
1526
	# Second image partition (if any) also starts offset one
1527
	# track to keep them identical.
1528
	if ($2 > 1) {
1529
		print "p 2 165 " $3 + c, isl * cs - $3
1530
		c += isl * cs;
1531
	}
1532

    
1533
	# Config partition starts at cylinder boundary.
1534
	print "p 3 165 " c, csl * cs
1535
	c += csl * cs
1536

    
1537
	# Data partition (if any) starts at cylinder boundary.
1538
	if ($7 > 0) {
1539
		print "p 4 165 " c, dsl * cs
1540
	} else if ($7 < 0 && $1 > c) {
1541
		print "p 4 165 " c, $1 - c
1542
	} else if ($1 < c) {
1543
		print "Disk space overcommitted by", \
1544
		    c - $1, "sectors" > "/dev/stderr"
1545
		exit 2
1546
	}
1547

    
1548
	# Force slice 1 to be marked active. This is necessary
1549
	# for booting the image from a USB device to work.
1550
	print "a 1"
1551
}
1552
	' > ${MAKEOBJDIRPREFIXFINAL}/_.fdisk
1553

    
1554
	pprint 2 "${MAKEOBJDIRPREFIXFINAL}/_.fdisk"
1555
	pprint 2 "`cat ${MAKEOBJDIRPREFIXFINAL}/_.fdisk`"
1556

    
1557
	IMG=${MAKEOBJDIRPREFIXFINAL}/nanobsd.full.img
1558
	BS=${NANO_SECTS}b
1559

    
1560
	if [ "${NANO_MD_BACKING}" = "swap" ] ; then
1561
		pprint 2 "Creating swap backing file ..."
1562
		MD=`mdconfig -a -t swap -s ${NANO_MEDIASIZE} -x ${NANO_SECTS} -y ${NANO_HEADS}`
1563
		pprint 2 "mdconfig -a -t swap -s ${NANO_MEDIASIZE} -x ${NANO_SECTS} -y ${NANO_HEADS}"
1564
	else
1565
		pprint 2 "Creating md backing file ${IMG} ..."
1566
		_c=`expr ${NANO_MEDIASIZE} / ${NANO_SECTS}`
1567
		pprint 2 "dd if=/dev/zero of=${IMG} bs=${BS} count=0 seek=${_c}"
1568
		dd if=/dev/zero of=${IMG} bs=${BS} count=0 seek=${_c}
1569
		pprint 2 "mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} -y ${NANO_HEADS}"
1570
		MD=`mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} -y ${NANO_HEADS}`
1571
	fi
1572

    
1573
	trap "mdconfig -d -u $MD" 1 2 15 EXIT
1574

    
1575
	pprint 2 "Write partition table ${MAKEOBJDIRPREFIXFINAL}/_.fdisk ..."
1576
	FDISK=${MAKEOBJDIRPREFIXFINAL}/_.fdisk
1577
	pprint 2 "fdisk -i -f ${FDISK} ${MD}"
1578
	fdisk -i -f ${FDISK} ${MD}
1579
	pprint 2 "fdisk ${MD}"
1580
	fdisk ${MD}
1581

    
1582
	# Create first image
1583
	IMG1=${MAKEOBJDIRPREFIXFINAL}/_.disk.image1
1584
	pprint 2 "Create first image ${IMG1} ..."
1585
	SIZE=`awk '/^p 1/ { print $5 "b" }' ${FDISK}`
1586
	pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${IMG1} ${NANO_WORLDDIR}"
1587
	${NANO_MAKEFS} -s ${SIZE} ${IMG1} ${NANO_WORLDDIR}
1588
	pprint 2 "dd if=${IMG1} of=/dev/${MD}s1 bs=${BS}"
1589
	dd if=${IMG1} of=/dev/${MD}s1 bs=${BS}
1590
	pprint 2 "tunefs -L pfsense0 /dev/${MD}s1"
1591
	tunefs -L pfsense0 /dev/${MD}s1
1592

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

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

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

    
1644
	if [ "${NANO_MD_BACKING}" = "swap" ] ; then
1645
		pprint 2 "Writing out ${IMG}..."
1646
		dd if=/dev/${MD} of=${IMG} bs=${BS}
1647
	fi
1648

    
1649
	pprint 2 "IMG1:             $IMG1"
1650
	pprint 2 "IMG2:             $IMG2"
1651
	pprint 2 "`date`"
1652
	pprint 2 "Full disk:         ${IMG}"
1653
	pprint 2 "Primary partition: ${IMG1}"
1654
	test "${IMG2}" && pprint 2 "2ndary partition:  ${IMG2}"
1655
	test "${CFG}" &&  pprint 2 "/cfg partition:    ${CFG}"
1656
	test "${DATA}" && pprint 2 "/data partition:   ${DATA}"
1657

    
1658
	#) > ${MAKEOBJDIRPREFIXFINAL}/_.di 2>&1
1659

    
1660
}
1661

    
1662
# This routine originated in nanobsd.sh
1663
create_nanobsd_diskimage () {
1664
	if [ -z "${1}" ]; then
1665
		echo ">>> ERROR: Type of image has not been specified"
1666
		print_error_pfS
1667
	fi
1668
	if [ -z "${2}" ]; then
1669
		echo ">>> ERROR: Size of image has not been specified"
1670
		print_error_pfS
1671
	fi
1672

    
1673
	if [ "${1}" = "nanobsd" ]; then
1674
		# It's serial
1675
		export NANO_BOOTLOADER="boot/boot0sio"
1676
	elif [ "${1}" = "nanobsd-vga" ]; then
1677
		# It's vga
1678
		export NANO_BOOTLOADER="boot/boot0"
1679
	else
1680
		echo ">>> ERROR: Type of image to create unkown"
1681
		print_error_pfS
1682
	fi
1683

    
1684
	if [ -z "${2}" ]; then
1685
		echo ">>> ERROR: Media size(s) not specified."
1686
		print_error_pfS
1687
	fi
1688

    
1689
	if [ -z "${FLASH_MODEL}" -o -z "${2}" ]; then
1690
		echo ">>> ERROR: either FLASH_MODEL=${FLASH_MODEL} or FLASH_SIZE=${2} is not set."
1691
		print_error_pfS
1692
	fi
1693

    
1694
	LOGFILE=${BUILDER_LOGS}/${1}.${TARGET}
1695
	# Prepare folder to be put in image
1696
	customize_stagearea_for_image "${1}"
1697
	install_default_kernel ${DEFAULT_KERNEL} "no"
1698

    
1699
	# Must be run after customize_stagearea_for_image
1700
	cust_fixup_nanobsd ${1} $NANO_MEDIASIZE
1701

    
1702
	for _NANO_MEDIASIZE in ${2}; do
1703
		if [ -z "${_NANO_MEDIASIZE}" ]; then
1704
			continue;
1705
		fi
1706

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

    
1710
		IMG="${MAKEOBJDIRPREFIXFINAL}/${PRODUCT_NAME}-${PFSENSE_VERSION}-${_NANO_MEDIASIZE}-${TARGET}-${1}-${DATESTRING}.img"
1711
		IMGUPDATE="${MAKEOBJDIRPREFIXFINAL}/${PRODUCT_NAME}-${PFSENSE_VERSION}-${_NANO_MEDIASIZE}-${TARGET}-${1}-upgrade-${DATESTRING}.img"
1712

    
1713
		FlashDevice ${FLASH_MODEL} ${_NANO_MEDIASIZE}
1714

    
1715
		# These are defined in FlashDevice and on builder_default.sh
1716
		echo $NANO_MEDIASIZE \
1717
			$NANO_IMAGES \
1718
			$NANO_SECTS \
1719
			$NANO_HEADS \
1720
			$NANO_CODESIZE \
1721
			$NANO_CONFSIZE \
1722
			$NANO_DATASIZE |
1723
awk '
1724
{
1725
	printf "# %s\n", $0
1726

    
1727
	# size of cylinder in sectors
1728
	cs = $3 * $4
1729

    
1730
	# number of full cylinders on media
1731
	cyl = int ($1 / cs)
1732

    
1733
	# output fdisk geometry spec, truncate cyls to 1023
1734
	if (cyl <= 1023)
1735
		print "g c" cyl " h" $4 " s" $3
1736
	else
1737
		print "g c" 1023 " h" $4 " s" $3
1738

    
1739
	if ($7 > 0) {
1740
		# size of data partition in full cylinders
1741
		dsl = int (($7 + cs - 1) / cs)
1742
	} else {
1743
		dsl = 0;
1744
	}
1745

    
1746
	# size of config partition in full cylinders
1747
	csl = int (($6 + cs - 1) / cs)
1748

    
1749
	if ($5 == 0) {
1750
		# size of image partition(s) in full cylinders
1751
		isl = int ((cyl - dsl - csl) / $2)
1752
	} else {
1753
		isl = int (($5 + cs - 1) / cs)
1754
	}
1755

    
1756
	# First image partition start at second track
1757
	print "p 1 165 " $3, isl * cs - $3
1758
	c = isl * cs;
1759

    
1760
	# Second image partition (if any) also starts offset one
1761
	# track to keep them identical.
1762
	if ($2 > 1) {
1763
		print "p 2 165 " $3 + c, isl * cs - $3
1764
		c += isl * cs;
1765
	}
1766

    
1767
	# Config partition starts at cylinder boundary.
1768
	print "p 3 165 " c, csl * cs
1769
	c += csl * cs
1770

    
1771
	# Data partition (if any) starts at cylinder boundary.
1772
	if ($7 > 0) {
1773
		print "p 4 165 " c, dsl * cs
1774
	} else if ($7 < 0 && $1 > c) {
1775
		print "p 4 165 " c, $1 - c
1776
	} else if ($1 < c) {
1777
		print "Disk space overcommitted by", \
1778
		    c - $1, "sectors" > "/dev/stderr"
1779
		exit 2
1780
	}
1781

    
1782
	# Force slice 1 to be marked active. This is necessary
1783
	# for booting the image from a USB device to work.
1784
	print "a 1"
1785
}
1786
	' > ${MAKEOBJDIRPREFIXFINAL}/_.fdisk
1787

    
1788
		MNT=${MAKEOBJDIRPREFIXFINAL}/_.mnt
1789
		mkdir -p ${MNT}
1790

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

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

    
1797
		fdisk -i -f ${MAKEOBJDIRPREFIXFINAL}/_.fdisk ${MD} 2>&1 >> ${LOGFILE}
1798
		fdisk ${MD} 2>&1 >> ${LOGFILE}
1799

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

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

    
1815
		clone_directory_contents ${PFSENSEISODIR} ${MNT}
1816

    
1817
		# Set NanoBSD image size
1818
		echo "${_NANO_MEDIASIZE}" > ${MNT}/etc/nanosize.txt
1819
		rm -f $MNT/conf.default/config.xml 2>/dev/null
1820
		rm -f $MNT/cf/conf/* 2>/dev/null
1821

    
1822
		echo "/dev/ufs/pfsense0 / ufs ro,sync,noatime 1 1" > ${MNT}/etc/fstab
1823
		if [ $NANO_CONFSIZE -gt 0 ] ; then
1824
			echo "/dev/ufs/cf /cf ufs ro,sync,noatime 1 1" >> ${MNT}/etc/fstab
1825
		fi
1826

    
1827
		umount ${MNT}
1828
		sync
1829
		# Restore the original trap
1830
		trap "mdconfig -d -u ${MD}; return" 1 2 15 EXIT
1831

    
1832
		# Setting NANO_IMAGES to 1 and NANO_INIT_IMG2 will tell
1833
		# NanoBSD to only create one partition.  We default to 2
1834
		# partitions in case anything happens to the first the
1835
		# operator can boot from the 2nd and should be OK.
1836

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

    
1855
			# Set NanoBSD image size
1856
			echo "${_NANO_MEDIASIZE}" > ${MNT}/etc/nanosize.txt
1857

    
1858
			echo "/dev/ufs/pfsense1 / ufs ro,sync,noatime 1 1" > ${MNT}/etc/fstab
1859
			if [ $NANO_CONFSIZE -gt 0 ] ; then
1860
				echo "/dev/ufs/cf /cf ufs ro,sync,noatime 1 1" >> ${MNT}/etc/fstab
1861
			fi
1862

    
1863
			umount ${MNT}
1864
			# Restore the trap back
1865
			trap "mdconfig -d -u ${MD}; return" 1 2 15 EXIT
1866
		fi
1867

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

    
1887
			clone_directory_contents ${PFSENSEISODIR}/cf ${MNT}
1888

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

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

    
1899
		mdconfig -d -u $MD
1900
		# Restore default action
1901
		trap "-" 1 2 15 EXIT
1902

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

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

    
1923
		gzip -f $IMG &
1924
		gzip -f $IMGUPDATE &
1925
	done
1926

    
1927
	unset IMG
1928
	unset IMGUPDATE
1929
	unset IMGUPDATESIZE
1930
	unset IMGSIZE
1931

    
1932
	ls -lah $MAKEOBJDIRPREFIXFINAL
1933
}
1934

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

    
1951
	LOGFILE=${BUILDER_LOGS}/ova.${TARGET}.log
1952

    
1953
	# Prepare folder to be put in image
1954
	export PKG_INSTALL_PORTSPFS="${PKG_INSTALL_PORTSPFS} /usr/ports/emulators/open-vm-tools-nox11"
1955
	customize_stagearea_for_image "ova"
1956
	install_default_kernel ${DEFAULT_KERNEL}
1957

    
1958
	ova_prereq_check
1959
	ova_remove_old_tmp_files
1960
	ova_setup_ovf_file
1961
	ova_create_raw_backed_file
1962
	/bin/echo -n ">>> Creating mdconfig image ${OVFPATH}/${OVFVMDK}.raw... " | tee -a ${LOGFILE}
1963
	MD=`mdconfig -a -t vnode -f ${OVFPATH}/${OVFVMDK}.raw`
1964
	# Just in case
1965
	trap "mdconfig -d -u ${MD}" 1 2 15 EXIT
1966

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

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

    
2020
# called from create_ova_image
2021
ova_umount_mnt() {
2022
	# Unmount /dev/mdX
2023
	umount /mnt
2024
	sync ; sync
2025
}
2026

    
2027
# called from create_ova_image
2028
ova_umount_mdconfig() {
2029
	MD=$1
2030
	# Show gpart info
2031
	gpart show $MD	
2032
	echo ">>> Unmounting ${MD}..." | tee -a ${LOGFILE}
2033
	mdconfig -d -u $MD
2034
	sync ; sync
2035
}
2036

    
2037
# called from create_ova_image
2038
ova_mount_mnt() {
2039
	MD=$1
2040
	echo ">>> Mounting image to /mnt..." | tee -a ${LOGFILE}
2041
	mount -o rw /dev/${MD}p2 /mnt/
2042
}
2043

    
2044
# called from create_ova_image
2045
ova_setup_ovf_file() {
2046
	if [ -f ${OVFFILE} ]; then
2047
		cp ${OVFFILE} ${OVFPATH}/${PRODUCT_NAME}.ovf
2048
	fi
2049
		
2050
	if [ ! -f ${OVFPATH}/${PRODUCT_NAME}.ovf ]; then
2051
		cp ${BUILDER_SCRIPTS}/conf/ovf/pfSense.ovf ${OVFPATH}/${PRODUCT_NAME}.ovf
2052
		file_search_replace PFSENSE_VERSION $PFSENSE_VERSION ${OVFPATH}/${PRODUCT_NAME}.ovf
2053
	fi
2054
}
2055

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

    
2065
disable_lan_disable_dhcpd_enable_sshd() {
2066
	if [ "${TARGET}" != "${BUILDER_HOST_TARGET}" ]; then
2067
		echo ">>> ERROR: Cannot perform the modifications since cross compiling!" | tee -a ${LOGFILE}
2068
		print_error_pfS
2069
	fi
2070

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

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

    
2121
# called from create_ova_image
2122
ova_calculate_mnt_size() {
2123
	/bin/echo -n ">>> Calculating size of /mnt..." | tee -a ${LOFGILE}
2124
	INSTALLSIZE=`du -s /mnt/ | awk '{ print $1 }'`
2125
	INSTALLSIZEH=`du -d0 -h /mnt/ | awk '{ print $1 }'`
2126
	echo $INSTALLSIZEH
2127
}
2128

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

    
2139
# called from create_ova_image
2140
ova_remove_old_tmp_files() {
2141
	rm ${OVFPATH}/*.ovf.final 2>/dev/null
2142
	rm ${OVFPATH}/*.ova 2>/dev/null	
2143
}
2144

    
2145
# called from create_ova_image
2146
ova_set_default_network_interfaces() {
2147
	echo ">>> Setting default interfaces to em0 and em1 in config.xml..." | tee -a ${LOGFILE}
2148
	file_search_replace vr0 em0 ${PFSENSEISODIR}/conf.default/config.xml
2149
	file_search_replace vr1 em1 ${PFSENSEISODIR}/conf.default/config.xml
2150
}
2151

    
2152
# called from create_ova_image
2153
ova_create_vbox_image() {
2154
	# VirtualBox
2155
	echo ">>> Creating image using qemu-img..." | tee -a ${LOGFILE}
2156
	rm ${OVFPATH}/${OVFVMDK} 2>/dev/null
2157
	qemu-img convert -f raw -O vmdk ${OVFPATH}/${OVFVMDK}.raw ${OVFPATH}/${OVFVMDK}
2158
	rm -rf ${OVFPATH}/${OVFVMDK}.raw
2159
	echo ">>> ${OVFPATH}/${OVFVMDK} created." | tee -a ${LOGFILE}
2160
}
2161

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

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

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

    
2222
# called from create_ova_image
2223
# This routine will replace a string in a file
2224
file_search_replace() {
2225
	SEARCH=$1
2226
	REPLACE=$2
2227
	FILENAME=$3
2228
	sed "s/${SEARCH}/${REPLACE}/g" $3 > $FILENAME.$$
2229
	mv $FILENAME.$$ $FILENAME
2230
}
2231

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

    
2239
	if [ "${TARGET}" != "${BUILDER_HOST_TARGET}" ]; then
2240
		echo ">>> WARNING: Cannot install pfSense packages since cross building!" | tee -a ${LOGFILE}
2241
		return
2242
	fi
2243

    
2244
	if [ ${FREEBSD_VERSION} -ge 10 ]; then
2245
		PFSDESTNAME="pkgnginstall.sh"
2246
	else
2247
		PFSDESTNAME="pkginstall.sh"
2248
	fi
2249
	PFSTODIR="${PFSENSEISODIR}"
2250

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

    
2260
		cp ${PFSTODIR}/etc/platform ${PFSTODIR}/tmp/
2261

    
2262
		/sbin/mount -t devfs devfs ${PFSTODIR}/dev
2263

    
2264
		/bin/mkdir -p ${PFSTODIR}/var/etc/
2265
		/bin/cp /etc/resolv.conf ${PFSTODIR}/etc/
2266

    
2267
		/bin/echo ${custom_package_list} > ${PFSTODIR}/tmp/pkgfile.lst
2268

    
2269
		/bin/cp ${BUILDER_TOOLS}/builder_scripts/scripts/pfspkg_installer ${PFSTODIR}/tmp
2270
		/bin/chmod a+x ${PFSTODIR}/tmp/pfspkg_installer
2271

    
2272
		cp ${PFSTODIR}/usr/local/lib/php.ini $SCRATCHDIR
2273
		if [ -f $SCRATCHDIR/php.ini ]; then
2274
			cat $SCRATCHDIR/php.ini | grep -v apc > ${PFSTODIR}/usr/local/lib/php.ini
2275
			cat $SCRATCHDIR/php.ini | grep -v apc > ${PFSTODIR}/usr/local/etc/php.ini
2276
		fi
2277

    
2278
	# setup script that will be run within the chroot env
2279
	/bin/cat > ${PFSTODIR}/${PFSDESTNAME} <<EOF
2280
#!/bin/sh
2281
#
2282
# ------------------------------------------------------------------------
2283
# ATTENTION: !!! This script is supposed to be run within a chroot env !!!
2284
# ------------------------------------------------------------------------
2285
#
2286
#
2287
# Setup
2288
#
2289

    
2290
# Handle php.ini if /etc/rc.php_ini_setup exists
2291
if [ -f "/etc/rc.php_ini_setup" ]; then
2292
	mkdir -p /usr/local/lib/ /usr/local/etc/
2293
	/etc/rc.php_ini_setup 2>/dev/null
2294
	cat /usr/local/etc/php.ini | grep -v apc > /tmp/php.ini.new
2295
	cp /tmp/php.ini.new /usr/local/etc/php.ini 2>/dev/null
2296
	cp /tmp/php.ini.new /usr/local/lib/php.ini 2>/dev/null
2297
fi
2298

    
2299
if [ ! -f "/usr/local/bin/php" ]; then
2300
	echo
2301
	echo
2302
	echo
2303
	echo "ERROR.  A copy of php does not exist in /usr/local/bin/"
2304
	echo
2305
	echo "This script cannot continue."
2306
	echo
2307
	while [ /bin/true ]; do
2308
		sleep 65535
2309
	done
2310
fi
2311

    
2312
if [ ! -f "/COPYRIGHT" ]; then
2313
	echo
2314
	echo
2315
	echo
2316
	echo "ERROR.  Could not detect the correct CHROOT environment (missing /COPYRIGHT)."
2317
	echo
2318
	echo "This script cannot continue."
2319
	echo
2320
	while [ /bin/true ]; do
2321
		sleep 65535
2322
	done
2323
fi
2324

    
2325
# backup original conf dir
2326
if [ -d /conf ]; then
2327
	/bin/mv /conf /conf.org
2328
	/usr/bin/touch /tmp/restore_conf_dir
2329
fi
2330

    
2331
# test whether conf dir is already a symlink
2332
if [ ! -h /conf ]; then
2333
	# install the symlink as it would exist on a live system
2334
	/bin/ln -s /cf/conf /conf 2>/dev/null
2335
	/usr/bin/touch /tmp/remove_conf_symlink
2336
fi
2337

    
2338
# now that we do have the symlink in place create
2339
# a backup dir if necessary.
2340
if [ ! -d /conf/backup ]; then
2341
	/bin/mkdir -p /conf/backup
2342
	/usr/bin/touch /tmp/remove_backup
2343
fi
2344

    
2345
#
2346
# Assemble package list if necessary
2347
#
2348
(/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)'
2349

    
2350
#
2351
# Exec PHP script which installs pfSense packages in place
2352
#
2353
(/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
2354

    
2355
rc=\$?
2356

    
2357
egrep -wi '(^>>>|error)' /tmp/pfspkg_installer.out 2>/dev/null
2358
rm -f /tmp/pfspkg_installer.out
2359

    
2360
#
2361
# Check if pfspkg_installer returned 0
2362
#
2363
[ "\$rc" != "0" ] && exit 1
2364

    
2365
# Copy config.xml to conf.default/
2366
cp /conf/config.xml conf.default/
2367

    
2368
#
2369
# Cleanup, aisle 7!
2370
#
2371
if [ -f /tmp/remove_platform ]; then
2372
	/bin/rm /etc/platform
2373
	/bin/rm /tmp/remove_platform
2374
fi
2375

    
2376
if [ -f /tmp/remove_backup ]; then
2377
	/bin/rm -rf /conf/backup
2378
	/bin/rm /tmp/remove_backup
2379
fi
2380

    
2381
if [ -f /tmp/remove_conf_symlink ]; then
2382
	/bin/rm /conf
2383
	if [ -h /cf ]; then
2384
		/bin/rm /cf
2385
	fi
2386
	/bin/rm /tmp/remove_conf_symlink
2387
fi
2388

    
2389
if [ -f /tmp/restore_conf_dir ]; then
2390
	/bin/mv /conf.org /conf
2391
	/bin/rm /tmp/restore_conf_dir
2392
fi
2393

    
2394
if [ -f /tmp/platform ]; then
2395
	mv /tmp/platform /etc/platform
2396
fi
2397

    
2398
/bin/rm /tmp/pfspkg_installer
2399

    
2400
/bin/rm /tmp/pkgfile.lst
2401

    
2402
/bin/rm /tmp/*.log /tmp/*.tbz 2>/dev/null
2403

    
2404
if [ -f /tmp/config.cache ]; then
2405
	/bin/rm /tmp/config.cache
2406
fi
2407

    
2408
/bin/rm /etc/resolv.conf
2409

    
2410
/bin/rm /${PFSDESTNAME}
2411

    
2412
if [ -f /tmp/php.ini ]; then
2413
	cp /tmp/php.ini /usr/local/lib/php.ini
2414
	cp /tmp/php.ini /usr/local/etc/php.ini
2415
fi
2416

    
2417
EOF
2418

    
2419
		echo ">>> Installing custom pfSense-XML packages inside chroot ..." | tee -a ${LOGFILE}
2420
		chmod a+rx ${PFSTODIR}/${PFSDESTNAME}
2421
		chroot ${PFSTODIR} /bin/sh /${PFSDESTNAME}
2422
		rc=$?
2423
		echo ">>> Unmounting ${PFSTODIR}/dev ..." | tee -a ${LOGFILE}
2424
		umount -f ${PFSTODIR}/dev
2425

    
2426
		if [ "${rc}" != "0" ]; then
2427
			echo ">>> ERROR: Error installing custom packages" | tee -a ${LOGFILE}
2428
			print_error_pfS
2429
		fi
2430
	fi
2431
}
2432

    
2433
# Cleans up previous builds
2434
pfSense_clean_obj_dir() {
2435
	# Clean out directories
2436
	echo ">>> Cleaning up previous build environment...Please wait!"
2437

    
2438
	staginareas_clean_each_run
2439

    
2440
	if [ -d "${PFSENSESTAGEDIR}" ]; then
2441
		BASENAME=`basename ${PFSENSESTAGEDIR}`
2442
		echo -n ">>> Cleaning ${PFSENSESTAGEDIR} ..."
2443
		chflags -R noschg ${PFSENSESTAGEDIR} 2>&1 >/dev/null
2444
		rm -rf ${PFSENSESTAGEDIR} 2>/dev/null
2445
		echo "Done."
2446
	fi
2447
	mkdir -p ${PFSENSESTAGEDIR}
2448

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

    
2467

    
2468
	echo -n ">>> Cleaning previously built images..."
2469
	rm -rf $MAKEOBJDIRPREFIXFINAL/*
2470
	echo "Done!"
2471

    
2472
	if [ -z "${NO_CLEANREPOS}" ]; then
2473
		if [ -d "${GIT_REPO_DIR}/pfSenseGITREPO" ]; then
2474
			echo -n ">>> Cleaning pfSense repo checkout..."
2475
			echo -n "."
2476
			rm -rf "${GIT_REPO_DIR}/pfSenseGITREPO"
2477
			echo "Done!"
2478
		fi
2479

    
2480
		if [ -d "$SRCDIR" ]; then
2481
			echo -n ">>> Ensuring $SRCDIR is clean..."
2482
			rm -rf ${SRCDIR}
2483
			echo "Done!"
2484
		fi
2485
	fi
2486

    
2487
	echo -n ">>> Cleaning previous builder logs..."
2488
	if [ -d "$BUILDER_LOGS" ]; then
2489
		rm -rf ${BUILDER_LOGS}
2490
	fi
2491
	mkdir -p ${BUILDER_LOGS}
2492

    
2493
	echo "Done!"
2494

    
2495
	echo ">>> Cleaning of builder environment has finished."
2496
}
2497

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

    
2513
# Rebuilds and installs the BSDInstaller which populates
2514
# the Ports directory sysutils/bsdinstaller, etc.
2515
rebuild_bsdinstaller() {
2516
	# Add BSDInstaller
2517
	cd ${BUILDER_SCRIPTS}
2518
	BSDINSTALLPKG=$(make -C /usr/ports/sysutils/bsdinstaller -V PKGNAME)
2519
	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
2520
		echo ">>> Found $BSDINSTALLPKG pre-built package using that not rebuilding from source!"
2521
	else
2522
		${BUILDER_SCRIPTS}/scripts/rebuild_bsdinstaller.sh
2523
	fi
2524
	unset BSDINSTALLPKG
2525
}
2526

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

    
2537
	update_freebsd_sources_and_apply_patches
2538

    
2539
	update_pfSense_repository
2540

    
2541
	# BSDInstaller is treated when needed
2542
	${BUILDER_SCRIPTS}/scripts/get_bsdinstaller.sh
2543
}
2544

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

    
2564
clone_to_staging_area() {
2565

    
2566
	OLDPWD=`pwd`
2567
	# Clone everything to the final staging area
2568
	echo -n ">>> Cloning everything to ${PFSENSESTAGEDIR} staging area..."
2569
	LOGFILE=${BUILDER_LOGS}/cloning.${TARGET}.log
2570

    
2571
	if [ ! -d ${GIT_REPO_DIR}/pfSenseGITREPO ]; then
2572
		echo "ERROR!"
2573
		echo ">>> ERROR: pfSense repository does not seem to be there please fix...STOPPING!" | tee -a ${LOGFILE}
2574
		print_error_pfS
2575
	fi
2576

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

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

    
2596
create_final_staging_area() {
2597
	if [ -z "${PFSENSEISODIR}" ]; then
2598
		echo ">>> ERROR: PFSENSEISODIR is not set, cannot continue!" | tee -a ${LOGFILE}
2599
		print_error_pfS
2600
	fi
2601

    
2602
	if [ -d "${PFSENSEISODIR}" ]; then
2603
		echo -n ">>> Previous ${PFSENSEISODIR} detected cleaning up..." | tee -a ${LOGFILE}
2604
		chflags -R noschg ${PFSENSEISODIR} 2>&1 1>/dev/null
2605
		rm -rf ${PFSENSEISODIR}/* 2>&1 1>/dev/null
2606
		echo "Done." | tee -a ${LOGFILE}
2607
	fi
2608
	mkdir -p ${PFSENSEISODIR}
2609

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

    
2628
	clone_directory_contents ${PFSENSESTAGEDIR} ${PFSENSEISODIR}
2629

    
2630
	# Create a copy of this file just in case
2631
	cp $PFSENSEISODIR/etc/gettytab $PFSENSEISODIR/etc/gettytab.bak
2632

    
2633
	if [ ! -f $PFSENSEISODIR/sbin/init ]; then
2634
		echo ">>> ERROR: Something went wrong during cloning -- Please verify!" 2>&1 | tee -a ${LOGFILE}
2635
                print_error_pfS
2636
                kill $$
2637
	fi
2638

    
2639
	if [ -z "${NO_COMPRESSEDFS:-}" ]; then
2640
		umount -f ${PFSENSEISODIR}/usr
2641
		mdconfig -d -u ${MD}
2642
		# Restore functionality
2643
		trap "-" 1 2 15 EXIT
2644

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

    
2655
	echo -n ">>> Copying rc.d needed scripts..."
2656
	# Copy file needed by iso image
2657
	for file in uzip etcmfs varmfs rootmfs; do
2658
		cp ${BUILDER_SCRIPTS}/scripts/rc.d/$file ${PFSENSEISODIR}/etc/rc.d/ 2>&1 | tee -a ${LOGFILE}
2659
		chmod 555 ${PFSENSEISODIR}/etc/rc.d/$file 2>&1 | tee -a ${LOGFILE}
2660
	done
2661
	echo "Done!"
2662

    
2663
	mkdir -p ${PFSENSEISODIR}/dist
2664
	mtree -Pcp ${PFSENSEISODIR} | bzip2 -9 > ${PFSENSEISODIR}/dist/root.dist.bz2
2665
}
2666

    
2667
customize_stagearea_for_image() {
2668
	# Prepare final stage area
2669
	create_final_staging_area
2670

    
2671
	# This check is for supporting create memstick/ova images
2672
	if [ "${1}" = "iso" -o "${1}" = "memstick" -o "${1}" = "memstickserial" ]; then
2673
		# Fetch BSDInstaller and rebuild
2674
		rebuild_bsdinstaller
2675

    
2676
		echo ">>> Searching for BSDInsaller..." | tee -a ${LOGFILE}
2677
		if [ "$PFSPKGFILE" = "" ]; then
2678
			PFSPKGFILE=${SCRATCHDIR}/pfspackages
2679
			echo ">> PFSPKGFILE is not defined.  Setting to ${PFSPKGFILE}." | tee -a ${LOGFILE}
2680
		fi
2681
		(${PKG_INFO} | grep bsdinstaller) > $PFSPKGFILE
2682
		(${PKG_INFO} | grep lua) >> $PFSPKGFILE
2683

    
2684
		echo $PFSPKGFILE >> ${LOGFILE}
2685
		echo ">>> Installing BSDInstaller: " | tee -a ${LOGFILE}
2686
		if [ ${FREEBSD_VERSION} -ge 10 ]; then
2687
			(${BUILDER_SCRIPTS}/scripts/pkgnginstall.sh)
2688
		else
2689
			(${BUILDER_SCRIPTS}/scripts/pkginstall.sh)
2690
		fi
2691

    
2692
		# Add installer bits
2693
		cust_populate_installer_bits
2694

    
2695
		# Check to see if we have a healthy installer
2696
		ensure_healthy_installer
2697
	else
2698
		echo ">>> BSDInstaller not being put into image type: ${1}" | tee -a ${LOGFILE}
2699
	fi
2700

    
2701
	# Add extra files such as buildtime of version, bsnmpd, etc.
2702
	cust_populate_extra
2703

    
2704
	install_custom_overlay
2705

    
2706
	# Check for custom config.xml
2707
	cust_install_config_xml
2708

    
2709
	# Install custom pfSense-XML packages from a chroot
2710
	pfsense_install_custom_packages_exec
2711

    
2712
	# Overlay final files
2713
	install_custom_overlay_final
2714

    
2715
	# Ensure config.xml exists
2716
	copy_config_xml_from_conf_default
2717

    
2718
	# Test PHP installation
2719
	test_php_install
2720

    
2721
	# Overlay any loader.conf customziations
2722
	install_extra_loader_conf_options
2723

    
2724
	# Create md5 summary file listing checksums
2725
	create_md5_summary_file
2726

    
2727
	# Create mtree summary file listing owner/permissions/sha256 and similar
2728
	create_mtree_summary_file
2729

    
2730
	# Setup serial port helper hints
2731
	setup_serial_hints
2732

    
2733
	# Allow a custom function to be called from pfsense-build.conf
2734
	# example: disable_lan_disable_dhcpd_enable_sshd
2735
	if [ -n "$CUSTOM_CALL_SHELL_FUNCTION"  ]; then
2736
		eval $CUSTOM_CALL_SHELL_FUNCTION
2737
	fi
2738

    
2739
}
2740

    
2741
create_iso_image() {
2742
	LOGFILE=${BUILDER_LOGS}/isoimage.${TARGET}
2743
	echo ">>> Building bootable ISO image for ${TARGET}" | tee -a ${LOGFILE}
2744
	if [ -z "${DEFAULT_KERNEL}" ]; then
2745
		echo ">>> ERROR: Could not identify DEFAULT_KERNEL to install on image!" | tee -a ${LOGFILE}
2746
		print_error_pfS
2747
	fi
2748

    
2749
	customize_stagearea_for_image "iso"
2750
	install_default_kernel ${DEFAULT_KERNEL}
2751

    
2752
	echo cdrom > $PFSENSEISODIR/etc/platform
2753

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

    
2757
	# This check is for supporting create memstick/ova images
2758
	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}
2759
	echo "-o label=${FSLABEL} -o publisher=\"${PRODUCT_NAME} project.\" $ISOPATH ${PFSENSEISODIR}" | tee -a ${LOGFILE}
2760
	makefs -t cd9660 -o bootimage="i386;${PFSENSEISODIR}/boot/cdboot" -o no-emul-boot -o rockridge \
2761
				-o label=${FSLABEL} -o publisher="${PRODUCT_NAME} project." $ISOPATH ${PFSENSEISODIR} 2>&1 >> ${LOGFILE}
2762
	if [ $? -ne 0 -o ! -f $ISOPATH ]; then
2763
		if [ -f ${ISOPATH} ]; then
2764
			rm -f $ISOPATH
2765
		fi
2766
		echo ">>> ERROR: Something wrong happened during ISO image creation. STOPPING!" | tee -a ${LOGFILE}
2767
		print_error_pfS
2768
		kill $$
2769
	fi
2770
	gzip -qf $ISOPATH &
2771

    
2772
	echo ">>> ISO created: `LC_ALL=C date`" | tee -a ${LOGFILE}
2773
}
2774

    
2775
create_memstick_image() {
2776

    
2777
	LOGFILE=${BUILDER_LOGS}/memstick.${TARGET}
2778
	if [ "${MEMSTICKPATH}" = "" ]; then
2779
		echo ">>> MEMSTICKPATH is empty skipping generation of memstick image!" | tee -a ${LOGFILE}
2780
		return
2781
	fi
2782

    
2783
	if [ ! -d ${PFSENSEISODIR}/boot ]; then
2784
		customize_stagearea_for_image "memstick"
2785
		install_default_kernel ${DEFAULT_KERNEL}
2786
	fi
2787

    
2788
	echo cdrom > $PFSENSEISODIR/etc/platform
2789

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

    
2819
	echo ">>> MEMSTICK created: `LC_ALL=C date`" | tee -a ${LOGFILE}
2820
}
2821

    
2822
create_memstick_serial_image() {
2823
	LOGFILE=${BUILDER_LOGS}/memstickserial.${TARGET}
2824
	if [ "${MEMSTICKSERIALPATH}" = "" ]; then
2825
		echo ">>> MEMSTICKSERIALPATH is empty skipping generation of memstick image!" | tee -a ${LOGFILE}
2826
		return
2827
	fi
2828

    
2829
	if [ ! -d ${PFSENSEISODIR}/boot ]; then
2830
		customize_stagearea_for_image "memstickserial"
2831
		install_default_kernel ${DEFAULT_KERNEL}
2832
	fi
2833

    
2834
	echo cdrom > $PFSENSEISODIR/etc/platform
2835

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

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

    
2841
	BOOTCONF=${PFSENSEISODIR}/boot.config
2842
	LOADERCONF=${PFSENSEISODIR}/boot/loader.conf
2843
	ACTIVECONF=${PFSENSEISODIR}/cf/conf/config.xml
2844
	DEFAULTCONF=${PFSENSEISODIR}/conf.default/config.xml
2845
	TTYS=${PFSENSEISODIR}/etc/ttys
2846

    
2847
	echo ">>>   Activating serial console..." 2>&1 | tee -a ${LOGFILE}
2848
	# Activate serial console in boot.config
2849
	if [ -f ${BOOTCONF} ]; then
2850
		sed -i "" '/^-D$/d' ${BOOTCONF}
2851
	fi
2852
	echo "-D" >> ${BOOTCONF}
2853

    
2854
	# Activate serial console in config.xml
2855
	# If it was there before, clear the setting to be sure we don't add it twice.
2856
	sed -i "" -e "/		<enableserial\/>/d" ${ACTIVECONF}
2857
	# Enable serial in the config
2858
	sed -i "" -e "s/	<\/system>/		<enableserial\/>\\`echo -e \\\n`	<\/system>/" ${ACTIVECONF}
2859
	# Make sure to update the default config as well.
2860
	cp ${ACTIVECONF} ${DEFAULTCONF}
2861

    
2862
	# Remove old console options if present.
2863
	sed -i "" -Ee "/(console|boot_multicons|boot_serial)/d" ${LOADERCONF}
2864
	# Activate serial console+video console in loader.conf
2865
	echo 'boot_multicons="YES"' >>  ${LOADERCONF}
2866
	echo 'boot_serial="YES"' >> ${LOADERCONF}
2867
	echo 'console="comconsole,vidconsole"' >> ${LOADERCONF}
2868

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

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

    
2898
	echo ">>> MEMSTICKSERIAL created: `LC_ALL=C date`" | tee -a ${LOGFILE}
2899
}
2900

    
2901
# This routine ensures any ports / binaries that the builder
2902
# system needs are on disk and ready for execution.
2903
install_required_builder_system_ports() {
2904
	# No ports exist, use portsnap to bootstrap.
2905
	if [ ! -d "/usr/ports/" ]; then
2906
		echo -n  ">>> Grabbing FreeBSD port sources, please wait..."
2907
		(/usr/sbin/portsnap fetch) 2>&1 | egrep -B3 -A3 -wi '(error)'
2908
		(/usr/sbin/portsnap extract) 2>&1 | egrep -B3 -A3 -wi '(error)'
2909
		echo "Done!"
2910
	fi
2911

    
2912
	OIFS=$IFS
2913
	IFS="
2914
"
2915

    
2916
	for PKG_STRING in `cat ${PFSBUILDERREQUIREDPORTS} ${PFSBUILDERREQUIREDPORTS}.${FREEBSD_VERSION} 2>/dev/null`
2917
	do
2918
		PKG_STRING_T=`echo $PKG_STRING | sed "s/[ ]+/ /g"`
2919
		CHECK_ON_DISK=`echo $PKG_STRING_T | awk '{ print $1 }'`
2920
		PORT_LOCATION=`echo $PKG_STRING_T | awk '{ print $2 }'`
2921
		UNSET_OPTS=`echo $PKG_STRING_T | awk '{ print $2 }' | sed 's/,/ /g'`
2922
		if [ ! -f "$CHECK_ON_DISK" ]; then
2923
			echo -n ">>> Building $PORT_LOCATION ..."
2924
			(cd $PORT_LOCATION && env -u TARGET make BATCH=yes deinstall clean) 2>&1 | egrep -B3 -A3 -wi '(error)'
2925
			(cd $PORT_LOCATION && env -u TARGET 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)'
2926
			echo "Done!"
2927
		fi
2928
	done
2929

    
2930
	IFS=$OIFS
2931
}
2932

    
2933
# Updates FreeBSD sources and applies any custom
2934
# patches that have been defined.
2935
update_freebsd_sources_and_apply_patches() {
2936
	# No need to obtain sources or patch
2937
	# on subsequent build runs.
2938

    
2939
	if [ ! -d "${SRCDIR}" ]; then
2940
		mkdir -p ${SRCDIR}
2941
	fi
2942

    
2943
	if [ -n "${NO_BUILDWORLD:-}" -a -n "${NO_BUILDKERNEL:-}" ]; then
2944
		echo ">>> NO_BUILDWORLD and NO_BUILDKERNEL set, skipping update of freebsd sources and patch applying" | tee -a ${LOGFILE}
2945
		return
2946
	fi
2947

    
2948
	OLDPWD=`pwd`
2949

    
2950
	echo -n ">>> Obtaining FreeBSD sources ${FREEBSD_BRANCH}..."
2951
	if [ -n "${USE_SVN}" ]; then
2952
		if [ -f /usr/bin/svnlite ]; then
2953
			SVN_BIN=/usr/bin/svnlite
2954
		else
2955
			SVN_BIN=svn
2956
		fi
2957

    
2958
		# If src is already there
2959
		if [ -d "${SRCDIR}/.svn" ]; then
2960
			# Remove orphan files
2961
			(cd ${SRCDIR} && ${SVN_BIN} status --no-ignore | awk '{print $2}' | xargs rm -rf)
2962
			# Revert possible changed files
2963
			(cd ${SRCDIR} && ${SVN_BIN} revert -R . 2>&1) | grep -i 'error'
2964
			# Update src
2965
			(cd ${SRCDIR} && ${SVN_BIN} up 2>&1) | grep -i 'error'
2966
		else
2967
			(${SVN_BIN} co ${FREEBSD_REPO_BASE}/${FREEBSD_BRANCH} ${SRCDIR} 2>&1) | grep -i 'error'
2968
		fi
2969
	else
2970
		local _FREEBSD_BRANCH=${FREEBSD_BRANCH:-"master"}
2971
		local _CLONE=1
2972

    
2973
		if [ -d "${SRCDIR}/.git" ]; then
2974
			CUR_BRANCH=$(cd ${SRCDIR} && git branch | grep '^\*' | cut -d' ' -f2)
2975
			if [ "${CUR_BRANCH}" = "${_FREEBSD_BRANCH}" ]; then
2976
				_CLONE=0
2977
				( cd ${SRCDIR} && git fetch origin; git reset --hard; git clean -fxd; git rebase origin/${_FREEBSD_BRANCH} ) 2>&1 | grep -C3 -i 'error'
2978
			elif (cd ${SRCDIR} && git branch 2>&1 | grep -q "${_FREEBSD_BRANCH}"); then
2979
				_CLONE=0
2980
				( 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'
2981
			else
2982
				rm -rf ${SRCDIR}
2983
			fi
2984
		fi
2985

    
2986
		if [ ${_CLONE} -eq 1 ]; then
2987
			( git clone --branch ${_FREEBSD_BRANCH} --single-branch ${FREEBSD_REPO_BASE} ${SRCDIR} ) 2>&1 | grep -C3 -i 'error'
2988
		fi
2989

    
2990
		if [ -n "${GIT_FREEBSD_COSHA1}" ]; then 
2991
			( cd ${SRCDIR} && git checkout ${GIT_FREEBSD_COSHA1} ) 2>&1 | grep -C3 -i 'error'
2992
		fi
2993
	fi
2994
	echo "Done!"
2995

    
2996
	# Loop through and remove files
2997
	echo ">>> Removing files listed for FreeBSD version: ${FREEBSD_VERSION} file-name: ${PFSPATCHFILE}"
2998
	for LINE in `cat ${PFSPATCHFILE}`
2999
	do
3000
		PATCH_RM=`echo $LINE | cut -d~ -f4`
3001
		PATCH_RM_LENGTH=`echo $PATCH_RM | wc -c`
3002
		DIR_CREATE=`echo $LINE | cut -d~ -f5`
3003
		if [ $PATCH_RM_LENGTH -gt "2" ]; then
3004
			rm -rf ${SRCDIR}${PATCH_RM}
3005
		fi
3006
		if [ "$DIR_CREATE" != "" ]; then
3007
			mkdir -p ${SRCDIR}/${DIR_CREATE}
3008
		fi
3009
	done
3010

    
3011
	echo -n ">>> Applying patches from $PFSPATCHFILE please wait..."
3012
	# Loop through and patch files
3013
	for LINE in `cat ${PFSPATCHFILE}`
3014
	do
3015
		PATCH_DEPTH=`echo $LINE | cut -d~ -f1`
3016
		PATCH_DIRECTORY=`echo $LINE | cut -d~ -f2`
3017
		PATCH_FILE=`echo $LINE | cut -d~ -f3`
3018
		PATCH_FILE_LEN=`echo $PATCH_FILE | wc -c`
3019
		MOVE_FILE=`echo $LINE | cut -d~ -f4`
3020
		MOVE_FILE_LEN=`echo $MOVE_FILE | wc -c`
3021
		IS_TGZ=`echo $LINE | grep -v grep | grep .tgz | wc -l`
3022
		if [ ${PATH_FILE} == ""]; then
3023
			
3024
		elif [ ! -f "${PFSPATCHDIR}/${PATCH_FILE}" ]; then
3025
			echo
3026
			echo "ERROR!  Patch file(${PATCH_FILE}) not found!  Please fix before building!"
3027
			echo
3028
			print_error_pfS
3029
			kill $$
3030
		fi
3031

    
3032
		if [ $PATCH_FILE_LEN -gt "2" ]; then
3033
			if [ $IS_TGZ -gt "0" ]; then
3034
				(cd ${SRCDIR}/${PATCH_DIRECTORY} && tar xzvpf ${PFSPATCHDIR}/${PATCH_FILE}) 2>&1 \
3035
				| egrep -wi '(warning|error)'
3036
			else
3037
				(cd ${SRCDIR}/${PATCH_DIRECTORY} && patch --quiet -f ${PATCH_DEPTH} < ${PFSPATCHDIR}/${PATCH_FILE} 2>&1 );
3038
				if [ "$?" != "0" ]; then
3039
					echo "failed to apply ${PATCH_FILE}";
3040
				fi
3041
			fi
3042
		fi
3043
		if [ $MOVE_FILE_LEN -gt "2" ]; then
3044
			#cp ${SRCDIR}/${MOVE_FILE} ${SRCDIR}/${PATCH_DIRECTORY}
3045
		fi
3046
	done
3047
	echo "Done!"
3048

    
3049
	echo ">>> Finding patch rejects..."
3050
	REJECTED_PATCHES=`find $SRCDIR -name "*.rej" | wc -l`
3051
	if [ $REJECTED_PATCHES -gt 0 ]; then
3052
		echo
3053
		echo "WARNING!  Rejected patches found!  Please fix before building!"
3054
		echo
3055
		find $SRCDIR -name "*.rej"
3056
		echo
3057
		if [ "$BUILD_ERROR_MAIL" != "" ]; then
3058
			LOGFILE="$SCRATCHDIR/patches.failed.apply"
3059
			find $SRCDIR -name "*.rej" > $LOGFILE
3060
			print_error_pfS
3061

    
3062
		fi
3063
		print_error_pfS
3064
		kill $$
3065
	fi
3066

    
3067
	cd $OLDPWD
3068
	unset OLDPWD
3069
}
3070

    
3071
# Email when an error has occured and BUILD_ERROR_MAIL is defined
3072
report_error_pfsense() {
3073
    if [ ! -z ${BUILD_ERROR_MAIL:-} ]; then
3074
		HOSTNAME=`hostname`
3075
		IPADDRESS=`ifconfig | grep inet | grep netmask | grep broadcast | awk '{ print $2 }'`
3076
		cat ${LOGFILE} | \
3077
		    mail -s "Builder (${PRODUCT_NAME}) build error in ${TARGET} phase ${IPADDRESS} - ${HOSTNAME} " \
3078
		    	${BUILD_ERROR_MAIL}
3079
    fi
3080
}
3081

    
3082
# Email when an operation is completed IE build run
3083
email_operation_completed() {
3084
    if [ ! -z ${BUILD_COMPLETED_MAIL:-} ]; then
3085
		HOSTNAME=`hostname`
3086
		IPADDRESS=`ifconfig | grep inet | grep netmask | grep broadcast | awk '{ print $2 }'`
3087
		echo "Build / operation completed ${IPADDRESS} - ${HOSTNAME}" | \
3088
		mail -s "Builder (${PRODUCT_NAME}) operation completed ${IPADDRESS} - ${HOSTNAME}" \
3089
	    	${BUILD_COMPLETED_MAIL}
3090
    fi
3091
}
3092

    
3093
# This ensures installer is healthy.
3094
ensure_healthy_installer() {
3095
	echo -n ">>> Checking BSDInstaller health..." | tee -a ${LOGFILE}
3096
	INSTALLER_ERROR=0
3097
	if [ ! -f "$PFSENSEISODIR/usr/local/sbin/dfuife_curses" ]; then
3098
		INSTALLER_ERROR=1
3099
		echo -n " dfuife_curses missing " | tee -a ${LOGFILE}
3100
	fi
3101
	if [ ! -d "$PFSENSEISODIR/usr/local/share/dfuibe_lua" ]; then
3102
		INSTALLER_ERROR=1
3103
		echo -n " dfuibe_lua missing " | tee -a ${LOGFILE}
3104
	fi
3105
	if [ ! -f "$PFSENSEISODIR/usr/local/share/dfuibe_lua/conf/pfSense.lua" ]; then
3106
		INSTALLER_ERROR=1
3107
		echo " pfSense_lua missing " | tee -a ${LOGFILE}
3108
	fi
3109
	if [ "$INSTALLER_ERROR" -gt 0 ]; then
3110
		echo ">>> ERROR: " |  tee -a ${LOGFILE}
3111
		print_error_pfS
3112
		kill $$
3113
	else
3114
		echo "[OK]" | tee -a ${LOGFILE}
3115
	fi
3116
}
3117

    
3118
# Check to see if a forced pfPorts run has been requested.
3119
# If so, rebuild pfPorts.  set_version.sh uses this.
3120
check_for_forced_pfPorts_build() {
3121
	if [ -f "$SCRATCHDIR/pfPorts_forced_build_required" ]; then
3122
		# Ensure that we build
3123
		rm -f $SCRATCHDIR/pfSense_do_not_build_pfPorts
3124
		recompile_pfPorts
3125
		# Remove file that could trigger 2 pfPorts
3126
		# builds in one run
3127
		rm $SCRATCHDIR/pfPorts_forced_build_required
3128
	fi
3129
}
3130

    
3131
# Print basenames
3132
print_basenames() {
3133
	for NAME in "$1"; do
3134
		echo `basename $NAME`
3135
	done
3136
}
3137

    
3138
# Put extra options in loader.conf.local if needed
3139
install_extra_loader_conf_options() {
3140
	if [ ! -z ${LOADER_CONF_CUSTOM} ]; then
3141
		if [ -f ${LOADER_CONF_CUSTOM} ]; then
3142
			echo -n  ">>> loader.conf custom option addition..."
3143
			cat ${LOADER_CONF_CUSTOM} >> $PFSENSESISODIR/boot/loader.conf.local
3144
			echo "Done!"
3145
		fi
3146
	fi
3147
}
3148

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

    
3181
	echo ">>> Building ports: (starting)"
3182
	for PORTDIRPFS in $PKG_INSTALL_PORTSPFS; do
3183
		install_pkg_install_ports_build $PORTDIRPFS
3184
	done
3185

    
3186
	mkdir -p $PFSENSESTAGEDIR/tmp/pkg/
3187
	cp ${PFS_PKG_ALL}/* $PFSENSESTAGEDIR/tmp/pkg/
3188
	echo ">>> Building ports: (finished)"
3189

    
3190
	echo ">>> Installing built ports (packages) in chroot (${PFSENSESTAGEDIR})... (starting)"
3191
	mv ${VAR_DB_PKG}/* ${VAR_DB_PKG_TMP} || true 2>/dev/null
3192
	cp ${BUILDER_SCRIPTS}/scripts/install_tmp_pkgs_in_chroot.sh $PFSENSESTAGEDIR/pkg.sh
3193
	chmod a+rx $PFSENSESTAGEDIR/pkg.sh
3194
	# chroot into staging area and pkg_add all of the packages
3195
	script ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt /sbin/mount -t devfs devfs ${PFSENSESTAGEDIR}/dev
3196
	script -a ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt chroot $PFSENSESTAGEDIR /pkg.sh
3197
	script -a ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt /sbin/umount ${PFSENSESTAGEDIR}/dev
3198
	echo ">>> Result of installing packages in the chroot is:"
3199
	echo "--------------------------------------------------"
3200
	cat ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt
3201
	echo "--------------------------------------------------"
3202
	echo ">>> Installing built ports (packages) in chroot (${PFSENSESTAGEDIR})... (finshied)"
3203

    
3204
	# Restore the previously backed up items
3205
	mv ${PFS_PKG_OLD}* ${PFS_PKG_ALL} || true 2>/dev/null
3206
	mv ${VAR_DB_PKG_TMP}/* ${VAR_DB_PKG} || true 2>/dev/null
3207
	rm -rf $PFSENSESTAGEDIR/tmp/pkg
3208
	rm -f $PFSENSESTAGEDIR/pkg.sh
3209

    
3210
	echo ">>> Building ports: (Done)"
3211
	TARGET_ARCH=${OLDTGTARCH}
3212
	cd $OLDPWD
3213
	unset OLDPWD
3214
}
3215

    
3216
install_pkg_install_ports_build() {
3217
	local PORTDIRPFSA
3218
	local PORTNAME
3219
	local _PORTNAME
3220
	local BUILT_PKGNAME
3221

    
3222
	PORTDIRPFSA="$1"
3223

    
3224
	# XXX: Maybe remove this code as its already done above!
3225
	PORTNAME="`basename $PORTDIRPFSA`"
3226
	if [ "$PORTNAME" = "" ]; then
3227
		echo ">>> ERROR: PORTNAME is blank.  Cannot continue."
3228
		print_error_pfS
3229
		kill $$
3230
	fi
3231

    
3232
	if [ -d $pfSPORTS_BASE_DIR/${PORTNAME} ]; then
3233
		echo -n ">>> Overlaying port $PORTNAME from pfPorts..."
3234
		# Cleanup to avoid issues with extra/different patches
3235
		rm -rf $PORTDIRPFSA/*
3236
		cp -R $pfSPORTS_BASE_DIR/${PORTNAME}/* $PORTDIRPFSA
3237
		echo "Done!"
3238
	fi
3239
	ALREADYBUILT="${BUILDER_LOGS}/pfPorts/install_pkg_install_ports"
3240
	BUILT_PKGNAME="`make -C $PORTDIRPFSA -V PKGNAME`"
3241
	if [ ! -f $ALREADYBUILT/$BUILT_PKGNAME ]; then
3242

    
3243
		# Install the required port for the build environment
3244
                for EXTRAPORT in `cd $PORTDIRPFSA && make build-depends-list | sort | uniq | xargs /bin/echo -n `; do
3245
                        _PORTNAME="`basename $EXTRAPORT`"
3246
                        if [ "$_PORTNAME" = "" ]; then
3247
                                echo ">>> ERROR: _PORTNAME is blank.  Cannot continue."
3248
                                print_error_pfS
3249
                                kill $$
3250
                        fi
3251
                        if [ -d $pfSPORTS_BASE_DIR/${_PORTNAME} ]; then
3252
                                echo -n ">>> Overlaying port $PORTNAME from pfPorts..."
3253
                                # Cleanup to avoid issues with extra/different patches
3254
                                rm -rf $EXTRAPORT/*
3255
                                cp -R $pfSPORTS_BASE_DIR/${_PORTNAME}/* $EXTRAPORT
3256
                                echo "Done!"
3257
                        fi
3258
                        _BUILT_PKGNAME="`make -C $EXTRAPORT -V PKGNAME`"
3259
			${PKG_QUERY} $_BUILT_PKGNAME
3260
			if [ $? -ne 0 ]; then
3261
				echo -n ">>> Building port $_PORTNAME($_BUILT_PKGNAME) as build dependency of ($PORTNAME)..."
3262
				script ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt env -u TARGET 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
3263
				if [ "$?" != "0" ]; then
3264
					echo
3265
					echo
3266
					echo "!!! Something went wrong while building ${EXTRAPORT}"
3267
					echo "    Press RETURN/ENTER to view the log from this build."
3268
					read inputline
3269
					more ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
3270
				else
3271
					echo "Done!"
3272
				fi
3273
			else
3274
				echo ">>> Port ${EXTRAPORT}($_BUILT_PKGNAME) as build dependency of ($PORTNAME)...already installed...skipping."
3275
			fi
3276
                done
3277
                        
3278
                # Package up what's needed to execute and run
3279
                for EXTRAPORT in `cd $PORTDIRPFSA && make run-depends-list | sort | uniq | xargs /bin/echo -n `; do
3280
                        _PORTNAME="`basename $EXTRAPORT`"
3281
                        if [ "$_PORTNAME" = "" ]; then
3282
                                echo ">>> ERROR: Run list _PORTNAME is blank.  Cannot continue."
3283
                                print_error_pfS
3284
                                kill $$
3285
                        fi
3286
                        if [ -d $pfSPORTS_BASE_DIR/${_PORTNAME} ]; then
3287
                                echo -n ">>> Overlaying port $_PORTNAME from pfPorts..."
3288
                                # Cleanup to avoid issues with extra/different patches
3289
                                rm -rf $EXTRAPORT/*
3290
                                cp -R $pfSPORTS_BASE_DIR/${_PORTNAME}/* $EXTRAPORT
3291
                                echo "Done!"
3292
                        fi
3293
                        install_pkg_install_ports_build $EXTRAPORT
3294
                        _BUILT_PKGNAME="`make -C $EXTRAPORT -V PKGNAME`"
3295
			echo ">>> Building port $_PORTNAME($_BUILT_PKGNAME) as runtime dependency of ($PORTNAME)...Done!"
3296
                done
3297

    
3298
		echo -n ">>> Building package $PORTNAME($BUILT_PKGNAME)..."
3299
		if [ -f /usr/ports/packages/Old/${BUILT_PKGNAME}.tbz ]; then
3300
			echo -n " Using already built port found in cache... "
3301
			cp -R /usr/ports/packages/Old/${BUILT_PKGNAME}.tbz \
3302
				/usr/ports/packages/All/
3303
			touch $ALREADYBUILT/$BUILT_PKGNAME
3304
			echo "Done!"
3305
			return;
3306
		fi
3307

    
3308
		script ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt env -u TARGET 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
3309
		if [ "$?" != "0" ]; then
3310
			echo
3311
			echo
3312
			echo "!!! Something went wrong while building ${PORTNAME}"
3313
			echo "    Press RETURN/ENTER to view the log from this build."
3314
			read inputline
3315
			more {$BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
3316
		fi
3317

    
3318
		if [ ${FREEBSD_VERSION} -gt 9 ]; then
3319
			script -a ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt pkg create -f tbz -o $PFS_PKG_ALL $BUILT_PKGNAME 
3320
		else
3321
			script -a ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt pkg_create -b $BUILT_PKGNAME $PFS_PKG_ALL/${BUILT_PKGNAME}.tbz
3322
		fi
3323
		if [ "$?" != "0" ]; then
3324
			echo
3325
			echo
3326
			echo "!!! Something went wrong while building package($BUILT_PKGNAME) for ${PORTNAME}"
3327
			echo "    Press RETURN/ENTER to view the log from this build."
3328
			read inputline
3329
			more ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
3330
		fi
3331
		echo "Done!"
3332
	fi
3333
	touch $ALREADYBUILT/$BUILT_PKGNAME
3334
}
3335

    
3336
staginareas_clean_each_run() {
3337
	if [ -f ${PFSPKGFILE} ]; then
3338
		rm -f ${PFSPKGFILE}
3339
	fi
3340
	echo -n ">>> Cleaning build directories: "
3341
	if [ -d "${PFSENSEISODIR}" ]; then
3342
		BASENAME=`basename ${PFSENSEISODIR}`
3343
		echo -n "$BASENAME "
3344
		chflags -R noschg ${PFSENSEISODIR} 2>&1 >/dev/null
3345
		rm -rf ${PFSENSEISODIR} 2>/dev/null
3346
	fi
3347
	echo "Done!"
3348
}
3349

    
3350
# Imported from FreeSBIE
3351
buildkernel() {
3352
	if [ -n "${NO_BUILDKERNEL:-}" ]; then
3353
	    echo ">>> NO_BUILDKERNEL set, skipping build" | tee -a ${LOGFILE}
3354
	    return
3355
	fi
3356

    
3357
	if [ -z "${KERNCONF:-}" ]; then
3358
		echo ">>> ERROR: No kernel configuration defined probably this is not what you want! STOPPING!" | tee -a ${LOGFILE}
3359
		print_error_pfS
3360
		kill $$
3361
	fi
3362

    
3363
	if [ -n "${KERNELCONF:-}" ]; then
3364
	    export KERNCONFDIR=$(dirname ${KERNELCONF})
3365
	    export KERNCONF=$(basename ${KERNELCONF})
3366
	fi
3367

    
3368
	SRCCONFBASENAME=`basename ${SRC_CONF}`
3369
	echo ">>> KERNCONFDIR: ${KERNCONFDIR}"
3370
	echo ">>> ARCH:        ${TARGET}"
3371
	echo ">>> SRC_CONF:    ${SRCCONFBASENAME}"
3372

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

    
3378
}
3379

    
3380
# Imported from FreeSBIE
3381
installkernel() {
3382
	if [ -z "${KERNCONF:-}" ]; then
3383
		echo ">>> ERROR: No kernel configuration defined probably this is not what you want! STOPPING!" | tee -a ${LOGFILE}
3384
		print_error_pfS
3385
		kill $$
3386
	fi
3387

    
3388
	if [ -n "${KERNELCONF:-}" ]; then
3389
	    export KERNCONFDIR=$(dirname ${KERNELCONF})
3390
	    export KERNCONF=$(basename ${KERNELCONF})
3391
	fi
3392

    
3393
	mkdir -p ${PFSENSESTAGEDIR}/boot
3394
	makeargs="${MAKEOPT:-} ${MAKEJ_KERNEL:-} SRCCONF=${SRC_CONF} TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET} DESTDIR=${KERNEL_DESTDIR}"
3395
	echo ">>> Builder is running the command: env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} installkernel KERNCONF=${KERNCONF}"  | tee -a $LOGFILE
3396
	cd ${SRCDIR}
3397
	(cd $SRCDIR; env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} installkernel KERNCONF=${KERNCONF} || print_error_pfS;) | egrep '^>>>'
3398
	gzip -f9 $KERNEL_DESTDIR/boot/kernel/kernel
3399
	cd $BUILDER_SCRIPTS
3400
}
3401

    
3402
# Launch is ran first to setup a few variables that we need
3403
# Imported from FreeSBIE
3404
launch() {
3405

    
3406
	if [ ! -f $SCRATCHDIR/pfSense_builder_set_time ]; then
3407
		echo ">>> Updating system clock..."
3408
		ntpdate 0.pfsense.pool.ntp.org
3409
		touch $SCRATCHDIR/pfSense_builder_set_time
3410
	fi
3411

    
3412
	if [ "`id -u`" != "0" ]; then
3413
	    echo "Sorry, this must be done as root."
3414
	    kill $$
3415
	fi
3416

    
3417
	echo ">>> Operation $0 has started at `date`"
3418
}
3419

    
3420
finish() {
3421
	echo ">>> Operation $0 has ended at `date`"
3422
	killall -9 check_reload_status 2>/dev/null
3423
}
3424

    
(3-3/7)