Projet

Général

Profil

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

univnautes-tools / builder_scripts / builder_common.sh @ 385877a8

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

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

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

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

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

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

    
100
}
101

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

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

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

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

    
158

    
159
	unset MOUNT_PRESTAGE
160
	unset MOUNT_STAGE
161
}
162

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

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

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

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

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

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

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

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

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

    
244
}
245

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

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

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

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

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

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

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

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

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

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

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

    
305
		SRC_CONF=${OSRC_CONF}
306

    
307
		ensure_kernel_exists $KERNEL_DESTDIR
308

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

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

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

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

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

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

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

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

    
372
	unset KERNEL_NAME
373
}
374

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

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

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

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

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

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

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

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

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

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

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

    
447
		echo ">>> Executing $PFPORTSBASENAME"
448

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

    
460
		handle_tools_stats_crypto
461

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
688
	# Set buildtime
689
	get_date_string
690

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
847
	unset _NANO_WITH_VGA
848
	unset _FLASH_SIZE
849
}
850

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
995
	OLDPWD=`pwd`
996

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

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

    
1016

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

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

    
1022
	cd $OLDPWD
1023
	unset OLDPWD
1024
}
1025

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

    
1029
	mkdir -p ${GIT_REPO_DIR}/pfSenseGITREPO
1030

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

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

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

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

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

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

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

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

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

    
1135
	OLDPWD=`pwd`
1136

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

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

    
1172
	cd $OLDPWD
1173
	unset OLDPWD
1174
}
1175

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

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

    
1186
	export MAKE_CONF="__MAKE_CONF=$MAKE_CONF"
1187

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

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

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

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

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

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

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

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

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

    
1277
	unset MAKE_CONF
1278
	unset makeargs
1279

    
1280
	SRC_CONF=${OSRC_CONF}
1281
}
1282

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

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

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

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

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

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

    
1495
	# size of cylinder in sectors
1496
	cs = $3 * $4
1497

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

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

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

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

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

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

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

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

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

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

    
1556
	pprint 2 "${MAKEOBJDIRPREFIXFINAL}/_.fdisk"
1557
	pprint 2 "`cat ${MAKEOBJDIRPREFIXFINAL}/_.fdisk`"
1558

    
1559
	IMG=${MAKEOBJDIRPREFIXFINAL}/nanobsd.full.img
1560
	BS=${NANO_SECTS}b
1561

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

    
1575
	trap "mdconfig -d -u $MD" 1 2 15 EXIT
1576

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

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

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

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

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

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

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

    
1660
	#) > ${MAKEOBJDIRPREFIXFINAL}/_.di 2>&1
1661

    
1662
}
1663

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

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

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

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

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

    
1701
	# Must be run after customize_stagearea_for_image
1702
	cust_fixup_nanobsd ${1} $NANO_MEDIASIZE
1703

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

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

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

    
1715
		FlashDevice ${FLASH_MODEL} ${_NANO_MEDIASIZE}
1716

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

    
1729
	# size of cylinder in sectors
1730
	cs = $3 * $4
1731

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

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

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

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

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

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

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

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

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

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

    
1790
		MNT=${MAKEOBJDIRPREFIXFINAL}/_.mnt
1791
		mkdir -p ${MNT}
1792

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

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

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

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

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

    
1817
		clone_directory_contents ${PFSENSEISODIR} ${MNT}
1818

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

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

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

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

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

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

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

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

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

    
1889
			clone_directory_contents ${PFSENSEISODIR}/cf ${MNT}
1890

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

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

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

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

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

    
1925
		gzip -f $IMG &
1926
		gzip -f $IMGUPDATE &
1927
	done
1928

    
1929
	unset IMG
1930
	unset IMGUPDATE
1931
	unset IMGUPDATESIZE
1932
	unset IMGSIZE
1933

    
1934
	ls -lah $MAKEOBJDIRPREFIXFINAL
1935
}
1936

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

    
1953
	LOGFILE=${BUILDER_LOGS}/ova.${TARGET}.log
1954

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2262
		cp ${PFSTODIR}/etc/platform ${PFSTODIR}/tmp/
2263

    
2264
		/sbin/mount -t devfs devfs ${PFSTODIR}/dev
2265

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

    
2269
		/bin/echo ${custom_package_list} > ${PFSTODIR}/tmp/pkgfile.lst
2270

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

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

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

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

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

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

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

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

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

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

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

    
2357
rc=\$?
2358

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

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

    
2367
# Copy config.xml to conf.default/
2368
cp /conf/config.xml conf.default/
2369

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

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

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

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

    
2396
if [ -f /tmp/platform ]; then
2397
	mv /tmp/platform /etc/platform
