Projet

Général

Profil

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

univnautes-tools / builder_scripts / builder_common.sh @ 5c0ce876

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

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

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

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

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

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

    
100
}
101

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

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

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

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

    
158

    
159
	unset MOUNT_PRESTAGE
160
	unset MOUNT_STAGE
161
}
162

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

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

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

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

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

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

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

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

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

    
244
}
245

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

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

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

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

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

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

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

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

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

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

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

    
305
		SRC_CONF=${OSRC_CONF}
306

    
307
		ensure_kernel_exists $KERNEL_DESTDIR
308

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

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

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

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

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

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

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

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

    
372
	unset KERNEL_NAME
373
}
374

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

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

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

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

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

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

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

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

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

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

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

    
447
		echo ">>> Executing $PFPORTSBASENAME"
448

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

    
460
		handle_tools_stats_crypto
461

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
688
	# Set buildtime
689
	get_date_string
690

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
847
	unset _NANO_WITH_VGA
848
	unset _FLASH_SIZE
849
}
850

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
995
	OLDPWD=`pwd`
996

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

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

    
1016

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

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

    
1022
	cd $OLDPWD
1023
	unset OLDPWD
1024
}
1025

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

    
1029
	mkdir -p ${GIT_REPO_DIR}/pfSenseGITREPO
1030

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

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

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

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

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

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

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

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

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

    
1135
	OLDPWD=`pwd`
1136

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

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

    
1172
	cd $OLDPWD
1173
	unset OLDPWD
1174
}
1175

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

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

    
1186
	export MAKE_CONF="__MAKE_CONF=$MAKE_CONF"
1187

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

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

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

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

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

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

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

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

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

    
1277
	unset MAKE_CONF
1278
	unset makeargs
1279

    
1280
	SRC_CONF=${OSRC_CONF}
1281
}
1282

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1662
}
1663

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

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

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

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

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

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

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

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

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

    
1715
		FlashDevice ${FLASH_MODEL} ${_NANO_MEDIASIZE}
1716

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1817
		clone_directory_contents ${PFSENSEISODIR} ${MNT}
1818

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1934
	ls -lah $MAKEOBJDIRPREFIXFINAL
1935
}
1936

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2357
rc=\$?
2358

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

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

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

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

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

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

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

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

    
2400
/bin/rm /tmp/pfspkg_installer
2401

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

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

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

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

    
2412
/bin/rm /${PFSDESTNAME}
2413

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

    
2419
EOF
2420

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

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

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

    
2440
	staginareas_clean_each_run
2441

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

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

    
2469

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

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

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

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

    
2495
	echo "Done!"
2496

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

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

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

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

    
2539
	update_freebsd_sources_and_apply_patches
2540

    
2541
	update_pfSense_repository
