Projet

Général

Profil

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

univnautes-tools / builder_scripts / builder_common.sh @ b6b9abe0

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

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

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

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

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

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

    
100
}
101

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

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

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

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

    
158

    
159
	unset MOUNT_PRESTAGE
160
	unset MOUNT_STAGE
161
}
162

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

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

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

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

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

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

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

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

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

    
244
}
245

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

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

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

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

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

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

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

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

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

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

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

    
305
		SRC_CONF=${OSRC_CONF}
306

    
307
		ensure_kernel_exists $KERNEL_DESTDIR
308

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

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

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

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

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

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

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

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

    
372
	unset KERNEL_NAME
373
}
374

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

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

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

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

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

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

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

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

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

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

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

    
447
		echo ">>> Executing $PFPORTSBASENAME"
448

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

    
460
		handle_tools_stats_crypto
461

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
688
	# Set buildtime
689
	get_date_string
690

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
847
	unset _NANO_WITH_VGA
848
	unset _FLASH_SIZE
849
}
850

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
995
	OLDPWD=`pwd`
996

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

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

    
1016

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

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

    
1022
	cd $OLDPWD
1023
	unset OLDPWD
1024
}
1025

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

    
1029
	mkdir -p ${GIT_REPO_DIR}/pfSenseGITREPO
1030

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

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

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

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

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

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

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

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

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

    
1135
	OLDPWD=`pwd`
1136

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

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

    
1172
	cd $OLDPWD
1173
	unset OLDPWD
1174
}
1175

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

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

    
1186
	export MAKE_CONF="__MAKE_CONF=$MAKE_CONF"
1187

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

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

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

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

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

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

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

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

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

    
1277
	unset MAKE_CONF
1278
	unset makeargs
1279

    
1280
	SRC_CONF=${OSRC_CONF}
1281
}
1282

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1662
}
1663

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

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

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

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

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

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

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

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

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

    
1715
		FlashDevice ${FLASH_MODEL} ${_NANO_MEDIASIZE}
1716

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1817
		clone_directory_contents ${PFSENSEISODIR} ${MNT}
1818

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1933
	ls -lah $MAKEOBJDIRPREFIXFINAL
1934
}
1935

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2356
rc=\$?
2357

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

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

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

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

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

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

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

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

    
2399
/bin/rm /tmp/pfspkg_installer
2400

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

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

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

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

    
2411
/bin/rm /${PFSDESTNAME}
2412

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

    
2418
EOF
2419

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

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

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

    
2439
	staginareas_clean_each_run
2440

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

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

    
2468

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

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

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

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

    
2494
	echo "Done!"
2495

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

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

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

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

    
2538
	update_freebsd_sources_and_apply_patches
2539

    
2540
	update_pfSense_repository
2541

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

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

    
2565
clone_to_staging_area() {
2566

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

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

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

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

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

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

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

    
2629
	clone_directory_contents ${PFSENSESTAGEDIR} ${PFSENSEISODIR}
2630

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

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

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

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

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

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

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

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

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

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

    
2693
		# Add installer bits
2694
		cust_populate_installer_bits
2695

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

    
2702
        # univnautes packages
2703
	echo ">>> UNIVNAUTES/START" | tee -a ${LOGFILE}
2704
	echo ">>> Search UnivNautes packages..." | tee -a ${LOGFILE}
2705
        if [ "$PFSPKGFILE" = "" ]; then
2706
            PFSPKGFILE=${SCRATCHDIR}/pfspackages
2707
            echo ">> PFSPKGFILE is not defined.  Setting to ${PFSPKGFILE}." | tee -a ${LOGFILE}
2708
        fi
2709
        (${PKG_INFO} | grep bash) > $PFSPKGFILE
2710
        (${PKG_INFO} | grep python) >> $PFSPKGFILE
2711
        (${PKG_INFO} | grep py27-) >> $PFSPKGFILE
2712
        (${PKG_INFO} | grep lasso) >> $PFSPKGFILE
2713
	echo $PFSPKGFILE >> ${LOGFILE}
2714
	echo ">>> Installing UnivNautes packages: " | tee -a ${LOGFILE}
2715
	(${BUILDER_SCRIPTS}/scripts/pkginstall.sh)
2716
        echo ">>> force perl removal" | tee -a ${LOGFILE}
2717
        PERLPKG=$(${PKG_INFO} | grep perl5 | cut -f1 -d" ")
2718
        echo ">>>     pkg_delete -f $PERLPKG:" | tee -a ${LOGFILE}
2719
        chroot /usr/local/pfsense-clone pkg_delete -f $PERLPKG
2720
	echo ">>> remove pyo/pyc files..." | tee -a ${LOGFILE}
2721
        find ${PFSENSEISODIR}/usr/local/ -type f -name "*.py[co]" -exec rm {} ";"
2722
	echo ">>> remove doc files:" | tee -a ${LOGFILE}
2723
        for d in ${PFSENSEISODIR}/usr/local/man ${PFSENSEISODIR}/usr/local/share/examples ${PFSENSEISODIR}/usr/local/share/doc # ${PFSENSEISODIR}/usr/local/lib/perl*
2724
	do
2725
		echo ">>>   remove $d..." | tee -a ${LOGFILE}
2726
                rm -rf $d
2727
        done
2728
	echo ">>> remove locale files (not fr/en):" | tee -a ${LOGFILE}
2729
	DLOC="ar az be bg bn br bs ca cs cy da de el eo es es_AR es_MX et eu fa fi fy_NL ga gl he hi hr hu id is it ja ka kk km kn ko lt lv mk ml mn my nb ne nl nn os pa pl pt pt_BR ro ru sk sl sq sr sr_Latn sv sw ta te th tr tt uk ur vi zh_CN zh_TW"
2730
        for d in $(find ${PFSENSEISODIR}/usr/local/ -type d -name locale)
2731
	do
2732
		echo -n ">>>   remove locales in $d..." | tee -a ${LOGFILE}
2733
		for loc in $DLOC
2734
		do
2735
			#echo -n " "$loc | tee -a ${LOGFILE}
2736
			rm -rf ${d}/${loc}
2737
		done
2738
                echo "" | tee -a ${LOGFILE}
2739
	done
2740
	echo ">>> UNIVNAUTES/END" | tee -a ${LOGFILE}
2741
        # end of univnautes packages
2742

    
2743
	# Add extra files such as buildtime of version, bsnmpd, etc.
2744
	cust_populate_extra
2745

    
2746
	install_custom_overlay
2747

    
2748
	# Check for custom config.xml
2749
	cust_install_config_xml
2750

    
2751
	# Install custom pfSense-XML packages from a chroot
2752
	pfsense_install_custom_packages_exec
2753

    
2754
	# Overlay final files
2755
	install_custom_overlay_final
2756

    
2757
	# Ensure config.xml exists
2758
	copy_config_xml_from_conf_default
2759

    
2760
	# Test PHP installation
2761
	test_php_install
2762

    
2763
	# Overlay any loader.conf customziations
2764
	install_extra_loader_conf_options
2765

    
2766
	# Create md5 summary file listing checksums
2767
	create_md5_summary_file
2768

    
2769
	# Create mtree summary file listing owner/permissions/sha256 and similar
2770
	create_mtree_summary_file
2771

    
2772
	# Setup serial port helper hints
2773
	setup_serial_hints
2774

    
2775
	# Allow a custom function to be called from pfsense-build.conf
2776
	# example: disable_lan_disable_dhcpd_enable_sshd
2777
	if [ -n "$CUSTOM_CALL_SHELL_FUNCTION"  ]; then
2778
		eval $CUSTOM_CALL_SHELL_FUNCTION
2779
	fi
2780

    
2781
}
2782

    
2783
create_iso_image() {
2784
	LOGFILE=${BUILDER_LOGS}/isoimage.${TARGET}
2785
	echo ">>> Building bootable ISO image for ${TARGET}" | tee -a ${LOGFILE}
2786
	if [ -z "${DEFAULT_KERNEL}" ]; then
2787
		echo ">>> ERROR: Could not identify DEFAULT_KERNEL to install on image!" | tee -a ${LOGFILE}
2788
		print_error_pfS
2789
	fi
2790

    
2791
	customize_stagearea_for_image "iso"
2792
	install_default_kernel ${DEFAULT_KERNEL}
2793

    
2794
	echo cdrom > $PFSENSEISODIR/etc/platform
2795

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

    
2799
	# This check is for supporting create memstick/ova images
2800
	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}