2398
fi
2399

    
2400
/bin/rm /tmp/pfspkg_installer
2401

    
2402
/bin/rm /tmp/pkgfile.lst
2403

    
2404
/bin/rm /tmp/*.log /tmp/*.tbz 2>/dev/null
2405

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

    
2410
/bin/rm /etc/resolv.conf
2411

    
2412
/bin/rm /${PFSDESTNAME}
2413

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

    
2419
EOF
2420

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

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

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

    
2440
	staginareas_clean_each_run
2441

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

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

    
2469

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

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

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

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

    
2495
	echo "Done!"
2496

    
2497
	echo ">>> Cleaning of builder environment has finished."
2498
}
2499

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

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

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

    
2539
	update_freebsd_sources_and_apply_patches
2540

    
2541
	update_pfSense_repository
2542

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

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

    
2566
clone_to_staging_area() {
2567

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

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

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

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

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

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

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

    
2630
	clone_directory_contents ${PFSENSESTAGEDIR} ${PFSENSEISODIR}
2631

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

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

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

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

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

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

    
2669
customize_stagearea_for_image() {
2670
	# Prepare final stage area
2671
	create_final_staging_area
2672

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

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

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

    
2694
		# Add installer bits
2695
		cust_populate_installer_bits
2696

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

    
2703
	# Add extra files such as buildtime of version, bsnmpd, etc.
2704
	cust_populate_extra
2705

    
2706
	install_custom_overlay
2707

    
2708
	# Check for custom config.xml
2709
	cust_install_config_xml
2710

    
2711
	# Install custom pfSense-XML packages from a chroot
2712
	pfsense_install_custom_packages_exec
2713

    
2714
	# Overlay final files
2715
	install_custom_overlay_final
2716

    
2717
	# Ensure config.xml exists
2718
	copy_config_xml_from_conf_default
2719

    
2720
	# Test PHP installation
2721
	test_php_install
2722

    
2723
	# Overlay any loader.conf customziations
2724
	install_extra_loader_conf_options
2725

    
2726
	# Create md5 summary file listing checksums
2727
	create_md5_summary_file
2728

    
2729
	# Create mtree summary file listing owner/permissions/sha256 and similar
2730
	create_mtree_summary_file
2731

    
2732
	# Setup serial port helper hints
2733
	setup_serial_hints
2734

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

    
2741
}
2742

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

    
2751
	customize_stagearea_for_image "iso"
2752
	install_default_kernel ${DEFAULT_KERNEL}
2753

    
2754
	echo cdrom > $PFSENSEISODIR/etc/platform
2755

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

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

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

    
2777
create_memstick_image() {
2778

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

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

    
2790
	echo cdrom > $PFSENSEISODIR/etc/platform
2791

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

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

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

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

    
2836
	echo cdrom > $PFSENSEISODIR/etc/platform
2837

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

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

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

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

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

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

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

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

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

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

    
2914
	OIFS=$IFS
2915
	IFS="
2916
"
2917

    
2918
	for PKG_STRING in `cat ${PFSBUILDERREQUIREDPORTS} ${PFSBUILDERREQUIREDPORTS}.${FREEBSD_VERSION} 2>/dev/null`
2919
	do
2920
		PKG_STRING_T=`echo $PKG_STRING | sed "s/[ ]+/ /g"`
2921
		CHECK_ON_DISK=`echo $PKG_STRING_T | awk '{ print $1 }'`
2922
		PORT_LOCATION=`echo $PKG_STRING_T | awk '{ print $2 }'`
2923
		UNSET_OPTS=`echo $PKG_STRING_T | awk '{ print $2 }' | sed 's/,/ /g'`
2924
		if [ ! -f "$CHECK_ON_DISK" ]; then
2925
			echo -n ">>> Building $PORT_LOCATION ..."
2926
			(cd $PORT_LOCATION && env -u TARGET -u TARGET_ARCH make BATCH=yes deinstall clean) 2>&1 | egrep -B3 -A3 -wi '(error)'
2927
			(cd $PORT_LOCATION && env -u TARGET -u TARGET_ARCH make ${MAKEJ_PORTS} WITHOUT="X11 DOCS EXAMPLES MAN INFO SDL ${UNSET_OPTS}" BATCH=yes FORCE_PKG_REGISTER=yes install clean) 2>&1 | egrep -B3 -A3 -wi '(error)'
2928
			echo "Done!"
2929
		fi
2930
	done
2931

    
2932
	IFS=$OIFS
2933
}
2934

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

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

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

    
2950
	OLDPWD=`pwd`
2951

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

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

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

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

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

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

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

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

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

    
3064
		fi
3065
		print_error_pfS
3066
		kill $$
3067
	fi
3068

    
3069
	cd $OLDPWD
3070
	unset OLDPWD
3071
}
3072

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

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

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

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

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

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

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

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

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

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

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

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

    
3218
install_pkg_install_ports_build() {
3219
	local PORTDIRPFSA
3220
	local PORTNAME
3221
	local _PORTNAME
3222
	local BUILT_PKGNAME
3223

    
3224
	PORTDIRPFSA="$1"
3225

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

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

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

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

    
3310
		script ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt env -u TARGET -u TARGET_ARCH make -C $PORTDIRPFSA ${MAKEJ_PORTS} $PKG_INSTALL_PFSMAKEENV WITHOUT="X11 DOCS EXAMPLES MAN INFO SDL LATEST_LINK" BATCH=yes FORCE_PKG_REGISTER=yes clean install clean 2>&1 1>/dev/null || true 2>&1 >/dev/null
3311
		if [ "$?" != "0" ]; then
3312
			echo
3313
			echo
3314
			echo "!!! Something went wrong while building ${PORTNAME}"
3315
			echo "    Press RETURN/ENTER to view the log from this build."
3316
			read inputline
3317
			more {$BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
3318
		fi
3319

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

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

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

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

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

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

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

    
3380
}
3381

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

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

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

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

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

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

    
3419
	echo ">>> Operation $0 has started at `date`"
3420
}
3421

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

    
(3-3/7)