2542

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

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

    
2566
clone_to_staging_area() {
2567

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

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

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

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

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

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

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

    
2630
	clone_directory_contents ${PFSENSESTAGEDIR} ${PFSENSEISODIR}
2631

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

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

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

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

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

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

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

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

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

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

    
2694
		# Add installer bits
2695
		cust_populate_installer_bits
2696

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

    
2703
        # univnautes packages
2704
	echo ">>> UNIVNAUTES/START" | tee -a ${LOGFILE}
2705
	echo ">>> Search UnivNautes packages..." | tee -a ${LOGFILE}
2706
        if [ "$PFSPKGFILE" = "" ]; then
2707
            PFSPKGFILE=${SCRATCHDIR}/pfspackages
2708
            echo ">> PFSPKGFILE is not defined.  Setting to ${PFSPKGFILE}." | tee -a ${LOGFILE}
2709
        fi
2710
        (${PKG_INFO} | grep bash) > $PFSPKGFILE
2711
        (${PKG_INFO} | grep python) >> $PFSPKGFILE
2712
        (${PKG_INFO} | grep py27-) >> $PFSPKGFILE
2713
        (${PKG_INFO} | grep lasso) >> $PFSPKGFILE
2714
	echo $PFSPKGFILE >> ${LOGFILE}
2715
	echo ">>> Installing UnivNautes packages: " | tee -a ${LOGFILE}
2716
	(${BUILDER_SCRIPTS}/scripts/pkginstall.sh)
2717
        echo ">>> force perl removal" | tee -a ${LOGFILE}
2718
        PERLPKG=$(${PKG_INFO} | grep perl5 | cut -f1 -d" ")
2719
        echo ">>>     pkg_delete -f $PERLPKG:" | tee -a ${LOGFILE}
2720
        chroot /usr/local/pfsense-clone pkg_delete -f $PERLPKG
2721
	echo ">>> remove pyo/pyc files..." | tee -a ${LOGFILE}
2722
        find ${PFSENSEISODIR}/usr/local/ -type f -name "*.py[co]" -exec rm {} ";"
2723
	echo ">>> remove doc files:" | tee -a ${LOGFILE}
2724
        for d in ${PFSENSEISODIR}/usr/local/man ${PFSENSEISODIR}/usr/local/share/examples ${PFSENSEISODIR}/usr/local/share/doc # ${PFSENSEISODIR}/usr/local/lib/perl*
2725
	do
2726
		echo ">>>   remove $d..." | tee -a ${LOGFILE}
2727
                rm -rf $d
2728
        done
2729
	echo ">>> remove locale files (not fr/en):" | tee -a ${LOGFILE}
2730
	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"
2731
        for d in $(find ${PFSENSEISODIR}/usr/local/ -type d -name locale)
2732
	do
2733
		echo -n ">>>   remove locales in $d..." | tee -a ${LOGFILE}
2734
		for loc in $DLOC
2735
		do
2736
			#echo -n " "$loc | tee -a ${LOGFILE}
2737
			rm -rf ${d}/${loc}
2738
		done
2739
                echo "" | tee -a ${LOGFILE}
2740
	done
2741
	echo ">>> UNIVNAUTES/END" | tee -a ${LOGFILE}
2742
        # end of univnautes packages
2743

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

    
2747
	install_custom_overlay
2748

    
2749
	# Check for custom config.xml
2750
	cust_install_config_xml
2751

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

    
2755
	# Overlay final files
2756
	install_custom_overlay_final
2757

    
2758
	# Ensure config.xml exists
2759
	copy_config_xml_from_conf_default
2760

    
2761
	# Test PHP installation
2762
	test_php_install
2763

    
2764
	# Overlay any loader.conf customziations
2765
	install_extra_loader_conf_options
2766

    
2767
	# Create md5 summary file listing checksums
2768
	create_md5_summary_file
2769

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

    
2773
	# Setup serial port helper hints
2774
	setup_serial_hints
2775

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

    
2782
}
2783

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

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

    
2795
	echo cdrom > $PFSENSEISODIR/etc/platform
2796

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

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

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

    
2818
create_memstick_image() {
2819

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

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

    
2831
	echo cdrom > $PFSENSEISODIR/etc/platform
2832

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

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

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

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

    
2877
	echo cdrom > $PFSENSEISODIR/etc/platform
2878

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

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

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

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

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

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

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

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

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

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

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

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

    
2973
	IFS=$OIFS
2974
}
2975

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

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

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

    
2991
	OLDPWD=`pwd`
2992

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

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

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

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

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

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

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

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

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

    
3105
		fi
3106
		print_error_pfS
3107
		kill $$
3108
	fi
3109

    
3110
	cd $OLDPWD
3111
	unset OLDPWD
3112
}
3113

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

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

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

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

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

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

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

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

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

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

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

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

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

    
3265
	PORTDIRPFSA="$1"
3266

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

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

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

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

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

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

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

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

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

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

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

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

    
3421
}
3422

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

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

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

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

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

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

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

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

    
(3-3/7)