Projet

Général

Profil

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

univnautes-tools / builder_scripts / builder_common.sh @ b3bdfdbf

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

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

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

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

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

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

    
100
}
101

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

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

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

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

    
158

    
159
	unset MOUNT_PRESTAGE
160
	unset MOUNT_STAGE
161
}
162

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

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

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

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

    
206
	# Copy pfSense kernel configuration files over to $SRCDIR/sys/$TARGET/conf
207
	cp $BUILDER_TOOLS/builder_scripts/conf/kernel/$KERNCONF $KERNELCONF
208
	if [ ! -f "$KERNELCONF" ]; then
209
		echo ">>> ERROR: Could not find $KERNELCONF"
210
		print_error_pfS
211
	fi
212
	echo "" >> $KERNELCONF
213

    
214

    
215
	if [ "$TARGET_ARCH" = "" ]; then
216
		TARGET_ARCH=$TARGET
217
	fi
218

    
219
	# Add APIC options for i386 platform
220
	if [ "$TARGET" = "i386" ]; then
221
		echo "device 		apic" >> $KERNELCONF
222
	fi
223

    
224
	if [ "$EXTRA_DEVICES" != "" ]; then
225
		echo "devices	$EXTRA_DEVICES" >> $KERNELCONF
226
	fi
227
	if [ "$NOEXTRA_DEVICES" != "" ]; then
228
		echo "nodevices	$NOEXTRA_DEVICES" >> $KERNELCONF
229
	fi
230
	if [ "$EXTRA_OPTIONS" != "" ]; then
231
		echo "options	$EXTRA_OPTIONS" >> $KERNELCONF
232
	fi
233
	if [ "$NOEXTRA_OPTIONS" != "" ]; then
234
		echo "nooptions	$NOEXTRA_OPTIONS" >> $KERNELCONF
235
	fi
236

    
237
	# NOTE!  If you remove this, you WILL break booting!  These file(s) are read
238
	#        by FORTH and for some reason installkernel with DESTDIR does not
239
	#        copy this file over and you will end up with a blank file?
240
	cp $SRCDIR/sys/boot/forth/loader.conf $KERNEL_DESTDIR/boot/defaults
241
	if [ -f $SRCDIR/sys/$TARGET/conf/GENERIC.hints ]; then
242
		cp $SRCDIR/sys/$TARGET/conf/GENERIC.hints	$KERNEL_DESTDIR/boot/device.hints
243
	fi
244
	if [ -f $SRCDIR/sys/$TARGET/conf/$KERNCONF.hints ]; then
245
		cp $SRCDIR/sys/$TARGET/conf/$KERNCONF.hints $KERNEL_DESTDIR/boot/device.hints
246
	fi
247
	# END NOTE.
248

    
249
	# Danger will robinson -- 7.2+ will NOT boot if these files are not present.
250
	# the loader will stop at |
251
	touch $KERNEL_DESTDIR/boot/loader.conf
252

    
253
}
254

    
255
# This routine builds all pfSense related kernels
256
build_all_kernels() {
257

    
258
	# Set KERNEL_BUILD_PATH if it has not been set
259
	if [ -z "${KERNEL_BUILD_PATH}" ]; then
260
		KERNEL_BUILD_PATH=$SCRATCHDIR/kernels
261
		echo ">>> KERNEL_BUILD_PATH has not been set. Setting to ${KERNEL_BUILD_PATH}!"
262
	fi
263

    
264
	# Build embedded kernel
265
	for BUILD_KERNEL in $BUILD_KERNELS; do
266
		unset KERNCONF
267
		unset KERNEL_DESTDIR
268
		unset KERNELCONF
269
		unset KERNEL_NAME
270
		export KERNCONF=$BUILD_KERNEL
271
		export KERNEL_DESTDIR="$KERNEL_BUILD_PATH/$BUILD_KERNEL"
272
		export KERNELCONF="$SRCDIR/sys/${TARGET}/conf/$BUILD_KERNEL"
273

    
274
		LOGFILE="${BUILDER_LOGS}/kernel.${KERNCONF}.${TARGET}.log"
275
		echo ">>> Building $BUILD_KERNEL kernel."  | tee -a ${LOGFILE}
276

    
277
		# Use kernel INSTALL_NAME if it exists
278
		KERNEL_INSTALL_NAME=$(echo ${KERNELCONF} | /usr/bin/sed -e '/INSTALL_NAME/!d; s/^.*INSTALL_NAME[[:blank:]]*//' \
279
			| /usr/bin/head -n 1)
280

    
281
		if [ -z "${KERNEL_INSTALL_NAME}" ]; then
282
			export KERNEL_NAME=$(echo ${BUILD_KERNEL} | sed -e 's/pfSense_//; s/\.[0-9].*$//')
283
		else
284
			export KERNEL_NAME=${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
	KERNEL_INSTALL_NAME=$(echo ${1} | /usr/bin/sed -e '/INSTALL_NAME/!d; s/^.*INSTALL_NAME[[:blank:]]*//' \
327
		| /usr/bin/head -n 1)
328

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

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

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

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

    
368
	unset KERNEL_NAME
369
}
370

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

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

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

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

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

    
397
		PFPORTSBASENAME=$(basename ${USE_PORTS_FILE})
398

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

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

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

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

    
439
		export FORCE_PKG_REGISTER=yo
440
		export BATCH=yo
441
		export DISABLE_VULNERABILITIES=yo
442

    
443
		echo ">>> Executing $PFPORTSBASENAME"
444

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

    
456
		handle_tools_stats_crypto
457

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
664
	mkdir -p ${PFSENSEISODIR}/home
665
	mkdir -p ${PFSENSEISODIR}/lib
666

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

    
674
	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"
675

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

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

    
684
	# Set buildtime
685
	get_date_string
686

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

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

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

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

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

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

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

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

    
814
	# create diskless marker file
815
	touch ${PFSENSEISODIR}/etc/diskless
816
	touch ${PFSENSEISODIR}/nanobuild
817

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

    
821
	echo "" > $PFSENSEISODIR/etc/motd
822

    
823
	mkdir -p $PFSENSEISODIR/cf/conf/backup
824

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

    
827
	echo "nanobsd" > $PFSENSEISODIR/etc/platform
828

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

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

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

    
843
	unset _NANO_WITH_VGA
844
	unset _FLASH_SIZE
845
}
846

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
991
	OLDPWD=`pwd`
