1
|
#!/bin/sh
|
2
|
#
|
3
|
# builder_common.sh
|
4
|
# Copyright (C) 2004-2011 Scott Ullrich
|
5
|
# Copyright (C) 2014 Ermal Luçi
|
6
|
# All rights reserved.
|
7
|
#
|
8
|
# NanoBSD portions of the code
|
9
|
# Copyright (c) 2005 Poul-Henning Kamp.
|
10
|
# and copied from nanobsd.sh
|
11
|
# All rights reserved.
|
12
|
#
|
13
|
# FreeSBIE portions of the code
|
14
|
# Copyright (c) 2005 Dario Freni
|
15
|
# and copied from FreeSBIE project
|
16
|
# All rights reserved.
|
17
|
#
|
18
|
# Redistribution and use in source and binary forms, with or without
|
19
|
# modification, are permitted provided that the following conditions are met:
|
20
|
#
|
21
|
# 1. Redistributions of source code must retain the above copyright notice,
|
22
|
# this list of conditions and the following disclaimer.
|
23
|
#
|
24
|
# 2. Redistributions in binary form must reproduce the above copyright
|
25
|
# notice, this list of conditions and the following disclaimer in the
|
26
|
# documentation and/or other materials provided with the distribution.
|
27
|
#
|
28
|
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
29
|
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
30
|
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
31
|
# AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
32
|
# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
33
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
34
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
35
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
36
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
37
|
# POSSIBILITY OF SUCH DAMAGE.
|
38
|
#
|
39
|
# This is the brains of the builder and is included
|
40
|
# by the various pfSense builder scripts such as
|
41
|
# build_iso.sh and build_nano.sh, etc.
|
42
|
#
|
43
|
# Crank up error reporting, debugging.
|
44
|
# set -e
|
45
|
# set -x
|
46
|
|
47
|
if [ "$MAKEOBJDIRPREFIXFINAL" != "" ]; then
|
48
|
mkdir -p $MAKEOBJDIRPREFIXFINAL
|
49
|
else
|
50
|
echo "MAKEOBJDIRPREFIXFINAL is not defined"
|
51
|
print_error_pfS
|
52
|
fi
|
53
|
|
54
|
# This routine will post a tweet to twitter
|
55
|
post_tweet() {
|
56
|
TWEET_MESSAGE="$1"
|
57
|
if [ "$TWITTER_USERNAME" ="" ]; then
|
58
|
echo ">>> ERROR: Could not find TWITTER_USERNAME -- tweet cancelled."
|
59
|
return
|
60
|
fi
|
61
|
if [ "$TWITTER_PASSWORD" = "" ]; then
|
62
|
echo ">>> ERROR: Could not find TWITTER_PASSWORD -- tweet cancelled."
|
63
|
return
|
64
|
fi
|
65
|
if [ ! -f "/usr/local/bin/curl" ]; then
|
66
|
echo ">>> ERROR: Could not find /usr/local/bin/curl -- tweet cancelled."
|
67
|
return
|
68
|
fi
|
69
|
echo -n ">>> Posting tweet to twitter: $TWEET_MESSAGE"
|
70
|
`/usr/local/bin/curl --silent --basic --user "$TWITTER_USERNAME:$TWITTER_PASSWORD" --data status="$TWEET_MESSAGE" http://twitter.com/statuses/update.xml`
|
71
|
echo "Done!"
|
72
|
}
|
73
|
|
74
|
get_date_string() {
|
75
|
# This is used for detecting updates.
|
76
|
echo "$BUILTDATESTRING" > $PFSENSEISODIR/etc/version.buildtime
|
77
|
}
|
78
|
|
79
|
git_last_commit() {
|
80
|
if [ -d "${GIT_REPO_DIR}/pfSenseGITREPO" ]; then
|
81
|
CURRENT_COMMIT=$(cd ${GIT_REPO_DIR}/pfSenseGITREPO && git log | head -n1 | cut -d' ' -f2)
|
82
|
CURRENT_AUTHOR=$(cd ${GIT_REPO_DIR}/pfSenseGITREPO && git log | head -n3 | grep "Author" | cut -d':' -f2 | cut -d'<' -f1)
|
83
|
echo ">>> Last known commit $CURRENT_AUTHOR - $CURRENT_COMMIT"
|
84
|
echo "$CURRENT_COMMIT" > $SCRATCHDIR/build_commit_info.txt
|
85
|
else
|
86
|
echo ">>> WARNING: pfSenseGITREPO variable not set! Previous commit functions disabled."
|
87
|
fi
|
88
|
}
|
89
|
|
90
|
# This routine handles the athstats directory since it lives in
|
91
|
# SRCDIR/tools/tools/ath/athstats and changes from various freebsd
|
92
|
# versions which makes adding this to pfPorts difficult.
|
93
|
handle_tools_stats_crypto() {
|
94
|
if [ -d $SRCDIR/tools/tools/crypto ]; then
|
95
|
echo -n ">>> Building tools/crytpo..."
|
96
|
(cd $SRCDIR/tools/tools/crypto && make clean && make cleandir && env SRCCONF=${SRC_CONF} make && env SRCCONF=${SRC_CONF} make install) 2>&1 | egrep -wi '(^>>>|error)'
|
97
|
echo "Done!"
|
98
|
fi
|
99
|
|
100
|
}
|
101
|
|
102
|
# This routine will output that something went wrong
|
103
|
print_error_pfS() {
|
104
|
echo
|
105
|
echo "####################################"
|
106
|
echo "Something went wrong, check errors!" >&2
|
107
|
echo "####################################"
|
108
|
echo
|
109
|
echo "NOTE: a lot of times you can run './build.sh --clean-builder' to resolve."
|
110
|
echo
|
111
|
if [ "$1" != "" ]; then
|
112
|
echo $1
|
113
|
fi
|
114
|
[ -n "${LOGFILE:-}" ] && \
|
115
|
echo "Log saved on ${LOGFILE}" && \
|
116
|
tail -n20 ${LOGFILE} >&2
|
117
|
report_error_pfsense
|
118
|
echo
|
119
|
echo "Press enter to continue."
|
120
|
read ans
|
121
|
kill $$
|
122
|
}
|
123
|
|
124
|
prestage_on_ram_setup() {
|
125
|
_AVAIL_MEM=$(($(sysctl -n hw.usermem) / 1024 / 1024))
|
126
|
if [ $_AVAIL_MEM -lt 1400 ]; then
|
127
|
echo ">>> Builder has less than 1.4GiB RAM skipping memory disks"
|
128
|
return
|
129
|
else
|
130
|
echo "######################################################################################"
|
131
|
echo
|
132
|
echo ">>> Builder has more than 1.4GiB RAM enabling memory disks"
|
133
|
echo ">>> WARNING: Remember to remove these memory disks by running $0 --disable-memorydisks"
|
134
|
echo
|
135
|
echo "######################################################################################"
|
136
|
fi
|
137
|
|
138
|
MOUNT_PRESTAGE=$(mount | grep prestagebacking | grep -v grep | wc -l)
|
139
|
if [ $MOUNT_PRESTAGE -eq 0 ]; then
|
140
|
mdconfig -a -t swap -u 10001 -s ${MEMORYDISK_SIZE}
|
141
|
mkdir -p ${PFSENSESTAGEDIR}
|
142
|
newfs -L prestagebacking -U /dev/md10001
|
143
|
mount /dev/ufs/prestagebacking ${PFSENSESTAGEDIR}
|
144
|
else
|
145
|
echo ">>> Detected preexisting memory disk enabled for ${PFSENSESTAGEDIR}."
|
146
|
fi
|
147
|
|
148
|
MOUNT_STAGE=$(mount | grep finalstagebacking | grep -v grep | wc -l)
|
149
|
if [ $MOUNT_STAGE -eq 0 ]; then
|
150
|
mdconfig -a -t swap -u 10002 -s ${MEMORYDISK_SIZE}
|
151
|
mkdir -p ${PFSENSEISODIR}
|
152
|
newfs -L finalstagebacking -U /dev/md10002
|
153
|
mount /dev/ufs/finalstagebacking ${PFSENSEISODIR}
|
154
|
else
|
155
|
echo ">>> Detected preexisting memory disk enabled for ${PFSENSEISODIR}."
|
156
|
fi
|
157
|
|
158
|
|
159
|
unset MOUNT_PRESTAGE
|
160
|
unset MOUNT_STAGE
|
161
|
}
|
162
|
|
163
|
prestage_on_ram_cleanup() {
|
164
|
if [ -c /dev/md10001 ]; then
|
165
|
if [ -d ${PFSENSESTAGEDIR} ]; then
|
166
|
umount ${PFSENSESTAGEDIR}
|
167
|
fi
|
168
|
mdconfig -d -u 10001
|
169
|
fi
|
170
|
if [ -c /dev/md10002 ]; then
|
171
|
if [ -d ${PFSENSEISODIR} ]; then
|
172
|
umount ${PFSENSEISODIR}
|
173
|
fi
|
174
|
mdconfig -d -u 10002
|
175
|
fi
|
176
|
}
|
177
|
|
178
|
# This routine will verify that the kernel has been
|
179
|
# installed OK to the staging area.
|
180
|
ensure_kernel_exists() {
|
181
|
if [ ! -f "$1/boot/kernel/kernel.gz" ]; then
|
182
|
echo ">>> ERROR: Could not locate $1/boot/kernel.gz"
|
183
|
print_error_pfS
|
184
|
kill $$
|
185
|
fi
|
186
|
KERNEL_SIZE=`ls -la $1/boot/kernel/kernel.gz | awk '{ print $5 }'`
|
187
|
if [ "$KERNEL_SIZE" -lt 3500 ]; then
|
188
|
echo ">>> ERROR: Kernel $1/boot/kernel.gz appears to be smaller than it should be: $KERNEL_SIZE"
|
189
|
print_error_pfS
|
190
|
kill $$
|
191
|
fi
|
192
|
}
|
193
|
|
194
|
fixup_kernel_options() {
|
195
|
if [ -d "$KERNEL_DESTDIR/boot" ]; then
|
196
|
chflags -R noschg $KERNEL_DESTDIR/boot/
|
197
|
rm -rf $KERNEL_DESTDIR/boot/*
|
198
|
fi
|
199
|
|
200
|
# Create area where kernels will be copied on LiveCD
|
201
|
mkdir -p $PFSENSESTAGEDIR/kernels/
|
202
|
# Make sure directories exist
|
203
|
mkdir -p $KERNEL_DESTDIR/boot/kernel
|
204
|
mkdir -p $KERNEL_DESTDIR/boot/defaults
|
205
|
|
206
|
if [ "$TARGET_ARCH" = "" ]; then
|
207
|
TARGET_ARCH=$TARGET
|
208
|
fi
|
209
|
|
210
|
# Add APIC options for i386 platform
|
211
|
if [ "$TARGET" = "i386" ]; then
|
212
|
echo "device apic" >> $KERNELCONF
|
213
|
fi
|
214
|
|
215
|
if [ "$EXTRA_DEVICES" != "" ]; then
|
216
|
echo "devices $EXTRA_DEVICES" >> $KERNELCONF
|
217
|
fi
|
218
|
if [ "$NOEXTRA_DEVICES" != "" ]; then
|
219
|
echo "nodevices $NOEXTRA_DEVICES" >> $KERNELCONF
|
220
|
fi
|
221
|
if [ "$EXTRA_OPTIONS" != "" ]; then
|
222
|
echo "options $EXTRA_OPTIONS" >> $KERNELCONF
|
223
|
fi
|
224
|
if [ "$NOEXTRA_OPTIONS" != "" ]; then
|
225
|
echo "nooptions $NOEXTRA_OPTIONS" >> $KERNELCONF
|
226
|
fi
|
227
|
|
228
|
# NOTE! If you remove this, you WILL break booting! These file(s) are read
|
229
|
# by FORTH and for some reason installkernel with DESTDIR does not
|
230
|
# copy this file over and you will end up with a blank file?
|
231
|
cp $SRCDIR/sys/boot/forth/loader.conf $KERNEL_DESTDIR/boot/defaults
|
232
|
if [ -f $SRCDIR/sys/$TARGET/conf/GENERIC.hints ]; then
|
233
|
cp $SRCDIR/sys/$TARGET/conf/GENERIC.hints $KERNEL_DESTDIR/boot/device.hints
|
234
|
fi
|
235
|
if [ -f $SRCDIR/sys/$TARGET/conf/$KERNCONF.hints ]; then
|
236
|
cp $SRCDIR/sys/$TARGET/conf/$KERNCONF.hints $KERNEL_DESTDIR/boot/device.hints
|
237
|
fi
|
238
|
# END NOTE.
|
239
|
|
240
|
# Danger will robinson -- 7.2+ will NOT boot if these files are not present.
|
241
|
# the loader will stop at |
|
242
|
touch $KERNEL_DESTDIR/boot/loader.conf
|
243
|
|
244
|
}
|
245
|
|
246
|
# This routine builds all pfSense related kernels
|
247
|
build_all_kernels() {
|
248
|
|
249
|
# Set KERNEL_BUILD_PATH if it has not been set
|
250
|
if [ -z "${KERNEL_BUILD_PATH}" ]; then
|
251
|
KERNEL_BUILD_PATH=$SCRATCHDIR/kernels
|
252
|
echo ">>> KERNEL_BUILD_PATH has not been set. Setting to ${KERNEL_BUILD_PATH}!"
|
253
|
fi
|
254
|
|
255
|
# Build embedded kernel
|
256
|
for BUILD_KERNEL in $BUILD_KERNELS; do
|
257
|
unset KERNCONF
|
258
|
unset KERNEL_DESTDIR
|
259
|
unset KERNELCONF
|
260
|
unset KERNEL_NAME
|
261
|
export KERNCONF=$BUILD_KERNEL
|
262
|
export KERNEL_DESTDIR="$KERNEL_BUILD_PATH/$BUILD_KERNEL"
|
263
|
export KERNELCONF="$SRCDIR/sys/${TARGET}/conf/$BUILD_KERNEL"
|
264
|
|
265
|
LOGFILE="${BUILDER_LOGS}/kernel.${KERNCONF}.${TARGET}.log"
|
266
|
echo ">>> Building $BUILD_KERNEL kernel." | tee -a ${LOGFILE}
|
267
|
|
268
|
# Copy pfSense kernel configuration files over to $SRCDIR/sys/$TARGET/conf
|
269
|
cp $BUILDER_TOOLS/builder_scripts/conf/kernel/$KERNCONF $KERNELCONF
|
270
|
if [ ! -f "$KERNELCONF" ]; then
|
271
|
echo ">>> ERROR: Could not find $KERNELCONF"
|
272
|
print_error_pfS
|
273
|
fi
|
274
|
echo "" >> $KERNELCONF
|
275
|
|
276
|
# Use kernel INSTALL_NAME if it exists
|
277
|
KERNEL_INSTALL_NAME=$(cat $BUILDER_TOOLS/builder_scripts/conf/kernel/$KERNCONF | /usr/bin/sed -e '/INSTALL_NAME/!d; s/^.*INSTALL_NAME[[:blank:]]*//' \
|
278
|
| /usr/bin/head -n 1)
|
279
|
|
280
|
if [ -z "${KERNEL_INSTALL_NAME}" ]; then
|
281
|
export KERNEL_NAME=$(echo ${BUILD_KERNEL} | sed -e 's/pfSense_//; s/\.[0-9].*$//')
|
282
|
else
|
283
|
export KERNEL_NAME=${KERNEL_INSTALL_NAME}
|
284
|
unset KERNEL_INSTALL_NAME
|
285
|
fi
|
286
|
|
287
|
if [ -n "${NO_BUILDKERNEL:-}" -a -f $KERNEL_BUILD_PATH/kernels/kernel_${KERNEL_NAME}.gz ]; then
|
288
|
echo ">>> NO_BUILDKERNEL set, skipping build" | tee -a ${LOGFILE}
|
289
|
continue
|
290
|
fi
|
291
|
|
292
|
# Common fixup code
|
293
|
fixup_kernel_options
|
294
|
export SRC_CONF=${SRC_CONF}
|
295
|
buildkernel
|
296
|
|
297
|
OSRC_CONF=${SRC_CONF}
|
298
|
if [ -n "${SRC_CONF_INSTALL:-}" ]; then
|
299
|
export SRC_CONF=$SRC_CONF_INSTALL
|
300
|
fi
|
301
|
|
302
|
echo ">>> Staging $BUILD_KERNEL kernel..." | tee -a ${LOGFILE}
|
303
|
installkernel
|
304
|
|
305
|
SRC_CONF=${OSRC_CONF}
|
306
|
|
307
|
ensure_kernel_exists $KERNEL_DESTDIR
|
308
|
|
309
|
echo -n ">>> Creating archive of $KERNEL_NAME kernel to staging area..." | tee -a ${LOGFILE}
|
310
|
chflags -R noschg $KERNEL_DESTDIR/boot/ 2>&1 >/dev/null
|
311
|
mkdir -p $KERNEL_BUILD_PATH/kernels
|
312
|
(cd $KERNEL_DESTDIR/boot/ && tar czf $KERNEL_BUILD_PATH/kernels/kernel_${KERNEL_NAME}.gz .)
|
313
|
rm -rf $KERNEL_DESTDIR 2>&1 1>/dev/null
|
314
|
|
315
|
echo ".Done" | tee -a ${LOGFILE}
|
316
|
done
|
317
|
}
|
318
|
|
319
|
install_default_kernel() {
|
320
|
if [ -z "${1}" ]; then
|
321
|
echo ">>> ERROR: install_default_kernel called without a kernel config name"| tee -a ${LOGFILE}
|
322
|
print_error_pfS
|
323
|
fi
|
324
|
|
325
|
# Use kernel INSTALL_NAME if it exists
|
326
|
if [ -f $BUILDER_TOOLS/builder_scripts/conf/kernel/${1} ]; then
|
327
|
KERNEL_INSTALL_NAME=$(cat $BUILDER_TOOLS/builder_scripts/conf/kernel/${1} \
|
328
|
| /usr/bin/sed -e '/INSTALL_NAME/!d; s/^.*INSTALL_NAME[[:blank:]]*//' \
|
329
|
| /usr/bin/head -n 1)
|
330
|
fi
|
331
|
|
332
|
if [ -z "${KERNEL_INSTALL_NAME}" ]; then
|
333
|
export KERNEL_NAME=$(echo ${1} | sed -e 's/pfSense_//; s/\.[0-9].*$//')
|
334
|
else
|
335
|
export KERNEL_NAME=${KERNEL_INSTALL_NAME}
|
336
|
unset KERNEL_INSTALL_NAME
|
337
|
fi
|
338
|
|
339
|
echo -n ">>> Installing kernel to be used by image ${KERNEL_NAME}..." | tee -a ${LOGFILE}
|
340
|
# If something is missing complain
|
341
|
if [ ! -f $KERNEL_BUILD_PATH/kernels/kernel_${KERNEL_NAME}.gz ]; then
|
342
|
echo ">>> ERROR: The kernel archive($PFSENSESTAGEDIR/kernels/kernel_${KERNEL_NAME}.gz) to install as default does not exist" | tee -a ${LOGFILE}
|
343
|
print_error_pfS
|
344
|
fi
|
345
|
|
346
|
# Just to make sure
|
347
|
mkdir -p $PFSENSEISODIR/boot
|
348
|
(cd $PFSENSEISODIR/boot/ && tar xzf $KERNEL_BUILD_PATH/kernels/kernel_${KERNEL_NAME}.gz -C $PFSENSEISODIR/boot/)
|
349
|
|
350
|
if [ ! -f $PFSENSEISODIR/boot/kernel/kernel.gz ]; then
|
351
|
echo ">>> ERROR: No kernel installed on $PFSENSEISODIR and the resulting image will be unusable. STOPPING!" | tee -a ${LOGFILE}
|
352
|
print_error_pfS
|
353
|
fi
|
354
|
mkdir -p $PFSENSEISODIR/kernels
|
355
|
if [ -z "${2}" -o -n "${INSTALL_EXTRA_KERNELS}" ]; then
|
356
|
cp $KERNEL_BUILD_PATH/kernels/kernel_${KERNEL_NAME}.gz $PFSENSEISODIR/kernels
|
357
|
if [ -n "${INSTALL_EXTRA_KERNELS}" ]; then
|
358
|
for _EXTRA_KERNEL in $INSTALL_EXTRA_KERNELS; do
|
359
|
KERNEL_NAME=$(echo ${_EXTRA_KERNEL} | sed -e 's/pfSense_//; s/\.[0-9].*$//')
|
360
|
if [ -f "${KERNEL_BUILD_PATH}/kernels/kernel_${KERNEL_NAME}.gz" ]; then
|
361
|
echo -n ". adding kernel_${KERNEL_NAME}.gz on image /kernels folder"
|
362
|
cp $KERNEL_BUILD_PATH/kernels/kernel_${KERNEL_NAME}.gz $PFSENSEISODIR/kernels
|
363
|
else
|
364
|
echo ">>> ERROR: Requested kernel kernel_${KERNEL_NAME}.gz was not found to be put on image /kernels folder!"
|
365
|
print_error_pfS
|
366
|
fi
|
367
|
done
|
368
|
fi
|
369
|
fi
|
370
|
echo "Done." | tee -a ${LOGFILE}
|
371
|
|
372
|
unset KERNEL_NAME
|
373
|
}
|
374
|
|
375
|
# This routine rebuilds all pfPorts files which are generally
|
376
|
# in /home/pfsense/tools/pfPorts/
|
377
|
recompile_pfPorts() {
|
378
|
|
379
|
if [ ! -d /usr/ports/ ]; then
|
380
|
echo "==> Please wait, grabbing port files from FreeBSD.org..."
|
381
|
portsnap fetch
|
382
|
echo "==> Please wait, extracting port files..."
|
383
|
portsnap extract
|
384
|
fi
|
385
|
|
386
|
if [ ! -f $SCRATCHDIR/pfSense_do_not_build_pfPorts ] || [ "$1" != "" ]; then
|
387
|
|
388
|
# Set some neede variables
|
389
|
PFPORTS_CONF_DIR="${BUILDER_TOOLS}/builder_scripts/conf/pfPorts"
|
390
|
if [ -n "$PFSPORTSFILE" ]; then
|
391
|
USE_PORTS_FILE="${PFPORTS_CONF_DIR}/${PFSPORTSFILE}"
|
392
|
else
|
393
|
USE_PORTS_FILE="${PFPORTS_CONF_DIR}/buildports.${PFSENSETAG}"
|
394
|
fi
|
395
|
|
396
|
if [ ! -f "${USE_PORTS_FILE}" ]; then
|
397
|
echo ">>> ERROR: Ports file doesn't exist: '${USE_PORTS_FILE}'"
|
398
|
exit 1
|
399
|
fi
|
400
|
|
401
|
PFPORTSBASENAME=$(basename ${USE_PORTS_FILE})
|
402
|
|
403
|
echo "--> Preparing for pfPorts build ${PFPORTSBASENAME}"
|
404
|
if [ "$1" = "" ]; then
|
405
|
update_freebsd_sources_and_apply_patches
|
406
|
|
407
|
# Warn user about make includes operation
|
408
|
echo "--> WARNING! We are about to run make includes."
|
409
|
echo -n "--> Press CTRl-C to abort this operation"
|
410
|
echo -n "."
|
411
|
sleep 1
|
412
|
echo -n "."
|
413
|
sleep 1
|
414
|
echo -n "."
|
415
|
sleep 1
|
416
|
echo -n "."
|
417
|
sleep 1
|
418
|
echo "."
|
419
|
sleep 1
|
420
|
|
421
|
# Since we are using NAT-T and custom patches
|
422
|
# to the build this is needed.
|
423
|
# The other option is to create build env for ports and
|
424
|
# not pollute the host
|
425
|
echo "==> Starting make includes operation..."
|
426
|
( cd $SRCDIR && env SRCCONF=${SRC_CONF} make includes ) | egrep -wi '(^>>>|error)'
|
427
|
else
|
428
|
echo "--> Skipping the make includes run for a single port build."
|
429
|
fi
|
430
|
|
431
|
echo "==> Compiling pfPorts..."
|
432
|
DCPUS=`sysctl kern.smp.cpus | cut -d' ' -f2`
|
433
|
CPUS=`expr $DCPUS '*' 2`
|
434
|
echo SUBTHREADS="${CPUS}" > $SCRATCHDIR/pfPorts_make.conf
|
435
|
if [ "$TARGET" = "mips" ]; then
|
436
|
echo "WITHOUT_PERL_MALLOC=1" >> $SCRATCHDIR/pfPorts_make.conf
|
437
|
echo "TARGET_BIG_ENDIAN=yes" >> $SCRATCHDIR/pfPorts_make.conf
|
438
|
fi
|
439
|
if [ -f "${PFPORTS_CONF_DIR}/make.conf" ]; then
|
440
|
cat ${PFPORTS_CONF_DIR}/make.conf >> $SCRATCHDIR/pfPorts_make.conf
|
441
|
fi
|
442
|
|
443
|
export FORCE_PKG_REGISTER=yo
|
444
|
export BATCH=yo
|
445
|
export DISABLE_VULNERABILITIES=yo
|
446
|
|
447
|
echo ">>> Executing $PFPORTSBASENAME"
|
448
|
|
449
|
if [ "$1" != "" ]; then
|
450
|
( ${BUILDER_TOOLS}/builder_scripts/scripts/buildports.sh \
|
451
|
-l ${USE_PORTS_FILE} -P ${1} -J "${MAKEJ_PORTS}" \
|
452
|
-m $SCRATCHDIR/pfPorts_make.conf ${CHECK_PORTS_INSTALLED} ) 2>&1
|
453
|
else
|
454
|
( ${BUILDER_TOOLS}/builder_scripts/scripts/buildports.sh \
|
455
|
-l ${USE_PORTS_FILE} -J "${MAKEJ_PORTS}" \
|
456
|
-m $SCRATCHDIR/pfPorts_make.conf ${CHECK_PORTS_INSTALLED} ) 2>&1 \
|
457
|
| egrep -wi "(^>>>|error)"
|
458
|
fi
|
459
|
|
460
|
handle_tools_stats_crypto
|
461
|
|
462
|
if [ "$1" = "" ]; then
|
463
|
touch $SCRATCHDIR/pfSense_do_not_build_pfPorts
|
464
|
echo "==> End of pfPorts..."
|
465
|
fi
|
466
|
|
467
|
else
|
468
|
echo "--> $SCRATCHDIR/pfSense_do_not_build_pfPorts is set, skipping pfPorts build..."
|
469
|
fi
|
470
|
}
|
471
|
|
472
|
# This routine overlays needed binaries found in the
|
473
|
# CUSTOM_COPY_LIST variable. Clog and syslgod are handled
|
474
|
# specially.
|
475
|
cust_overlay_host_binaries() {
|
476
|
# Ensure directories exist
|
477
|
# BEGIN required by gather_pfPorts_binaries_in_tgz
|
478
|
mkdir -p ${PFSENSESTAGEDIR}/lib/geom
|
479
|
mkdir -p ${PFSENSESTAGEDIR}/usr/local/lib/php/20060613/
|
480
|
mkdir -p ${PFSENSESTAGEDIR}/usr/local/share/rrdtool/fonts/
|
481
|
mkdir -p ${PFSENSESTAGEDIR}/usr/local/share/smartmontools/
|
482
|
mkdir -p ${PFSENSESTAGEDIR}/usr/local/lib/lighttpd/
|
483
|
mkdir -p ${PFSENSESTAGEDIR}/usr/share/man/man8
|
484
|
mkdir -p ${PFSENSESTAGEDIR}/usr/share/man/man5
|
485
|
# END required by gather_pfPorts_binaries_in_tgz
|
486
|
mkdir -p ${PFSENSESTAGEDIR}/bin
|
487
|
mkdir -p ${PFSENSESTAGEDIR}/sbin
|
488
|
mkdir -p ${PFSENSESTAGEDIR}/usr/bin
|
489
|
mkdir -p ${PFSENSESTAGEDIR}/usr/sbin
|
490
|
mkdir -p ${PFSENSESTAGEDIR}/usr/lib
|
491
|
mkdir -p ${PFSENSESTAGEDIR}/usr/sbin
|
492
|
mkdir -p ${PFSENSESTAGEDIR}/usr/libexec
|
493
|
mkdir -p ${PFSENSESTAGEDIR}/usr/local/bin
|
494
|
mkdir -p ${PFSENSESTAGEDIR}/usr/local/sbin
|
495
|
mkdir -p ${PFSENSESTAGEDIR}/usr/local/lib
|
496
|
mkdir -p ${PFSENSESTAGEDIR}/usr/local/lib/mysql
|
497
|
mkdir -p ${PFSENSESTAGEDIR}/usr/local/libexec
|
498
|
if [ ! -d $PFSENSESTAGEDIR/tank ]; then
|
499
|
mkdir $PFSENSESTAGEDIR/tank
|
500
|
fi
|
501
|
mkdir -p ${BUILDER_LOGS}/pfPort
|
502
|
|
503
|
# Create a copy of this file just in case
|
504
|
cp $PFSENSESTAGEDIR/etc/gettytab $PFSENSESTAGEDIR/etc/gettytab.bak
|
505
|
|
506
|
if [ ! -z "${CUSTOM_COPY_LIST:-}" ]; then
|
507
|
echo ">>> Using ${CUSTOM_COPY_LIST:-}..."
|
508
|
FOUND_FILES=`cat ${CUSTOM_COPY_LIST:-}`
|
509
|
else
|
510
|
echo ">>> Using copy.list.${PFSENSETAG}..."
|
511
|
FOUND_FILES=`cat conf/copylist/copy.list.${PFSENSETAG}`
|
512
|
fi
|
513
|
|
514
|
if [ -f ${BUILDER_LOGS}/pfPort/copy.list ]; then
|
515
|
rm ${BUILDER_LOGS}/pfPort/copy.list
|
516
|
touch ${BUILDER_LOGS}/pfPort/copy.list
|
517
|
else
|
518
|
touch ${BUILDER_LOGS}/pfPort/copy.list
|
519
|
fi
|
520
|
|
521
|
if [ "${TARGET}" = "${BUILDER_HOST_TARGET}" ]; then
|
522
|
# XXX: handle syslogd
|
523
|
if [ ! -f $PFSENSESTAGEDIR/usr/sbin/syslogd ]; then
|
524
|
echo ">>> Syslogd is missing on staging area copying from host " | tee -a ${LOGFILE}
|
525
|
install /usr/sbin/syslogd $PFSENSESTAGEDIR/usr/sbin/
|
526
|
fi
|
527
|
|
528
|
# Process base system libraries
|
529
|
NEEDEDLIBS=""
|
530
|
echo ">>> Populating newer binaries found on host jail/os (usr/local)..."
|
531
|
for TEMPFILE in $FOUND_FILES; do
|
532
|
if [ -f /${TEMPFILE} ]; then
|
533
|
FILETYPE=`file /$TEMPFILE | egrep "(dynamically|shared)" | wc -l | awk '{ print $1 }'`
|
534
|
mkdir -p `dirname ${PFSENSESTAGEDIR}/${TEMPFILE}`
|
535
|
if [ "$FILETYPE" -gt 0 ]; then
|
536
|
NEEDLIB=`ldd /${TEMPFILE} | grep "=>" | awk '{ print $3 }'`
|
537
|
NEEDEDLIBS="$NEEDEDLIBS $NEEDLIB"
|
538
|
if [ ! -f ${PFSENSESTAGEDIR}/${TEMPFILE} ] || [ /${TEMPFILE} -nt ${PFSENSESTAGEDIR}/${TEMPFILE} ]; then
|
539
|
cp /${TEMPFILE} ${PFSENSESTAGEDIR}/${TEMPFILE}
|
540
|
chmod a+rx ${PFSENSESTAGEDIR}/${TEMPFILE}
|
541
|
fi
|
542
|
for NEEDL in $NEEDLIB; do
|
543
|
if [ -f $NEEDL ]; then
|
544
|
if [ ! -f ${PFSENSESTAGEDIR}${NEEDL} ] || [ $NEEDL -nt ${PFSENSESTAGEDIR}${NEEDL} ]; then
|
545
|
if [ ! -d "$(dirname ${PFSENSESTAGEDIR}${NEEDL})" ]; then
|
546
|
mkdir -p $(dirname ${PFSENSESTAGEDIR}${NEEDL})
|
547
|
fi
|
548
|
cp $NEEDL ${PFSENSESTAGEDIR}${NEEDL}
|
549
|
fi
|
550
|
fi
|
551
|
done
|
552
|
else
|
553
|
cp /${TEMPFILE} ${PFSENSESTAGEDIR}/$TEMPFILE
|
554
|
fi
|
555
|
else
|
556
|
if [ -f ${GIT_REPO_DIR}/pfSenseGITREPO/${TEMPFILE} ]; then
|
557
|
FILETYPE=`file ${GIT_REPO_DIR}/pfSenseGITREPO/${TEMPFILE} | grep dynamically | wc -l | awk '{ print $1 }'`
|
558
|
if [ "$FILETYPE" -gt 0 ]; then
|
559
|
NEEDEDLIBS="$NEEDEDLIBS `ldd ${GIT_REPO_DIR}/pfSenseGITREPO/${TEMPFILE} | grep "=>" | awk '{ print $3 }'`"
|
560
|
fi
|
561
|
else
|
562
|
echo "Could not locate $TEMPFILE" >> ${BUILDER_LOGS}/pfPort/copy.list
|
563
|
fi
|
564
|
fi
|
565
|
done
|
566
|
#export DONTSTRIP=1
|
567
|
echo ">>> Installing collected library information, please wait..."
|
568
|
# Unique the libraries so we only copy them once
|
569
|
NEEDEDLIBS=`for LIB in ${NEEDEDLIBS} ; do echo $LIB ; done |sort -u`
|
570
|
for NEEDLIB in $NEEDEDLIBS; do
|
571
|
if [ -f $NEEDLIB ]; then
|
572
|
if [ ! -f ${PFSENSESTAGEDIR}${NEEDLIB} ] || [ ${NEEDLIB} -nt ${PFSENSESTAGEDIR}${NEEDLIB} ]; then
|
573
|
install ${NEEDLIB} ${PFSENSESTAGEDIR}${NEEDLIB}
|
574
|
fi
|
575
|
fi
|
576
|
done
|
577
|
#unset DONTSTRIP
|
578
|
else
|
579
|
echo ">>> NOTE: Cross compiling detected so binaries overlayed cannot be checked for missing libraries to be copied from host!" | tee -a ${LOGFILE}
|
580
|
fi
|
581
|
|
582
|
echo ">>> Deleting files listed in ${PRUNE_LIST}" | tee -a ${LOGFILE}
|
583
|
(cd ${PFSENSESTAGEDIR} && sed 's/^#.*//g' ${PRUNE_LIST} | xargs rm -rvf > /dev/null 2>&1)
|
584
|
|
585
|
# Check for zero sized files.
|
586
|
echo ">>> Checking and reporting zero size files..." | tee -a ${LOGFILE}
|
587
|
check_for_zero_size_files ${PFSENSESTAGEDIR}
|
588
|
}
|
589
|
|
590
|
# This routine notes any files that are 0 sized.
|
591
|
check_for_zero_size_files() {
|
592
|
if [ -f $BUILDER_LOGS/zero_sized_files.txt ]; then
|
593
|
rm -f $BUILDER_LOGS/zero_sized_files.txt
|
594
|
fi
|
595
|
if [ -n "${1}" ]; then
|
596
|
(find ${1} -perm -+x -type f -size 0 > $BUILDER_LOGS/zero_sized_files.txt)
|
597
|
if [ -f $BUILDER_LOGS/zero_sized_files.txt ]; then
|
598
|
cat $BUILDER_LOGS/zero_sized_files.txt | tee -a ${LOGFILE}
|
599
|
fi
|
600
|
fi
|
601
|
}
|
602
|
|
603
|
# Install custom BSDInstaller bits for pfSense
|
604
|
cust_populate_installer_bits() {
|
605
|
# Add lua installer items
|
606
|
echo ">>> Using FreeBSD ${FREEBSD_VERSION} BSDInstaller dfuibelua structure." | tee -a ${LOGFILE}
|
607
|
mkdir -p $PFSENSEISODIR/usr/local/share/dfuibe_lua/install/
|
608
|
mkdir -p $PFSENSEISODIR/scripts/
|
609
|
# This is now ready for general consumption! \o/
|
610
|
mkdir -p $PFSENSEISODIR/usr/local/share/dfuibe_lua/conf/
|
611
|
cp -r $BUILDER_TOOLS/installer/conf \
|
612
|
$PFSENSEISODIR/usr/local/share/dfuibe_lua/
|
613
|
# Rebrand installer!
|
614
|
if [ "${PRODUCT_NAME}" != "" ]; then
|
615
|
sed -i "" -e "s/name = \"pfSense\"/name = \"${PRODUCT_NAME}\"/" $PFSENSEISODIR/usr/local/share/dfuibe_lua/conf/pfSense.lua
|
616
|
fi
|
617
|
if [ "${PFSENSE_VERSION}" != "" ]; then
|
618
|
sed -i "" -e "s/version = \"1.2RC3\"/version = \"${PFSENSE_VERSION}\"/" $PFSENSEISODIR/usr/local/share/dfuibe_lua/conf/pfSense.lua
|
619
|
fi
|
620
|
|
621
|
# 597_ belongs in installation directory
|
622
|
cp $BUILDER_TOOLS/installer/installer_root_dir7/597* \
|
623
|
$PFSENSEISODIR/usr/local/share/dfuibe_lua/install/
|
624
|
# 599_ belongs in installation directory
|
625
|
cp $BUILDER_TOOLS/installer/installer_root_dir7/599* \
|
626
|
$PFSENSEISODIR/usr/local/share/dfuibe_lua/install/
|
627
|
# 300_ belongs in dfuibe_lua/
|
628
|
cp $BUILDER_TOOLS/installer/installer_root_dir7/300* \
|
629
|
$PFSENSEISODIR/usr/local/share/dfuibe_lua/
|
630
|
# 500_ belongs in dfuibe_lua/
|
631
|
cp $BUILDER_TOOLS/installer/installer_root_dir7/500* \
|
632
|
$PFSENSEISODIR/usr/local/share/dfuibe_lua/
|
633
|
# Copy Centipede Networks sponsored easy-install into place
|
634
|
cp -r $BUILDER_TOOLS/installer/easy_install \
|
635
|
$PFSENSEISODIR/usr/local/share/dfuibe_lua/
|
636
|
# Copy Centipede Networks sponsored easy-install into place
|
637
|
cp $BUILDER_TOOLS/installer/installer_root_dir7/150_easy_install.lua \
|
638
|
$PFSENSEISODIR/usr/local/share/dfuibe_lua/
|
639
|
# Override the base installers welcome and call the Install step "Custom Install"
|
640
|
cp $BUILDER_TOOLS/installer/installer_root_dir7/200_install.lua \
|
641
|
$PFSENSEISODIR/usr/local/share/dfuibe_lua/
|
642
|
# Copy custom 950_reboot.lua script which touches $SCRATCHDIR/install_complete
|
643
|
cp $BUILDER_TOOLS/installer/installer_root_dir7/950_reboot.lua \
|
644
|
$PFSENSEISODIR/usr/local/share/dfuibe_lua/
|
645
|
# Copy cleargpt.sh utility
|
646
|
cp $BUILDER_TOOLS/installer/cleargpt.sh \
|
647
|
$PFSENSEISODIR/usr/sbin/
|
648
|
chmod a+rx $PFSENSEISODIR/usr/sbin/cleargpt.sh
|
649
|
# Copy installer launcher scripts
|
650
|
cp $BUILDER_TOOLS/installer/scripts/pfi $PFSENSEISODIR/scripts/
|
651
|
cp $BUILDER_TOOLS/installer/scripts/lua_installer $PFSENSEISODIR/scripts/lua_installer
|
652
|
cp $BUILDER_TOOLS/installer/scripts/freebsd_installer $PFSENSEISODIR/scripts/
|
653
|
cp $BUILDER_TOOLS/installer/scripts/lua_installer_rescue $PFSENSEISODIR/scripts/
|
654
|
cp $BUILDER_TOOLS/installer/scripts/lua_installer_rescue $PFSENSEISODIR/scripts/
|
655
|
cp $BUILDER_TOOLS/installer/scripts/lua_installer_full $PFSENSEISODIR/scripts/
|
656
|
chmod a+rx $PFSENSEISODIR/scripts/*
|
657
|
mkdir -p $PFSENSEISODIR/usr/local/bin/
|
658
|
cp $BUILDER_TOOLS/installer/scripts/after_installation_routines.sh \
|
659
|
$PFSENSEISODIR/usr/local/bin/after_installation_routines.sh
|
660
|
chmod a+rx $PFSENSEISODIR/scripts/*
|
661
|
}
|
662
|
|
663
|
# Copies all extra files to the repository staging
|
664
|
# area and ISO staging area (as needed)
|
665
|
cust_populate_extra() {
|
666
|
echo ">>> Phase populate_extra..." | tee -a ${LOGFILE}
|
667
|
|
668
|
mkdir -p ${PFSENSEISODIR}/home
|
669
|
mkdir -p ${PFSENSEISODIR}/lib
|
670
|
|
671
|
if [ ! -f ${PFSENSEISODIR}/usr/lib/pam_unix.so ]; then
|
672
|
echo ">>> pam_unix.so is missing copying from host " | tee -a ${LOGFILE}
|
673
|
if [ -f /usr/lib/pam_unix.so ]; then
|
674
|
install -s /usr/lib/pam_unix.so ${PFSENSEISODIR}/usr/lib/
|
675
|
fi
|
676
|
fi
|
677
|
|
678
|
STRUCTURE_TO_CREATE="root etc usr/local/pkg/parse_config var/run scripts conf usr/local/share/dfuibe_installer root usr/local/bin usr/local/sbin usr/local/lib usr/local/etc usr/local/lib/php/20060613 usr/local/lib/lighttpd"
|
679
|
|
680
|
for TEMPDIR in $STRUCTURE_TO_CREATE; do
|
681
|
mkdir -p ${PFSENSEISODIR}/${TEMPDIR}
|
682
|
done
|
683
|
|
684
|
# bsnmpd
|
685
|
mkdir -p $PFSENSEISODIR/usr/share/snmp/defs/
|
686
|
cp -R /usr/share/snmp/defs/ $PFSENSEISODIR/usr/share/snmp/defs/
|
687
|
|
688
|
# Set buildtime
|
689
|
get_date_string
|
690
|
|
691
|
# Record last commit info if it is available.
|
692
|
if [ -f $SCRATCHDIR/build_commit_info.txt ]; then
|
693
|
cp $SCRATCHDIR/build_commit_info.txt $PFSENSEISODIR/etc/version.lastcommit
|
694
|
fi
|
695
|
}
|
696
|
|
697
|
# Copy a custom defined config.xml used commonly
|
698
|
# in rebranding and such applications.
|
699
|
cust_install_config_xml() {
|
700
|
if [ ! -z "${USE_CONFIG_XML:-}" ]; then
|
701
|
if [ -f "$USE_CONFIG_XML" ]; then
|
702
|
echo ">>> Using custom config.xml file ${USE_CONFIG_XML} ..." | tee -a ${LOGFILE}
|
703
|
cp ${USE_CONFIG_XML} ${PFSENSEISODIR}/cf/conf/config.xml
|
704
|
cp ${USE_CONFIG_XML} ${PFSENSEISODIR}/conf.default/config.xml 2>/dev/null
|
705
|
fi
|
706
|
fi
|
707
|
}
|
708
|
|
709
|
# This routine will copy over $custom_overlay onto
|
710
|
# the staging area. It is commonly used for rebranding
|
711
|
# and or custom appliances.
|
712
|
install_custom_overlay() {
|
713
|
# Extract custom overlay if it's defined.
|
714
|
if [ ! -z "${custom_overlay:-}" ]; then
|
715
|
echo -n ">>> Custom overlay defined - " | tee -a ${LOGFILE}
|
716
|
if [ -d $custom_overlay ]; then
|
717
|
echo " found directory, $custom_overlay copying..." | tee -a ${LOGFILE}
|
718
|
for i in $custom_overlay/*
|
719
|
do
|
720
|
if [ -d "$i" ]; then
|
721
|
echo ">>> Copying dir: $i ..." | tee -a ${LOGFILE}
|
722
|
cp -R $i $PFSENSEISODIR
|
723
|
else
|
724
|
echo ">>> Copying file: $i ..." | tee -a ${LOGFILE}
|
725
|
cp $i $PFSENSEISODIR
|
726
|
fi
|
727
|
done
|
728
|
elif [ -f $custom_overlay ]; then
|
729
|
echo " found file, $custom_overlay extracting..." | tee -a ${LOGFILE}
|
730
|
tar xzpf $custom_overlay -C $PFSENSEISODIR
|
731
|
else
|
732
|
echo "ERROR: file not found $custom_overlay" | tee -a ${LOGFILE}
|
733
|
print_error_pfS
|
734
|
fi
|
735
|
fi
|
736
|
if [ ! -z "${custom_overlay_archive:-}" ]; then
|
737
|
echo -n ">>> Custom overlay archive defined - " | tee -a ${LOGFILE}
|
738
|
if [ -d $custom_overlay_archive ]; then
|
739
|
echo " found directory, $custom_overlay_archive extracting files..." | tee -a ${LOGFILE}
|
740
|
for i in $custom_overlay_archive/*
|
741
|
do
|
742
|
if [ -f "$i" ]; then
|
743
|
echo ">>> Extracting file: $i ..." | tee -a ${LOGFILE}
|
744
|
tar xzpf $i -C $PFSENSEISODIR
|
745
|
fi
|
746
|
done
|
747
|
elif [ -f $custom_overlay_archive ]; then
|
748
|
echo " found file, $custom_overlay_archive extracting..." | tee -a ${LOGFILE}
|
749
|
tar xzpf $custom_overlay_archive -C $PFSENSEISODIR
|
750
|
else
|
751
|
echo ">>> ERROR: file not found $custom_overlay_archive" | tee -a ${LOGFILE}
|
752
|
print_error_pfS
|
753
|
fi
|
754
|
fi
|
755
|
}
|
756
|
|
757
|
# This rotine will overlay $custom_overlay_final when
|
758
|
# the build is 99% completed. Used to overwrite globals.inc
|
759
|
# and other files when we need to install packages from pfSense
|
760
|
# which would require a normal globals.inc.
|
761
|
install_custom_overlay_final() {
|
762
|
# Extract custom overlay if it's defined.
|
763
|
if [ ! -z "${custom_overlay_final:-}" ]; then
|
764
|
echo -n ">>> Custom overlay defined - "
|
765
|
if [ -d $custom_overlay_final ]; then
|
766
|
echo " found directory, $custom_overlay_final copying..."
|
767
|
for i in $custom_overlay_final/*
|
768
|
do
|
769
|
if [ -d $i ]; then
|
770
|
echo ">>> Copying dir: $i $PFSENSEISODIR ..." | tee -a ${LOGFILE}
|
771
|
cp -R $i $PFSENSEISODIR
|
772
|
else
|
773
|
echo ">>> Copying file: $i $PFSENSEISODIR ..." | tee -a ${LOGFILE}
|
774
|
cp $i $PFSENSEISODIR
|
775
|
fi
|
776
|
done
|
777
|
elif [ -f $custom_overlay_final ]; then
|
778
|
echo " found file, $custom_overlay_final extracting..." |tee -a ${LOGFILE}
|
779
|
tar xzpf $custom_overlay_final -C $PFSENSEISODIR
|
780
|
else
|
781
|
echo ">>> ERROR: file not found $custom_overlay_final" | tee -a ${LOGFILE}
|
782
|
print_error_pfS
|
783
|
fi
|
784
|
fi
|
785
|
}
|
786
|
|
787
|
setup_serial_hints() {
|
788
|
# When using the serial port as a boot console, be sure to update
|
789
|
# /boot/device.hints and /etc/ttys before booting the new kernel.
|
790
|
# If you forget to do so, you can still manually specify the hints
|
791
|
# at the loader prompt:
|
792
|
if [ ! -f $PFSENSEISODIR/boot/device.hints ]; then
|
793
|
touch $PFSENSEISODIR/boot/device.hints
|
794
|
fi
|
795
|
echo -n ">>> Setting uart hints on device.hints..." | tee -a ${LOGFILE}
|
796
|
echo 'hint.uart.0.at="isa"' >> $PFSENSEISODIR/boot/device.hints
|
797
|
echo 'hint.uart.0.port="0x3F8"' >> $PFSENSEISODIR/boot/device.hints
|
798
|
echo 'hint.uart.0.flags="0x10"' >> $PFSENSEISODIR/boot/device.hints
|
799
|
echo 'hint.uart.0.irq="4"' >> $PFSENSEISODIR/boot/device.hints
|
800
|
echo "Done." | tee -a ${LOGFILE}
|
801
|
}
|
802
|
|
803
|
# Items that need to be fixed up that are
|
804
|
# specific to nanobsd builds
|
805
|
cust_fixup_nanobsd() {
|
806
|
_NANO_WITH_VGA="${1}"
|
807
|
_FLASH_SIZE="${2}"
|
808
|
|
809
|
echo ">>> Fixing up NanoBSD Specific items..." | tee -a ${LOGFILE}
|
810
|
if [ "${_NANO_WITH_VGA}" = "nanobsd" ]; then
|
811
|
cp $PFSENSEISODIR/boot/loader.conf_wrap $PFSENSEISODIR/boot/loader.conf
|
812
|
cp $PFSENSEISODIR/etc/ttys_wrap $PFSENSEISODIR/etc/ttys
|
813
|
fi
|
814
|
|
815
|
# Be sure loader.conf exists, to avoid errors
|
816
|
touch $PFSENSEISODIR/boot/loader.conf
|
817
|
|
818
|
# create diskless marker file
|
819
|
touch ${PFSENSEISODIR}/etc/diskless
|
820
|
touch ${PFSENSEISODIR}/nanobuild
|
821
|
|
822
|
# Make root filesystem R/O by default
|
823
|
echo "root_rw_mount=NO" >> ${PFSENSEISODIR}/etc/defaults/rc.conf
|
824
|
|
825
|
echo "" > $PFSENSEISODIR/etc/motd
|
826
|
|
827
|
mkdir -p $PFSENSEISODIR/cf/conf/backup
|
828
|
|
829
|
rm -f $PFSENSEISODIR/usr/local/bin/after_installation_routines.sh 2>/dev/null
|
830
|
|
831
|
echo "nanobsd" > $PFSENSEISODIR/etc/platform
|
832
|
|
833
|
if [ "${_NANO_WITH_VGA}" = "nanobsd" ]; then
|
834
|
# Tell loader to use serial console early.
|
835
|
echo "-h" >> $PFSENSEISODIR/boot.config
|
836
|
|
837
|
# Enable getty on console
|
838
|
sed -i "" -e /ttyd0/s/off/on/ ${PFSENSEISODIR}/etc/ttys
|
839
|
|
840
|
# Disable getty on syscons devices
|
841
|
sed -i "" -e '/^ttyv[0-8]/s/ on/ off/' ${PFSENSEISODIR}/etc/ttys
|
842
|
else
|
843
|
# Empty file to identify nanobsd_vga images
|
844
|
touch ${PFSENSEISODIR}/etc/nano_use_vga.txt
|
845
|
fi
|
846
|
|
847
|
unset _NANO_WITH_VGA
|
848
|
unset _FLASH_SIZE
|
849
|
}
|
850
|
|
851
|
# This routine will verify that PHP is sound and that it
|
852
|
# can open and read config.xml and ensure the hostname
|
853
|
test_php_install() {
|
854
|
if [ "${TARGET}" != "${BUILDER_HOST_TARGET}" ]; then
|
855
|
echo ">>> WARNING: Cannot test PHP installation due to different platform ABIs... Skipping!" | tee -a ${LOGFILE}
|
856
|
return
|
857
|
fi
|
858
|
|
859
|
# We might need to setup php.ini
|
860
|
if test -f "/boot/kernel/ng_socket.ko" && !(kldstat -m ng_socket 2>&1 1>/dev/null); then
|
861
|
echo ">>> Loading ng_socket.ko needed for testing php." | tee -a ${LOGFILE}
|
862
|
kldload -v /boot/kernel/ng_socket.ko 2>/dev/null
|
863
|
if [ $? -ne 0 ]; then
|
864
|
echo ">>> ERROR: root priviledges required for this operation please preload this if running as non-root or check why ng_socket.ko cannot be loaded!" | tee -a ${LOGFILE}
|
865
|
print_error_pfS
|
866
|
fi
|
867
|
fi
|
868
|
|
869
|
echo -n ">>> Testing PHP installation in ${PFSENSEISODIR}:" | tee -a ${LOGFILE}
|
870
|
|
871
|
# backup original conf dir
|
872
|
if [ -d $PFSENSEISODIR/conf ]; then
|
873
|
/bin/mv $PFSENSEISODIR/conf $PFSENSEISODIR/conf.org
|
874
|
mkdir -p $PFSENSEISODIR/tmp/
|
875
|
/usr/bin/touch $PFSENSEISODIR/tmp/restore_conf_dir
|
876
|
fi
|
877
|
|
878
|
# test whether conf dir is already a symlink
|
879
|
if [ ! -L $PFSENSEISODIR/conf ]; then
|
880
|
# install the symlink as it would exist on a live system
|
881
|
(chroot $PFSENSEISODIR /bin/ln -s /conf.default /conf 2>&1) >> ${LOGFILE}
|
882
|
(chroot $PFSENSEISODIR /bin/ln -s /conf.default /cf 2>&1) >> ${LOGFILE}
|
883
|
/usr/bin/touch $PFSENSEISODIR/tmp/remove_conf_symlink
|
884
|
fi
|
885
|
|
886
|
if [ -f "$PFSENSEISODIR/etc/rc.php_ini_setup" ]; then
|
887
|
mkdir -p $PFSENSEISODIR/usr/local/lib/ $PFSENSEISODIR/usr/local/etc/
|
888
|
(chroot $PFSENSEISODIR /etc/rc.php_ini_setup) 2>/dev/null
|
889
|
fi
|
890
|
|
891
|
if [ ${FREEBSD_VERSION} -lt 10 ]; then
|
892
|
cp $BUILDER_SCRIPTS/scripts/test_php.php $PFSENSEISODIR/
|
893
|
chmod a+rx $PFSENSEISODIR/test_php.php
|
894
|
HOSTNAME=`env SHELL=/bin/sh chroot $PFSENSEISODIR /test_php.php`
|
895
|
echo -n " $HOSTNAME "
|
896
|
if [ "$HOSTNAME" != "FCGI-PASSED PASSED" ]; then
|
897
|
echo
|
898
|
echo
|
899
|
echo ">>> ERROR: An error occured while testing the php installation in $PFSENSEISODIR" | tee -a ${LOGFILE}
|
900
|
echo
|
901
|
print_error_pfS
|
902
|
die
|
903
|
else
|
904
|
echo " [OK]" | tee -a ${LOGFILE}
|
905
|
fi
|
906
|
else
|
907
|
echo " [ UNKOWN] since a new test needs to be written for php-fpm" | tee -a ${LOGFILE}
|
908
|
fi
|
909
|
|
910
|
#
|
911
|
# Cleanup, aisle 7!
|
912
|
#
|
913
|
if [ -f $PFSENSEISODIR/tmp/remove_platform ]; then
|
914
|
/bin/rm $PFSENSEISODIR/etc/platform
|
915
|
/bin/rm $PFSENSEISODIR/tmp/remove_platform
|
916
|
fi
|
917
|
|
918
|
if [ -f $PFSENSEISODIR/tmp/remove_conf_symlink ]; then
|
919
|
/bin/rm $PFSENSEISODIR/conf
|
920
|
if [ -L $PFSENSEISODIR/cf ]; then
|
921
|
/bin/rm $PFSENSEISODIR/cf
|
922
|
fi
|
923
|
/bin/rm $PFSENSEISODIR/tmp/remove_conf_symlink
|
924
|
fi
|
925
|
|
926
|
if [ -f $PFSENSEISODIR/tmp/restore_conf_dir ]; then
|
927
|
/bin/mv $PFSENSEISODIR/conf.org $PFSENSEISODIR/conf
|
928
|
/bin/rm $PFSENSEISODIR/tmp/restore_conf_dir
|
929
|
fi
|
930
|
|
931
|
if [ -f $PFSENSEISODIR/tmp/platform ]; then
|
932
|
mv $PFSENSEISODIR/tmp/platform $PFSENSEISODIR/etc/platform
|
933
|
fi
|
934
|
|
935
|
if [ -f $PFSENSEISODIR/tmp/config.cache ]; then
|
936
|
/bin/rm $PFSENSEISODIR/tmp/config.cache
|
937
|
fi
|
938
|
|
939
|
if [ -f $PFSENSEISODIR/tmp/php.ini ]; then
|
940
|
cp /tmp/php.ini $PFSENSEISODIR/usr/local/lib/php.ini
|
941
|
cp /tmp/php.ini $PFSENSEISODIR/usr/local/etc/php.ini
|
942
|
fi
|
943
|
|
944
|
rm $PFSENSEISODIR/test_php.php 2>/dev/null
|
945
|
rm $PFSENSEISODIR/tmp/*.cache 2>/dev/null
|
946
|
rm $PFSENSEISODIR/tmp/*.lock 2>/dev/null
|
947
|
}
|
948
|
|
949
|
# This routine creates a on disk summary of all file
|
950
|
# checksums which could be used to verify that a file
|
951
|
# is indeed how it was shipped.
|
952
|
create_md5_summary_file() {
|
953
|
if [ "${TARGET}" != "${BUILDER_HOST_TARGET}" ]; then
|
954
|
echo ">>> WARNING: cross compiling detected, skipping generation of md5 summaries!" | tee -a ${LOGFILE}
|
955
|
return
|
956
|
fi
|
957
|
echo -n ">>> Creating md5 summary of files present..." | tee -a ${LOGFILE}
|
958
|
rm -f $PFSENSEISODIR/etc/pfSense_md5.txt
|
959
|
echo "#!/bin/sh" > $PFSENSEISODIR/chroot.sh
|
960
|
echo "find / -type f | /usr/bin/xargs /sbin/md5 >> /etc/pfSense_md5.txt" >> $PFSENSEISODIR/chroot.sh
|
961
|
chmod a+rx $PFSENSEISODIR/chroot.sh
|
962
|
(chroot $PFSENSEISODIR /chroot.sh) 2>&1 | egrep -wi '(^>>>|errors)'
|
963
|
rm $PFSENSEISODIR/chroot.sh
|
964
|
echo "Done." | tee -a ${LOGFILE}
|
965
|
}
|
966
|
|
967
|
# This routine creates an mtree file that can be used to check
|
968
|
# and correct file permissions post-install, to correct for the
|
969
|
# fact that the ISO image doesn't support some permissions.
|
970
|
create_mtree_summary_file() {
|
971
|
if [ "${TARGET}" != "${BUILDER_HOST_TARGET}" ]; then
|
972
|
echo ">>> WARNING: cross compiling detected, skipping generation of md5 summaries!" | tee -a ${LOGFILE}
|
973
|
return
|
974
|
fi
|
975
|
echo -n ">>> Creating mtree summary of files present..." | tee -a ${LOGFILE}
|
976
|
rm -f $PFSENSEISODIR/etc/installed_filesystem.mtree
|
977
|
echo "#!/bin/sh" > $PFSENSEISODIR/chroot.sh
|
978
|
echo "cd /" >> $PFSENSEISODIR/chroot.sh
|
979
|
echo "/tmp" >> $PFSENSEISODIR/tmp/installed_filesystem.mtree.exclude
|
980
|
echo "/dev" >> $PFSENSEISODIR/tmp/installed_filesystem.mtree.exclude
|
981
|
echo "/usr/sbin/mtree -c -k uid,gid,mode,size,sha256digest -p / -X /tmp/installed_filesystem.mtree.exclude > /tmp/installed_filesystem.mtree" >> $PFSENSEISODIR/chroot.sh
|
982
|
echo "/bin/chmod 600 /tmp/installed_filesystem.mtree" >> $PFSENSEISODIR/chroot.sh
|
983
|
echo "/bin/mv /tmp/installed_filesystem.mtree /etc/" >> $PFSENSEISODIR/chroot.sh
|
984
|
|
985
|
chmod a+rx $PFSENSEISODIR/chroot.sh
|
986
|
(chroot $PFSENSEISODIR /chroot.sh) 2>&1 | egrep -wi '(^>>>|errors)'
|
987
|
rm $PFSENSEISODIR/chroot.sh
|
988
|
echo "Done." | tee -a ${LOGFILE}
|
989
|
}
|
990
|
|
991
|
# Creates a full update file
|
992
|
create_pfSense_Full_update_tarball() {
|
993
|
mkdir -p $UPDATESDIR
|
994
|
|
995
|
OLDPWD=`pwd`
|
996
|
|
997
|
customize_stagearea_for_image "fullupdate"
|
998
|
install_default_kernel ${DEFAULT_KERNEL}
|
999
|
|
1000
|
rm -rf ${PFSENSEISODIR}/cf
|
1001
|
rm -rf ${PFSENSEISODIR}/conf
|
1002
|
rm -f ${PFSENSEISODIR}/etc/rc.conf
|
1003
|
rm -f ${PFSENSEISODIR}/etc/motd
|
1004
|
rm -f ${PFSENSEISODIR}/etc/pwd.db 2>/dev/null
|
1005
|
rm -f ${PFSENSEISODIR}/etc/group 2>/dev/null
|
1006
|
rm -f ${PFSENSEISODIR}/etc/spwd.db 2>/dev/null
|
1007
|
rm -f ${PFSENSEISODIR}/etc/passwd 2>/dev/null
|
1008
|
rm -f ${PFSENSEISODIR}/etc/master.passwd 2>/dev/null
|
1009
|
rm -f ${PFSENSEISODIR}/etc/fstab 2>/dev/null
|
1010
|
rm -f ${PFSENSEISODIR}/etc/ttys 2>/dev/null
|
1011
|
rm -f ${PFSENSEISODIR}/etc/bogons 2>/dev/null
|
1012
|
# Remove loader.conf and friends. Ticket #560
|
1013
|
rm ${PFSENSEISODIR}/boot/loader.conf 2>/dev/null
|
1014
|
rm ${PFSENSEISODIR}/boot/loader.conf.local 2>/dev/null
|
1015
|
|
1016
|
|
1017
|
mkdir -p ${PFSENSEISODIR}/usr/local/livefs/lib/
|
1018
|
|
1019
|
echo ">>> Creating ${UPDATES_TARBALL_FILENAME} ..." | tee -a ${LOGFILE}
|
1020
|
cd ${PFSENSEISODIR} && tar czPf ${UPDATES_TARBALL_FILENAME} .
|
1021
|
|
1022
|
cd $OLDPWD
|
1023
|
unset OLDPWD
|
1024
|
}
|
1025
|
|
1026
|
# Does the work of checking out the specific branch of pfSense
|
1027
|
checkout_pfSense_git() {
|
1028
|
|
1029
|
mkdir -p ${GIT_REPO_DIR}/pfSenseGITREPO
|
1030
|
|
1031
|
branch_exists=`(cd ${GIT_REPO_DIR}/pfSenseGITREPO \
|
1032
|
&& git branch -a | grep "${PFSENSETAG}\$")`
|
1033
|
tag_exists=`(cd ${GIT_REPO_DIR}/pfSenseGITREPO \
|
1034
|
&& git tag -l | grep "^${PFSENSETAG}\$")`
|
1035
|
|
1036
|
if [ -z "${branch_exists}" -a -z "${tag_exists}" ]; then
|
1037
|
BRANCH=master
|
1038
|
else
|
1039
|
BRANCH="${PFSENSETAG}"
|
1040
|
fi
|
1041
|
|
1042
|
# If we are using a git tag, don't specify origin/ in the remote.
|
1043
|
if [ -z "${tag_exists}" ]; then
|
1044
|
ORIGIN=origin/
|
1045
|
fi
|
1046
|
|
1047
|
echo -n ">>> Checking out tag ${BRANCH} ..."
|
1048
|
if [ "${BRANCH}" = "master" ]; then
|
1049
|
(cd ${GIT_REPO_DIR}/pfSenseGITREPO && git checkout master) \
|
1050
|
2>&1 | egrep -wi '(^>>>|error)'
|
1051
|
elif [ -z "${branch_exists}" ]; then
|
1052
|
(cd ${GIT_REPO_DIR}/pfSenseGITREPO \
|
1053
|
&& git checkout -b "${PFSENSETAG}" "${ORIGIN}${PFSENSETAG}") \
|
1054
|
2>&1 | egrep -wi '(^>>>|error)'
|
1055
|
else
|
1056
|
(cd ${GIT_REPO_DIR}/pfSenseGITREPO \
|
1057
|
&& git checkout "${PFSENSETAG}") 2>&1 \
|
1058
|
| egrep -wi '(^>>>|error)'
|
1059
|
fi
|
1060
|
echo 'Done!'
|
1061
|
|
1062
|
echo -n '>>> Making sure we are in the right branch...'
|
1063
|
selected_branch=`cd ${GIT_REPO_DIR}/pfSenseGITREPO && \
|
1064
|
git branch | grep '^\*' | cut -d' ' -f2`
|
1065
|
if [ "${selected_branch}" = "${BRANCH}" ]; then
|
1066
|
echo " [OK] (${BRANCH})"
|
1067
|
else
|
1068
|
tag_exists=`(cd ${GIT_REPO_DIR}/pfSenseGITREPO \
|
1069
|
&& git tag -l | grep "^${PFSENSETAG}\$")`
|
1070
|
|
1071
|
if [ -z "${tag_exists}" ] || [ "${selected_branch}" != "(no" ]; then
|
1072
|
echo " [FAILED!] (${BRANCH})"
|
1073
|
print_error_pfS 'Checked out branch/tag differs from configured BRANCH, something is wrong with the build system!'
|
1074
|
kill $$
|
1075
|
fi
|
1076
|
fi
|
1077
|
}
|
1078
|
|
1079
|
# Outputs various set variables aka env
|
1080
|
print_flags() {
|
1081
|
|
1082
|
echo
|
1083
|
printf " MAKEOBJDIRPREFIX: %s\n" $MAKEOBJDIRPREFIX
|
1084
|
printf " pfSense version: %s\n" $PFSENSE_VERSION
|
1085
|
printf " BASE_DIR: %s\n" $BASE_DIR
|
1086
|
printf " Stage DIR: %s\n" $PFSENSESTAGEDIR
|
1087
|
printf " Updates dir: %s\n" $UPDATESDIR
|
1088
|
printf " Image Preparation Stage DIR: %s\n" $PFSENSEISODIR
|
1089
|
printf " Custom overlay: %s\n" $custom_overlay
|
1090
|
printf " Source DIR: %s\n" $SRCDIR
|
1091
|
printf " FreeBSD repository: %s\n" $FREEBSD_REPO_BASE
|
1092
|
printf " FreeBSD version: %s\n" $FREEBSD_VERSION
|
1093
|
printf " FreeBSD branch: %s\n" $FREEBSD_BRANCH
|
1094
|
printf " BUILD_KERNELS: %s\n" $BUILD_KERNELS
|
1095
|
printf " Git Repository: %s\n" $GIT_REPO_PFSENSE
|
1096
|
printf " pfSense Tag: %s\n" $PFSENSETAG
|
1097
|
printf " MODULES_OVERRIDE: %s\n" $MODULES_OVERRIDE
|
1098
|
printf " Custom Config: %s\n" $USE_CONFIG_XML
|
1099
|
printf " BUILD_COMPLETED_MAIL: %s\n" $BUILD_COMPLETED_MAIL
|
1100
|
printf " BUILD_ERROR_MAIL: %s\n" $BUILD_ERROR_MAIL
|
1101
|
printf " OVADISKSIZE: %s\n" $OVADISKSIZE
|
1102
|
printf " OVABLOCKSIZE: %s\n" $OVABLOCKSIZE
|
1103
|
printf " OVA_FIRST_PART_SIZE: %s\n" $OVA_FIRST_PART_SIZE
|
1104
|
printf " OVA_SWAP_PART_SIZE: %s\n" $OVA_SWAP_PART_SIZE
|
1105
|
printf " OVFFILE: %s\n" $OVFFILE
|
1106
|
printf " OVAFILE: %s\n" $OVAFILE
|
1107
|
printf " OVFVMDK: %s\n" $OVFVMDK
|
1108
|
printf " OVFSTRINGS: %s\n" $OVFSTRINGS
|
1109
|
printf " OVFMF: %s\n" $OVFMF
|
1110
|
printf " OVFCERT: %s\n" $OVFCERT
|
1111
|
printf " SRC_CONF: %s\n" $SRC_CONF
|
1112
|
printf " Remove list: %s\n" $CUSTOM_REMOVE_LIST
|
1113
|
printf " Copy list: %s\n" $CUSTOM_COPY_LIST
|
1114
|
printf " ISOPATH: %s\n" $ISOPATH
|
1115
|
printf " MEMSTICKPATH: %s\n" $MEMSTICKPATH
|
1116
|
printf " UPDATES_TARBALL_FILENAME: %s\n" $UPDATES_TARBALL_FILENAME
|
1117
|
printf " PKG_INSTALL_PORTSPFS: %s\n" $PKG_INSTALL_PORTSPFS
|
1118
|
printf " CUSTOM_CALL_SHELL_FUNCTION: %s\n" $CUSTOM_CALL_SHELL_FUNCTION
|
1119
|
if [ -n "$SHOW_ENV" ]; then
|
1120
|
for LINE in `env | grep -v "terminal" | grep -v "PASS" | grep -v "NAME" | grep -v "USER" | grep -v "SSH" | grep -v "GROUP" | grep -v "HOST"`; do
|
1121
|
echo "SHOW_ENV: $LINE"
|
1122
|
done
|
1123
|
fi
|
1124
|
echo
|
1125
|
|
1126
|
}
|
1127
|
|
1128
|
# This updates the pfSense sources
|
1129
|
update_pfSense_repository() {
|
1130
|
if [ ! -d "${GIT_REPO_DIR}" ]; then
|
1131
|
echo ">>> Creating ${GIT_REPO_DIR}"
|
1132
|
mkdir -p ${GIT_REPO_DIR}
|
1133
|
fi
|
1134
|
|
1135
|
OLDPWD=`pwd`
|
1136
|
|
1137
|
echo ">>> Using GIT to checkout ${PFSENSETAG}"
|
1138
|
echo -n ">>> "
|
1139
|
|
1140
|
if [ ! -d "${GIT_REPO_DIR}/pfSenseGITREPO/.git" ]; then
|
1141
|
echo -n ">>> Cloning ${GIT_REPO_PFSENSE} ..."
|
1142
|
(cd ${GIT_REPO_DIR} && /usr/local/bin/git clone ${GIT_REPO_PFSENSE} pfSenseGITREPO) 2>&1 | egrep -B3 -A3 -wi '(error)'
|
1143
|
if [ -d "${GIT_REPO_DIR}/pfSenseGITREPO" ]; then
|
1144
|
if [ ! -d "${GIT_REPO_DIR}/pfSenseGITREPO/conf.default" ]; then
|
1145
|
echo
|
1146
|
echo "!!!! An error occured while checking out pfSense"
|
1147
|
echo " Could not locate ${GIT_REPO_DIR}/pfSenseGITREPO/conf.default"
|
1148
|
echo
|
1149
|
print_error_pfS
|
1150
|
kill $$
|
1151
|
fi
|
1152
|
else
|
1153
|
echo
|
1154
|
echo "!!!! An error occured while checking out pfSense"
|
1155
|
echo " Could not locate ${GIT_REPO_DIR}/pfSenseGITREPO"
|
1156
|
echo
|
1157
|
print_error_pfS
|
1158
|
kill $$
|
1159
|
fi
|
1160
|
echo "Done!"
|
1161
|
else
|
1162
|
# Fetch an update of the repository
|
1163
|
# Proper branch checkout will be done from checkout_pfSense_git
|
1164
|
( cd ${GIT_REPO_DIR}/pfSenseGITREPO && git checkout master; git fetch origin; git reset --hard; git clean -fxd; git rebase origin ) 2>&1 | grep -C3 -i 'error'
|
1165
|
fi
|
1166
|
checkout_pfSense_git
|
1167
|
if [ $? != 0 ]; then
|
1168
|
echo ">>> ERROR: Something went wrong while checking out GIT."
|
1169
|
print_error_pfS
|
1170
|
fi
|
1171
|
|
1172
|
cd $OLDPWD
|
1173
|
unset OLDPWD
|
1174
|
}
|
1175
|
|
1176
|
# This builds FreeBSD (make buildworld)
|
1177
|
# Imported from FreeSBIE
|
1178
|
make_world() {
|
1179
|
|
1180
|
LOGFILE=${BUILDER_LOGS}/buildworld.${TARGET}
|
1181
|
if [ -n "${NO_BUILDWORLD:-}" ]; then
|
1182
|
echo ">>> NO_BUILDWORLD set, skipping build" | tee -a ${LOGFILE}
|
1183
|
return
|
1184
|
fi
|
1185
|
|
1186
|
export MAKE_CONF="__MAKE_CONF=$MAKE_CONF"
|
1187
|
|
1188
|
if [ ! -z ${MAKEOBJDIRPREFIX:-} ]; then
|
1189
|
# FreeBSD 8 has issues with putting this in MAKE opt rather than environment
|
1190
|
#export MAKE_CONF="${MAKE_CONF} MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX}"
|
1191
|
mkdir -p $MAKEOBJDIRPREFIX
|
1192
|
fi
|
1193
|
|
1194
|
# Check if the world and kernel are already built and set
|
1195
|
# the NO variables accordingly
|
1196
|
if [ -d "${MAKEOBJDIRPREFIX}" ]; then
|
1197
|
ISINSTALLED=`find ${MAKEOBJDIRPREFIX}/ -name init | wc -l`
|
1198
|
if [ "$ISINSTALLED" -gt 0 ]; then
|
1199
|
export MAKE_CONF="${MAKE_CONF} NO_CLEAN=yes"
|
1200
|
fi
|
1201
|
fi
|
1202
|
|
1203
|
if [ -z "${TARGET}" -o "${BUILDER_HOST_TARGET}" = "${TARGET}" ]; then
|
1204
|
export MAKE_CONF="${MAKE_CONF} WITHOUT_CROSS_COMPILER=yes"
|
1205
|
else
|
1206
|
if [ -f ${MAKEOBJDIRPREFIX}/${TARGET}.${TARGET_ARCH}/${SRCDIR}/tmp/usr/bin/cc ]; then
|
1207
|
export MAKE_CONF="${MAKE_CONF} NO_CLEAN=yes "
|
1208
|
fi
|
1209
|
if [ "${TARGET}" = "mips" ]; then
|
1210
|
MAKEJ_WORLD=""
|
1211
|
fi
|
1212
|
echo "** --------------------------------------------- ***"
|
1213
|
echo ">>> Cross compiling settings defined building environment." | tee -a ${LOGFILE}
|
1214
|
echo ">>> Building toolchain for ${TARGET} architecture... (Starting - `LC_ALL=C date`)" | tee -a ${LOGFILE}
|
1215
|
echo ">>> Builder is running the command: env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${MAKEOPT} ${MAKE_CONF} SRCCONF=${SRC_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} toolchain" | tee -a ${LOGFILE}
|
1216
|
if [ -z "${NO_BUILDTOOLCHAIN}" ]; then
|
1217
|
(cd $SRCDIR; env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${MAKEOPT} ${MAKE_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} toolchain || print_error_pfS;) | egrep '^>>>' | tee -a ${LOGFILE}
|
1218
|
cd $BUILDER_SCRIPTS
|
1219
|
echo ">>> Building toolchain for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
|
1220
|
else
|
1221
|
echo ">>> NO_BUILDTOOLCHAIN set SKIPPING - Building toolchain for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
|
1222
|
fi
|
1223
|
|
1224
|
echo ">>> Building kernel-toolchain for ${TARGET} architecture... (Starting - `LC_ALL=C date`)" | tee -a ${LOGFILE}
|
1225
|
echo ">>> Builder is running the command: env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${MAKEOPT} ${MAKE_CONF} SRCCONF=${SRC_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} kernel-toolchain" | tee -a ${LOGFILE}
|
1226
|
if [ -z "${NO_BUILDTOOLCHAIN}" ]; then
|
1227
|
(cd $SRCDIR; env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${MAKEOPT} ${MAKE_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} kernel-toolchain || print_error_pfS;) | egrep '^>>>' | tee -a ${LOGFILE}
|
1228
|
cd $BUILDER_SCRIPTS
|
1229
|
echo ">>> Building kernel-toolchain for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
|
1230
|
else
|
1231
|
echo ">>> NO_BUILDTOOLCHAIN set SKIPPING - Building kernel-toolchain for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
|
1232
|
fi
|
1233
|
echo "** --------------------------------------------- ***"
|
1234
|
fi
|
1235
|
|
1236
|
# Set SRC_CONF variable if it's not already set.
|
1237
|
if [ -z "${SRC_CONF:-}" ]; then
|
1238
|
echo ">>> SRC_CONF is unset make sure this is what you want!" | tee -a ${LOGFILE}
|
1239
|
else
|
1240
|
echo ">>> Setting SRC_CONF to $SRC_CONF" | tee -a ${LOGFILE}
|
1241
|
fi
|
1242
|
|
1243
|
echo ">>> LOGFILE set to $LOGFILE." | tee -a ${LOGFILE}
|
1244
|
makeargs="${MAKEOPT:-} ${MAKEJ_WORLD:-} ${MAKE_CONF} SRCCONF=${SRC_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH}"
|
1245
|
echo ">>> Building world for ${TARGET} architecture... (Starting - `LC_ALL=C date`)" | tee -a ${LOGFILE}
|
1246
|
echo ">>> Builder is running the command: env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} buildworld" | tee -a ${LOGFILE}
|
1247
|
cd $SRCDIR
|
1248
|
(env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} buildworld || print_error_pfS;) | egrep '^>>>' | tee -a ${LOGFILE}
|
1249
|
cd $BUILDER_SCRIPTS
|
1250
|
echo ">>> Building world for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
|
1251
|
|
1252
|
OSRC_CONF=${SRC_CONF}
|
1253
|
if [ -n "${SRC_CONF_INSTALL:-}" ]; then
|
1254
|
export SRC_CONF=$SRC_CONF_INSTALL
|
1255
|
fi
|
1256
|
|
1257
|
LOGFILE=${BUILDER_LOGS}/installworld.${TARGET}
|
1258
|
echo ">>> LOGFILE set to $LOGFILE." | tee -a ${LOGFILE}
|
1259
|
# Create if cleaned up
|
1260
|
mkdir -p ${PFSENSESTAGEDIR}
|
1261
|
makeargs="${MAKEOPT:-} ${MAKEJ_WORLD:-} ${MAKE_CONF} SRCCONF=${SRC_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} DESTDIR=${PFSENSESTAGEDIR}"
|
1262
|
echo ">>> Installing world for ${TARGET} architecture... (Starting - `LC_ALL=C date`)" | tee -a ${LOGFILE}
|
1263
|
echo ">>> Builder is running the command: env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} installworld" | tee -a ${LOGFILE}
|
1264
|
cd $SRCDIR
|
1265
|
(env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} installworld || print_error_pfS;) | egrep '^>>>' | tee -a ${LOGFILE}
|
1266
|
cd $BUILDER_SCRIPTS
|
1267
|
echo ">>> Installing world for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
|
1268
|
|
1269
|
makeargs="${MAKEOPT:-} ${MAKEJ_WORLD:-} ${MAKE_CONF} SRCCONF=${SRC_CONF} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} DESTDIR=${PFSENSESTAGEDIR}"
|
1270
|
echo ">>> Distribution world for ${TARGET} architecture... (Starting - `LC_ALL=C date`)" | tee -a ${LOGFILE}
|
1271
|
echo ">>> Builder is running the command: env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} distribution " | tee -a ${LOGFILE}
|
1272
|
cd $SRCDIR
|
1273
|
(env MAKEOBJDIRPREFIX=${MAKEOBJDIRPREFIX} $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} distribution || print_error_pfS;) | egrep '^>>>' | tee -a ${LOGFILE}
|
1274
|
cd $BUILDER_SCRIPTS
|
1275
|
echo ">>> Distribution world for ${TARGET} architecture... (Finished - `LC_ALL=C date`)" | tee -a ${LOGFILE}
|
1276
|
|
1277
|
unset MAKE_CONF
|
1278
|
unset makeargs
|
1279
|
|
1280
|
SRC_CONF=${OSRC_CONF}
|
1281
|
}
|
1282
|
|
1283
|
# This routine originated in nanobsd.sh
|
1284
|
FlashDevice () {
|
1285
|
a1=`echo $1 | tr '[:upper:]' '[:lower:]'`
|
1286
|
a2=`echo $2 | tr '[:upper:]' '[:lower:]'`
|
1287
|
case $a1 in
|
1288
|
integral)
|
1289
|
# Source: mich@FreeBSD.org
|
1290
|
case $a2 in
|
1291
|
256|256m|256mb)
|
1292
|
NANO_MEDIASIZE=`expr 259596288 / 512`
|
1293
|
NANO_HEADS=16
|
1294
|
NANO_SECTS=63
|
1295
|
;;
|
1296
|
*)
|
1297
|
echo "Unknown Integral i-Pro Flash capacity"
|
1298
|
exit 2
|
1299
|
;;
|
1300
|
esac
|
1301
|
;;
|
1302
|
memorycorp)
|
1303
|
# Source: simon@FreeBSD.org
|
1304
|
case $a2 in
|
1305
|
512|512m|512mb)
|
1306
|
# MC512CFLS2
|
1307
|
NANO_MEDIASIZE=`expr 519192576 / 512`
|
1308
|
NANO_HEADS=16
|
1309
|
NANO_SECTS=63
|
1310
|
;;
|
1311
|
*)
|
1312
|
echo "Unknown Memory Corp Flash capacity"
|
1313
|
exit 2
|
1314
|
;;
|
1315
|
esac
|
1316
|
;;
|
1317
|
sandisk)
|
1318
|
# Source:
|
1319
|
# SanDisk CompactFlash Memory Card
|
1320
|
# Product Manual
|
1321
|
# Version 10.9
|
1322
|
# Document No. 20-10-00038
|
1323
|
# April 2005
|
1324
|
# Table 2-7
|
1325
|
# NB: notice math error in SDCFJ-4096-388 line.
|
1326
|
#
|
1327
|
case $a2 in
|
1328
|
32|32m|32mb)
|
1329
|
NANO_MEDIASIZE=`expr 32112640 / 512`
|
1330
|
NANO_HEADS=4
|
1331
|
NANO_SECTS=32
|
1332
|
;;
|
1333
|
64|64m|64mb)
|
1334
|
NANO_MEDIASIZE=`expr 64225280 / 512`
|
1335
|
NANO_HEADS=8
|
1336
|
NANO_SECTS=32
|
1337
|
;;
|
1338
|
128|128m|128mb)
|
1339
|
NANO_MEDIASIZE=`expr 128450560 / 512`
|
1340
|
NANO_HEADS=8
|
1341
|
NANO_SECTS=32
|
1342
|
;;
|
1343
|
256|256m|256mb)
|
1344
|
NANO_MEDIASIZE=`expr 256901120 / 512`
|
1345
|
NANO_HEADS=16
|
1346
|
NANO_SECTS=32
|
1347
|
;;
|
1348
|
512|512m|512mb)
|
1349
|
NANO_MEDIASIZE=`expr 512483328 / 512`
|
1350
|
NANO_HEADS=16
|
1351
|
NANO_SECTS=63
|
1352
|
;;
|
1353
|
1024|1024m|1024mb|1g)
|
1354
|
NANO_MEDIASIZE=`expr 997129216 / 512`
|
1355
|
NANO_HEADS=16
|
1356
|
NANO_SECTS=63
|
1357
|
;;
|
1358
|
2048|2048m|2048mb|2g)
|
1359
|
NANO_MEDIASIZE=`expr 1989999616 / 512`
|
1360
|
NANO_HEADS=16
|
1361
|
NANO_SECTS=63
|
1362
|
;;
|
1363
|
3670|3670m|3670mb|3.5g)
|
1364
|
NANO_MEDIASIZE=`expr -e 3758096384 / 512`
|
1365
|
NANO_HEADS=16
|
1366
|
NANO_SECTS=63
|
1367
|
;;
|
1368
|
4096|4096m|4096mb|4g)
|
1369
|
NANO_MEDIASIZE=`expr -e 3989999616 / 512`
|
1370
|
NANO_HEADS=16
|
1371
|
NANO_SECTS=63
|
1372
|
;;
|
1373
|
8192|8192m|8192mb|8g)
|
1374
|
NANO_MEDIASIZE=`expr -e 7989999616 / 512`
|
1375
|
NANO_HEADS=16
|
1376
|
NANO_SECTS=63
|
1377
|
;;
|
1378
|
16384|16384m|16384mb|16g)
|
1379
|
NANO_MEDIASIZE=`expr -e 15989999616 / 512`
|
1380
|
NANO_HEADS=16
|
1381
|
NANO_SECTS=63
|
1382
|
;;
|
1383
|
*)
|
1384
|
echo "Unknown Sandisk Flash capacity"
|
1385
|
exit 2
|
1386
|
;;
|
1387
|
esac
|
1388
|
;;
|
1389
|
siliconsystems)
|
1390
|
case $a2 in
|
1391
|
4096|4g)
|
1392
|
NANO_MEDIASIZE=`expr -e 4224761856 / 512`
|
1393
|
NANO_HEADS=16
|
1394
|
NANO_SECTS=63
|
1395
|
;;
|
1396
|
*)
|
1397
|
echo "Unknown SiliconSystems Flash capacity"
|
1398
|
exit 2
|
1399
|
;;
|
1400
|
esac
|
1401
|
;;
|
1402
|
soekris)
|
1403
|
case $a2 in
|
1404
|
net4526 | 4526 | net4826 | 4826 | 64 | 64mb)
|
1405
|
NANO_MEDIASIZE=125056
|
1406
|
NANO_HEADS=4
|
1407
|
NANO_SECTS=32
|
1408
|
;;
|
1409
|
*)
|
1410
|
echo "Unknown Soekris Flash capacity"
|
1411
|
exit 2
|
1412
|
;;
|
1413
|
esac
|
1414
|
;;
|
1415
|
generic-hdd)
|
1416
|
case $a2 in
|
1417
|
4096|4g)
|
1418
|
NANO_HEADS=64
|
1419
|
NANO_SECTS=32
|
1420
|
NANO_MEDIASIZE="7812500"
|
1421
|
;;
|
1422
|
*)
|
1423
|
echo "Unknwon generic-hdd capacity"
|
1424
|
exit 2
|
1425
|
;;
|
1426
|
esac
|
1427
|
;;
|
1428
|
transcend)
|
1429
|
case $a2 in
|
1430
|
dom064m)
|
1431
|
NANO_MEDIASIZE=125184
|
1432
|
NANO_HEADS=4
|
1433
|
NANO_SECTS=32
|
1434
|
;;
|
1435
|
2048|2g)
|
1436
|
NANO_MEDIASIZE=3980592
|
1437
|
NANO_HEADS=16
|
1438
|
NANO_SECTS=63
|
1439
|
;;
|
1440
|
*)
|
1441
|
echo "Unknown Transcend Flash capacity"
|
1442
|
exit 2
|
1443
|
;;
|
1444
|
esac
|
1445
|
;;
|
1446
|
*)
|
1447
|
echo "Unknown Flash manufacturer"
|
1448
|
exit 2
|
1449
|
;;
|
1450
|
esac
|
1451
|
echo ">>> [nanoo] $1 $2"
|
1452
|
echo ">>> [nanoo] NANO_MEDIASIZE: $NANO_MEDIASIZE"
|
1453
|
echo ">>> [nanoo] NANO_HEADS: $NANO_HEADS"
|
1454
|
echo ">>> [nanoo] NANO_SECTS: $NANO_SECTS"
|
1455
|
echo ">>> [nanoo] NANO_BOOT0CFG: $NANO_BOOT0CFG"
|
1456
|
}
|
1457
|
|
1458
|
pprint() {
|
1459
|
echo $2 >> $BUILDER_LOGS/nanobsd_cmds.sh
|
1460
|
}
|
1461
|
|
1462
|
create_mips_diskimage()
|
1463
|
{
|
1464
|
echo ">>> building NanoBSD disk image (mips)..."
|
1465
|
echo ">>> Log file can be found in $BUILDER_LOGS/nanobsd_cmds.sh"
|
1466
|
echo "`date`" > $BUILDER_LOGS/nanobsd_cmds.sh
|
1467
|
|
1468
|
NANO_MAKEFS="makefs -B big -o bsize=4096,fsize=512,density=8192,optimization=space"
|
1469
|
NANO_MD_BACKING="file"
|
1470
|
NANO_BOOTLOADER="boot/boot0sio"
|
1471
|
NANO_WORLDDIR=${PFSENSEISODIR}/
|
1472
|
NANO_CFGDIR=${PFSENSEISODIR}/cf
|
1473
|
|
1474
|
pprint 2 "build diskimage"
|
1475
|
pprint 3 "log: ${MAKEOBJDIRPREFIXFINAL}/_.di"
|
1476
|
pprint 2 "NANO_MEDIASIZE: $NANO_MEDIASIZE"
|
1477
|
pprint 2 "NANO_IMAGES: $NANO_IMAGES"
|
1478
|
pprint 2 "NANO_SECTS: $NANO_SECTS"
|
1479
|
pprint 2 "NANO_HEADS: $NANO_HEADS"
|
1480
|
pprint 2 "NANO_CODESIZE: $NANO_CODESIZE"
|
1481
|
pprint 2 "NANO_CONFSIZE: $NANO_CONFSIZE"
|
1482
|
pprint 2 "NANO_DATASIZE: $NANO_DATASIZE"
|
1483
|
|
1484
|
echo $NANO_MEDIASIZE \
|
1485
|
$NANO_IMAGES \
|
1486
|
$NANO_SECTS \
|
1487
|
$NANO_HEADS \
|
1488
|
$NANO_CODESIZE \
|
1489
|
$NANO_CONFSIZE \
|
1490
|
$NANO_DATASIZE |
|
1491
|
awk '
|
1492
|
{
|
1493
|
printf "# %s\n", $0
|
1494
|
|
1495
|
# size of cylinder in sectors
|
1496
|
cs = $3 * $4
|
1497
|
|
1498
|
# number of full cylinders on media
|
1499
|
cyl = int ($1 / cs)
|
1500
|
|
1501
|
# output fdisk geometry spec, truncate cyls to 1023
|
1502
|
if (cyl <= 1023)
|
1503
|
print "g c" cyl " h" $4 " s" $3
|
1504
|
else
|
1505
|
print "g c" 1023 " h" $4 " s" $3
|
1506
|
|
1507
|
if ($7 > 0) {
|
1508
|
# size of data partition in full cylinders
|
1509
|
dsl = int (($7 + cs - 1) / cs)
|
1510
|
} else {
|
1511
|
dsl = 0;
|
1512
|
}
|
1513
|
|
1514
|
# size of config partition in full cylinders
|
1515
|
csl = int (($6 + cs - 1) / cs)
|
1516
|
|
1517
|
if ($5 == 0) {
|
1518
|
# size of image partition(s) in full cylinders
|
1519
|
isl = int ((cyl - dsl - csl) / $2)
|
1520
|
} else {
|
1521
|
isl = int (($5 + cs - 1) / cs)
|
1522
|
}
|
1523
|
|
1524
|
# First image partition start at second track
|
1525
|
print "p 1 165 " $3, isl * cs - $3
|
1526
|
c = isl * cs;
|
1527
|
|
1528
|
# Second image partition (if any) also starts offset one
|
1529
|
# track to keep them identical.
|
1530
|
if ($2 > 1) {
|
1531
|
print "p 2 165 " $3 + c, isl * cs - $3
|
1532
|
c += isl * cs;
|
1533
|
}
|
1534
|
|
1535
|
# Config partition starts at cylinder boundary.
|
1536
|
print "p 3 165 " c, csl * cs
|
1537
|
c += csl * cs
|
1538
|
|
1539
|
# Data partition (if any) starts at cylinder boundary.
|
1540
|
if ($7 > 0) {
|
1541
|
print "p 4 165 " c, dsl * cs
|
1542
|
} else if ($7 < 0 && $1 > c) {
|
1543
|
print "p 4 165 " c, $1 - c
|
1544
|
} else if ($1 < c) {
|
1545
|
print "Disk space overcommitted by", \
|
1546
|
c - $1, "sectors" > "/dev/stderr"
|
1547
|
exit 2
|
1548
|
}
|
1549
|
|
1550
|
# Force slice 1 to be marked active. This is necessary
|
1551
|
# for booting the image from a USB device to work.
|
1552
|
print "a 1"
|
1553
|
}
|
1554
|
' > ${MAKEOBJDIRPREFIXFINAL}/_.fdisk
|
1555
|
|
1556
|
pprint 2 "${MAKEOBJDIRPREFIXFINAL}/_.fdisk"
|
1557
|
pprint 2 "`cat ${MAKEOBJDIRPREFIXFINAL}/_.fdisk`"
|
1558
|
|
1559
|
IMG=${MAKEOBJDIRPREFIXFINAL}/nanobsd.full.img
|
1560
|
BS=${NANO_SECTS}b
|
1561
|
|
1562
|
if [ "${NANO_MD_BACKING}" = "swap" ] ; then
|
1563
|
pprint 2 "Creating swap backing file ..."
|
1564
|
MD=`mdconfig -a -t swap -s ${NANO_MEDIASIZE} -x ${NANO_SECTS} -y ${NANO_HEADS}`
|
1565
|
pprint 2 "mdconfig -a -t swap -s ${NANO_MEDIASIZE} -x ${NANO_SECTS} -y ${NANO_HEADS}"
|
1566
|
else
|
1567
|
pprint 2 "Creating md backing file ${IMG} ..."
|
1568
|
_c=`expr ${NANO_MEDIASIZE} / ${NANO_SECTS}`
|
1569
|
pprint 2 "dd if=/dev/zero of=${IMG} bs=${BS} count=0 seek=${_c}"
|
1570
|
dd if=/dev/zero of=${IMG} bs=${BS} count=0 seek=${_c}
|
1571
|
pprint 2 "mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} -y ${NANO_HEADS}"
|
1572
|
MD=`mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} -y ${NANO_HEADS}`
|
1573
|
fi
|
1574
|
|
1575
|
trap "mdconfig -d -u $MD" 1 2 15 EXIT
|
1576
|
|
1577
|
pprint 2 "Write partition table ${MAKEOBJDIRPREFIXFINAL}/_.fdisk ..."
|
1578
|
FDISK=${MAKEOBJDIRPREFIXFINAL}/_.fdisk
|
1579
|
pprint 2 "fdisk -i -f ${FDISK} ${MD}"
|
1580
|
fdisk -i -f ${FDISK} ${MD}
|
1581
|
pprint 2 "fdisk ${MD}"
|
1582
|
fdisk ${MD}
|
1583
|
|
1584
|
# Create first image
|
1585
|
IMG1=${MAKEOBJDIRPREFIXFINAL}/_.disk.image1
|
1586
|
pprint 2 "Create first image ${IMG1} ..."
|
1587
|
SIZE=`awk '/^p 1/ { print $5 "b" }' ${FDISK}`
|
1588
|
pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${IMG1} ${NANO_WORLDDIR}"
|
1589
|
${NANO_MAKEFS} -s ${SIZE} ${IMG1} ${NANO_WORLDDIR}
|
1590
|
pprint 2 "dd if=${IMG1} of=/dev/${MD}s1 bs=${BS}"
|
1591
|
dd if=${IMG1} of=/dev/${MD}s1 bs=${BS}
|
1592
|
pprint 2 "tunefs -L pfsense0 /dev/${MD}s1"
|
1593
|
tunefs -L pfsense0 /dev/${MD}s1
|
1594
|
|
1595
|
if [ $NANO_IMAGES -gt 1 -a $NANO_INIT_IMG2 -gt 0 ] ; then
|
1596
|
IMG2=${MAKEOBJDIRPREFIXFINAL}/_.disk.image2
|
1597
|
pprint 2 "Create second image ${IMG2}..."
|
1598
|
for f in ${NANO_WORLDDIR}/etc/fstab
|
1599
|
do
|
1600
|
sed -i "" "s/${NANO_DRIVE}s1/${NANO_DRIVE}s2/g" $f
|
1601
|
done
|
1602
|
SIZE=`awk '/^p 2/ { print $5 "b" }' ${FDISK}`
|
1603
|
pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${IMG2} ${NANO_WORLDDIR}"
|
1604
|
${NANO_MAKEFS} -s ${SIZE} ${IMG2} ${NANO_WORLDDIR}
|
1605
|
pprint 2 "dd if=${IMG2} of=/dev/${MD}s2 bs=${BS}"
|
1606
|
dd if=${IMG1} of=/dev/${MD}s2 bs=${BS}
|
1607
|
fi
|
1608
|
|
1609
|
# Create Config slice
|
1610
|
if [ $NANO_CONFSIZE -gt 0 ] ; then
|
1611
|
CFG=${MAKEOBJDIRPREFIXFINAL}/_.disk.cfg
|
1612
|
pprint 2 "Creating config partition ${CFG}..."
|
1613
|
SIZE=`awk '/^p 3/ { print $5 "b" }' ${FDISK}`
|
1614
|
pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${CFG} ${NANO_CFGDIR}"
|
1615
|
${NANO_MAKEFS} -s ${SIZE} ${CFG} ${NANO_CFGDIR}
|
1616
|
pprint 2 "dd if=${CFG} of=/dev/${MD}s3 bs=${BS}"
|
1617
|
dd if=${CFG} of=/dev/${MD}s3 bs=${BS}
|
1618
|
pprint 2 "tunefs -L cf /dev/${MD}s3"
|
1619
|
tunefs -L cf /dev/${MD}s3
|
1620
|
pprint 2 "rm ${CFG}"
|
1621
|
rm ${CFG}; CFG= # NB: disable printing below
|
1622
|
else
|
1623
|
pprint 2 ">>> [nanoo] NANO_CONFSIZE is not set. Not adding a /conf partition.. You sure about this??"
|
1624
|
fi
|
1625
|
|
1626
|
# Create Data slice, if any.
|
1627
|
# Note the changing of the variable to NANO_CONFSIZE
|
1628
|
# from NANO_DATASIZE. We also added glabel support
|
1629
|
# and populate the pfSense configuration from the /cf
|
1630
|
# directory located in PFSENSEISODIR
|
1631
|
#if [ $NANO_CONFSIZE -gt 0 ] ; then
|
1632
|
# DATA=${MAKEOBJDIRPREFIXFINAL}/_.disk.data
|
1633
|
# echo ""; echo "Creating data partition ${DATA}..."
|
1634
|
# SIZE=`awk '/^p 4/ { print $5 "b" }' ${FDISK}`
|
1635
|
# # XXX: fill from where ?
|
1636
|
# pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${DATA} /var/empty"
|
1637
|
# ${NANO_MAKEFS} -s ${SIZE} ${DATA} /var/empty
|
1638
|
# pprint 2 "dd if=${DATA} of=/dev/${MD}s4 bs=${BS}"
|
1639
|
# dd if=${DATA} of=/dev/${MD}s4 bs=${BS}
|
1640
|
# pprint 2 "rm ${DATA}"
|
1641
|
# rm ${DATA}; DATA= # NB: disable printing below
|
1642
|
#else
|
1643
|
# ">>> [nanoo] NANO_CONFSIZE is not set. Not adding a /conf partition.. You sure about this??"
|
1644
|
#fi
|
1645
|
|
1646
|
if [ "${NANO_MD_BACKING}" = "swap" ] ; then
|
1647
|
pprint 2 "Writing out ${IMG}..."
|
1648
|
dd if=/dev/${MD} of=${IMG} bs=${BS}
|
1649
|
fi
|
1650
|
|
1651
|
pprint 2 "IMG1: $IMG1"
|
1652
|
pprint 2 "IMG2: $IMG2"
|
1653
|
pprint 2 "`date`"
|
1654
|
pprint 2 "Full disk: ${IMG}"
|
1655
|
pprint 2 "Primary partition: ${IMG1}"
|
1656
|
test "${IMG2}" && pprint 2 "2ndary partition: ${IMG2}"
|
1657
|
test "${CFG}" && pprint 2 "/cfg partition: ${CFG}"
|
1658
|
test "${DATA}" && pprint 2 "/data partition: ${DATA}"
|
1659
|
|
1660
|
#) > ${MAKEOBJDIRPREFIXFINAL}/_.di 2>&1
|
1661
|
|
1662
|
}
|
1663
|
|
1664
|
# This routine originated in nanobsd.sh
|
1665
|
create_nanobsd_diskimage () {
|
1666
|
if [ -z "${1}" ]; then
|
1667
|
echo ">>> ERROR: Type of image has not been specified"
|
1668
|
print_error_pfS
|
1669
|
fi
|
1670
|
if [ -z "${2}" ]; then
|
1671
|
echo ">>> ERROR: Size of image has not been specified"
|
1672
|
print_error_pfS
|
1673
|
fi
|
1674
|
|
1675
|
if [ "${1}" = "nanobsd" ]; then
|
1676
|
# It's serial
|
1677
|
export NANO_BOOTLOADER="boot/boot0sio"
|
1678
|
elif [ "${1}" = "nanobsd-vga" ]; then
|
1679
|
# It's vga
|
1680
|
export NANO_BOOTLOADER="boot/boot0"
|
1681
|
else
|
1682
|
echo ">>> ERROR: Type of image to create unkown"
|
1683
|
print_error_pfS
|
1684
|
fi
|
1685
|
|
1686
|
if [ -z "${2}" ]; then
|
1687
|
echo ">>> ERROR: Media size(s) not specified."
|
1688
|
print_error_pfS
|
1689
|
fi
|
1690
|
|
1691
|
if [ -z "${FLASH_MODEL}" -o -z "${2}" ]; then
|
1692
|
echo ">>> ERROR: either FLASH_MODEL=${FLASH_MODEL} or FLASH_SIZE=${2} is not set."
|
1693
|
print_error_pfS
|
1694
|
fi
|
1695
|
|
1696
|
LOGFILE=${BUILDER_LOGS}/${1}.${TARGET}
|
1697
|
# Prepare folder to be put in image
|
1698
|
customize_stagearea_for_image "${1}"
|
1699
|
install_default_kernel ${DEFAULT_KERNEL} "no"
|
1700
|
|
1701
|
# Must be run after customize_stagearea_for_image
|
1702
|
cust_fixup_nanobsd ${1} $NANO_MEDIASIZE
|
1703
|
|
1704
|
for _NANO_MEDIASIZE in ${2}; do
|
1705
|
if [ -z "${_NANO_MEDIASIZE}" ]; then
|
1706
|
continue;
|
1707
|
fi
|
1708
|
|
1709
|
echo ">>> building NanoBSD(${1}) disk image with size ${_NANO_MEDIASIZE} for platform (${TARGET})..." | tee -a ${LOGFILE}
|
1710
|
echo "" > $BUILDER_LOGS/nanobsd_cmds.sh
|
1711
|
|
1712
|
IMG="${MAKEOBJDIRPREFIXFINAL}/${PRODUCT_NAME}-${PFSENSE_VERSION}-${_NANO_MEDIASIZE}-${TARGET}-${1}-${DATESTRING}.img"
|
1713
|
IMGUPDATE="${MAKEOBJDIRPREFIXFINAL}/${PRODUCT_NAME}-${PFSENSE_VERSION}-${_NANO_MEDIASIZE}-${TARGET}-${1}-upgrade-${DATESTRING}.img"
|
1714
|
|
1715
|
FlashDevice ${FLASH_MODEL} ${_NANO_MEDIASIZE}
|
1716
|
|
1717
|
# These are defined in FlashDevice and on builder_default.sh
|
1718
|
echo $NANO_MEDIASIZE \
|
1719
|
$NANO_IMAGES \
|
1720
|
$NANO_SECTS \
|
1721
|
$NANO_HEADS \
|
1722
|
$NANO_CODESIZE \
|
1723
|
$NANO_CONFSIZE \
|
1724
|
$NANO_DATASIZE |
|
1725
|
awk '
|
1726
|
{
|
1727
|
printf "# %s\n", $0
|
1728
|
|
1729
|
# size of cylinder in sectors
|
1730
|
cs = $3 * $4
|
1731
|
|
1732
|
# number of full cylinders on media
|
1733
|
cyl = int ($1 / cs)
|
1734
|
|
1735
|
# output fdisk geometry spec, truncate cyls to 1023
|
1736
|
if (cyl <= 1023)
|
1737
|
print "g c" cyl " h" $4 " s" $3
|
1738
|
else
|
1739
|
print "g c" 1023 " h" $4 " s" $3
|
1740
|
|
1741
|
if ($7 > 0) {
|
1742
|
# size of data partition in full cylinders
|
1743
|
dsl = int (($7 + cs - 1) / cs)
|
1744
|
} else {
|
1745
|
dsl = 0;
|
1746
|
}
|
1747
|
|
1748
|
# size of config partition in full cylinders
|
1749
|
csl = int (($6 + cs - 1) / cs)
|
1750
|
|
1751
|
if ($5 == 0) {
|
1752
|
# size of image partition(s) in full cylinders
|
1753
|
isl = int ((cyl - dsl - csl) / $2)
|
1754
|
} else {
|
1755
|
isl = int (($5 + cs - 1) / cs)
|
1756
|
}
|
1757
|
|
1758
|
# First image partition start at second track
|
1759
|
print "p 1 165 " $3, isl * cs - $3
|
1760
|
c = isl * cs;
|
1761
|
|
1762
|
# Second image partition (if any) also starts offset one
|
1763
|
# track to keep them identical.
|
1764
|
if ($2 > 1) {
|
1765
|
print "p 2 165 " $3 + c, isl * cs - $3
|
1766
|
c += isl * cs;
|
1767
|
}
|
1768
|
|
1769
|
# Config partition starts at cylinder boundary.
|
1770
|
print "p 3 165 " c, csl * cs
|
1771
|
c += csl * cs
|
1772
|
|
1773
|
# Data partition (if any) starts at cylinder boundary.
|
1774
|
if ($7 > 0) {
|
1775
|
print "p 4 165 " c, dsl * cs
|
1776
|
} else if ($7 < 0 && $1 > c) {
|
1777
|
print "p 4 165 " c, $1 - c
|
1778
|
} else if ($1 < c) {
|
1779
|
print "Disk space overcommitted by", \
|
1780
|
c - $1, "sectors" > "/dev/stderr"
|
1781
|
exit 2
|
1782
|
}
|
1783
|
|
1784
|
# Force slice 1 to be marked active. This is necessary
|
1785
|
# for booting the image from a USB device to work.
|
1786
|
print "a 1"
|
1787
|
}
|
1788
|
' > ${MAKEOBJDIRPREFIXFINAL}/_.fdisk
|
1789
|
|
1790
|
MNT=${MAKEOBJDIRPREFIXFINAL}/_.mnt
|
1791
|
mkdir -p ${MNT}
|
1792
|
|
1793
|
dd if=/dev/zero of=${IMG} bs=${NANO_SECTS}b \
|
1794
|
count=0 seek=`expr ${NANO_MEDIASIZE} / ${NANO_SECTS}` 2>&1 >> ${LOGFILE}
|
1795
|
|
1796
|
MD=$(mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} -y ${NANO_HEADS})
|
1797
|
trap "mdconfig -d -u ${MD}; return" 1 2 15 EXIT
|
1798
|
|
1799
|
fdisk -i -f ${MAKEOBJDIRPREFIXFINAL}/_.fdisk ${MD} 2>&1 >> ${LOGFILE}
|
1800
|
fdisk ${MD} 2>&1 >> ${LOGFILE}
|
1801
|
|
1802
|
boot0cfg -B -b ${PFSENSEISODIR}/${NANO_BOOTLOADER} ${NANO_BOOT0CFG} ${MD} 2>&1 >> ${LOGFILE}
|
1803
|
|
1804
|
# Create first image
|
1805
|
bsdlabel -m i386 -w -B -b ${PFSENSEISODIR}/boot/boot ${MD}s1 2>&1 >> ${LOGFILE}
|
1806
|
bsdlabel -m i386 ${MD}s1 2>&1 >> ${LOGFILE}
|
1807
|
newfs -L pfsense0 ${NANO_NEWFS} /dev/${MD}s1a 2>&1 >> ${LOGFILE}
|
1808
|
mount /dev/ufs/pfsense0 ${MNT}
|
1809
|
if [ $? -ne 0 ]; then
|
1810
|
echo ">>> ERROR: Something wrong happened during mount of first slice image creation. STOPPING!" | tee -a ${LOGFILE}
|
1811
|
print_error_pfS
|
1812
|
kill $$
|
1813
|
fi
|
1814
|
# Consider the unmounting as well
|
1815
|
trap "umount /dev/ufs/pfsense0; mdconfig -d -u ${MD}; return" 1 2 15 EXIT
|
1816
|
|
1817
|
clone_directory_contents ${PFSENSEISODIR} ${MNT}
|
1818
|
|
1819
|
# Set NanoBSD image size
|
1820
|
echo "${_NANO_MEDIASIZE}" > ${MNT}/etc/nanosize.txt
|
1821
|
rm -f $MNT/cf/conf/* 2>/dev/null
|
1822
|
|
1823
|
echo "/dev/ufs/pfsense0 / ufs ro,sync,noatime 1 1" > ${MNT}/etc/fstab
|
1824
|
if [ $NANO_CONFSIZE -gt 0 ] ; then
|
1825
|
echo "/dev/ufs/cf /cf ufs ro,sync,noatime 1 1" >> ${MNT}/etc/fstab
|
1826
|
fi
|
1827
|
|
1828
|
umount ${MNT}
|
1829
|
sync
|
1830
|
# Restore the original trap
|
1831
|
trap "mdconfig -d -u ${MD}; return" 1 2 15 EXIT
|
1832
|
|
1833
|
# Setting NANO_IMAGES to 1 and NANO_INIT_IMG2 will tell
|
1834
|
# NanoBSD to only create one partition. We default to 2
|
1835
|
# partitions in case anything happens to the first the
|
1836
|
# operator can boot from the 2nd and should be OK.
|
1837
|
|
1838
|
# Before just going to use dd for duplicate think!
|
1839
|
# The images are created as sparse so lets take advantage
|
1840
|
# of that by just exec some commands.
|
1841
|
if [ $NANO_IMAGES -gt 1 -a $NANO_INIT_IMG2 -gt 0 ] ; then
|
1842
|
# Duplicate to second image (if present)
|
1843
|
echo ">>> Creating NanoBSD second slice by duplicating first slice." | tee -a ${LOGFILE}
|
1844
|
# Create second image
|
1845
|
dd if=/dev/${MD}s1 of=/dev/${MD}s2 conv=sparse bs=64k 2>&1 >> ${LOGFILE}
|
1846
|
tunefs -L pfsense1 /dev/${MD}s2a 2>&1 >> ${LOGFILE}
|
1847
|
mount /dev/ufs/pfsense1 ${MNT}
|
1848
|
if [ $? -ne 0 ]; then
|
1849
|
echo ">>> ERROR: Something wrong happened during mount of second slice image creation. STOPPING!" | tee -a ${LOGFILE}
|
1850
|
print_error_pfS
|
1851
|
kill $$
|
1852
|
fi
|
1853
|
# Consider the unmounting as well
|
1854
|
trap "umount /dev/ufs/pfsense1; mdconfig -d -u ${MD}; return" 1 2 15 EXIT
|
1855
|
|
1856
|
# Set NanoBSD image size
|
1857
|
echo "${_NANO_MEDIASIZE}" > ${MNT}/etc/nanosize.txt
|
1858
|
|
1859
|
echo "/dev/ufs/pfsense1 / ufs ro,sync,noatime 1 1" > ${MNT}/etc/fstab
|
1860
|
if [ $NANO_CONFSIZE -gt 0 ] ; then
|
1861
|
echo "/dev/ufs/cf /cf ufs ro,sync,noatime 1 1" >> ${MNT}/etc/fstab
|
1862
|
fi
|
1863
|
|
1864
|
umount ${MNT}
|
1865
|
# Restore the trap back
|
1866
|
trap "mdconfig -d -u ${MD}; return" 1 2 15 EXIT
|
1867
|
fi
|
1868
|
|
1869
|
# Create Data slice, if any.
|
1870
|
# Note the changing of the variable to NANO_CONFSIZE
|
1871
|
# from NANO_DATASIZE. We also added glabel support
|
1872
|
# and populate the pfSense configuration from the /cf
|
1873
|
# directory located in PFSENSEISODIR
|
1874
|
if [ $NANO_CONFSIZE -gt 0 ] ; then
|
1875
|
echo ">>> Creating /cf area to hold config.xml"
|
1876
|
newfs -L cf ${NANO_NEWFS} /dev/${MD}s3 2>&1 >> ${LOGFILE}
|
1877
|
# Mount data partition and copy contents of /cf
|
1878
|
# Can be used later to create custom default config.xml while building
|
1879
|
mount /dev/ufs/cf ${MNT}
|
1880
|
if [ $? -ne 0 ]; then
|
1881
|
echo ">>> ERROR: Something wrong happened during mount of cf slice image creation. STOPPING!" | tee -a ${LOGFILE}
|
1882
|
print_error_pfS
|
1883
|
kill $$
|
1884
|
fi
|
1885
|
# Consider the unmounting as well
|
1886
|
trap "umount /dev/ufs/cf; mdconfig -d -u ${MD}; return" 1 2 15 EXIT
|
1887
|
|
1888
|
clone_directory_contents ${PFSENSEISODIR}/cf ${MNT}
|
1889
|
|
1890
|
umount ${MNT}
|
1891
|
# Restore the trap back
|
1892
|
trap "mdconfig -d -u ${MD}; return" 1 2 15 EXIT
|
1893
|
else
|
1894
|
">>> [nanoo] NANO_CONFSIZE is not set. Not adding a /conf partition.. You sure about this??" | tee -a ${LOGFILE}
|
1895
|
fi
|
1896
|
|
1897
|
echo ">>> [nanoo] Creating NanoBSD upgrade file from first slice..." | tee -a ${LOGFILE}
|
1898
|
dd if=/dev/${MD}s1 of=$IMGUPDATE conv=sparse bs=64k 2>&1 >> ${LOGFILE}
|
1899
|
|
1900
|
mdconfig -d -u $MD
|
1901
|
# Restore default action
|
1902
|
trap "-" 1 2 15 EXIT
|
1903
|
|
1904
|
# Check each image and ensure that they are over
|
1905
|
# 3 megabytes. If either image is under 20 megabytes
|
1906
|
# in size then error out.
|
1907
|
IMGSIZE=`ls -la $IMG | awk '{ print $5 }'`
|
1908
|
IMGUPDATESIZE=`ls -la $IMGUPDATE | awk '{ print $5 }'`
|
1909
|
CHECKSIZE="20040710"
|
1910
|
if [ "$IMGSIZE" -lt "$CHECKSIZE" ]; then
|
1911
|
echo ">>> ERROR: Something went wrong when building NanoBSD. The image size is under 20 megabytes!" | tee -a ${LOGFILE}
|
1912
|
print_error_pfS
|
1913
|
kill $$
|
1914
|
fi
|
1915
|
if [ "$IMGUPDATESIZE" -lt "$CHECKSIZE" ]; then
|
1916
|
echo ">>> ERROR: Something went wrong when building NanoBSD upgrade image. The image size is under 20 megabytes!" | tee -a ${LOGFILE}
|
1917
|
print_error_pfS
|
1918
|
kill $$
|
1919
|
fi
|
1920
|
|
1921
|
# Wrap up the show, Johnny
|
1922
|
echo ">>> NanoBSD Image completed for flash type: $FLASH_MODEL size: $_NANO_MEDIASIZE." | tee -a ${LOGFILE}
|
1923
|
|
1924
|
gzip -f $IMG &
|
1925
|
gzip -f $IMGUPDATE &
|
1926
|
done
|
1927
|
|
1928
|
unset IMG
|
1929
|
unset IMGUPDATE
|
1930
|
unset IMGUPDATESIZE
|
1931
|
unset IMGSIZE
|
1932
|
|
1933
|
ls -lah $MAKEOBJDIRPREFIXFINAL
|
1934
|
}
|
1935
|
|
1936
|
# This routine creates a ova image that contains
|
1937
|
# a ovf and vmdk file. These files can be imported
|
1938
|
# right into vmware or virtual box.
|
1939
|
# (and many other emulation platforms)
|
1940
|
# http://www.vmware.com/pdf/ovf_whitepaper_specification.pdf
|
1941
|
create_ova_image() {
|
1942
|
# XXX create a .ovf php creator that you can pass:
|
1943
|
# 1. populatedSize
|
1944
|
# 2. license
|
1945
|
# 3. product name
|
1946
|
# 4. version
|
1947
|
# 5. number of network interface cards
|
1948
|
# 6. allocationUnits
|
1949
|
# 7. capacity
|
1950
|
# 8. capacityAllocationUnits
|
1951
|
|
1952
|
LOGFILE=${BUILDER_LOGS}/ova.${TARGET}.log
|
1953
|
|
1954
|
# Prepare folder to be put in image
|
1955
|
export PKG_INSTALL_PORTSPFS="${PKG_INSTALL_PORTSPFS} /usr/ports/emulators/open-vm-tools-nox11"
|
1956
|
customize_stagearea_for_image "ova"
|
1957
|
install_default_kernel ${DEFAULT_KERNEL}
|
1958
|
|
1959
|
ova_prereq_check
|
1960
|
ova_remove_old_tmp_files
|
1961
|
ova_setup_ovf_file
|
1962
|
ova_create_raw_backed_file
|
1963
|
/bin/echo -n ">>> Creating mdconfig image ${OVFPATH}/${OVFVMDK}.raw... " | tee -a ${LOGFILE}
|
1964
|
MD=`mdconfig -a -t vnode -f ${OVFPATH}/${OVFVMDK}.raw`
|
1965
|
# Just in case
|
1966
|
trap "mdconfig -d -u ${MD}" 1 2 15 EXIT
|
1967
|
|
1968
|
# comment out if using pc-sysinstall
|
1969
|
ova_partition_gpart $MD
|
1970
|
ova_set_default_network_interfaces
|
1971
|
ova_mount_mnt $MD
|
1972
|
ova_cpdup_files
|
1973
|
ova_setup_platform_specific # after cpdup
|
1974
|
ova_calculate_mnt_size
|
1975
|
ova_umount_mnt $MD
|
1976
|
# Restore default action
|
1977
|
trap "-" 1 2 15 EXIT
|
1978
|
ova_umount_mdconfig $MD
|
1979
|
# We use vbox because it compresses the vmdk on export
|
1980
|
ova_create_vbox_image
|
1981
|
# We repack the file with a more universal xml file that
|
1982
|
# works in both virtual box and esx server
|
1983
|
ova_repack_vbox_image
|
1984
|
}
|
1985
|
|
1986
|
ova_repack_vbox_image() {
|
1987
|
BUILDPLATFORM=`uname -p`
|
1988
|
POPULATEDSIZE=`du -d0 -h $PFSENSEISODIR | awk '{ print \$1 }' | cut -dM -f1`
|
1989
|
POPULATEDSIZEBYTES=`echo "${POPULATEDSIZE}*1024^2" | bc`
|
1990
|
REFERENCESSIZE=`ls -la ${OVFPATH}/${OVFVMDK} | awk '{ print \$5 }'`
|
1991
|
echo ">>> Setting REFERENCESSIZE to ${REFERENCESSIZE}..." | tee -a ${LOGFILE}
|
1992
|
file_search_replace REFERENCESSIZE ${REFERENCESSIZE} ${OVFPATH}/${PRODUCT_NAME}.ovf
|
1993
|
echo ">>> Setting POPULATEDSIZEBYTES to ${POPULATEDSIZEBYTES}..." | tee -a ${LOGFILE}
|
1994
|
# OperatingSystemSection (pfSense.ovf)
|
1995
|
# 42 FreeBSD 32-Bit
|
1996
|
# 78 FreeBSD 64-Bit
|
1997
|
if [ "$BUILDPLATFORM" = "i386" ]; then
|
1998
|
file_search_replace '"101"' '"42"' ${OVFPATH}/${PRODUCT_NAME}.ovf
|
1999
|
file_search_replace 'FreeBSD XX-Bit' 'FreeBSD' ${OVFPATH}/${PRODUCT_NAME}.ovf
|
2000
|
fi
|
2001
|
if [ "$BUILDPLATFORM" = "amd64" ]; then
|
2002
|
file_search_replace '"101"' '"78"' ${OVFPATH}/${PRODUCT_NAME}.ovf
|
2003
|
file_search_replace 'FreeBSD XX-Bit' 'FreeBSD 64-Bit' ${OVFPATH}/${PRODUCT_NAME}.ovf
|
2004
|
fi
|
2005
|
file_search_replace DISKSECTIONPOPULATEDSIZE $POPULATEDSIZEBYTES ${OVFPATH}/${PRODUCT_NAME}.ovf
|
2006
|
# 10737254400 = 10240MB = virtual box vmdk file size XXX grab this value from vbox creation
|
2007
|
# 10737418240 = 10GB
|
2008
|
echo ">>> Setting DISKSECTIONALLOCATIONUNITS to 10737254400..." | tee -a ${LOGFILE}
|
2009
|
file_search_replace DISKSECTIONALLOCATIONUNITS $OVA_DISKSECTIONALLOCATIONUNITS ${OVFPATH}/${PRODUCT_NAME}.ovf
|
2010
|
echo ">>> Setting DISKSECTIONCAPACITY to 10737418240..." | tee -a ${LOGFILE}
|
2011
|
file_search_replace DISKSECTIONCAPACITY $OVADISKSIZE ${OVFPATH}/${PRODUCT_NAME}.ovf
|
2012
|
echo ">>> Repacking OVA with universal OVF file..." | tee -a ${LOGFILE}
|
2013
|
mv ${OVFPATH}/${OVFVMDK} ${OVFPATH}/${PRODUCT_NAME}-disk1.vmdk
|
2014
|
OWD=`pwd`
|
2015
|
cd ${OVFPATH} && tar cpf ${PRODUCT_NAME}.ova ${PRODUCT_NAME}.ovf ${PRODUCT_NAME}-disk1.vmdk
|
2016
|
cd ${OWD}
|
2017
|
rm $OVFPATH/${PRODUCT_NAME}-disk1.vmdk
|
2018
|
ls -lah ${OVFPATH}/${PRODUCT_NAME}*ov*
|
2019
|
}
|
2020
|
|
2021
|
# called from create_ova_image
|
2022
|
ova_umount_mnt() {
|
2023
|
# Unmount /dev/mdX
|
2024
|
umount /mnt
|
2025
|
sync ; sync
|
2026
|
}
|
2027
|
|
2028
|
# called from create_ova_image
|
2029
|
ova_umount_mdconfig() {
|
2030
|
MD=$1
|
2031
|
# Show gpart info
|
2032
|
gpart show $MD
|
2033
|
echo ">>> Unmounting ${MD}..." | tee -a ${LOGFILE}
|
2034
|
mdconfig -d -u $MD
|
2035
|
sync ; sync
|
2036
|
}
|
2037
|
|
2038
|
# called from create_ova_image
|
2039
|
ova_mount_mnt() {
|
2040
|
MD=$1
|
2041
|
echo ">>> Mounting image to /mnt..." | tee -a ${LOGFILE}
|
2042
|
mount -o rw /dev/${MD}p2 /mnt/
|
2043
|
}
|
2044
|
|
2045
|
# called from create_ova_image
|
2046
|
ova_setup_ovf_file() {
|
2047
|
if [ -f ${OVFFILE} ]; then
|
2048
|
cp ${OVFFILE} ${OVFPATH}/${PRODUCT_NAME}.ovf
|
2049
|
fi
|
2050
|
|
2051
|
if [ ! -f ${OVFPATH}/${PRODUCT_NAME}.ovf ]; then
|
2052
|
cp ${BUILDER_SCRIPTS}/conf/ovf/pfSense.ovf ${OVFPATH}/${PRODUCT_NAME}.ovf
|
2053
|
file_search_replace PFSENSE_VERSION $PFSENSE_VERSION ${OVFPATH}/${PRODUCT_NAME}.ovf
|
2054
|
fi
|
2055
|
}
|
2056
|
|
2057
|
# called from create_ova_image
|
2058
|
ova_prereq_check() {
|
2059
|
if [ ! -f /usr/local/bin/qemu-img]; then
|
2060
|
echo ">>> ERROR: qemu-img is not present please check port emulators/qemu installation" | tee -a ${LOGFILE}
|
2061
|
print_error_pfS
|
2062
|
fi
|
2063
|
sysctl kern.geom.debugflags=16
|
2064
|
}
|
2065
|
|
2066
|
disable_lan_disable_dhcpd_enable_sshd() {
|
2067
|
if [ "${TARGET}" != "${BUILDER_HOST_TARGET}" ]; then
|
2068
|
echo ">>> ERROR: Cannot perform the modifications since cross compiling!" | tee -a ${LOGFILE}
|
2069
|
print_error_pfS
|
2070
|
fi
|
2071
|
|
2072
|
cat <<EOF >$PFSENSEISODIR/remove_lan.php
|
2073
|
#!/usr/local/bin/php -f
|
2074
|
<?php
|
2075
|
require_once("globals.inc");
|
2076
|
require_once("functions.inc");
|
2077
|
require_once("config.inc");
|
2078
|
require_once("util.inc");
|
2079
|
\$config = parse_config(true);
|
2080
|
echo ">>> Disabling LAN interface...\n";
|
2081
|
unset(\$config['interfaces']['lan']);
|
2082
|
echo ">>> Disabling DHCPD on LAN interface...\n";
|
2083
|
unset(\$config['dhcpd']['lan']['enable']);
|
2084
|
\$config['system']['enablesshd'] = true;
|
2085
|
echo ">>> Adding allow all rule to WAN...\n";
|
2086
|
\$filterent = array();
|
2087
|
\$filterent["type"] = "pass";
|
2088
|
\$filterent["interface"] = "wan";
|
2089
|
\$filterent["source"]["any"] = "";
|
2090
|
\$filterent["destination"]["any"] = "";
|
2091
|
\$filterent["statetype"] = "keep state";
|
2092
|
\$filterent["os"] = "";
|
2093
|
\$filterent["descr"] = "Allow all via DevBuilder";
|
2094
|
\$config["filter"]["rule"][] = \$filterent;
|
2095
|
echo ">>> Turning off block private networks (if on)...\n";
|
2096
|
unset(\$config["interfaces"]["wan"]["blockpriv"]);
|
2097
|
unset(\$config['interfaces']['wan']['blockbogons']);
|
2098
|
unlink_if_exists("/tmp/config.cache");
|
2099
|
echo ">>> Writing config...\n";
|
2100
|
write_config("DevBuilder changes.");
|
2101
|
\$config = parse_config(true);
|
2102
|
echo ">>> Finished with config.xml modificaitons...\n";
|
2103
|
?>
|
2104
|
EOF
|
2105
|
|
2106
|
# Setup config environment
|
2107
|
cp $PFSENSEISODIR/cf/conf/config.xml $PFSENSEISODIR/conf/
|
2108
|
mkdir -p $PFSENSEISODIR/conf/backup
|
2109
|
mkdir -p $PFSENSEISODIR/cf/conf/backup
|
2110
|
chmod a+rx $PFSENSEISODIR/remove_lan.php
|
2111
|
# chroot in and do the operations
|
2112
|
chroot $PFSENSEISODIR /remove_lan.php
|
2113
|
# copy the altered config.xml into place
|
2114
|
cp $PFSENSEISODIR/cf/conf/config.xml $PFSENSEISODIR/conf.default/config.xml
|
2115
|
# Break environment back down
|
2116
|
rm -rf $PFSENSEISODIR/cf/conf/backup
|
2117
|
rm -rf $PFSENSEISODIR/conf/*
|
2118
|
rm -rf $PFSENSEISODIR/tmp/*
|
2119
|
rm $PFSENSEISODIR/remove_lan.php
|
2120
|
}
|
2121
|
|
2122
|
# called from create_ova_image
|
2123
|
ova_calculate_mnt_size() {
|
2124
|
/bin/echo -n ">>> Calculating size of /mnt..." | tee -a ${LOFGILE}
|
2125
|
INSTALLSIZE=`du -s /mnt/ | awk '{ print $1 }'`
|
2126
|
INSTALLSIZEH=`du -d0 -h /mnt/ | awk '{ print $1 }'`
|
2127
|
echo $INSTALLSIZEH
|
2128
|
}
|
2129
|
|
2130
|
# called from create_ova_image
|
2131
|
ova_create_raw_backed_file() {
|
2132
|
DISKSIZE=$OVADISKSIZE
|
2133
|
BLOCKSIZE=$OVABLOCKSIZE
|
2134
|
COUNT=`expr -e $DISKSIZE / $BLOCKSIZE`
|
2135
|
DISKFILE=${OVFPATH}/${OVFVMDK}.raw
|
2136
|
echo ">>> Creating raw backing file ${DISKFILE} (Disk Size: ${DISKSIZE}, Block Size: ${BLOCKSIZE}, Count: ${COUNT})..." | tee -a ${LOGFILE}
|
2137
|
dd if=/dev/zero of=$DISKFILE bs=$BLOCKSIZE count=0 seek=$COUNT
|
2138
|
}
|
2139
|
|
2140
|
# called from create_ova_image
|
2141
|
ova_remove_old_tmp_files() {
|
2142
|
rm ${OVFPATH}/*.ovf.final 2>/dev/null
|
2143
|
rm ${OVFPATH}/*.ova 2>/dev/null
|
2144
|
}
|
2145
|
|
2146
|
# called from create_ova_image
|
2147
|
ova_set_default_network_interfaces() {
|
2148
|
echo ">>> Setting default interfaces to em0 and em1 in config.xml..." | tee -a ${LOGFILE}
|
2149
|
file_search_replace vr0 em0 ${PFSENSEISODIR}/conf.default/config.xml
|
2150
|
file_search_replace vr1 em1 ${PFSENSEISODIR}/conf.default/config.xml
|
2151
|
}
|
2152
|
|
2153
|
# called from create_ova_image
|
2154
|
ova_create_vbox_image() {
|
2155
|
# VirtualBox
|
2156
|
echo ">>> Creating image using qemu-img..." | tee -a ${LOGFILE}
|
2157
|
rm ${OVFPATH}/${OVFVMDK} 2>/dev/null
|
2158
|
qemu-img convert -f raw -O vmdk ${OVFPATH}/${OVFVMDK}.raw ${OVFPATH}/${OVFVMDK}
|
2159
|
rm -rf ${OVFPATH}/${OVFVMDK}.raw
|
2160
|
echo ">>> ${OVFPATH}/${OVFVMDK} created." | tee -a ${LOGFILE}
|
2161
|
}
|
2162
|
|
2163
|
# called from create_ova_image
|
2164
|
ova_cpdup_files() {
|
2165
|
echo ">>> Populating vmdk staging area..."
|
2166
|
cpdup -o ${PFSENSEISODIR}/COPYRIGHT /mnt/COPYRIGHT
|
2167
|
cpdup -o ${PFSENSEISODIR}/boot /mnt/boot
|
2168
|
cpdup -o ${PFSENSEISODIR}/bin /mnt/bin
|
2169
|
cpdup -o ${PFSENSEISODIR}/conf /mnt/conf
|
2170
|
cpdup -o ${PFSENSEISODIR}/conf.default /mnt/conf.default
|
2171
|
cpdup -o ${PFSENSEISODIR}/dev /mnt/dev
|
2172
|
cpdup -o ${PFSENSEISODIR}/etc /mnt/etc
|
2173
|
cpdup -o ${PFSENSEISODIR}/home /mnt/home
|
2174
|
cpdup -o ${PFSENSEISODIR}/kernels /mnt/kernels
|
2175
|
cpdup -o ${PFSENSEISODIR}/libexec /mnt/libexec
|
2176
|
cpdup -o ${PFSENSEISODIR}/lib /mnt/lib
|
2177
|
cpdup -o ${PFSENSEISODIR}/root /mnt/root
|
2178
|
cpdup -o ${PFSENSEISODIR}/sbin /mnt/sbin
|
2179
|
cpdup -o ${PFSENSEISODIR}/usr /mnt/usr
|
2180
|
cpdup -o ${PFSENSEISODIR}/var /mnt/var
|
2181
|
sync ; sync ; sync ; sync
|
2182
|
}
|
2183
|
|
2184
|
ova_setup_platform_specific() {
|
2185
|
echo ">>> Installing platform specific items..." | tee -a ${LOGFILE}
|
2186
|
echo "/dev/label/${PRODUCT_NAME} / ufs rw 0 0" > /mnt/etc/fstab
|
2187
|
echo "/dev/label/swap0 none swap sw 0 0" >> /mnt/etc/fstab
|
2188
|
echo pfSense > /mnt/etc/platform
|
2189
|
rmdir /mnt/conf
|
2190
|
mkdir -p /mnt/cf
|
2191
|
mkdir -p /mnt/cf/conf
|
2192
|
cp /mnt/conf.default/config.xml /mnt/cf/conf/
|
2193
|
chroot /mnt /bin/ln -s /cf/conf /conf
|
2194
|
mkdir -p /mnt/tmp
|
2195
|
}
|
2196
|
|
2197
|
# called from create_ova_image
|
2198
|
ova_partition_gpart() {
|
2199
|
# XXX: Switch to mkimg tool!!
|
2200
|
MD=$1
|
2201
|
echo ">>> Creating GPT..." | tee -a ${LOGFILE}
|
2202
|
gpart create -s gpt $MD
|
2203
|
echo ">>> Embedding GPT bootstrap into protective MBR..." | tee -a ${LOGFILE}
|
2204
|
gpart bootcode -b /boot/pmbr $MD
|
2205
|
echo ">>> Creating GPT boot partition..." | tee -a ${LOGFILE}
|
2206
|
gpart add -b 34 -s 128 -t freebsd-boot $MD
|
2207
|
gpart bootcode -p /boot/gptboot -i 1 $MD
|
2208
|
echo ">>> Setting up disk slices: ${MD}p2 (Size: ${OVA_FIRST_PART_SIZE})..." | tee -a ${LOGFILE}
|
2209
|
gpart add -s $OVA_FIRST_PART_SIZE -t freebsd-ufs -i 2 $MD
|
2210
|
echo ">>> Setting up disk slices: ${MD}p3 (swap) (Size: ${OVA_SWAP_PART_SIZE})..." | tee -a ${LOGFILE}
|
2211
|
gpart add -s $OVA_SWAP_PART_SIZE -t freebsd-swap -i 3 $MD
|
2212
|
echo ">>> Running newfs..." | tee -a ${LOGFILE}
|
2213
|
newfs -U /dev/${MD}p2
|
2214
|
sync ; sync ; sync ; sync
|
2215
|
echo ">>> Labeling partitions: ${MD}p2..." | tee -a ${LOGFILE}
|
2216
|
glabel label ${PRODUCT_NAME} ${MD}p2
|
2217
|
sync ; sync
|
2218
|
echo ">>> Labeling partitions: ${MD}p3..." | tee -a ${LOGFILE}
|
2219
|
glabel label swap0 ${MD}p3
|
2220
|
sync ; sync
|
2221
|
}
|
2222
|
|
2223
|
# called from create_ova_image
|
2224
|
# This routine will replace a string in a file
|
2225
|
file_search_replace() {
|
2226
|
SEARCH=$1
|
2227
|
REPLACE=$2
|
2228
|
FILENAME=$3
|
2229
|
sed "s/${SEARCH}/${REPLACE}/g" $3 > $FILENAME.$$
|
2230
|
mv $FILENAME.$$ $FILENAME
|
2231
|
}
|
2232
|
|
2233
|
# This routine installs pfSense packages into the staging area.
|
2234
|
# Packages such as squid, snort, autoconfigbackup, etc.
|
2235
|
pfsense_install_custom_packages_exec() {
|
2236
|
# Function originally written by Daniel S. Haischt
|
2237
|
# Copyright (C) 2007 Daniel S. Haischt <me@daniel.stefan.haischt.name>
|
2238
|
# Copyright (C) 2009 Scott Ullrich <sullrich@gmail.com>
|
2239
|
|
2240
|
if [ "${TARGET}" != "${BUILDER_HOST_TARGET}" ]; then
|
2241
|
echo ">>> WARNING: Cannot install pfSense packages since cross building!" | tee -a ${LOGFILE}
|
2242
|
return
|
2243
|
fi
|
2244
|
|
2245
|
if [ ${FREEBSD_VERSION} -ge 10 ]; then
|
2246
|
PFSDESTNAME="pkgnginstall.sh"
|
2247
|
else
|
2248
|
PFSDESTNAME="pkginstall.sh"
|
2249
|
fi
|
2250
|
PFSTODIR="${PFSENSEISODIR}"
|
2251
|
|
2252
|
# Extra package list if defined.
|
2253
|
if [ ! -z "${custom_package_list:-}" ]; then
|
2254
|
# Notes:
|
2255
|
# ======
|
2256
|
# devfs mount is required cause PHP requires /dev/stdin
|
2257
|
# php.ini needed to make PHP argv capable
|
2258
|
#
|
2259
|
/bin/echo ">>> Installing custom packages to: ${PFSTODIR} ..."
|
2260
|
|
2261
|
cp ${PFSTODIR}/etc/platform ${PFSTODIR}/tmp/
|
2262
|
|
2263
|
/sbin/mount -t devfs devfs ${PFSTODIR}/dev
|
2264
|
|
2265
|
/bin/mkdir -p ${PFSTODIR}/var/etc/
|
2266
|
/bin/cp /etc/resolv.conf ${PFSTODIR}/etc/
|
2267
|
|
2268
|
/bin/echo ${custom_package_list} > ${PFSTODIR}/tmp/pkgfile.lst
|
2269
|
|
2270
|
/bin/cp ${BUILDER_TOOLS}/builder_scripts/scripts/pfspkg_installer ${PFSTODIR}/tmp
|
2271
|
/bin/chmod a+x ${PFSTODIR}/tmp/pfspkg_installer
|
2272
|
|
2273
|
cp ${PFSTODIR}/usr/local/lib/php.ini $SCRATCHDIR
|
2274
|
if [ -f $SCRATCHDIR/php.ini ]; then
|
2275
|
cat $SCRATCHDIR/php.ini | grep -v apc > ${PFSTODIR}/usr/local/lib/php.ini
|
2276
|
cat $SCRATCHDIR/php.ini | grep -v apc > ${PFSTODIR}/usr/local/etc/php.ini
|
2277
|
fi
|
2278
|
|
2279
|
# setup script that will be run within the chroot env
|
2280
|
/bin/cat > ${PFSTODIR}/${PFSDESTNAME} <<EOF
|
2281
|
#!/bin/sh
|
2282
|
#
|
2283
|
# ------------------------------------------------------------------------
|
2284
|
# ATTENTION: !!! This script is supposed to be run within a chroot env !!!
|
2285
|
# ------------------------------------------------------------------------
|
2286
|
#
|
2287
|
#
|
2288
|
# Setup
|
2289
|
#
|
2290
|
|
2291
|
# Handle php.ini if /etc/rc.php_ini_setup exists
|
2292
|
if [ -f "/etc/rc.php_ini_setup" ]; then
|
2293
|
mkdir -p /usr/local/lib/ /usr/local/etc/
|
2294
|
/etc/rc.php_ini_setup 2>/dev/null
|
2295
|
cat /usr/local/etc/php.ini | grep -v apc > /tmp/php.ini.new
|
2296
|
cp /tmp/php.ini.new /usr/local/etc/php.ini 2>/dev/null
|
2297
|
cp /tmp/php.ini.new /usr/local/lib/php.ini 2>/dev/null
|
2298
|
fi
|
2299
|
|
2300
|
if [ ! -f "/usr/local/bin/php" ]; then
|
2301
|
echo
|
2302
|
echo
|
2303
|
echo
|
2304
|
echo "ERROR. A copy of php does not exist in /usr/local/bin/"
|
2305
|
echo
|
2306
|
echo "This script cannot continue."
|
2307
|
echo
|
2308
|
while [ /bin/true ]; do
|
2309
|
sleep 65535
|
2310
|
done
|
2311
|
fi
|
2312
|
|
2313
|
if [ ! -f "/COPYRIGHT" ]; then
|
2314
|
echo
|
2315
|
echo
|
2316
|
echo
|
2317
|
echo "ERROR. Could not detect the correct CHROOT environment (missing /COPYRIGHT)."
|
2318
|
echo
|
2319
|
echo "This script cannot continue."
|
2320
|
echo
|
2321
|
while [ /bin/true ]; do
|
2322
|
sleep 65535
|
2323
|
done
|
2324
|
fi
|
2325
|
|
2326
|
# backup original conf dir
|
2327
|
if [ -d /conf ]; then
|
2328
|
/bin/mv /conf /conf.org
|
2329
|
/usr/bin/touch /tmp/restore_conf_dir
|
2330
|
fi
|
2331
|
|
2332
|
# test whether conf dir is already a symlink
|
2333
|
if [ ! -h /conf ]; then
|
2334
|
# install the symlink as it would exist on a live system
|
2335
|
/bin/ln -s /cf/conf /conf 2>/dev/null
|
2336
|
/usr/bin/touch /tmp/remove_conf_symlink
|
2337
|
fi
|
2338
|
|
2339
|
# now that we do have the symlink in place create
|
2340
|
# a backup dir if necessary.
|
2341
|
if [ ! -d /conf/backup ]; then
|
2342
|
/bin/mkdir -p /conf/backup
|
2343
|
/usr/bin/touch /tmp/remove_backup
|
2344
|
fi
|
2345
|
|
2346
|
#
|
2347
|
# Assemble package list if necessary
|
2348
|
#
|
2349
|
(/tmp/pfspkg_installer -q -m config -l /tmp/pkgfile.lst -p .:/etc/inc:/usr/local/www:/usr/local/captiveportal:/usr/local/pkg) | egrep -wi '(^>>>|error)'
|
2350
|
|
2351
|
#
|
2352
|
# Exec PHP script which installs pfSense packages in place
|
2353
|
#
|
2354
|
(/tmp/pfspkg_installer -q -m install -l /tmp/pkgfile.lst -p .:/etc/inc:/usr/local/www:/usr/local/captiveportal:/usr/local/pkg) > /tmp/pfspkg_installer.out 2>&1
|
2355
|
|
2356
|
rc=\$?
|
2357
|
|
2358
|
egrep -wi '(^>>>|error)' /tmp/pfspkg_installer.out 2>/dev/null
|
2359
|
rm -f /tmp/pfspkg_installer.out
|
2360
|
|
2361
|
#
|
2362
|
# Check if pfspkg_installer returned 0
|
2363
|
#
|
2364
|
[ "\$rc" != "0" ] && exit 1
|
2365
|
|
2366
|
# Copy config.xml to conf.default/
|
2367
|
cp /conf/config.xml conf.default/
|
2368
|
|
2369
|
#
|
2370
|
# Cleanup, aisle 7!
|
2371
|
#
|
2372
|
if [ -f /tmp/remove_platform ]; then
|
2373
|
/bin/rm /etc/platform
|
2374
|
/bin/rm /tmp/remove_platform
|
2375
|
fi
|
2376
|
|
2377
|
if [ -f /tmp/remove_backup ]; then
|
2378
|
/bin/rm -rf /conf/backup
|
2379
|
/bin/rm /tmp/remove_backup
|
2380
|
fi
|
2381
|
|
2382
|
if [ -f /tmp/remove_conf_symlink ]; then
|
2383
|
/bin/rm /conf
|
2384
|
if [ -h /cf ]; then
|
2385
|
/bin/rm /cf
|
2386
|
fi
|
2387
|
/bin/rm /tmp/remove_conf_symlink
|
2388
|
fi
|
2389
|
|
2390
|
if [ -f /tmp/restore_conf_dir ]; then
|
2391
|
/bin/mv /conf.org /conf
|
2392
|
/bin/rm /tmp/restore_conf_dir
|
2393
|
fi
|
2394
|
|
2395
|
if [ -f /tmp/platform ]; then
|
2396
|
mv /tmp/platform /etc/platform
|
2397
|
fi
|
2398
|
|
2399
|
/bin/rm /tmp/pfspkg_installer
|
2400
|
|
2401
|
/bin/rm /tmp/pkgfile.lst
|
2402
|
|
2403
|
/bin/rm /tmp/*.log /tmp/*.tbz 2>/dev/null
|
2404
|
|
2405
|
if [ -f /tmp/config.cache ]; then
|
2406
|
/bin/rm /tmp/config.cache
|
2407
|
fi
|
2408
|
|
2409
|
/bin/rm /etc/resolv.conf
|
2410
|
|
2411
|
/bin/rm /${PFSDESTNAME}
|
2412
|
|
2413
|
if [ -f /tmp/php.ini ]; then
|
2414
|
cp /tmp/php.ini /usr/local/lib/php.ini
|
2415
|
cp /tmp/php.ini /usr/local/etc/php.ini
|
2416
|
fi
|
2417
|
|
2418
|
EOF
|
2419
|
|
2420
|
echo ">>> Installing custom pfSense-XML packages inside chroot ..." | tee -a ${LOGFILE}
|
2421
|
chmod a+rx ${PFSTODIR}/${PFSDESTNAME}
|
2422
|
chroot ${PFSTODIR} /bin/sh /${PFSDESTNAME}
|
2423
|
rc=$?
|
2424
|
echo ">>> Unmounting ${PFSTODIR}/dev ..." | tee -a ${LOGFILE}
|
2425
|
umount -f ${PFSTODIR}/dev
|
2426
|
|
2427
|
if [ "${rc}" != "0" ]; then
|
2428
|
echo ">>> ERROR: Error installing custom packages" | tee -a ${LOGFILE}
|
2429
|
print_error_pfS
|
2430
|
fi
|
2431
|
fi
|
2432
|
}
|
2433
|
|
2434
|
# Cleans up previous builds
|
2435
|
pfSense_clean_obj_dir() {
|
2436
|
# Clean out directories
|
2437
|
echo ">>> Cleaning up previous build environment...Please wait!"
|
2438
|
|
2439
|
staginareas_clean_each_run
|
2440
|
|
2441
|
if [ -d "${PFSENSESTAGEDIR}" ]; then
|
2442
|
BASENAME=`basename ${PFSENSESTAGEDIR}`
|
2443
|
echo -n ">>> Cleaning ${PFSENSESTAGEDIR} ..."
|
2444
|
chflags -R noschg ${PFSENSESTAGEDIR} 2>&1 >/dev/null
|
2445
|
rm -rf ${PFSENSESTAGEDIR} 2>/dev/null
|
2446
|
echo "Done."
|
2447
|
fi
|
2448
|
mkdir -p ${PFSENSESTAGEDIR}
|
2449
|
|
2450
|
if [ -z "${NO_CLEANFREEBSDOBJDIR}" ]; then
|
2451
|
if [ -d "$MAKEOBJDIRPREFIX" ]; then
|
2452
|
echo -n ">>> Cleaning FreeBSD objects dir staging..."
|
2453
|
echo -n "."
|
2454
|
chflags -R noschg ${MAKEOBJDIRPREFIX} 2>&1 >/dev/null
|
2455
|
echo -n "."
|
2456
|
rm -rf ${MAKEOBJDIRPREFIX}/*
|
2457
|
echo "Done!"
|
2458
|
fi
|
2459
|
if [ -n "${KERNEL_DESTDIR}" -a -d "${KERNEL_BUILD_PATH}" ]; then
|
2460
|
echo -n ">>> Cleaning previously built kernel stage area..."
|
2461
|
rm -rf $KERNEL_BUILD_PATH/*
|
2462
|
echo "Done!"
|
2463
|
fi
|
2464
|
fi
|
2465
|
mkdir -p $MAKEOBJDIRPREFIX
|
2466
|
mkdir -p $KERNEL_BUILD_PATH
|
2467
|
|
2468
|
|
2469
|
echo -n ">>> Cleaning previously built images..."
|
2470
|
rm -rf $MAKEOBJDIRPREFIXFINAL/*
|
2471
|
echo "Done!"
|
2472
|
|
2473
|
if [ -z "${NO_CLEANREPOS}" ]; then
|
2474
|
if [ -d "${GIT_REPO_DIR}/pfSenseGITREPO" ]; then
|
2475
|
echo -n ">>> Cleaning pfSense repo checkout..."
|
2476
|
echo -n "."
|
2477
|
rm -rf "${GIT_REPO_DIR}/pfSenseGITREPO"
|
2478
|
echo "Done!"
|
2479
|
fi
|
2480
|
|
2481
|
if [ -d "$SRCDIR" ]; then
|
2482
|
echo -n ">>> Ensuring $SRCDIR is clean..."
|
2483
|
rm -rf ${SRCDIR}
|
2484
|
echo "Done!"
|
2485
|
fi
|
2486
|
fi
|
2487
|
|
2488
|
echo -n ">>> Cleaning previous builder logs..."
|
2489
|
if [ -d "$BUILDER_LOGS" ]; then
|
2490
|
rm -rf ${BUILDER_LOGS}
|
2491
|
fi
|
2492
|
mkdir -p ${BUILDER_LOGS}
|
2493
|
|
2494
|
echo "Done!"
|
2495
|
|
2496
|
echo ">>> Cleaning of builder environment has finished."
|
2497
|
}
|
2498
|
|
2499
|
# This copies the default config.xml to the location on
|
2500
|
# disk as the primary configuration file.
|
2501
|
copy_config_xml_from_conf_default() {
|
2502
|
# XXX: Wouldn't this overwrite any pre-installed pacakge info and customization as called so late today!!??
|
2503
|
if [ ! -f "${PFSENSEISODIR}/cf/conf/config.xml" ]; then
|
2504
|
if [ ! -f "${PFSENSEISODIR}/conf.default/config.xml" ]; then
|
2505
|
echo ">>> ERROR: There is no config.xml in the stage area ${PFSENSEISODIR}...STOPPING!" | tee -a ${LOGFILE}
|
2506
|
print_error_pfS
|
2507
|
kill $$
|
2508
|
fi
|
2509
|
echo ">>> Copying config.xml from conf.default/ to cf/conf/" | tee -a ${LOGFILE}
|
2510
|
cp ${PFSENSEISODIR}/conf.default/config.xml ${PFSENSEISODIR}/cf/conf/
|
2511
|
fi
|
2512
|
}
|
2513
|
|
2514
|
# Rebuilds and installs the BSDInstaller which populates
|
2515
|
# the Ports directory sysutils/bsdinstaller, etc.
|
2516
|
rebuild_bsdinstaller() {
|
2517
|
# Add BSDInstaller
|
2518
|
cd ${BUILDER_SCRIPTS}
|
2519
|
BSDINSTALLPKG=$(make -C /usr/ports/sysutils/bsdinstaller -V PKGNAME)
|
2520
|
if [ -f "/usr/ports/packages/All/$BSDINSTALLPKG.txz" -o -f "/usr/ports/packages/All/$BSDINSTALLPKG.tgz" -o -f "/usr/ports/packages/All/$BSDINSTALLPKG.tbz" ]; then
|
2521
|
echo ">>> Found $BSDINSTALLPKG pre-built package using that not rebuilding from source!"
|
2522
|
else
|
2523
|
${BUILDER_SCRIPTS}/scripts/rebuild_bsdinstaller.sh
|
2524
|
fi
|
2525
|
unset BSDINSTALLPKG
|
2526
|
}
|
2527
|
|
2528
|
# This routine ensures that the $SRCDIR has sources
|
2529
|
# and is ready for action / building.
|
2530
|
ensure_source_directories_present() {
|
2531
|
# Sanity check
|
2532
|
if [ ! -d "${PFSPATCHDIR}" ]; then
|
2533
|
echo ">>> ERROR: PFSPATCHDIR=${PFSPATCHDIR} is not a directory -- Please fix."
|
2534
|
print_error_pfS
|
2535
|
kill $$
|
2536
|
fi
|
2537
|
|
2538
|
update_freebsd_sources_and_apply_patches
|
2539
|
|
2540
|
update_pfSense_repository
|
2541
|
|
2542
|
# BSDInstaller is treated when needed
|
2543
|
${BUILDER_SCRIPTS}/scripts/get_bsdinstaller.sh
|
2544
|
}
|
2545
|
|
2546
|
clone_directory_contents() {
|
2547
|
if [ ! -d $1 -o ! -d $2 ]; then
|
2548
|
if [ -z "${LOGFILE}" ]; then
|
2549
|
echo ">>> ERROR: Argument $1 supplied is not a directory!"
|
2550
|
else
|
2551
|
echo ">>> ERROR: Argument $1 supplied is not a directory!" | tee -a ${LOGFILE}
|
2552
|
fi
|
2553
|
print_error_pfS
|
2554
|
kill $$
|
2555
|
fi
|
2556
|
OLDPWD=`pwd`
|
2557
|
echo -n ">>> Using TAR to clone $1 to $2 ..."
|
2558
|
cd ${1}
|
2559
|
tar -c -f - * | ( cd $2; tar -x -p -f -)
|
2560
|
echo "Done!"
|
2561
|
cd $OLDPWD
|
2562
|
unset OLDPWD
|
2563
|
}
|
2564
|
|
2565
|
clone_to_staging_area() {
|
2566
|
|
2567
|
OLDPWD=`pwd`
|
2568
|
# Clone everything to the final staging area
|
2569
|
echo -n ">>> Cloning everything to ${PFSENSESTAGEDIR} staging area..."
|
2570
|
LOGFILE=${BUILDER_LOGS}/cloning.${TARGET}.log
|
2571
|
|
2572
|
if [ ! -d ${GIT_REPO_DIR}/pfSenseGITREPO ]; then
|
2573
|
echo "ERROR!"
|
2574
|
echo ">>> ERROR: pfSense repository does not seem to be there please fix...STOPPING!" | tee -a ${LOGFILE}
|
2575
|
print_error_pfS
|
2576
|
fi
|
2577
|
|
2578
|
cd ${GIT_REPO_DIR}/pfSenseGITREPO
|
2579
|
tar --exclude=\.git -c -f - * | ( cd $PFSENSESTAGEDIR; tar -x -p -f -)
|
2580
|
|
2581
|
if [ -f ${PFSENSESTAGEDIR}/etc/master.passwd ]; then
|
2582
|
chroot ${PFSENSESTAGEDIR} cap_mkdb /etc/master.passwd
|
2583
|
chroot ${PFSENSESTAGEDIR} pwd_mkdb /etc/master.passwd
|
2584
|
fi
|
2585
|
cd $OLDPWD
|
2586
|
mkdir -p ${PFSENSESTAGEDIR}/etc/mtree
|
2587
|
mtree -Pcp ${PFSENSESTAGEDIR}/root > ${PFSENSESTAGEDIR}/etc/mtree/root.dist
|
2588
|
mtree -Pcp ${PFSENSESTAGEDIR}/var > ${PFSENSESTAGEDIR}/etc/mtree/var.dist
|
2589
|
mtree -Pcp ${PFSENSESTAGEDIR}/etc > ${PFSENSESTAGEDIR}/etc/mtree/etc.dist
|
2590
|
if [ -d ${PFSENSESTAGEDIR}/usr/local/etc ]; then
|
2591
|
mtree -Pcp ${PFSENSESTAGEDIR}/usr/local/etc > ${PFSENSESTAGEDIR}/etc/mtree/localetc.dist
|
2592
|
fi
|
2593
|
echo "Done!"
|
2594
|
unset OLDPWD
|
2595
|
}
|
2596
|
|
2597
|
create_final_staging_area() {
|
2598
|
if [ -z "${PFSENSEISODIR}" ]; then
|
2599
|
echo ">>> ERROR: PFSENSEISODIR is not set, cannot continue!" | tee -a ${LOGFILE}
|
2600
|
print_error_pfS
|
2601
|
fi
|
2602
|
|
2603
|
if [ -d "${PFSENSEISODIR}" ]; then
|
2604
|
echo -n ">>> Previous ${PFSENSEISODIR} detected cleaning up..." | tee -a ${LOGFILE}
|
2605
|
chflags -R noschg ${PFSENSEISODIR} 2>&1 1>/dev/null
|
2606
|
rm -rf ${PFSENSEISODIR}/* 2>&1 1>/dev/null
|
2607
|
echo "Done." | tee -a ${LOGFILE}
|
2608
|
fi
|
2609
|
mkdir -p ${PFSENSEISODIR}
|
2610
|
|
2611
|
echo ">>> Preparing Final image staging area: `LC_ALL=C date` - from ${PFSENSESTAGEDIR} to ${PFSENSEISODIR}" 2>&1 | tee -a ${LOGFILE}
|
2612
|
if [ -z "${NO_COMPRESSEDFS:-}" ]; then
|
2613
|
mkdir -p ${PFSENSEISODIR}/uzip
|
2614
|
mkdir -p ${PFSENSEISODIR}/usr
|
2615
|
DIRSIZE=$(($(du -kd 0 $PFSENSESTAGEDIR | cut -f 1)))
|
2616
|
FSSIZE=$(($DIRSIZE + ($DIRSIZE/5)))
|
2617
|
if [ -f ${PFSENSEISODIR}/uzip/usr.ufs ]; then
|
2618
|
rm -f ${PFSENSEISODIR}/uzip/usr.ufs
|
2619
|
fi
|
2620
|
dd if=/dev/zero of=${PFSENSEISODIR}/uzip/usr.ufs bs=1k count=1 seek=$((${FSSIZE} - 1)) 2>&1 | tee -a ${LOGFILE}
|
2621
|
MD=`mdconfig -a -t vnode -f ${PFSENSEISODIR}/uzip/usr.ufs`
|
2622
|
# Just in case
|
2623
|
trap "mdconfig -d -u ${MD}" 1 2 15 EXIT
|
2624
|
newfs -o space /dev/${MD} 2>&1 | tee -a ${LOGFILE}
|
2625
|
mount -o noatime /dev/${MD} ${PFSENSEISODIR}/usr 2>&1 | tee -a ${LOGFILE}
|
2626
|
trap "umount -f ${PFSENSEISODIR}/usr; mdconfig -d -u ${MD}" 1 2 15 EXIT
|
2627
|
fi
|
2628
|
|
2629
|
clone_directory_contents ${PFSENSESTAGEDIR} ${PFSENSEISODIR}
|
2630
|
|
2631
|
# Create a copy of this file just in case
|
2632
|
cp $PFSENSEISODIR/etc/gettytab $PFSENSEISODIR/etc/gettytab.bak
|
2633
|
|
2634
|
if [ ! -f $PFSENSEISODIR/sbin/init ]; then
|
2635
|
echo ">>> ERROR: Something went wrong during cloning -- Please verify!" 2>&1 | tee -a ${LOGFILE}
|
2636
|
print_error_pfS
|
2637
|
kill $$
|
2638
|
fi
|
2639
|
|
2640
|
if [ -z "${NO_COMPRESSEDFS:-}" ]; then
|
2641
|
umount -f ${PFSENSEISODIR}/usr
|
2642
|
mdconfig -d -u ${MD}
|
2643
|
# Restore functionality
|
2644
|
trap "-" 1 2 15 EXIT
|
2645
|
|
2646
|
echo -n ">>> Compressing ${PFSENSEISODIR}/uzip/ufs.ufs ..."
|
2647
|
mkuzip -s 65536 -o ${PFSENSEISODIR}/uzip/usr.uzip ${PFSENSEISODIR}/uzip/usr.ufs 2>&1 | tee -a ${LOGFILE}
|
2648
|
if [ $? -ne 0 ]; then
|
2649
|
echo ">>> ERROR: Something went wrong during compressing -- Please verify!" 2>&1 | tee -a ${LOGFILE}
|
2650
|
print_error_pfS
|
2651
|
kill $$
|
2652
|
fi
|
2653
|
echo "Done!"
|
2654
|
fi
|
2655
|
|
2656
|
echo -n ">>> Copying rc.d needed scripts..."
|
2657
|
# Copy file needed by iso image
|
2658
|
for file in uzip etcmfs varmfs rootmfs; do
|
2659
|
cp ${BUILDER_SCRIPTS}/scripts/rc.d/$file ${PFSENSEISODIR}/etc/rc.d/ 2>&1 | tee -a ${LOGFILE}
|
2660
|
chmod 555 ${PFSENSEISODIR}/etc/rc.d/$file 2>&1 | tee -a ${LOGFILE}
|
2661
|
done
|
2662
|
echo "Done!"
|
2663
|
|
2664
|
mkdir -p ${PFSENSEISODIR}/dist
|
2665
|
mtree -Pcp ${PFSENSEISODIR} | bzip2 -9 > ${PFSENSEISODIR}/dist/root.dist.bz2
|
2666
|
}
|
2667
|
|
2668
|
customize_stagearea_for_image() {
|
2669
|
# Prepare final stage area
|
2670
|
create_final_staging_area
|
2671
|
|
2672
|
# This check is for supporting create memstick/ova images
|
2673
|
if [ "${1}" = "iso" -o "${1}" = "memstick" -o "${1}" = "memstickserial" ]; then
|
2674
|
# Fetch BSDInstaller and rebuild
|
2675
|
rebuild_bsdinstaller
|
2676
|
|
2677
|
echo ">>> Searching for BSDInstaller..." | tee -a ${LOGFILE}
|
2678
|
if [ "$PFSPKGFILE" = "" ]; then
|
2679
|
PFSPKGFILE=${SCRATCHDIR}/pfspackages
|
2680
|
echo ">> PFSPKGFILE is not defined. Setting to ${PFSPKGFILE}." | tee -a ${LOGFILE}
|
2681
|
fi
|
2682
|
(${PKG_INFO} | grep bsdinstaller) > $PFSPKGFILE
|
2683
|
(${PKG_INFO} | grep lua) >> $PFSPKGFILE
|
2684
|
|
2685
|
echo $PFSPKGFILE >> ${LOGFILE}
|
2686
|
echo ">>> Installing BSDInstaller: " | tee -a ${LOGFILE}
|
2687
|
if [ ${FREEBSD_VERSION} -ge 10 ]; then
|
2688
|
(${BUILDER_SCRIPTS}/scripts/pkgnginstall.sh)
|
2689
|
else
|
2690
|
(${BUILDER_SCRIPTS}/scripts/pkginstall.sh)
|
2691
|
fi
|
2692
|
|
2693
|
# Add installer bits
|
2694
|
cust_populate_installer_bits
|
2695
|
|
2696
|
# Check to see if we have a healthy installer
|
2697
|
ensure_healthy_installer
|
2698
|
else
|
2699
|
echo ">>> BSDInstaller not being put into image type: ${1}" | tee -a ${LOGFILE}
|
2700
|
fi
|
2701
|
|
2702
|
# univnautes packages
|
2703
|
echo ">>> UNIVNAUTES/START" | tee -a ${LOGFILE}
|
2704
|
echo ">>> Search UnivNautes packages..." | tee -a ${LOGFILE}
|
2705
|
if [ "$PFSPKGFILE" = "" ]; then
|
2706
|
PFSPKGFILE=${SCRATCHDIR}/pfspackages
|
2707
|
echo ">> PFSPKGFILE is not defined. Setting to ${PFSPKGFILE}." | tee -a ${LOGFILE}
|
2708
|
fi
|
2709
|
(${PKG_INFO} | grep bash) > $PFSPKGFILE
|
2710
|
(${PKG_INFO} | grep python) >> $PFSPKGFILE
|
2711
|
(${PKG_INFO} | grep py27-) >> $PFSPKGFILE
|
2712
|
(${PKG_INFO} | grep lasso) >> $PFSPKGFILE
|
2713
|
echo $PFSPKGFILE >> ${LOGFILE}
|
2714
|
echo ">>> Installing UnivNautes packages: " | tee -a ${LOGFILE}
|
2715
|
(${BUILDER_SCRIPTS}/scripts/pkginstall.sh)
|
2716
|
echo ">>> force perl removal" | tee -a ${LOGFILE}
|
2717
|
PERLPKG=$(${PKG_INFO} | grep perl5 | cut -f1 -d" ")
|
2718
|
echo ">>> pkg_delete -f $PERLPKG:" | tee -a ${LOGFILE}
|
2719
|
chroot /usr/local/pfsense-clone pkg_delete -f $PERLPKG
|
2720
|
echo ">>> remove pyo/pyc files..." | tee -a ${LOGFILE}
|
2721
|
find ${PFSENSEISODIR}/usr/local/ -type f -name "*.py[co]" -exec rm {} ";"
|
2722
|
echo ">>> remove doc files:" | tee -a ${LOGFILE}
|
2723
|
for d in ${PFSENSEISODIR}/usr/local/man ${PFSENSEISODIR}/usr/local/share/examples ${PFSENSEISODIR}/usr/local/share/doc # ${PFSENSEISODIR}/usr/local/lib/perl*
|
2724
|
do
|
2725
|
echo ">>> remove $d..." | tee -a ${LOGFILE}
|
2726
|
rm -rf $d
|
2727
|
done
|
2728
|
echo ">>> remove locale files (not fr/en):" | tee -a ${LOGFILE}
|
2729
|
DLOC="ar az be bg bn br bs ca cs cy da de el eo es es_AR es_MX et eu fa fi fy_NL ga gl he hi hr hu id is it ja ka kk km kn ko lt lv mk ml mn my nb ne nl nn os pa pl pt pt_BR ro ru sk sl sq sr sr_Latn sv sw ta te th tr tt uk ur vi zh_CN zh_TW"
|
2730
|
for d in $(find ${PFSENSEISODIR}/usr/local/ -type d -name locale)
|
2731
|
do
|
2732
|
echo -n ">>> remove locales in $d..." | tee -a ${LOGFILE}
|
2733
|
for loc in $DLOC
|
2734
|
do
|
2735
|
#echo -n " "$loc | tee -a ${LOGFILE}
|
2736
|
rm -rf ${d}/${loc}
|
2737
|
done
|
2738
|
echo "" | tee -a ${LOGFILE}
|
2739
|
done
|
2740
|
echo ">>> UNIVNAUTES/END" | tee -a ${LOGFILE}
|
2741
|
# end of univnautes packages
|
2742
|
|
2743
|
# Add extra files such as buildtime of version, bsnmpd, etc.
|
2744
|
cust_populate_extra
|
2745
|
|
2746
|
install_custom_overlay
|
2747
|
|
2748
|
# Check for custom config.xml
|
2749
|
cust_install_config_xml
|
2750
|
|
2751
|
# Install custom pfSense-XML packages from a chroot
|
2752
|
pfsense_install_custom_packages_exec
|
2753
|
|
2754
|
# Overlay final files
|
2755
|
install_custom_overlay_final
|
2756
|
|
2757
|
# Ensure config.xml exists
|
2758
|
copy_config_xml_from_conf_default
|
2759
|
|
2760
|
# Test PHP installation
|
2761
|
test_php_install
|
2762
|
|
2763
|
# Overlay any loader.conf customziations
|
2764
|
install_extra_loader_conf_options
|
2765
|
|
2766
|
# Create md5 summary file listing checksums
|
2767
|
create_md5_summary_file
|
2768
|
|
2769
|
# Create mtree summary file listing owner/permissions/sha256 and similar
|
2770
|
create_mtree_summary_file
|
2771
|
|
2772
|
# Setup serial port helper hints
|
2773
|
setup_serial_hints
|
2774
|
|
2775
|
# Allow a custom function to be called from pfsense-build.conf
|
2776
|
# example: disable_lan_disable_dhcpd_enable_sshd
|
2777
|
if [ -n "$CUSTOM_CALL_SHELL_FUNCTION" ]; then
|
2778
|
eval $CUSTOM_CALL_SHELL_FUNCTION
|
2779
|
fi
|
2780
|
|
2781
|
}
|
2782
|
|
2783
|
create_iso_image() {
|
2784
|
LOGFILE=${BUILDER_LOGS}/isoimage.${TARGET}
|
2785
|
echo ">>> Building bootable ISO image for ${TARGET}" | tee -a ${LOGFILE}
|
2786
|
if [ -z "${DEFAULT_KERNEL}" ]; then
|
2787
|
echo ">>> ERROR: Could not identify DEFAULT_KERNEL to install on image!" | tee -a ${LOGFILE}
|
2788
|
print_error_pfS
|
2789
|
fi
|
2790
|
|
2791
|
customize_stagearea_for_image "iso"
|
2792
|
install_default_kernel ${DEFAULT_KERNEL}
|
2793
|
|
2794
|
echo cdrom > $PFSENSEISODIR/etc/platform
|
2795
|
|
2796
|
FSLABEL=`echo ${PRODUCT_NAME} | tr '[:lower:]' '[:upper:]'`
|
2797
|
echo "/dev/iso9660/${FSLABEL} / cd9660 ro 0 0" > ${PFSENSEISODIR}/etc/fstab
|
2798
|
|
2799
|
# This check is for supporting create memstick/ova images
|
2800
|
echo -n ">>> Running command: script -aq $LOGFILE makefs -t cd9660 -o bootimage=\"i386;${PFSENSEISODIR}/boot/cdboot \"-o no-emul-boot -o rockridge " | tee -a ${LOGFILE}
|
2801
|
echo "-o label=${FSLABEL} -o publisher=\"${PRODUCT_NAME} project.\" $ISOPATH ${PFSENSEISODIR}" | tee -a ${LOGFILE}
|
2802
|
makefs -t cd9660 -o bootimage="i386;${PFSENSEISODIR}/boot/cdboot" -o no-emul-boot -o rockridge \
|
2803
|
-o label=${FSLABEL} -o publisher="${PRODUCT_NAME} project." $ISOPATH ${PFSENSEISODIR} 2>&1 >> ${LOGFILE}
|
2804
|
if [ $? -ne 0 -o ! -f $ISOPATH ]; then
|
2805
|
if [ -f ${ISOPATH} ]; then
|
2806
|
rm -f $ISOPATH
|
2807
|
fi
|
2808
|
echo ">>> ERROR: Something wrong happened during ISO image creation. STOPPING!" | tee -a ${LOGFILE}
|
2809
|
print_error_pfS
|
2810
|
kill $$
|
2811
|
fi
|
2812
|
gzip -qf $ISOPATH &
|
2813
|
|
2814
|
echo ">>> ISO created: `LC_ALL=C date`" | tee -a ${LOGFILE}
|
2815
|
}
|
2816
|
|
2817
|
create_memstick_image() {
|
2818
|
|
2819
|
LOGFILE=${BUILDER_LOGS}/memstick.${TARGET}
|
2820
|
if [ "${MEMSTICKPATH}" = "" ]; then
|
2821
|
echo ">>> MEMSTICKPATH is empty skipping generation of memstick image!" | tee -a ${LOGFILE}
|
2822
|
return
|
2823
|
fi
|
2824
|
|
2825
|
if [ ! -d ${PFSENSEISODIR}/boot ]; then
|
2826
|
customize_stagearea_for_image "memstick"
|
2827
|
install_default_kernel ${DEFAULT_KERNEL}
|
2828
|
fi
|
2829
|
|
2830
|
echo cdrom > $PFSENSEISODIR/etc/platform
|
2831
|
|
2832
|
echo ">>> Creating memstick to ${MEMSTICKPATH}." 2>&1 | tee -a ${LOGFILE}
|
2833
|
echo "/dev/ufs/${PRODUCT_NAME} / ufs ro 0 0" > ${PFSENSEISODIR}/etc/fstab
|
2834
|
echo "kern.cam.boot_delay=10000" >> ${PFSENSEISODIR}/boot/loader.conf.local
|
2835
|
if [ $FREEBSD_VERSION -lt 10 ]; then
|
2836
|
makefs -B little ${MEMSTICKPATH} ${PFSENSEISODIR}
|
2837
|
else
|
2838
|
makefs -B little -o label=${PRODUCT_NAME} ${MEMSTICKPATH} ${PFSENSEISODIR}
|
2839
|
fi
|
2840
|
if [ $? -ne 0 ]; then
|
2841
|
if [ -f ${MEMSTICKPATH} ]; then
|
2842
|
rm -f $MEMSTICKPATH
|
2843
|
fi
|
2844
|
echo ">>> ERROR: Something wrong happened during MEMSTICK image creation. STOPPING!" | tee -a ${LOGFILE}
|
2845
|
print_error_pfS
|
2846
|
kill $$
|
2847
|
fi
|
2848
|
MD=$(mdconfig -a -t vnode -f $MEMSTICKPATH)
|
2849
|
# Just in case
|
2850
|
trap "mdconfig -d -u ${MD}" 1 2 15 EXIT
|
2851
|
gpart create -s BSD ${MD} 2>&1 >> ${LOGFILE}|
|
2852
|
gpart bootcode -b ${PFSENSEISODIR}/boot/boot ${MD} 2>&1 >> ${LOGFILE}
|
2853
|
gpart add -t freebsd-ufs ${MD} 2>&1 >> ${LOGFILE}
|
2854
|
if [ $FREEBSD_VERSION -lt 10 ]; then
|
2855
|
tunefs -L ${PRODUCT_NAME} /dev/${MD}
|
2856
|
fi
|
2857
|
trap "-" 1 2 15 EXIT
|
2858
|
mdconfig -d -u ${MD} 2>&1 | tee -a ${LOGFILE}
|
2859
|
gzip -qf $MEMSTICKPATH &
|
2860
|
|
2861
|
echo ">>> MEMSTICK created: `LC_ALL=C date`" | tee -a ${LOGFILE}
|
2862
|
}
|
2863
|
|
2864
|
create_memstick_serial_image() {
|
2865
|
LOGFILE=${BUILDER_LOGS}/memstickserial.${TARGET}
|
2866
|
if [ "${MEMSTICKSERIALPATH}" = "" ]; then
|
2867
|
echo ">>> MEMSTICKSERIALPATH is empty skipping generation of memstick image!" | tee -a ${LOGFILE}
|
2868
|
return
|
2869
|
fi
|
2870
|
|
2871
|
if [ ! -d ${PFSENSEISODIR}/boot ]; then
|
2872
|
customize_stagearea_for_image "memstickserial"
|
2873
|
install_default_kernel ${DEFAULT_KERNEL}
|
2874
|
fi
|
2875
|
|
2876
|
echo cdrom > $PFSENSEISODIR/etc/platform
|
2877
|
|
2878
|
echo "/dev/ufs/${PRODUCT_NAME} / ufs ro 0 0" > ${PFSENSEISODIR}/etc/fstab
|
2879
|
echo "kern.cam.boot_delay=10000" >> ${PFSENSEISODIR}/boot/loader.conf.local
|
2880
|
|
2881
|
echo ">>> Creating serial memstick to ${MEMSTICKSERIALPATH}." 2>&1 | tee -a ${LOGFILE}
|
2882
|
|
2883
|
BOOTCONF=${PFSENSEISODIR}/boot.config
|
2884
|
LOADERCONF=${PFSENSEISODIR}/boot/loader.conf
|
2885
|
ACTIVECONF=${PFSENSEISODIR}/cf/conf/config.xml
|
2886
|
DEFAULTCONF=${PFSENSEISODIR}/conf.default/config.xml
|
2887
|
TTYS=${PFSENSEISODIR}/etc/ttys
|
2888
|
|
2889
|
echo ">>> Activating serial console..." 2>&1 | tee -a ${LOGFILE}
|
2890
|
# Activate serial console in boot.config
|
2891
|
if [ -f ${BOOTCONF} ]; then
|
2892
|
sed -i "" '/^-D$/d' ${BOOTCONF}
|
2893
|
fi
|
2894
|
echo "-D" >> ${BOOTCONF}
|
2895
|
|
2896
|
# Activate serial console in config.xml
|
2897
|
# If it was there before, clear the setting to be sure we don't add it twice.
|
2898
|
sed -i "" -e "/ <enableserial\/>/d" ${ACTIVECONF}
|
2899
|
# Enable serial in the config
|
2900
|
sed -i "" -e "s/ <\/system>/ <enableserial\/>\\`echo -e \\\n` <\/system>/" ${ACTIVECONF}
|
2901
|
# Make sure to update the default config as well.
|
2902
|
cp ${ACTIVECONF} ${DEFAULTCONF}
|
2903
|
|
2904
|
# Remove old console options if present.
|
2905
|
sed -i "" -Ee "/(console|boot_multicons|boot_serial)/d" ${LOADERCONF}
|
2906
|
# Activate serial console+video console in loader.conf
|
2907
|
echo 'boot_multicons="YES"' >> ${LOADERCONF}
|
2908
|
echo 'boot_serial="YES"' >> ${LOADERCONF}
|
2909
|
echo 'console="comconsole,vidconsole"' >> ${LOADERCONF}
|
2910
|
|
2911
|
# Activate serial console TTY
|
2912
|
sed -i "" -Ee "s/^ttyu0.*$/ttyu0 \"\/usr\/libexec\/getty bootupcli\" cons25 on secure/" ${TTYS}
|
2913
|
|
2914
|
if [ $FREEBSD_VERSION -lt 10 ]; then
|
2915
|
makefs -B little ${MEMSTICKSERIALPATH} ${PFSENSEISODIR}
|
2916
|
else
|
2917
|
makefs -B little -o label=${PRODUCT_NAME} ${MEMSTICKSERIALPATH} ${PFSENSEISODIR}
|
2918
|
fi
|
2919
|
if [ $? -ne 0 ]; then
|
2920
|
if [ -f ${MEMSTICKSERIALPATH} ]; then
|
2921
|
rm -f $MEMSTICKSERIALPATH
|
2922
|
fi
|
2923
|
echo ">>> ERROR: Something wrong happened during MEMSTICKSERIAL image creation. STOPPING!" | tee -a ${LOGFILE}
|
2924
|
print_error_pfS
|
2925
|
kill $$
|
2926
|
fi
|
2927
|
MD=$(mdconfig -a -t vnode -f $MEMSTICKSERIALPATH)
|
2928
|
# Just in case
|
2929
|
trap "mdconfig -d -u ${MD}" 1 2 15 EXIT
|
2930
|
gpart create -s BSD ${MD} 2>&1 >> ${LOGFILE}
|
2931
|
gpart bootcode -b ${PFSENSEISODIR}/boot/boot ${MD} 2>&1 >> ${LOGFILE}
|
2932
|
gpart add -t freebsd-ufs ${MD} 2>&1 >> ${LOGFILE}
|
2933
|
if [ $FREEBSD_VERSION -lt 10 ]; then
|
2934
|
tunefs -L ${PRODUCT_NAME} /dev/${MD}
|
2935
|
fi
|
2936
|
trap "-" 1 2 15 EXIT
|
2937
|
mdconfig -d -u ${MD} 2>&1 >> ${LOGFILE}
|
2938
|
gzip -qf $MEMSTICKSERIALPATH &
|
2939
|
|
2940
|
echo ">>> MEMSTICKSERIAL created: `LC_ALL=C date`" | tee -a ${LOGFILE}
|
2941
|
}
|
2942
|
|
2943
|
# This routine ensures any ports / binaries that the builder
|
2944
|
# system needs are on disk and ready for execution.
|
2945
|
install_required_builder_system_ports() {
|
2946
|
# No ports exist, use portsnap to bootstrap.
|
2947
|
if [ ! -d "/usr/ports/" ]; then
|
2948
|
echo -n ">>> Grabbing FreeBSD port sources, please wait..."
|
2949
|
(/usr/sbin/portsnap fetch) 2>&1 | egrep -B3 -A3 -wi '(error)'
|
2950
|
(/usr/sbin/portsnap extract) 2>&1 | egrep -B3 -A3 -wi '(error)'
|
2951
|
echo "Done!"
|
2952
|
fi
|
2953
|
|
2954
|
OIFS=$IFS
|
2955
|
IFS="
|
2956
|
"
|
2957
|
|
2958
|
for PKG_STRING in `cat ${PFSBUILDERREQUIREDPORTS} ${PFSBUILDERREQUIREDPORTS}.${FREEBSD_VERSION} 2>/dev/null`
|
2959
|
do
|
2960
|
PKG_STRING_T=`echo $PKG_STRING | sed "s/[ ]+/ /g"`
|
2961
|
CHECK_ON_DISK=`echo $PKG_STRING_T | awk '{ print $1 }'`
|
2962
|
PORT_LOCATION=`echo $PKG_STRING_T | awk '{ print $2 }'`
|
2963
|
UNSET_OPTS=`echo $PKG_STRING_T | awk '{ print $2 }' | sed 's/,/ /g'`
|
2964
|
if [ ! -f "$CHECK_ON_DISK" ]; then
|
2965
|
echo -n ">>> Building $PORT_LOCATION ..."
|
2966
|
(cd $PORT_LOCATION && env -u TARGET -u TARGET_ARCH make BATCH=yes deinstall clean) 2>&1 | egrep -B3 -A3 -wi '(error)'
|
2967
|
(cd $PORT_LOCATION && env -u TARGET -u TARGET_ARCH make ${MAKEJ_PORTS} WITHOUT="X11 DOCS EXAMPLES MAN INFO SDL ${UNSET_OPTS}" BATCH=yes FORCE_PKG_REGISTER=yes install clean) 2>&1 | egrep -B3 -A3 -wi '(error)'
|
2968
|
echo "Done!"
|
2969
|
fi
|
2970
|
done
|
2971
|
|
2972
|
IFS=$OIFS
|
2973
|
}
|
2974
|
|
2975
|
# Updates FreeBSD sources and applies any custom
|
2976
|
# patches that have been defined.
|
2977
|
update_freebsd_sources_and_apply_patches() {
|
2978
|
# No need to obtain sources or patch
|
2979
|
# on subsequent build runs.
|
2980
|
|
2981
|
if [ ! -d "${SRCDIR}" ]; then
|
2982
|
mkdir -p ${SRCDIR}
|
2983
|
fi
|
2984
|
|
2985
|
if [ -n "${NO_BUILDWORLD:-}" -a -n "${NO_BUILDKERNEL:-}" ]; then
|
2986
|
echo ">>> NO_BUILDWORLD and NO_BUILDKERNEL set, skipping update of freebsd sources and patch applying" | tee -a ${LOGFILE}
|
2987
|
return
|
2988
|
fi
|
2989
|
|
2990
|
OLDPWD=`pwd`
|
2991
|
|
2992
|
echo -n ">>> Obtaining FreeBSD sources ${FREEBSD_BRANCH}..."
|
2993
|
if [ -n "${USE_SVN}" ]; then
|
2994
|
if [ -f /usr/bin/svnlite ]; then
|
2995
|
SVN_BIN=/usr/bin/svnlite
|
2996
|
else
|
2997
|
SVN_BIN=svn
|
2998
|
fi
|
2999
|
|
3000
|
# If src is already there
|
3001
|
if [ -d "${SRCDIR}/.svn" ]; then
|
3002
|
# Remove orphan files
|
3003
|
(cd ${SRCDIR} && ${SVN_BIN} status --no-ignore | awk '{print $2}' | xargs rm -rf)
|
3004
|
# Revert possible changed files
|
3005
|
(cd ${SRCDIR} && ${SVN_BIN} revert -R . 2>&1) | grep -i 'error'
|
3006
|
# Update src
|
3007
|
(cd ${SRCDIR} && ${SVN_BIN} up 2>&1) | grep -i 'error'
|
3008
|
else
|
3009
|
(${SVN_BIN} co ${FREEBSD_REPO_BASE}/${FREEBSD_BRANCH} ${SRCDIR} 2>&1) | grep -i 'error'
|
3010
|
fi
|
3011
|
else
|
3012
|
local _FREEBSD_BRANCH=${FREEBSD_BRANCH:-"master"}
|
3013
|
local _CLONE=1
|
3014
|
|
3015
|
if [ -d "${SRCDIR}/.git" ]; then
|
3016
|
CUR_BRANCH=$(cd ${SRCDIR} && git branch | grep '^\*' | cut -d' ' -f2)
|
3017
|
if [ "${CUR_BRANCH}" = "${_FREEBSD_BRANCH}" ]; then
|
3018
|
_CLONE=0
|
3019
|
( cd ${SRCDIR} && git fetch origin; git reset --hard; git clean -fxd; git rebase origin/${_FREEBSD_BRANCH} ) 2>&1 | grep -C3 -i 'error'
|
3020
|
elif (cd ${SRCDIR} && git branch 2>&1 | grep -q "${_FREEBSD_BRANCH}"); then
|
3021
|
_CLONE=0
|
3022
|
( cd ${SRCDIR} && git fetch origin; git reset --hard; git clean -fxd; git checkout ${_FREEBSD_BRANCH}; git rebase origin/${_FREEBSD_BRANCH} ) 2>&1 | grep -C3 -i 'error'
|
3023
|
else
|
3024
|
rm -rf ${SRCDIR}
|
3025
|
fi
|
3026
|
fi
|
3027
|
|
3028
|
if [ ${_CLONE} -eq 1 ]; then
|
3029
|
( git clone --branch ${_FREEBSD_BRANCH} --single-branch ${FREEBSD_REPO_BASE} ${SRCDIR} ) 2>&1 | grep -C3 -i 'error'
|
3030
|
fi
|
3031
|
|
3032
|
if [ -n "${GIT_FREEBSD_COSHA1}" ]; then
|
3033
|
( cd ${SRCDIR} && git checkout ${GIT_FREEBSD_COSHA1} ) 2>&1 | grep -C3 -i 'error'
|
3034
|
fi
|
3035
|
fi
|
3036
|
echo "Done!"
|
3037
|
|
3038
|
# Loop through and remove files
|
3039
|
echo ">>> Removing files listed for FreeBSD version: ${FREEBSD_VERSION} file-name: ${PFSPATCHFILE}"
|
3040
|
for LINE in `cat ${PFSPATCHFILE}`
|
3041
|
do
|
3042
|
PATCH_RM=`echo $LINE | cut -d~ -f4`
|
3043
|
PATCH_RM_LENGTH=`echo $PATCH_RM | wc -c`
|
3044
|
DIR_CREATE=`echo $LINE | cut -d~ -f5`
|
3045
|
if [ $PATCH_RM_LENGTH -gt "2" ]; then
|
3046
|
rm -rf ${SRCDIR}${PATCH_RM}
|
3047
|
fi
|
3048
|
if [ "$DIR_CREATE" != "" ]; then
|
3049
|
mkdir -p ${SRCDIR}/${DIR_CREATE}
|
3050
|
fi
|
3051
|
done
|
3052
|
|
3053
|
echo -n ">>> Applying patches from $PFSPATCHFILE please wait..."
|
3054
|
# Loop through and patch files
|
3055
|
for LINE in `cat ${PFSPATCHFILE}`
|
3056
|
do
|
3057
|
PATCH_DEPTH=`echo $LINE | cut -d~ -f1`
|
3058
|
PATCH_DIRECTORY=`echo $LINE | cut -d~ -f2`
|
3059
|
PATCH_FILE=`echo $LINE | cut -d~ -f3`
|
3060
|
PATCH_FILE_LEN=`echo $PATCH_FILE | wc -c`
|
3061
|
MOVE_FILE=`echo $LINE | cut -d~ -f4`
|
3062
|
MOVE_FILE_LEN=`echo $MOVE_FILE | wc -c`
|
3063
|
IS_TGZ=`echo $LINE | grep -v grep | grep .tgz | wc -l`
|
3064
|
if [ ${PATH_FILE} == ""]; then
|
3065
|
|
3066
|
elif [ ! -f "${PFSPATCHDIR}/${PATCH_FILE}" ]; then
|
3067
|
echo
|
3068
|
echo "ERROR! Patch file(${PATCH_FILE}) not found! Please fix before building!"
|
3069
|
echo
|
3070
|
print_error_pfS
|
3071
|
kill $$
|
3072
|
fi
|
3073
|
|
3074
|
if [ $PATCH_FILE_LEN -gt "2" ]; then
|
3075
|
if [ $IS_TGZ -gt "0" ]; then
|
3076
|
(cd ${SRCDIR}/${PATCH_DIRECTORY} && tar xzvpf ${PFSPATCHDIR}/${PATCH_FILE}) 2>&1 \
|
3077
|
| egrep -wi '(warning|error)'
|
3078
|
else
|
3079
|
(cd ${SRCDIR}/${PATCH_DIRECTORY} && patch --quiet -f ${PATCH_DEPTH} < ${PFSPATCHDIR}/${PATCH_FILE} 2>&1 );
|
3080
|
if [ "$?" != "0" ]; then
|
3081
|
echo "failed to apply ${PATCH_FILE}";
|
3082
|
fi
|
3083
|
fi
|
3084
|
fi
|
3085
|
if [ $MOVE_FILE_LEN -gt "2" ]; then
|
3086
|
#cp ${SRCDIR}/${MOVE_FILE} ${SRCDIR}/${PATCH_DIRECTORY}
|
3087
|
fi
|
3088
|
done
|
3089
|
echo "Done!"
|
3090
|
|
3091
|
echo ">>> Finding patch rejects..."
|
3092
|
REJECTED_PATCHES=`find $SRCDIR -name "*.rej" | wc -l`
|
3093
|
if [ $REJECTED_PATCHES -gt 0 ]; then
|
3094
|
echo
|
3095
|
echo "WARNING! Rejected patches found! Please fix before building!"
|
3096
|
echo
|
3097
|
find $SRCDIR -name "*.rej"
|
3098
|
echo
|
3099
|
if [ "$BUILD_ERROR_MAIL" != "" ]; then
|
3100
|
LOGFILE="$SCRATCHDIR/patches.failed.apply"
|
3101
|
find $SRCDIR -name "*.rej" > $LOGFILE
|
3102
|
print_error_pfS
|
3103
|
|
3104
|
fi
|
3105
|
print_error_pfS
|
3106
|
kill $$
|
3107
|
fi
|
3108
|
|
3109
|
cd $OLDPWD
|
3110
|
unset OLDPWD
|
3111
|
}
|
3112
|
|
3113
|
# Email when an error has occured and BUILD_ERROR_MAIL is defined
|
3114
|
report_error_pfsense() {
|
3115
|
if [ ! -z ${BUILD_ERROR_MAIL:-} ]; then
|
3116
|
HOSTNAME=`hostname`
|
3117
|
IPADDRESS=`ifconfig | grep inet | grep netmask | grep broadcast | awk '{ print $2 }'`
|
3118
|
cat ${LOGFILE} | \
|
3119
|
mail -s "Builder (${PRODUCT_NAME}) build error in ${TARGET} phase ${IPADDRESS} - ${HOSTNAME} " \
|
3120
|
${BUILD_ERROR_MAIL}
|
3121
|
fi
|
3122
|
}
|
3123
|
|
3124
|
# Email when an operation is completed IE build run
|
3125
|
email_operation_completed() {
|
3126
|
if [ ! -z ${BUILD_COMPLETED_MAIL:-} ]; then
|
3127
|
HOSTNAME=`hostname`
|
3128
|
IPADDRESS=`ifconfig | grep inet | grep netmask | grep broadcast | awk '{ print $2 }'`
|
3129
|
echo "Build / operation completed ${IPADDRESS} - ${HOSTNAME}" | \
|
3130
|
mail -s "Builder (${PRODUCT_NAME}) operation completed ${IPADDRESS} - ${HOSTNAME}" \
|
3131
|
${BUILD_COMPLETED_MAIL}
|
3132
|
fi
|
3133
|
}
|
3134
|
|
3135
|
# This ensures installer is healthy.
|
3136
|
ensure_healthy_installer() {
|
3137
|
echo -n ">>> Checking BSDInstaller health..." | tee -a ${LOGFILE}
|
3138
|
INSTALLER_ERROR=0
|
3139
|
if [ ! -f "$PFSENSEISODIR/usr/local/sbin/dfuife_curses" ]; then
|
3140
|
INSTALLER_ERROR=1
|
3141
|
echo -n " dfuife_curses missing " | tee -a ${LOGFILE}
|
3142
|
fi
|
3143
|
if [ ! -d "$PFSENSEISODIR/usr/local/share/dfuibe_lua" ]; then
|
3144
|
INSTALLER_ERROR=1
|
3145
|
echo -n " dfuibe_lua missing " | tee -a ${LOGFILE}
|
3146
|
fi
|
3147
|
if [ ! -f "$PFSENSEISODIR/usr/local/share/dfuibe_lua/conf/pfSense.lua" ]; then
|
3148
|
INSTALLER_ERROR=1
|
3149
|
echo " pfSense_lua missing " | tee -a ${LOGFILE}
|
3150
|
fi
|
3151
|
if [ "$INSTALLER_ERROR" -gt 0 ]; then
|
3152
|
echo ">>> ERROR: " | tee -a ${LOGFILE}
|
3153
|
print_error_pfS
|
3154
|
kill $$
|
3155
|
else
|
3156
|
echo "[OK]" | tee -a ${LOGFILE}
|
3157
|
fi
|
3158
|
}
|
3159
|
|
3160
|
# Check to see if a forced pfPorts run has been requested.
|
3161
|
# If so, rebuild pfPorts. set_version.sh uses this.
|
3162
|
check_for_forced_pfPorts_build() {
|
3163
|
if [ -f "$SCRATCHDIR/pfPorts_forced_build_required" ]; then
|
3164
|
# Ensure that we build
|
3165
|
rm -f $SCRATCHDIR/pfSense_do_not_build_pfPorts
|
3166
|
recompile_pfPorts
|
3167
|
# Remove file that could trigger 2 pfPorts
|
3168
|
# builds in one run
|
3169
|
rm $SCRATCHDIR/pfPorts_forced_build_required
|
3170
|
fi
|
3171
|
}
|
3172
|
|
3173
|
# Print basenames
|
3174
|
print_basenames() {
|
3175
|
for NAME in "$1"; do
|
3176
|
echo `basename $NAME`
|
3177
|
done
|
3178
|
}
|
3179
|
|
3180
|
# Put extra options in loader.conf.local if needed
|
3181
|
install_extra_loader_conf_options() {
|
3182
|
if [ ! -z ${LOADER_CONF_CUSTOM} ]; then
|
3183
|
if [ -f ${LOADER_CONF_CUSTOM} ]; then
|
3184
|
echo -n ">>> loader.conf custom option addition..."
|
3185
|
cat ${LOADER_CONF_CUSTOM} >> $PFSENSEISODIR/boot/loader.conf.local
|
3186
|
echo "Done!"
|
3187
|
fi
|
3188
|
fi
|
3189
|
}
|
3190
|
|
3191
|
# This routine assists with installing various
|
3192
|
# freebsd ports files into the pfsenese-fs staging
|
3193
|
# area. The various ports are built prior to install.
|
3194
|
install_pkg_install_ports() {
|
3195
|
if [ "$PKG_INSTALL_PORTSPFS" = "" ]; then
|
3196
|
return
|
3197
|
fi
|
3198
|
OLDPWD=`pwd`
|
3199
|
# port build log files will be stored here
|
3200
|
mkdir -p ${BUILDER_LOGS}/pfPorts
|
3201
|
ALREADYBUILT="${BUILDER_LOGS}/pfPorts/install_pkg_install_ports"
|
3202
|
if [ -d $ALREADYBUILT ]; then
|
3203
|
rm -rf $ALREADYBUILT
|
3204
|
fi
|
3205
|
mkdir -p $ALREADYBUILT
|
3206
|
# Some ports are unhappy with cross building and fail spectacularly.
|
3207
|
OLDTGTARCH=${TARGET_ARCH}
|
3208
|
unset TARGET_ARCH
|
3209
|
export PFS_PKG_ALL="/usr/ports/packages/All/"
|
3210
|
PFS_PKG_OLD="/usr/ports/packages/Old/"
|
3211
|
VAR_DB_PKG_TMP="$SCRATCHDIR/vardbpkg/"
|
3212
|
VAR_DB_PKG="/var/db/pkg/"
|
3213
|
mkdir -p ${PFS_PKG_ALL}
|
3214
|
mkdir -p ${PFS_PKG_OLD}
|
3215
|
mkdir -p ${VAR_DB_PKG_TMP}
|
3216
|
# Make a backup of existing packages so we can figure out
|
3217
|
# which packages need to be installed in pfsense-fs chroot.
|
3218
|
# otherwise you will get a bunch of extra pkgs that where
|
3219
|
# on the system prior to invoking this build run.
|
3220
|
mv ${PFS_PKG_ALL}* ${PFS_PKG_OLD}/ 2>/dev/null
|
3221
|
mkdir -p ${PFS_PKG_ALL} 2>/dev/null
|
3222
|
|
3223
|
echo ">>> Building ports: (starting)"
|
3224
|
for PORTDIRPFS in $PKG_INSTALL_PORTSPFS; do
|
3225
|
install_pkg_install_ports_build $PORTDIRPFS
|
3226
|
done
|
3227
|
|
3228
|
mkdir -p $PFSENSESTAGEDIR/tmp/pkg/
|
3229
|
cp ${PFS_PKG_ALL}/* $PFSENSESTAGEDIR/tmp/pkg/
|
3230
|
echo ">>> Building ports: (finished)"
|
3231
|
|
3232
|
echo ">>> Installing built ports (packages) in chroot (${PFSENSESTAGEDIR})... (starting)"
|
3233
|
mv ${VAR_DB_PKG}/* ${VAR_DB_PKG_TMP} || true 2>/dev/null
|
3234
|
cp ${BUILDER_SCRIPTS}/scripts/install_tmp_pkgs_in_chroot.sh $PFSENSESTAGEDIR/pkg.sh
|
3235
|
chmod a+rx $PFSENSESTAGEDIR/pkg.sh
|
3236
|
# chroot into staging area and pkg_add all of the packages
|
3237
|
script ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt /sbin/mount -t devfs devfs ${PFSENSESTAGEDIR}/dev
|
3238
|
script -a ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt chroot $PFSENSESTAGEDIR /pkg.sh
|
3239
|
script -a ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt /sbin/umount ${PFSENSESTAGEDIR}/dev
|
3240
|
echo ">>> Result of installing packages in the chroot is:"
|
3241
|
echo "--------------------------------------------------"
|
3242
|
cat ${BUILDER_LOGS}/pfPorts/install_pkg_install_ports.txt
|
3243
|
echo "--------------------------------------------------"
|
3244
|
echo ">>> Installing built ports (packages) in chroot (${PFSENSESTAGEDIR})... (finshied)"
|
3245
|
|
3246
|
# Restore the previously backed up items
|
3247
|
mv ${PFS_PKG_OLD}* ${PFS_PKG_ALL} || true 2>/dev/null
|
3248
|
mv ${VAR_DB_PKG_TMP}/* ${VAR_DB_PKG} || true 2>/dev/null
|
3249
|
rm -rf $PFSENSESTAGEDIR/tmp/pkg
|
3250
|
rm -f $PFSENSESTAGEDIR/pkg.sh
|
3251
|
|
3252
|
echo ">>> Building ports: (Done)"
|
3253
|
TARGET_ARCH=${OLDTGTARCH}
|
3254
|
cd $OLDPWD
|
3255
|
unset OLDPWD
|
3256
|
}
|
3257
|
|
3258
|
install_pkg_install_ports_build() {
|
3259
|
local PORTDIRPFSA
|
3260
|
local PORTNAME
|
3261
|
local _PORTNAME
|
3262
|
local BUILT_PKGNAME
|
3263
|
|
3264
|
PORTDIRPFSA="$1"
|
3265
|
|
3266
|
# XXX: Maybe remove this code as its already done above!
|
3267
|
PORTNAME="`basename $PORTDIRPFSA`"
|
3268
|
if [ "$PORTNAME" = "" ]; then
|
3269
|
echo ">>> ERROR: PORTNAME is blank. Cannot continue."
|
3270
|
print_error_pfS
|
3271
|
kill $$
|
3272
|
fi
|
3273
|
|
3274
|
if [ -d $pfSPORTS_BASE_DIR/${PORTNAME} ]; then
|
3275
|
echo -n ">>> Overlaying port $PORTNAME from pfPorts..."
|
3276
|
# Cleanup to avoid issues with extra/different patches
|
3277
|
rm -rf $PORTDIRPFSA/*
|
3278
|
cp -R $pfSPORTS_BASE_DIR/${PORTNAME}/* $PORTDIRPFSA
|
3279
|
echo "Done!"
|
3280
|
fi
|
3281
|
ALREADYBUILT="${BUILDER_LOGS}/pfPorts/install_pkg_install_ports"
|
3282
|
BUILT_PKGNAME="`make -C $PORTDIRPFSA -V PKGNAME`"
|
3283
|
if [ ! -f $ALREADYBUILT/$BUILT_PKGNAME ]; then
|
3284
|
|
3285
|
# Install the required port for the build environment
|
3286
|
for EXTRAPORT in `cd $PORTDIRPFSA && make build-depends-list | sort | uniq | xargs /bin/echo -n `; do
|
3287
|
_PORTNAME="`basename $EXTRAPORT`"
|
3288
|
if [ "$_PORTNAME" = "" ]; then
|
3289
|
echo ">>> ERROR: _PORTNAME is blank. Cannot continue."
|
3290
|
print_error_pfS
|
3291
|
kill $$
|
3292
|
fi
|
3293
|
if [ -d $pfSPORTS_BASE_DIR/${_PORTNAME} ]; then
|
3294
|
echo -n ">>> Overlaying port $PORTNAME from pfPorts..."
|
3295
|
# Cleanup to avoid issues with extra/different patches
|
3296
|
rm -rf $EXTRAPORT/*
|
3297
|
cp -R $pfSPORTS_BASE_DIR/${_PORTNAME}/* $EXTRAPORT
|
3298
|
echo "Done!"
|
3299
|
fi
|
3300
|
_BUILT_PKGNAME="`make -C $EXTRAPORT -V PKGNAME`"
|
3301
|
${PKG_QUERY} $_BUILT_PKGNAME
|
3302
|
if [ $? -ne 0 ]; then
|
3303
|
echo -n ">>> Building port $_PORTNAME($_BUILT_PKGNAME) as build dependency of ($PORTNAME)..."
|
3304
|
script ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt env -u TARGET -u TARGET_ARCH make -C $EXTRAPORT $PKG_INSTALL_PFSMAKEENV WITHOUT="X11 DOCS EXAMPLES MAN INFO SDL" BATCH=yes FORCE_PKG_REGISTER=yes clean install clean 2>&1 1>/dev/null || true 2>&1 >/dev/null
|
3305
|
if [ "$?" != "0" ]; then
|
3306
|
echo
|
3307
|
echo
|
3308
|
echo "!!! Something went wrong while building ${EXTRAPORT}"
|
3309
|
echo " Press RETURN/ENTER to view the log from this build."
|
3310
|
read inputline
|
3311
|
more ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
|
3312
|
else
|
3313
|
echo "Done!"
|
3314
|
fi
|
3315
|
else
|
3316
|
echo ">>> Port ${EXTRAPORT}($_BUILT_PKGNAME) as build dependency of ($PORTNAME)...already installed...skipping."
|
3317
|
fi
|
3318
|
done
|
3319
|
|
3320
|
# Package up what's needed to execute and run
|
3321
|
for EXTRAPORT in `cd $PORTDIRPFSA && make run-depends-list | sort | uniq | xargs /bin/echo -n `; do
|
3322
|
_PORTNAME="`basename $EXTRAPORT`"
|
3323
|
if [ "$_PORTNAME" = "" ]; then
|
3324
|
echo ">>> ERROR: Run list _PORTNAME is blank. Cannot continue."
|
3325
|
print_error_pfS
|
3326
|
kill $$
|
3327
|
fi
|
3328
|
if [ -d $pfSPORTS_BASE_DIR/${_PORTNAME} ]; then
|
3329
|
echo -n ">>> Overlaying port $_PORTNAME from pfPorts..."
|
3330
|
# Cleanup to avoid issues with extra/different patches
|
3331
|
rm -rf $EXTRAPORT/*
|
3332
|
cp -R $pfSPORTS_BASE_DIR/${_PORTNAME}/* $EXTRAPORT
|
3333
|
echo "Done!"
|
3334
|
fi
|
3335
|
install_pkg_install_ports_build $EXTRAPORT
|
3336
|
_BUILT_PKGNAME="`make -C $EXTRAPORT -V PKGNAME`"
|
3337
|
echo ">>> Building port $_PORTNAME($_BUILT_PKGNAME) as runtime dependency of ($PORTNAME)...Done!"
|
3338
|
done
|
3339
|
|
3340
|
echo -n ">>> Building package $PORTNAME($BUILT_PKGNAME)..."
|
3341
|
if [ -f /usr/ports/packages/Old/${BUILT_PKGNAME}.tbz ]; then
|
3342
|
echo -n " Using already built port found in cache... "
|
3343
|
cp -R /usr/ports/packages/Old/${BUILT_PKGNAME}.tbz \
|
3344
|
/usr/ports/packages/All/
|
3345
|
touch $ALREADYBUILT/$BUILT_PKGNAME
|
3346
|
echo "Done!"
|
3347
|
return;
|
3348
|
fi
|
3349
|
|
3350
|
script ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt env -u TARGET -u TARGET_ARCH make -C $PORTDIRPFSA ${MAKEJ_PORTS} $PKG_INSTALL_PFSMAKEENV WITHOUT="X11 DOCS EXAMPLES MAN INFO SDL LATEST_LINK" BATCH=yes FORCE_PKG_REGISTER=yes clean install clean 2>&1 1>/dev/null || true 2>&1 >/dev/null
|
3351
|
if [ "$?" != "0" ]; then
|
3352
|
echo
|
3353
|
echo
|
3354
|
echo "!!! Something went wrong while building ${PORTNAME}"
|
3355
|
echo " Press RETURN/ENTER to view the log from this build."
|
3356
|
read inputline
|
3357
|
more {$BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
|
3358
|
fi
|
3359
|
|
3360
|
if [ ${FREEBSD_VERSION} -gt 9 ]; then
|
3361
|
script -a ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt pkg create -f tbz -o $PFS_PKG_ALL $BUILT_PKGNAME
|
3362
|
else
|
3363
|
script -a ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt pkg_create -b $BUILT_PKGNAME $PFS_PKG_ALL/${BUILT_PKGNAME}.tbz
|
3364
|
fi
|
3365
|
if [ "$?" != "0" ]; then
|
3366
|
echo
|
3367
|
echo
|
3368
|
echo "!!! Something went wrong while building package($BUILT_PKGNAME) for ${PORTNAME}"
|
3369
|
echo " Press RETURN/ENTER to view the log from this build."
|
3370
|
read inputline
|
3371
|
more ${BUILDER_LOGS}/pfPorts/${PORTNAME}.txt
|
3372
|
fi
|
3373
|
echo "Done!"
|
3374
|
fi
|
3375
|
touch $ALREADYBUILT/$BUILT_PKGNAME
|
3376
|
}
|
3377
|
|
3378
|
staginareas_clean_each_run() {
|
3379
|
if [ -f ${PFSPKGFILE} ]; then
|
3380
|
rm -f ${PFSPKGFILE}
|
3381
|
fi
|
3382
|
echo -n ">>> Cleaning build directories: "
|
3383
|
if [ -d "${PFSENSEISODIR}" ]; then
|
3384
|
BASENAME=`basename ${PFSENSEISODIR}`
|
3385
|
echo -n "$BASENAME "
|
3386
|
chflags -R noschg ${PFSENSEISODIR} 2>&1 >/dev/null
|
3387
|
rm -rf ${PFSENSEISODIR} 2>/dev/null
|
3388
|
fi
|
3389
|
echo "Done!"
|
3390
|
}
|
3391
|
|
3392
|
# Imported from FreeSBIE
|
3393
|
buildkernel() {
|
3394
|
if [ -n "${NO_BUILDKERNEL:-}" ]; then
|
3395
|
echo ">>> NO_BUILDKERNEL set, skipping build" | tee -a ${LOGFILE}
|
3396
|
return
|
3397
|
fi
|
3398
|
|
3399
|
if [ -z "${KERNCONF:-}" ]; then
|
3400
|
echo ">>> ERROR: No kernel configuration defined probably this is not what you want! STOPPING!" | tee -a ${LOGFILE}
|
3401
|
print_error_pfS
|
3402
|
kill $$
|
3403
|
fi
|
3404
|
|
3405
|
if [ -n "${KERNELCONF:-}" ]; then
|
3406
|
export KERNCONFDIR=$(dirname ${KERNELCONF})
|
3407
|
export KERNCONF=$(basename ${KERNELCONF})
|
3408
|
fi
|
3409
|
|
3410
|
SRCCONFBASENAME=`basename ${SRC_CONF}`
|
3411
|
echo ">>> KERNCONFDIR: ${KERNCONFDIR}"
|
3412
|
echo ">>> ARCH: ${TARGET}"
|
3413
|
echo ">>> SRC_CONF: ${SRCCONFBASENAME}"
|
3414
|
|
3415
|
makeargs="${MAKEOPT:-} ${MAKEJ_KERNEL:-} SRCCONF=${SRC_CONF} TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET}"
|
3416
|
echo ">>> Builder is running the command: env $MAKE_CONF script -aq $LOGFILE make $makeargs buildkernel KERNCONF=${KERNCONF} NO_KERNELCLEAN=yo" | tee -a $LOGFILE
|
3417
|
(cd $SRCDIR; env $MAKE_CONF script -q $LOGFILE make $makeargs buildkernel KERNCONF=${KERNCONF} NO_KERNELCLEAN=yo || print_error_pfS;) | egrep '^>>>'
|
3418
|
cd $BUILDER_SCRIPTS
|
3419
|
|
3420
|
}
|
3421
|
|
3422
|
# Imported from FreeSBIE
|
3423
|
installkernel() {
|
3424
|
if [ -z "${KERNCONF:-}" ]; then
|
3425
|
echo ">>> ERROR: No kernel configuration defined probably this is not what you want! STOPPING!" | tee -a ${LOGFILE}
|
3426
|
print_error_pfS
|
3427
|
kill $$
|
3428
|
fi
|
3429
|
|
3430
|
if [ -n "${KERNELCONF:-}" ]; then
|
3431
|
export KERNCONFDIR=$(dirname ${KERNELCONF})
|
3432
|
export KERNCONF=$(basename ${KERNELCONF})
|
3433
|
fi
|
3434
|
|
3435
|
mkdir -p ${PFSENSESTAGEDIR}/boot
|
3436
|
makeargs="${MAKEOPT:-} ${MAKEJ_KERNEL:-} SRCCONF=${SRC_CONF} TARGET_ARCH=${TARGET_ARCH} TARGET=${TARGET} DESTDIR=${KERNEL_DESTDIR}"
|
3437
|
echo ">>> Builder is running the command: env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} installkernel KERNCONF=${KERNCONF}" | tee -a $LOGFILE
|
3438
|
cd ${SRCDIR}
|
3439
|
(cd $SRCDIR; env $MAKE_CONF script -aq $LOGFILE make ${makeargs:-} installkernel KERNCONF=${KERNCONF} || print_error_pfS;) | egrep '^>>>'
|
3440
|
gzip -f9 $KERNEL_DESTDIR/boot/kernel/kernel
|
3441
|
cd $BUILDER_SCRIPTS
|
3442
|
}
|
3443
|
|
3444
|
# Launch is ran first to setup a few variables that we need
|
3445
|
# Imported from FreeSBIE
|
3446
|
launch() {
|
3447
|
|
3448
|
if [ ! -f $SCRATCHDIR/pfSense_builder_set_time ]; then
|
3449
|
echo ">>> Updating system clock..."
|
3450
|
ntpdate 0.pfsense.pool.ntp.org
|
3451
|
touch $SCRATCHDIR/pfSense_builder_set_time
|
3452
|
fi
|
3453
|
|
3454
|
if [ "`id -u`" != "0" ]; then
|
3455
|
echo "Sorry, this must be done as root."
|
3456
|
kill $$
|
3457
|
fi
|
3458
|
|
3459
|
echo ">>> Operation $0 has started at `date`"
|
3460
|
}
|
3461
|
|
3462
|
finish() {
|
3463
|
echo ">>> Operation $0 has ended at `date`"
|
3464
|
killall -9 check_reload_status 2>/dev/null
|
3465
|
}
|
3466
|
|