2801
	echo "-o label=${FSLABEL} -o publisher=\"${PRODUCT_NAME} project.\" $ISOPATH ${PFSENSEISODIR}" | tee -a ${LOGFILE}
2802
	makefs -t cd9660 -o bootimage="i386;${PFSENSEISODIR}/boot/cdboot" -o no-emul-boot -o rockridge \
2803
				-o label=${FSLABEL} -o publisher="${PRODUCT_NAME} project." $ISOPATH ${PFSENSEISODIR} 2>&1 >> ${LOGFILE}
2804
	if [ $? -ne 0 -o ! -f $ISOPATH ]; then
2805
		if [ -f ${ISOPATH} ]; then
2806
			rm -f $ISOPATH
2807
		fi
2808
		echo ">>> ERROR: Something wrong happened during ISO image creation. STOPPING!" | tee -a ${LOGFILE}
2809
		print_error_pfS
2810
		kill $$
2811
	fi
2812
	gzip -qf $ISOPATH &
2813

    
2814
	echo ">>> ISO created: `LC_ALL=C date`" | tee -a ${LOGFILE}
2815
}
2816

    
2817
create_memstick_image() {
2818

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

    
2825
	if [ ! -d ${PFSENSEISODIR}/boot ]; then
2826
		customize_stagearea_for_image "memstick"
2827
		install_default_kernel ${DEFAULT_KERNEL}
2828
	fi
2829

    
2830
	echo cdrom > $PFSENSEISODIR/etc/platform
2831

    
2832
	echo ">>> Creating memstick to ${MEMSTICKPATH}." 2>&1 | tee -a ${LOGFILE}
2833
	echo "/dev/ufs/${PRODUCT_NAME} / ufs ro 0 0" > ${PFSENSEISODIR}/etc/fstab
2834
	echo "kern.cam.boot_delay=10000" >> ${PFSENSEISODIR}/boot/loader.conf.local
2835
	if [ $FREEBSD_VERSION -lt 10 ]; then
2836
		makefs -B little ${MEMSTICKPATH} ${PFSENSEISODIR}
2837
	else
2838
		makefs -B little -o label=${PRODUCT_NAME} ${MEMSTICKPATH} ${PFSENSEISODIR}
2839
	fi
2840
	if [ $? -ne 0 ]; then
2841
		if [ -f ${MEMSTICKPATH} ]; then
2842
			rm -f $MEMSTICKPATH
2843
		fi
2844
		echo ">>> ERROR: Something wrong happened during MEMSTICK image creation. STOPPING!" | tee -a ${LOGFILE}
2845
		print_error_pfS
2846
		kill $$
2847
	fi
2848
	MD=$(mdconfig -a -t vnode -f $MEMSTICKPATH)
2849
	# Just in case
2850
	trap "mdconfig -d -u ${MD}" 1 2 15 EXIT
2851
	gpart create -s BSD ${MD} 2>&1 >> ${LOGFILE}|
2852
	gpart bootcode -b ${PFSENSEISODIR}/boot/boot ${MD} 2>&1 >> ${LOGFILE}
2853
	gpart add -t freebsd-ufs ${MD} 2>&1 >> ${LOGFILE}
2854
	if [ $FREEBSD_VERSION -lt 10 ]; then
2855
		tunefs -L ${PRODUCT_NAME} /dev/${MD}
2856
	fi
2857
	trap "-" 1 2 15 EXIT
2858
	mdconfig -d -u ${MD} 2>&1 | tee -a ${LOGFILE}
2859
	gzip -qf $MEMSTICKPATH &
2860

    
2861
	echo ">>> MEMSTICK created: `LC_ALL=C date`" | tee -a ${LOGFILE}
2862
}
2863

    
2864
create_memstick_serial_image() {
2865
	LOGFILE=${BUILDER_LOGS}/memstickserial.${TARGET}
2866
	if [ "${MEMSTICKSERIALPATH}" = "" ]; then
2867
		echo ">>> MEMSTICKSERIALPATH is empty skipping generation of memstick image!" | tee -a ${LOGFILE}
2868
		return
2869
	fi
2870

    
2871
	if [ ! -d ${PFSENSEISODIR}/boot ]; then
2872
		customize_stagearea_for_image "memstickserial"
2873
		install_default_kernel ${DEFAULT_KERNEL}
2874
	fi
2875

    
2876
	echo cdrom > $PFSENSEISODIR/etc/platform
2877

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

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

    
2883
	BOOTCONF=${PFSENSEISODIR}/boot.config
2884
	LOADERCONF=${PFSENSEISODIR}/boot/loader.conf
2885
	ACTIVECONF=${PFSENSEISODIR}/cf/conf/config.xml
2886
	DEFAULTCONF=${PFSENSEISODIR}/conf.default/config.xml
2887
	TTYS=${PFSENSEISODIR}/etc/ttys
2888

    
2889
	echo ">>>   Activating serial console..." 2>&1 | tee -a ${LOGFILE}
2890
	# Activate serial console in boot.config
2891
	if [ -f ${BOOTCONF} ]; then
2892
		sed -i "" '/^-D$/d' ${BOOTCONF}
2893
	fi
2894
	echo "-D" >> ${BOOTCONF}
2895

    
2896
	# Activate serial console in config.xml
2897
	# If it was there before, clear the setting to be sure we don't add it twice.
2898
	sed -i "" -e "/		<enableserial\/>/d" ${ACTIVECONF}
2899
	# Enable serial in the config
2900
	sed -i "" -e "s/	<\/system>/		<enableserial\/>\\`echo -e \\\n`	<\/system>/" ${ACTIVECONF}
2901
	# Make sure to update the default config as well.
2902
	cp ${ACTIVECONF} ${DEFAULTCONF}
2903

    
2904
	# Remove old console options if present.
2905
	sed -i "" -Ee "/(console|boot_multicons|boot_serial)/d" ${LOADERCONF}
2906
	# Activate serial console+video console in loader.conf
2907
	echo 'boot_multicons="YES"' >>  ${LOADERCONF}
2908
	echo 'boot_serial="YES"' >> ${LOADERCONF}
2909
	echo 'console="comconsole,vidconsole"' >> ${LOADERCONF}
2910

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

    
2914
	if [ $FREEBSD_VERSION -lt 10 ]; then
2915
		makefs -B little ${MEMSTICKSERIALPATH} ${PFSENSEISODIR}
2916
	else
2917
		makefs -B little -o label=${PRODUCT_NAME} ${MEMSTICKSERIALPATH} ${PFSENSEISODIR}
2918
	fi
2919
	if [ $? -ne 0 ]; then
2920
		if [ -f ${MEMSTICKSERIALPATH} ]; then
2921
			rm -f $MEMSTICKSERIALPATH
2922
		fi
2923
		echo ">>> ERROR: Something wrong happened during MEMSTICKSERIAL image creation. STOPPING!" | tee -a ${LOGFILE}
2924
		print_error_pfS
2925
		kill $$
2926
	fi
2927
	MD=$(mdconfig -a -t vnode -f $MEMSTICKSERIALPATH)
2928
	# Just in case
2929
	trap "mdconfig -d -u ${MD}" 1 2 15 EXIT
2930
	gpart create -s BSD ${MD} 2>&1 >> ${LOGFILE}
2931
	gpart bootcode -b ${PFSENSEISODIR}/boot/boot ${MD} 2>&1 >> ${LOGFILE}
2932
	gpart add -t freebsd-ufs ${MD} 2>&1 >> ${LOGFILE}
2933
	if [ $FREEBSD_VERSION -lt 10 ]; then
2934
		tunefs -L ${PRODUCT_NAME} /dev/${MD}
2935
	fi
2936
	trap "-" 1 2 15 EXIT
2937
	mdconfig -d -u ${MD} 2>&1 >> ${LOGFILE}
2938
	gzip -qf $MEMSTICKSERIALPATH &
2939

    
2940
	echo ">>> MEMSTICKSERIAL created: `LC_ALL=C date`" | tee -a ${LOGFILE}
2941
}
2942

    
2943
# This routine ensures any ports / binaries that the builder
2944
# system needs are on disk and ready for execution.
2945
install_required_builder_system_ports() {
2946
	# No ports exist, use portsnap to bootstrap.
2947
	if [ ! -d "/usr/ports/" ]; then
2948
		echo -n  ">>> Grabbing FreeBSD port sources, please wait..."
2949
		(/usr/sbin/portsnap fetch) 2>&1 | egrep -B3 -A3 -wi '(error)'
2950
		(/usr/sbin/portsnap extract) 2>&1 | egrep -B3 -A3 -wi '(error)'
2951
		echo "Done!"
2952
	fi
2953

    
2954
	OIFS=$IFS
2955
	IFS="
2956
"
2957

    
2958
	for PKG_STRING in `cat ${PFSBUILDERREQUIREDPORTS} ${PFSBUILDERREQUIREDPORTS}.${FREEBSD_VERSION} 2>/dev/null`
2959
	do
2960
		PKG_STRING_T=`echo $PKG_STRING | sed "s/[ ]+/ /g"`
2961
		CHECK_ON_DISK=`echo $PKG_STRING_T | awk '{ print $1 }'`
2962
		PORT_LOCATION=`echo $PKG_STRING_T | awk '{ print $2 }'`
2963
		UNSET_OPTS=`echo $PKG_STRING_T | awk '{ print $2 }' | sed 's/,/ /g'`
2964
		if [ ! -f "$CHECK_ON_DISK" ]; then
2965
			echo -n ">>> Building $PORT_LOCATION ..."
2966
			(cd $PORT_LOCATION && env -u TARGET -u TARGET_ARCH make BATCH=yes deinstall clean) 2>&1 | egrep -B3 -A3 -wi '(error)'
2967
			(cd $PORT_LOCATION && env -u TARGET -u TARGET_ARCH make ${MAKEJ_PORTS} WITHOUT="X11 DOCS EXAMPLES MAN INFO SDL ${UNSET_OPTS}" BATCH=yes FORCE_PKG_REGISTER=yes install clean) 2>&1 | egrep -B3 -A3 -wi '(error)'
2968
			echo "Done!"
2969
		fi
2970
	done
2971

    
2972
	IFS=$OIFS
2973
}
2974

    
2975
# Updates FreeBSD sources and applies any custom
2976
# patches that have been defined.
2977
update_freebsd_sources_and_apply_patches() {
2978
	# No need to obtain sources or patch
2979
	# on subsequent build runs.
2980

    
2981
	if [ ! -d "${SRCDIR}" ]; then
2982
		mkdir -p ${SRCDIR}
2983
	fi
2984

    
2985
	if [ -n "${NO_BUILDWORLD:-}" -a -n "${NO_BUILDKERNEL:-}" ]; then
2986
		echo ">>> NO_BUILDWORLD and NO_BUILDKERNEL set, skipping update of freebsd sources and patch applying" | tee -a ${LOGFILE}
2987
		return
2988
	fi
2989

    
2990
	OLDPWD=`pwd`
2991

    
2992
	echo -n ">>> Obtaining FreeBSD sources ${FREEBSD_BRANCH}..."
2993
	if [ -n "${USE_SVN}" ]; then
2994
		if [ -f /usr/bin/svnlite ]; then
2995
			SVN_BIN=/usr/bin/svnlite
2996
		else
2997
			SVN_BIN=svn
2998
		fi
2999

    
3000
		# If src is already there
3001
		if [ -d "${SRCDIR}/.svn" ]; then
3002
			# Remove orphan files
3003
			(cd ${SRCDIR} && ${SVN_BIN} status --no-ignore | awk '{print $2}' | xargs rm -rf)
3004
			# Revert possible changed files
3005
			(cd ${SRCDIR} && ${SVN_BIN} revert -R . 2>&1) | grep -i 'error'
3006
			# Update src
3007
			(cd ${SRCDIR} && ${SVN_BIN} up 2>&1) | grep -i 'error'
3008
		else
3009
			(${SVN_BIN} co ${FREEBSD_REPO_BASE}/${FREEBSD_BRANCH} ${SRCDIR} 2>&1) | grep -i 'error'
3010
		fi
3011
	else
3012
		local _FREEBSD_BRANCH=${FREEBSD_BRANCH:-"master"}
3013
		local _CLONE=1
3014

    
3015
		if [ -d "${SRCDIR}/.git" ]; then
3016
			CUR_BRANCH=$(cd ${SRCDIR} && git branch | grep '^\*' | cut -d' ' -f2)
3017
			if [ "${CUR_BRANCH}" = "${_FREEBSD_BRANCH}" ]; then
3018
				_CLONE=0
3019
				( cd ${SRCDIR} && git fetch origin; git reset --hard; git clean -fxd; git rebase origin/${_FREEBSD_BRANCH} ) 2>&1 | grep -C3 -i 'error'
3020
			elif (cd ${SRCDIR} && git branch 2>&1 | grep -q "${_FREEBSD_BRANCH}"); then
3021
				_CLONE=0
3022
				( 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'
3023
			else
3024
				rm -rf ${SRCDIR}
3025
			fi
3026
		fi
3027

    
3028
		if [ ${_CLONE} -eq 1 ]; then
3029
			( git clone --branch ${_FREEBSD_BRANCH} --single-branch ${FREEBSD_REPO_BASE} ${SRCDIR} ) 2>&1 | grep -C3 -i 'error'
3030
		fi
3031

    
3032
		if [ -n "${GIT_FREEBSD_COSHA1}" ]; then 
3033
			( cd ${SRCDIR} && git checkout ${GIT_FREEBSD_COSHA1} ) 2>&1 | grep -C3 -i 'error'
3034
		fi
3035
	fi
3036
	echo "Done!"
3037

    
3038
	# Loop through and remove files
3039
	echo ">>> Removing files listed for FreeBSD version: ${FREEBSD_VERSION} file-name: ${PFSPATCHFILE}"
3040
	for LINE in `cat ${PFSPATCHFILE}`
3041
	do
3042
		PATCH_RM=`echo $LINE | cut -d~ -f4`
3043
		PATCH_RM_LENGTH=`echo $PATCH_RM | wc -c`
3044
		DIR_CREATE=`echo $LINE | cut -d~ -f5`
3045
		if [ $PATCH_RM_LENGTH -gt "2" ]; then
3046
			rm -rf ${SRCDIR}${PATCH_RM}
3047
		fi
3048
		if [ "$DIR_CREATE" != "" ]; then
3049
			mkdir -p ${SRCDIR}/${DIR_CREATE}
3050
		fi
3051
	done
3052

    
3053
	echo -n ">>> Applying patches from $PFSPATCHFILE please wait..."
3054
	# Loop through and patch files
3055
	for LINE in `cat ${PFSPATCHFILE}`
3056
	do
3057
		PATCH_DEPTH=`echo $LINE | cut -d~ -f1`
3058
		PATCH_DIRECTORY=`echo $LINE | cut -d~ -f2`
3059
		PATCH_FILE=`echo $LINE | cut -d~ -f3`
3060
		PATCH_FILE_LEN=`echo $PATCH_FILE | wc -c`
3061
		MOVE_FILE=`echo $LINE | cut -d~ -f4`
3062
		MOVE_FILE_LEN=`echo $MOVE_FILE | wc -c`
3063
		IS_TGZ=`echo $LINE | grep -v grep | grep .tgz | wc -l`
3064
		if [ ${PATH_FILE} == ""]; then
3065
			
3066
		elif [ ! -f "${PFSPATCHDIR}/${PATCH_FILE}" ]; then
3067
			echo
3068
			echo "ERROR!  Patch file(${PATCH_FILE}) not found!  Please fix before building!"
3069
			echo
3070
			print_error_pfS
3071
			kill $$
3072
		fi
3073

    
3074
		if [ $PATCH_FILE_LEN -gt "2" ]; then
3075
			if [ $IS_TGZ -gt "0" ]; then
3076
				(cd ${SRCDIR}/${PATCH_DIRECTORY} && tar xzvpf ${PFSPATCHDIR}/${PATCH_FILE}) 2>&1 \
3077
				| egrep -wi '(warning|error)'
3078
			else
3079
				(cd ${SRCDIR}/${PATCH_DIRECTORY} && patch --quiet -f ${PATCH_DEPTH} < ${PFSPATCHDIR}/${PATCH_FILE} 2>&1 );
3080
				if [ "$?" != "0" ]; then
3081
					echo "failed to apply ${PATCH_FILE}";
3082
				fi
3083
			fi
3084
		fi
3085
		if [ $MOVE_FILE_LEN -gt "2" ]; then
3086
			#cp ${SRCDIR}/${MOVE_FILE} ${SRCDIR}/${PATCH_DIRECTORY}
3087
		fi
3088
	done
3089
	echo "Done!"
3090

    
3091
	echo ">>> Finding patch rejects..."
3092
	REJECTED_PATCHES=`find $SRCDIR -name "*.rej" | wc -l`
3093
	if [ $REJECTED_PATCHES -gt 0 ]; then
3094
		echo
3095
		echo "WARNING!  Rejected patches found!  Please fix before building!"
3096
		echo
3097
		find $SRCDIR -name "*.rej"
3098
		echo
3099
		if [ "$BUILD_ERROR_MAIL" != "" ]; then
3100
			LOGFILE="$SCRATCHDIR/patches.failed.apply"
3101
			find $SRCDIR -name "*.rej" > $LOGFILE
3102
			print_error_pfS
3103

    
3104
		fi
3105
		print_error_pfS
3106
		kill $$
3107
	fi
3108

    
3109
	cd $OLDPWD
3110
	unset OLDPWD
3111
}
3112

    
3113
# Email when an error has occured and BUILD_ERROR_MAIL is defined
3114
report_error_pfsense() {
3115
    if [ ! -z ${BUILD_ERROR_MAIL:-} ]; then
3116
		HOSTNAME=`hostname`
3117
		IPADDRESS=`ifconfig | grep inet | grep netmask | grep broadcast | awk '{ print $2 }'`
3118
		cat ${LOGFILE} | \
3119
		    mail -s "Builder (${PRODUCT_NAME}) build error in ${TARGET} phase ${IPADDRESS} - ${HOSTNAME} " \
3120
		    	${BUILD_ERROR_MAIL}
3121
    fi
3122
}
3123

    
3124
# Email when an operation is completed IE build run
3125
email_operation_completed() {
3126
    if [ ! -z ${BUILD_COMPLETED_MAIL:-} ]; then
3127
		HOSTNAME=`hostname`
3128
		IPADDRESS=`ifconfig | grep inet | grep netmask | grep broadcast | awk '{ print $2 }'`
3129
		echo "Build / operation completed ${IPADDRESS} - ${HOSTNAME}" | \
3130
		mail -s "Builder (${PRODUCT_NAME}) operation completed ${IPADDRESS} - ${HOSTNAME}" \
3131
	    	${BUILD_COMPLETED_MAIL}
3132
    fi
3133
}
3134

    
3135
# This ensures installer is healthy.
3136
ensure_healthy_installer() {
3137
	echo -n ">>> Checking BSDInstaller health..." | tee -a ${LOGFILE}
3138
	INSTALLER_ERROR=0
3139
	if [ ! -f "$PFSENSEISODIR/usr/local/sbin/dfuife_curses" ]; then
3140
		INSTALLER_ERROR=1
3141
		echo -n " dfuife_curses missing " | tee -a ${LOGFILE}
3142
	fi
3143
	if [ ! -d "$PFSENSEISODIR/usr/local/share/dfuibe_lua" ]; then
3144
		INSTALLER_ERROR=1
3145
		echo -n " dfuibe_lua missing " | tee -a ${LOGFILE}
3146
	fi
3147
	if [ ! -f "$PFSENSEISODIR/usr/local/share/dfuibe_lua/conf/pfSense.lua" ]; then
3148
		INSTALLER_ERROR=1
3149
		echo " pfSense_lua missing " | tee -a ${LOGFILE}
3150
	fi
3151
	if [ "$INSTALLER_ERROR" -gt 0 ]; then
3152
		echo ">>> ERROR: " |  tee -a ${LOGFILE}
3153
		print_error_pfS
3154
		kill $$
3155
	else
3156
		echo "[OK]" | tee -a ${LOGFILE}
3157
	fi
3158
}
3159

    
3160
# Check to see if a forced pfPorts run has been requested.
3161
# If so, rebuild pfPorts.  set_version.sh uses this.
3162
check_for_forced_pfPorts_build() {
3163
	if [ -f "$SCRATCHDIR/pfPorts_forced_build_required" ]; then
3164
		# Ensure that we build
3165
		rm -f $SCRATCHDIR/pfSense_do_not_build_pfPorts
3166
		recompile_pfPorts
3167
		# Remove file that could trigger 2 pfPorts
3168
		# builds in one run
3169
		rm $SCRATCHDIR/pfPorts_forced_build_required
3170
	fi
3171
}
3172

    
3173
# Print basenames
3174
print_basenames() {
3175
	for NAME in "$1"; do
3176
		echo `basename $NAME`
3177
	done
3178
}
3179

    
3180
# Put extra options in loader.conf.local if needed
3181
install_extra_loader_conf_options() {
3182
	if [ ! -z ${LOADER_CONF_CUSTOM} ]; then
3183
		if [ -f ${LOADER_CONF_CUSTOM} ]; then
3184
			echo -n  ">>> loader.conf custom option addition..."
3185
			cat ${LOADER_CONF_CUSTOM} >> $PFSENSEISODIR/boot/loader.conf.local
3186
			echo "Done!"
3187
		fi
3188
	fi
3189
}
3190

    
3191
# This routine assists with installing various
3192
# freebsd ports files into the pfsenese-fs staging
3193
# area.  The various ports are built prior to install.
3194
install_pkg_install_ports() {
3195
	if [ "$PKG_INSTALL_PORTSPFS" = "" ]; then
3196
		return
3197
	fi
3198
	OLDPWD=`pwd`
3199
	# port build log files will be stored here
3200
	mkdir -p ${BUILDER_LOGS}/pfPorts
3201
	ALREADYBUILT="${BUILDER_LOGS}/pfPorts/install_pkg_install_ports"
3202
	if [ -d $ALREADYBUILT ]; then
3203
		rm -rf $ALREADYBUILT
3204
	fi
3205
	mkdir -p $ALREADYBUILT
3206
	# Some ports are unhappy with cross building and fail spectacularly.
3207
	OLDTGTARCH=${TARGET_ARCH}
3208
	unset TARGET_ARCH
3209
	export PFS_PKG_ALL="/usr/ports/packages/All/"
3210
	PFS_PKG_OLD="/usr/ports/packages/Old/"
3211
	VAR_DB_PKG_TMP="$SCRATCHDIR/vardbpkg/"
3212
	VAR_DB_PKG="/var/db/pkg/"
3213
	mkdir -p ${PFS_PKG_ALL}
3214
	mkdir -p ${PFS_PKG_OLD}
3215
	mkdir -p ${VAR_DB_PKG_TMP}
3216
	# Make a backup of existing packages so we can figure out
3217
	# which packages need to be installed in pfsense-fs chroot.
3218
	# otherwise you will get a bunch of extra pkgs that where
3219
	# on the system prior to invoking this build run.
3220
	mv ${PFS_PKG_ALL}* ${PFS_PKG_OLD}/ 2>/dev/null
3221
	mkdir -p ${PFS_PKG_ALL} 2>/dev/null
3222

    
3223
	echo ">>> Building ports: (starting)"
3224
	for PORTDIRPFS in $PKG_INSTALL_PORTSPFS; do
3225
		install_pkg_install_ports_build $PORTDIRPFS
3226
	done
3227

    
3228
	mkdir -p $PFSENSESTAGEDIR/tmp/pkg/
3229
	cp ${PFS_PKG_ALL}/* $PFSENSESTAGEDIR/tmp/pkg/
3230
	echo ">>> Building ports: (finished)"
3231

    
3232
	echo ">>> Installing built ports (packages) in chroot (${PFSENSESTAGEDIR})... (starting)"
3233
	mv ${VAR_DB_PKG}/* ${VAR_DB_PKG_TMP} || true 2>/dev/null
3234
	cp ${BUILDER_SCRIPTS}/scripts/install_tmp_pkgs_in_chroot.sh $PFSENSESTAGEDIR/pkg.sh
3235
	chmod a+rx $PFSENSESTAGEDIR/pkg.sh
3236
	# chroot into staging area and pkg_add all of the packages
3237
	script ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt /sbin/mount -t devfs devfs ${PFSENSESTAGEDIR}/dev
3238
	script -a ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt chroot $PFSENSESTAGEDIR /pkg.sh
3239
	script -a ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt /sbin/umount ${PFSENSESTAGEDIR}/dev
3240
	echo ">>> Result of installing packages in the chroot is:"
3241
	echo "--------------------------------------------------"
3242
	cat ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt
3243
	echo "--------------------------------------------------"
3244
	echo ">>> Installing built ports (packages) in chroot (${PFSENSESTAGEDIR})... (finshied)"
3245

    
3246
	# Restore the previously backed up items
3247
	mv ${PFS_PKG_OLD}* ${PFS_PKG_ALL} || true 2>/dev/null
3248
	mv ${VAR_DB_PKG_TMP}/* ${VAR_DB_PKG} || true 2>/dev/null
3249
	rm -rf $PFSENSESTAGEDIR/tmp/pkg
3250
	rm -f $PFSENSESTAGEDIR/pkg.sh
3251

    
3252
	echo ">>> Building ports: (Done)"
3253
	TARGET_ARCH=${OLDTGTARCH}
3254
	cd $OLDPWD
3255
	unset OLDPWD
3256
}
3257

    
3258
install_pkg_install_ports_build() {
3259
	local PORTDIRPFSA
3260
	local PORTNAME
3261
	local _PORTNAME
3262
	local BUILT_PKGNAME
3263

    
3264
	PORTDIRPFSA="$1"
3265

    
3266
	# XXX: Maybe remove this code as its already done above!
3267
	PORTNAME="`basename $PORTDIRPFSA`"
3268
	if [ "$PORTNAME" = "" ]; then
3269
		echo ">>> ERROR: PORTNAME is blank.  Cannot continue."
3270
		print_error_pfS
3271
		kill $$
3272
	fi
3273

    
3274
	if [ -d $pfSPORTS_BASE_DIR/${PORTNAME} ]; then
3275
		echo -n ">>> Overlaying port $PORTNAME from pfPorts..."
3276
		# Cleanup to avoid issues with extra/different patches
3277
		rm -rf $PORTDIRPFSA/*
3278
		cp -R $pfSPORTS_BASE_DIR/${PORTNAME}/* $PORTDIRPFSA
3279
		echo "Done!"
3280
	fi
3281
	ALREADYBUILT="${BUILDER_LOGS}/pfPorts/install_pkg_install_ports"
3282
	BUILT_PKGNAME="`make -C $PORTDIRPFSA -V PKGNAME`"
3283
	if [ ! -f $ALREADYBUILT/$BUILT_PKGNAME ]; then
3284

    
3285
		# Install the required port for the build environment
3286
                for EXTRAPORT in `cd $PORTDIRPFSA && make build-depends-list | sort | uniq | xargs /bin/echo -n `; do
3287
                        _PORTNAME="`basename $EXTRAPORT`"
3288
                        if [ "$_PORTNAME" = "" ]; then
3289
                                echo ">>> ERROR: _PORTNAME is blank.  Cannot continue."
3290
                                print_error_pfS
3291
                                kill $$
3292
                        fi
3293
                        if [ -d $pfSPORTS_BASE_DIR/${_PORTNAME} ]; then
3294
                                echo -n ">>> Overlaying port $PORTNAME from pfPorts..."
3295
                                # Cleanup to avoid issues with extra/different patches
3296
                                rm -rf $EXTRAPORT/*
3297
                                cp -R $pfSPORTS_BASE_DIR/${_PORTNAME}/* $EXTRAPORT
3298
                                echo "Done!"
3299
                        fi
3300
                        _BUILT_PKGNAME="`make -C $EXTRAPORT -V PKGNAME`"
3301
			${PKG_QUERY} $_BUILT_PKGNAME
3302
			if [ $? -ne 0 ]; then
3303
				echo -n ">>> Building port $_PORTNAME($_BUILT_PKGNAME) as build dependency of ($PORTNAME)..."
3304
				script ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt env -u TARGET -u TARGET_ARCH make -C $EXTRAPORT $PKG_INSTALL_PFSMAKEENV WITHOUT="X11 DOCS EXAMPLES MAN INFO SDL" BATCH=yes FORCE_PKG_REGISTER=yes clean install clean 2>&1 1>/dev/null || true 2>&1 >/dev/null
3305
				if [ "$?" != "0" ]; then
3306
					echo
3307
					echo
3308
					echo "!!! Something went wrong while building ${EXTRAPORT}"
3309
					echo "    Press RETURN/ENTER to view the log from this build."
3310
					read inputline
3311
					more ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
3312
				else
3313
					echo "Done!"
3314
				fi
3315
			else
3316
				echo ">>> Port ${EXTRAPORT}($_BUILT_PKGNAME) as build dependency of ($PORTNAME)...already installed...skipping."
3317
			fi
3318
                done
3319
                        
3320
                # Package up what's needed to execute and run
3321
                for EXTRAPORT in `cd $PORTDIRPFSA && make run-depends-list | sort | uniq | xargs /bin/echo -n `; do
3322
                        _PORTNAME="`basename $EXTRAPORT`"
3323
                        if [ "$_PORTNAME" = "" ]; then
3324
                                echo ">>> ERROR: Run list _PORTNAME is blank.  Cannot continue."
3325
                                print_error_pfS
3326
                                kill $$
3327
                        fi
3328
                        if [ -d $pfSPORTS_BASE_DIR/${_PORTNAME} ]; then
3329
                                echo -n ">>> Overlaying port $_PORTNAME from pfPorts..."
3330
                                # Cleanup to avoid issues with extra/different patches
3331
                                rm -rf $EXTRAPORT/*
3332
                                cp -R $pfSPORTS_BASE_DIR/${_PORTNAME}/* $EXTRAPORT
3333
                                echo "Done!"
3334
                        fi
3335
                        install_pkg_install_ports_build $EXTRAPORT
3336
                        _BUILT_PKGNAME="`make -C $EXTRAPORT -V PKGNAME`"
3337
			echo ">>> Building port $_PORTNAME($_BUILT_PKGNAME) as runtime dependency of ($PORTNAME)...Done!"
3338
                done
3339

    
3340
		echo -n ">>> Building package $PORTNAME($BUILT_PKGNAME)..."
3341
		if [ -f /usr/ports/packages/Old/${BUILT_PKGNAME}.tbz ]; then
3342
			echo -n " Using already built port found in cache... "
3343
			cp -R /usr/ports/packages/Old/${BUILT_PKGNAME}.tbz \
3344
				/usr/ports/packages/All/
3345
			touch $ALREADYBUILT/$BUILT_PKGNAME
3346
			echo "Done!"
3347
			return;
3348
		fi
3349

    
3350
		script ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt env -u TARGET -u TARGET_ARCH make -C $PORTDIRPFSA ${MAKEJ_PORTS} $PKG_INSTALL_PFSMAKEENV WITHOUT="X11 DOCS EXAMPLES MAN INFO SDL LATEST_LINK" BATCH=yes FORCE_PKG_REGISTER=yes clean install clean 2>&1 1>/dev/null || true 2>&1 >/dev/null
3351
		if [ "$?" != "0" ]; then
3352
			echo
3353
			echo
3354
			echo "!!! Something went wrong while building ${PORTNAME}"
3355
			echo "    Press RETURN/ENTER to view the log from this build."
3356
			read inputline
3357
			more {$BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
3358
		fi
3359

    
3360
		if [ ${FREEBSD_VERSION} -gt 9 ]; then
3361
			script -a ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt pkg create -f tbz -o $PFS_PKG_ALL $BUILT_PKGNAME 
3362
		else
3363
			script -a ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt pkg_create -b $BUILT_PKGNAME $PFS_PKG_ALL/${BUILT_PKGNAME}.tbz
3364
		fi
3365
		if [ "$?" != "0" ]; then
3366
			echo
3367
			echo
3368
			echo "!!! Something went wrong while building package($BUILT_PKGNAME) for ${PORTNAME}"
3369
			echo "    Press RETURN/ENTER to view the log from this build."
3370
			read inputline
3371
			more ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
3372
		fi
3373
		echo "Done!"
3374
	fi
3375
	touch $ALREADYBUILT/$BUILT_PKGNAME
3376
}
3377

    
3378
staginareas_clean_each_run() {
3379
	if [ -f ${PFSPKGFILE} ]; then
3380
		rm -f ${PFSPKGFILE}
3381
	fi
3382
	echo -n ">>> Cleaning build directories: "
3383
	if [ -d "${PFSENSEISODIR}" ]; then
3384
		BASENAME=`basename ${PFSENSEISODIR}`
3385
		echo -n "$BASENAME "
3386
		chflags -R noschg ${PFSENSEISODIR} 2>&1 >/dev/null
3387
		rm -rf ${PFSENSEISODIR} 2>/dev/null
3388
	fi
3389
	echo "Done!"
3390
}
3391

    
3392
# Imported from FreeSBIE
3393
buildkernel() {
3394
	if [ -n "${NO_BUILDKERNEL:-}" ]; then
3395
	    echo ">>> NO_BUILDKERNEL set, skipping build" | tee -a ${LOGFILE}
3396
	    return
3397
	fi
3398

    
3399
	if [ -z "${KERNCONF:-}" ]; then
3400
		echo ">>> ERROR: No kernel configuration defined probably this is not what you want! STOPPING!" | tee -a ${LOGFILE}
3401
		print_error_pfS
3402
		kill $$
3403
	fi
3404

    
3405
	if [ -n "${KERNELCONF:-}" ]; then
3406
	    export KERNCONFDIR=$(dirname ${KERNELCONF})
3407
	    export KERNCONF=$(basename ${KERNELCONF})
3408
	fi
3409

    
3410
	SRCCONFBASENAME=`basename ${SRC_CONF}`
3411
	echo ">>> KERNCONFDIR: ${KERNCONFDIR}"
3412
	echo ">>> ARCH:        ${TARGET}"
3413
	echo ">>> SRC_CONF:    ${SRCCONFBASENAME}"
3414

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

    
3420
}
3421

    
3422
# Imported from FreeSBIE
3423
installkernel() {
3424
	if [ -z "${KERNCONF:-}" ]; then
3425
		echo ">>> ERROR: No kernel configuration defined probably this is not what you want! STOPPING!" | tee -a ${LOGFILE}
3426
		print_error_pfS
3427
		kill $$
3428
	fi
3429

    
3430
	if [ -n "${KERNELCONF:-}" ]; then
3431
	    export KERNCONFDIR=$(dirname ${KERNELCONF})
3432
	    export KERNCONF=$(basename ${KERNELCONF})
3433
	fi
3434

    
3435
	mkdir -p ${PFSENSESTAGEDIR}/boot
3436
	makeargs="${MAKEOPT:-} ${MAKEJ_KERNEL:-} SRCCONF=${SRC_CONF} TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET} DESTDIR=${KERNEL_DESTDIR}"
3437
	echo ">>> Builder is running the command: env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} installkernel KERNCONF=${KERNCONF}"  | tee -a $LOGFILE
3438
	cd ${SRCDIR}
3439
	(cd $SRCDIR; env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} installkernel KERNCONF=${KERNCONF} || print_error_pfS;) | egrep '^>>>'
3440
	gzip -f9 $KERNEL_DESTDIR/boot/kernel/kernel
3441
	cd $BUILDER_SCRIPTS
3442
}
3443

    
3444
# Launch is ran first to setup a few variables that we need
3445
# Imported from FreeSBIE
3446
launch() {
3447

    
3448
	if [ ! -f $SCRATCHDIR/pfSense_builder_set_time ]; then
3449
		echo ">>> Updating system clock..."
3450
		ntpdate 0.pfsense.pool.ntp.org
3451
		touch $SCRATCHDIR/pfSense_builder_set_time
3452
	fi
3453

    
3454
	if [ "`id -u`" != "0" ]; then
3455
	    echo "Sorry, this must be done as root."
3456
	    kill $$
3457
	fi
3458

    
3459
	echo ">>> Operation $0 has started at `date`"
3460
}
3461

    
3462
finish() {
3463
	echo ">>> Operation $0 has ended at `date`"
3464
	killall -9 check_reload_status 2>/dev/null
3465
}
3466

    
(3-3/8)