992

    
993
	customize_stagearea_for_image "fullupdate"
994
	install_default_kernel ${DEFAULT_KERNEL}
995

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

    
1012

    
1013
	mkdir -p ${PFSENSEISODIR}/usr/local/livefs/lib/
1014

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

    
1018
	cd $OLDPWD
1019
	unset OLDPWD
1020
}
1021

    
1022
# Does the work of checking out the specific branch of pfSense
1023
checkout_pfSense_git() {
1024

    
1025
	mkdir -p ${GIT_REPO_DIR}/pfSenseGITREPO
1026

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

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

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

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

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

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

    
1075
# Outputs various set variables aka env
1076
print_flags() {
1077

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

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

    
1131
	OLDPWD=`pwd`
1132

    
1133
	echo ">>> Using GIT to checkout ${PFSENSETAG}"
1134
	echo -n ">>> "
1135

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

    
1168
	cd $OLDPWD
1169
	unset OLDPWD
1170
}
1171

    
1172
# This builds FreeBSD (make buildworld)
1173
# Imported from FreeSBIE
1174
make_world() {
1175

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

    
1182
	export MAKE_CONF="__MAKE_CONF=$MAKE_CONF"
1183

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

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

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

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

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

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

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

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

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

    
1273
	unset MAKE_CONF
1274
	unset makeargs
1275

    
1276
	SRC_CONF=${OSRC_CONF}
1277
}
1278

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

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

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

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

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

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

    
1491
	# size of cylinder in sectors
1492
	cs = $3 * $4
1493

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

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

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

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

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

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

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

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

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

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

    
1552
	pprint 2 "${MAKEOBJDIRPREFIXFINAL}/_.fdisk"
1553
	pprint 2 "`cat ${MAKEOBJDIRPREFIXFINAL}/_.fdisk`"
1554

    
1555
	IMG=${MAKEOBJDIRPREFIXFINAL}/nanobsd.full.img
1556
	BS=${NANO_SECTS}b
1557

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

    
1571
	trap "mdconfig -d -u $MD" 1 2 15 EXIT
1572

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

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

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

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

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

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

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

    
1656
	#) > ${MAKEOBJDIRPREFIXFINAL}/_.di 2>&1
1657

    
1658
}
1659

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

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

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

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

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

    
1697
	# Must be run after customize_stagearea_for_image
1698
	cust_fixup_nanobsd ${1} $NANO_MEDIASIZE
1699

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

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

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

    
1711
		FlashDevice ${FLASH_MODEL} ${_NANO_MEDIASIZE}
1712

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

    
1725
	# size of cylinder in sectors
1726
	cs = $3 * $4
1727

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

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

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

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

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

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

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

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

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

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

    
1786
		MNT=${MAKEOBJDIRPREFIXFINAL}/_.mnt
1787
		mkdir -p ${MNT}
1788

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

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

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

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

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

    
1813
		clone_directory_contents ${PFSENSEISODIR} ${MNT}
1814

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

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

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

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

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

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

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

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

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

    
1885
			clone_directory_contents ${PFSENSEISODIR}/cf ${MNT}
1886

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

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

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

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

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

    
1921
		gzip -f $IMG &
1922
		gzip -f $IMGUPDATE &
1923
	done
1924

    
1925
	unset IMG
1926
	unset IMGUPDATE
1927
	unset IMGUPDATESIZE
1928
	unset IMGSIZE
1929

    
1930
	ls -lah $MAKEOBJDIRPREFIXFINAL
1931
}
1932

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

    
1949
	LOGFILE=${BUILDER_LOGS}/ova.${TARGET}.log
1950

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2258
		cp ${PFSTODIR}/etc/platform ${PFSTODIR}/tmp/
2259

    
2260
		/sbin/mount -t devfs devfs ${PFSTODIR}/dev
2261

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

    
2265
		/bin/echo ${custom_package_list} > ${PFSTODIR}/tmp/pkgfile.lst
2266

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

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

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

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

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

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

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

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

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

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

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

    
2353
rc=\$?
2354

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

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

    
2363
# Copy config.xml to conf.default/
2364
cp /conf/config.xml conf.default/
2365

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

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

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

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

    
2392
if [ -f /tmp/platform ]; then
2393
	mv /tmp/platform /etc/platform
2394
fi
2395

    
2396
/bin/rm /tmp/pfspkg_installer
2397

    
2398
/bin/rm /tmp/pkgfile.lst
2399

    
2400
/bin/rm /tmp/*.log /tmp/*.tbz 2>/dev/null
2401

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

    
2406
/bin/rm /etc/resolv.conf
2407

    
2408
/bin/rm /${PFSDESTNAME}
2409

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

    
2415
EOF
2416

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

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

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

    
2436
	staginareas_clean_each_run
2437

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

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

    
2465

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

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

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

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

    
2491
	echo "Done!"
2492

    
2493
	echo ">>> Cleaning of builder environment has finished."
2494
}
2495

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

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

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

    
2535
	update_freebsd_sources_and_apply_patches
2536

    
2537
	update_pfSense_repository
2538

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

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

    
2562
clone_to_staging_area() {
2563

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

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

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

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

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

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

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

    
2626
	clone_directory_contents ${PFSENSESTAGEDIR} ${PFSENSEISODIR}
2627

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

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

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

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

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

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

    
2665
customize_stagearea_for_image() {
2666
	# Prepare final stage area
2667
	create_final_staging_area
2668

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

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

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

    
2690
		# Add installer bits
2691
		cust_populate_installer_bits
2692

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

    
2699
	# Add extra files such as buildtime of version, bsnmpd, etc.
2700
	cust_populate_extra
2701

    
2702
	install_custom_overlay
2703

    
2704
	# Check for custom config.xml
2705
	cust_install_config_xml
2706

    
2707
	# Install custom pfSense-XML packages from a chroot
2708
	pfsense_install_custom_packages_exec
2709

    
2710
	# Overlay final files
2711
	install_custom_overlay_final
2712

    
2713
	# Ensure config.xml exists
2714
	copy_config_xml_from_conf_default
2715

    
2716
	# Test PHP installation
2717
	test_php_install
2718

    
2719
	# Overlay any loader.conf customziations
2720
	install_extra_loader_conf_options
2721

    
2722
	# Create md5 summary file listing checksums
2723
	create_md5_summary_file
2724

    
2725
	# Create mtree summary file listing owner/permissions/sha256 and similar
2726
	create_mtree_summary_file
2727

    
2728
	# Setup serial port helper hints
2729
	setup_serial_hints
2730

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

    
2737
}
2738

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

    
2747
	customize_stagearea_for_image "iso"
2748
	install_default_kernel ${DEFAULT_KERNEL}
2749

    
2750
	echo cdrom > $PFSENSEISODIR/etc/platform
2751

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

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

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

    
2773
create_memstick_image() {
2774

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

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

    
2786
	echo cdrom > $PFSENSEISODIR/etc/platform
2787

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

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

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

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

    
2832
	echo cdrom > $PFSENSEISODIR/etc/platform
2833

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

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

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

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

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

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

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

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

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

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

    
2910
	OIFS=$IFS
2911
	IFS="
2912
"
2913

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

    
2928
	IFS=$OIFS
2929
}
2930

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

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

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

    
2946
	OLDPWD=`pwd`
2947

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

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

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

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

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

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

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

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

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

    
3060
		fi
3061
		print_error_pfS
3062
		kill $$
3063
	fi
3064

    
3065
	cd $OLDPWD
3066
	unset OLDPWD
3067
}
3068

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

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

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

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

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

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

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

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

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

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

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

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

    
3214
install_pkg_install_ports_build() {
3215
	local PORTDIRPFSA
3216
	local PORTNAME
3217
	local _PORTNAME
3218
	local BUILT_PKGNAME
3219

    
3220
	PORTDIRPFSA="$1"
3221

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

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

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

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

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

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

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

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

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

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

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

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

    
3376
}
3377

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

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

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

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

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

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

    
3415
	echo ">>> Operation $0 has started at `date`"
3416
}
3417

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

    
(3-3/7)