1162485Sjulian#!/bin/sh -
2162485Sjulian# Copyright (c) 2006 Jean Milanez Melo <jmelo@freebsdbrasil.com.br>
3162485Sjulian#				       <jmelo@FreeBSD.org>
4162485Sjulian#		     Patrick Tracanelli <eksffa@freebsdbrasil.com.br>
5162485Sjulian#
6162485Sjulian# $FreeBSD$
7162485Sjulian#set -xv
8162485SjulianCURRENTDIR=/usr/src/tools/tools/tinybsd
9163253Sjulianif [ ! -d $CURRENTDIR ]
10163253Sjulianthen
11163253Sjulian  CURRENTDIR=`pwd`
12163254Sjulianelse
13163254Sjulian  cd $CURRENTDIR
14163253Sjulianfi
15176934Sremko
16162485SjulianWORKDIR=/usr/obj/tinybsdbuild
17162485SjulianKERNCONF=TINYBSD
18163806SjulianBASEFILE="tinybsd.basefiles"
19163854SjulianPORTSFILE="tinybsd.ports"
20163854SjulianPORTSDIR=/usr/ports
21162485SjulianDEFINSTARGS="-o 0 -g 0 -m 555"
22194558SremkoTINYARCH=$(uname -p)
23194558Sremko
24162485SjulianTS="=====>"
25162485Sjulian
26163017Sjuliansplitarg1 () {
27163017Sjulian   local IFS
28163017Sjulian   IFS='='
29163017Sjulian   set $1
30163017Sjulian   echo $1
31163017Sjulian}
32162485Sjulian
33163017Sjuliansplitarg2 () {
34163017Sjulian   local IFS
35163017Sjulian   IFS='='
36163017Sjulian   set $1
37163017Sjulian   echo $2
38163017Sjulian}
39162485Sjulian
40163017Sjuliangetargs () {
41163017Sjulian ARGS="$*"
42163017Sjulian for arg in $* 
43163017Sjulian do
44163017Sjulian   ARG=`splitarg1 $arg`
45163017Sjulian   VAL=`splitarg2 $arg`
46163017Sjulian   case $ARG in
47163017Sjulian     sectors)
48163017Sjulian        SECTUNIT=$VAL
49163017Sjulian        ;;
50163017Sjulian     heads)
51163017Sjulian        TRACKCYL=$VAL 
52163017Sjulian        ;;
53163017Sjulian     spt)
54163017Sjulian        SECTRACK=$VAL
55163017Sjulian        ;;
56163017Sjulian     conf)
57163017Sjulian        CONF=$VAL
58163017Sjulian        ;;
59163017Sjulian     mfsroot)
60163017Sjulian        MFSROOT=$VAL
61163017Sjulian        ;;
62163017Sjulian     image)
63163017Sjulian        IMG=$VAL
64163017Sjulian        ;;
65163017Sjulian     batch)
66163017Sjulian        NO_PROMPTS="YES"
67163017Sjulian        ;;
68163017Sjulian     new)
69163017Sjulian        NO_READ="YES"
70163017Sjulian        ;;
71163017Sjulian     *)
72163017Sjulian         usage
73163017Sjulian         ;;
74163017Sjulian    esac
75163017Sjulian done
76163017Sjulian}
77162485Sjulian
78163017Sjulianusage () {
79163017Sjulian    echo "Woops
80163017Sjulian    Usage: $0 sectors=<size of media> [80000]
81163017Sjulian              heads=<heads according to firmware>  [4]
82163017Sjulian              spt=<sectors per track according to firmware> [32]
83163017Sjulian              conf=<configuration name> (see conf/name) [default]
84163017Sjulian              mfsroot[=<yes|no>] [no]
85163017Sjulian              image=<tinybsd image name> [tinybsd.bin]
86163017Sjulian              batch[=<anything>]  (do not ask interactively)
87163017Sjulian              new[=<anything>]  (do not read previous values)
88162485Sjulian
89163017Sjulian     Examples:
90163017Sjulian    $0 sectors=65536 heads=8 spt=16 conf=wireless mfsroot=yes image=myimage.img batch
91162485Sjulian
92163017Sjulian     Default values are set in the program.
93163017Sjulian     Environment values override defaults.
94163017Sjulian     Previous values override environment values but can be disabled.
95163017Sjulian     Command arguments override previous values.
96163017Sjulian     Interactive values override command arguments but can be disabled. 
97163017Sjulian
98163017Sjulian     Run diskinfo(8) -v against your CF device to get correct information
99163017Sjulian     about your disk. USB keys do not need any specific geometry"
100163017Sjulian    exit 1
101163017Sjulian}
102163017Sjulian
103163017Sjulian########
104163017Sjulian# Load variables from stdin (could be a file)
105163017Sjulian# Look for lines that match foo=bar
106163017Sjulian# do not run the file.. that is asking for trouble
107163017Sjulian########
108163017Sjulianloadvars () {
109163017Sjulian  while :
110163017Sjulian  do
111163017Sjulian    OIFS=$IFS
112163017Sjulian    IFS="="
113163017Sjulian    if read PART1 PART2
114163017Sjulian    then
115163017Sjulian      IFS="$OIFS"
116163017Sjulian      case "$PART1" in
117163017Sjulian      \#*)
118163017Sjulian        ;;
119163017Sjulian      "")
120163017Sjulian        ;;
121163017Sjulian      *)
122163017Sjulian        set "${PART1}"
123163017Sjulian        if [ $# = "1" ]
124163017Sjulian        then
125163017Sjulian          eval "${PART1}='${PART2}'"
126163017Sjulian        fi
127163017Sjulian        ;;
128163017Sjulian      esac
129163017Sjulian    else
130163017Sjulian      IFS="$OIFS"
131163017Sjulian      return 0
132163017Sjulian    fi
133163017Sjulian  done
134163017Sjulian}
135163017Sjulian
136163017Sjulian########
137163017Sjulian# get values from the user
138163017Sjulian########
139163017Sjulianconfirm_action(){
140163017Sjulian    local ANSWER
141163017Sjulian    local MESSAGE
142163017Sjulian    ANSWER=$1
143163017Sjulian    MESSAGE=$2
144163017Sjulian    if [ "$NO_PROMPTS" != "YES" ]
145163017Sjulian    then
146163253Sjulian        echo -n "$MESSAGE [$ANSWER] " > /dev/tty
147163017Sjulian        read result
148163017Sjulian        [ "$result" != "" ] && ANSWER=$result
149163017Sjulian    fi
150163017Sjulian
151163017Sjulian    ANSWER=`eval "echo $ANSWER"`
152163017Sjulian    echo $ANSWER
153163017Sjulian}
154163017Sjulian
155163017Sjulian########
156163017Sjulian# These are only used the VERY first time you run the program (on this machine)
157163017Sjulian########
158163017Sjuliansetdefaults () {
159163017Sjulian  NO_PROMPTS=${NO_PROMPTS:-NO}
160163017Sjulian  NO_READ=${NO_READ:-NO}
161163017Sjulian  SECTUNIT=${SECTUNIT:-80000}; export SECTUNIT
162163017Sjulian  TRACKCYL=${TRACKCYL:-4}; export TRACKCYL
163163017Sjulian  SECTRACK=${SECTRACK:-32}; export SECTRACK
164163017Sjulian  CONF=${CONF:-default}; export CONF
165163017Sjulian  MFSROOT=${MFSROOT:-NO}; export MFSROOT
166163017Sjulian  IMG=${IMG:-tinybsd.bin}; export IMG
167163017Sjulian
168163017Sjulian}
169163017Sjulian
170163017Sjulian#######
171163017Sjulian# get ourselves set up.
172163017Sjulian# Partly by reading config files and partly from asking questions.
173163017Sjulian#######
174163017Sjulianloadconfig () {
175163017Sjulian  if [ "${NO_READ}" = "YES" ]
176163017Sjulian  then
177163017Sjulian    return
178163017Sjulian  fi
179163017Sjulian
180163017Sjulian  HOSTNAME=`hostname`
181163017Sjulian  HOSTPART=${HOSTNAME%%.*}
182163017Sjulian  FILENAME=".tinybsd.${HOSTPART}.${USER}"
183163017Sjulian  FULLFILENAME=$HOME/$FILENAME
184163017Sjulian
185163017Sjulian  if [ -f ${FULLFILENAME} ]
186163017Sjulian  then
187163017Sjulian    loadvars <${FULLFILENAME}
188163017Sjulian  fi
189163017Sjulian
190163017Sjulian  SECTUNIT=`confirm_action "$SECTUNIT" "512 byte sectors per unit?"`
191163017Sjulian  TRACKCYL=`confirm_action "$TRACKCYL" "Tracks per cylinder?"`
192163017Sjulian  SECTRACK=`confirm_action "$SECTRACK" "Sectors per track?"`
193163253Sjulian  while :
194163253Sjulian  do
195163253Sjulian    echo "The following configurations exist:"
196163253Sjulian    ls -l conf|awk '/^d/{print "    ",$9}'|grep -v CVS
197163253Sjulian    CONF=`confirm_action "$CONF" "Configuration name?"`
198163253Sjulian    if [ ! -d "${CURRENTDIR}/conf/$CONF" ]
199163253Sjulian    then
200163253Sjulian      echo "${TS} Error: Could not find config (${CONF})"
201163253Sjulian      if [ "$NO_PROMPTS" = "YES" ]
202163253Sjulian      then
203163253Sjulian        exit 1
204163253Sjulian      fi
205163253Sjulian    else
206163253Sjulian      break
207163253Sjulian    fi
208163253Sjulian  done
209163253Sjulian  MFSROOT=`confirm_action "$MFSROOT" "Use an MFSROOT? (YES/NO)"`
210163017Sjulian  IMG=`confirm_action "$IMG" "Image file to generate?"`
211163017Sjulian
212163017Sjulian# example of formatted value (NNN in this case)
213163017Sjulian#  #condition and format the number
214163017Sjulian#  if [ -z "${BUILDNUM}" ]
215163017Sjulian#  then
216163017Sjulian#    echo "Starting with build 001"
217163017Sjulian#    BUILDNUM="001"
218163017Sjulian#  else
219163017Sjulian#    BUILDNUM=`printf "%03d\n" $(($BUILDNUM))`
220163017Sjulian#  fi
221163017Sjulian
222163017Sjulian
223163017Sjulian}
224163017Sjulian
225163017Sjuliansaveconfig () {
226163017Sjulian  HOSTNAME=`hostname`
227163017Sjulian  HOSTPART=${HOSTNAME%%.*}
228163017Sjulian  FILENAME=".tinybsd.${HOSTPART}.${USER}"
229163017Sjulian  FULLFILENAME=$HOME/$FILENAME
230163017Sjulian  (
231163017Sjulian    echo "# written by tinybsd" `date` 
232163017Sjulian    echo "SECTUNIT=${SECTUNIT}"
233163017Sjulian    echo "TRACKCYL=${TRACKCYL}"
234163017Sjulian    echo "SECTRACK=${SECTRACK}"
235163017Sjulian    echo "CONF=${CONF}"
236163017Sjulian    echo "MFSROOT=${MFSROOT:-NO}"
237163017Sjulian    echo "IMG=${IMG}"
238163017Sjulian  ) >${FULLFILENAME}
239163017Sjulian}
240163017Sjulian
241162485Sjuliancheck_alt_imgname() {
242163017Sjulian	if [ ${IMG} = 'tinybsd.bin' ]
243162485Sjulian	then
244162485Sjulian		echo "${TS} Alternative image name not set; defaulting to 'tinybsd.bin'"
245162485Sjulian	fi
246162485Sjulian}
247162485Sjulian
248163806Sjulianrotate_buidlog() {
249163806Sjulian	mv -f ${HOME}/tinybsd.log ${HOME}/tinybsd.log.old
250163806Sjulian}
251163806Sjulian
252162485Sjulianremove_workdir() {
253177453Sremko	# Before removing check if there is not a mount under $WORKDIR anymore
254177453Sremko	MOUNT_CHECK=`mount|egrep "on ${WORKDIR}"`
255177453Sremko
256177453Sremko	if [ ! -z "${MOUNT_CHECK}" ]; then
257177453Sremko		echo "There are mounts under the workdir (${WORKDIR}). Please umount them before running this script"
258177453Sremko		exit 1
259177453Sremko	else
260177453Sremko		chflags -R noschg ${WORKDIR}
261177453Sremko		echo "${TS} Removing "${WORKDIR}
262177453Sremko		rm -rf ${WORKDIR}
263177453Sremko		echo "${TS} Removing Build Kernel Directory"
264177453Sremko		rm -rf /usr/obj/usr/src/sys/${KERNCONF}
265177453Sremko		echo "${TS}  done."
266177453Sremko	fi
267162485Sjulian}
268162485Sjulian
269162485Sjulian
270162485Sjulianprework() {
271163806Sjulian	remove_workdir
272162485Sjulian	mkdir -p ${WORKDIR}
273162485Sjulian}
274162485Sjulian
275162485Sjulian
276162485Sjuliancreate_tree() {
277162485Sjulian	echo "${TS} Creating directory hierarchy... "
278162485Sjulian	mtree -deU -f /etc/mtree/BSD.root.dist -p ${WORKDIR}
279171923Sremko	mtree -deU -f /etc/mtree/BIND.chroot.dist -p ${WORKDIR}
280162485Sjulian	mtree -deU -f /etc/mtree/BSD.usr.dist -p ${WORKDIR}/usr
281163806Sjulian	mtree -deU -f /etc/mtree/BSD.local.dist -p ${WORKDIR}/usr/local
282162485Sjulian	mtree -deU -f /etc/mtree/BSD.var.dist -p ${WORKDIR}/var
283162485Sjulian}
284162485Sjulian
285163806Sjuliancopy_binaries() {
286163806Sjulian	cd ${CURRENTDIR}/conf/${CONF}
287162485Sjulian
288176934Sremko	for file in `cat ${CURRENTDIR}/conf/${CONF}/${BASEFILE} | grep -v "#" | \
289162485Sjulian		cut -f1 -d":" | sort | uniq` ; do
290162485Sjulian		echo "${TS} Copying "/${file}" to "${WORKDIR}/${file} 
291162485Sjulian		cp -fp /${file} ${WORKDIR}/${file} ;
292162485Sjulian	done
293162485Sjulian}
294162485Sjulian
295163854Sjulianinstall_ports() {
296176934Sremko	for portname in `cat ${CURRENTDIR}/conf/${CONF}/${PORTSFILE} | grep -v '#'` ; do
297176934Sremko		if [ ! -d "${WORKDIR}/usr/ports" ]; then
298176934Sremko			mkdir -p "${WORKDIR}/usr/ports"
299176934Sremko		fi
300163854Sjulian
301176934Sremko		PNAME=`/usr/bin/basename "${portname}"`
302176934Sremko		PORT_OPTION_FILE="/var/db/ports/${PNAME}/options"
303176934Sremko
304176934Sremko		if [ -f "${PORT_OPTION_FILE}" ]; then
305176934Sremko			mkdir -p "${WORKDIR}/var/db/ports/${PNAME}"
306176934Sremko			cp "${PORT_OPTION_FILE}" "${WORKDIR}/var/db/ports/${PNAME}/"
307176934Sremko		fi
308176934Sremko
309176934Sremko		mount_nullfs /lib "${WORKDIR}/lib"
310176934Sremko		mount_nullfs /usr/bin "${WORKDIR}/usr/bin"
311176934Sremko		mount_nullfs /usr/sbin "${WORKDIR}/usr/sbin"
312176934Sremko		mount_nullfs /usr/ports "${WORKDIR}/usr/ports"
313176934Sremko		mount_nullfs /usr/share "${WORKDIR}/usr/share"
314176934Sremko		mount_nullfs /usr/libexec "${WORKDIR}/usr/libexec"
315176934Sremko		mount_nullfs /usr/lib "${WORKDIR}/usr/lib"
316176934Sremko		mount_nullfs /usr/include "${WORKDIR}/usr/include"
317176934Sremko
318176934Sremko		cd ${PORTSDIR}/${portname}
319176934Sremko		make fetch-recursive
320176934Sremko		make DESTDIR_ENV_LIST=PATH DESTDIR="${WORKDIR}" install
321176934Sremko		make clean
322176934Sremko
323176934Sremko		umount "${WORKDIR}/lib"
324176934Sremko		umount "${WORKDIR}/usr/ports"
325176934Sremko		umount "${WORKDIR}/usr/bin"
326176934Sremko		umount "${WORKDIR}/usr/sbin"
327176934Sremko		umount "${WORKDIR}/usr/share"
328176934Sremko		umount "${WORKDIR}/usr/libexec"
329176934Sremko		umount "${WORKDIR}/usr/lib"
330176934Sremko		umount "${WORKDIR}/usr/include"
331163854Sjulian	done
332163854Sjulian}
333163854Sjulian
334162485Sjulianmake_kernel() {
335162485Sjulian	echo "${TS} Building customized tiny beastie kernel... "
336194558Sremko	cp -p ${CURRENTDIR}/conf/${CONF}/${KERNCONF} /usr/src/sys/${TINYARCH}/conf
337162485Sjulian	cd /usr/src
338162485Sjulian	make buildkernel KERNCONF=${KERNCONF} || exit 1
339162485Sjulian	gzip -9 /usr/obj/usr/src/sys/${KERNCONF}/kernel
340162485Sjulian	install ${DEFINSTARGS} /usr/obj/usr/src/sys/${KERNCONF}/kernel.gz ${WORKDIR}/boot/kernel/
341162485Sjulian	install ${DEFINSTARGS} \
342162485Sjulian	  /usr/obj/usr/src/sys/${KERNCONF}/modules/usr/src/sys/modules/acpi/acpi/acpi.ko \
343162485Sjulian	    ${WORKDIR}/boot/kernel
344194558Sremko	install -o 0 -g 0 -m 444 /sys/${TINYARCH}/conf/GENERIC.hints ${WORKDIR}/boot/device.hints
345162485Sjulian}
346162485Sjulian
347162485Sjuliancopy_libraries() {
348162485Sjulian	TDEPFILE="`mktemp -t deps`"
349162485Sjulian	TDEPFILES="`mktemp -t depsymlnk`"
350162485Sjulian
351176934Sremko	find "${WORKDIR}" -type f |while read file; do
352176934Sremko		ldd -f "%p\n" ${file} >> ${TDEPFILE} ; # don't worry on progs been "not dynamic"
353162485Sjulian	done
354162485Sjulian
355162485Sjulian	for libdeplib in `cat ${TDEPFILE} | sort | uniq`; do
356162485Sjulian		ldd -f "%p\n" /${libdeplib} >> ${TDEPFILE} ;
357162485Sjulian	done
358163854Sjulian
359162485Sjulian	for pamdep in `ls -1 /usr/lib/pam*`; do
360162485Sjulian		echo $pamdep >> ${TDEPFILE} ;
361162485Sjulian		ldd -f "%p\n" /${pamdep} >> ${TDEPFILE} ;
362162485Sjulian	done	
363163806Sjulian
364162485Sjulian	for lib in `cat ${TDEPFILE} | sort | uniq`; do
365162485Sjulian		echo "${TS} Copying "${lib}" to "${WORKDIR}${lib}
366162485Sjulian		cp -fp ${lib} ${WORKDIR}${lib} ;
367162485Sjulian	done
368162485Sjulian
369162485Sjulian	for depsymlink in `cat ${TDEPFILE}`; do
370162485Sjulian		echo "${TS} Checking if ${depsymlink} is a symbolic link"
371162485Sjulian		/bin/ls -l $depsymlink | grep "\->" | awk '{print $11":"$9}' >> ${TDEPFILES}
372162485Sjulian	done
373162485Sjulian
374162485Sjulian	for i in `cat ${TDEPFILES}`; do
375162485Sjulian                SOURCE_FILE=`echo $i | awk -F ":" '{print $1}'`
376162485Sjulian                TARGET_FILE=`echo $i | awk -F ":" '{print $2}'`
377162485Sjulian
378162485Sjulian		echo "${TS} Unlinking ${WORKDIR}${TARGET_FILE}"
379163806Sjulian		chroot ${WORKDIR} /bin/chflags 0 ${TARGET_FILE}
380162485Sjulian                chroot ${WORKDIR} /bin/rm -f ${TARGET_FILE}
381162485Sjulian
382162485Sjulian		echo "${TS} Symlinking ${SOURCE_FILE} to ${TARGET_FILE}"
383162485Sjulian                chroot ${WORKDIR} /bin/ln -s ${SOURCE_FILE} ${TARGET_FILE}
384162485Sjulian        done
385162485Sjulian
386162485Sjulian	echo -n "${TS} Unlinking "
387162485Sjulian	rm -fv ${TDEPFILE} ${TDEPFILES}
388162485Sjulian}
389162485Sjulian
390162485Sjuliancreate_etc() {
391162485Sjulian	cd /usr/src/etc/sendmail/
392162485Sjulian	make freebsd.cf freebsd.submit.cf
393162485Sjulian
394162485Sjulian	cd /usr/src/etc/
395162485Sjulian	mkdir -p ${WORKDIR}/var/named/etc/namedb
396199812Sjulian	make distribution DESTDIR=${WORKDIR} || exit 1
397162485Sjulian}
398162485Sjulian
399163017Sjuliancreate_ssh_keys() {
400163017Sjulian	echo "Creating ssh keys..."
401163017Sjulian	ssh-keygen -t rsa1 -b 1024  -f ${WORKDIR}/etc/ssh/ssh_host_key -N ''
402163017Sjulian	ssh-keygen -t dsa -f ${WORKDIR}/etc/ssh/ssh_host_dsa_key -N ''
403163017Sjulian	ssh-keygen -t rsa -f ${WORKDIR}/etc/ssh/ssh_host_rsa_key -N ''
404163017Sjulian}
405163017Sjulian
406163806Sjulianpersonal_conf() {
407162485Sjulian	echo "${TS} Copying your custom configuration on conf/ ..."
408163806Sjulian	for custom in `find ${CURRENTDIR}/conf/${CONF}/ -type d -depth 1 \! -name CVS`; do
409162485Sjulian		cp -Rp ${custom}/* ${WORKDIR}/${custom#${CURRENTDIR}/conf/${CONF}/}/
410162485Sjulian	done
411163806Sjulian
412163806Sjulian	if [ -f ${CURRENTDIR}/conf/${CONF}/boot.config ]; then
413163806Sjulian		cp ${CURRENTDIR}/conf/${CONF}/boot.config ${WORKDIR}/boot.config
414163806Sjulian	fi
415162485Sjulian}
416162485Sjulian
417162485Sjuliansymlinks() {
418163854Sjulian#set -xv
419176934Sremko	for i in `cat ${CURRENTDIR}/conf/${CONF}/${BASEFILE}| grep -v "#" | grep ":"`; do
420162485Sjulian		SOURCE_FILE=`echo $i | awk -F ":" {'print $1'}`
421162485Sjulian		TARGET_FILE=`echo $i | awk -F ":" {'print $2'}`
422162485Sjulian		chroot ${WORKDIR} /bin/ln -vs /${SOURCE_FILE} ${TARGET_FILE}
423162485Sjulian	done
424163854Sjulian#set +xv
425162485Sjulian}
426162485Sjulian
427162485Sjulian
428162485Sjuliancreate_image() {
429162485Sjulian	VNODEFILE=`mktemp -t tinybsd`
430162485Sjulian	IMGMNT=`mktemp -d -t tinybsd`
431162485Sjulian
432162485Sjulian	dd if=/dev/zero of=${VNODEFILE} count=${SECTUNIT}
433162485Sjulian
434162485Sjulian	MD=`mdconfig -a -t vnode -f ${VNODEFILE} -x ${SECTRACK} -y ${TRACKCYL}`
435162485Sjulian
436162485Sjulian	diskinfo -v /dev/${MD}
437162485Sjulian
438162485Sjulian	fdisk -I /dev/${MD}
439162485Sjulian	fdisk /dev/${MD}
440162485Sjulian
441162485Sjulian	cp -p /boot/boot0 ${WORKDIR}/boot/boot0
442162485Sjulian	bsdlabel -w -B /dev/${MD}
443162485Sjulian	newfs -O2 -U /dev/${MD}a
444162485Sjulian
445162485Sjulian	mount /dev/${MD}a ${IMGMNT}
446162485Sjulian
447163017Sjulian	if [ ${MFSROOT} = 'yes' ]
448163017Sjulian	then
449163017Sjulian		echo "${TS} Creating MFS root..."
450163017Sjulian		# Update is not done yet
451163017Sjulian		#mkdir -p ${WORKDIR}/usr/local/bin/
452163017Sjulian		#cp -p ${CURRENTDIR}/update/update ${WORKDIR}/usr/local/bin/
453163017Sjulian		rm ${WORKDIR}/etc/fstab
454163017Sjulian		cd ${WORKDIR} && find . -print | sed '/kernel/ d' | cpio -dump ${IMGMNT} || true
455163017Sjulian		umount ${IMGMNT}
456163017Sjulian		dd if=/dev/${MD} of=${CURRENTDIR}/mfsroot.img		
457163017Sjulian		gzip -9 < ${CURRENTDIR}/mfsroot.img > ${CURRENTDIR}/mfsroot.gz
458163017Sjulian		rm ${CURRENTDIR}/mfsroot.img
459163017Sjulian		mount /dev/${MD}a ${IMGMNT}
460163017Sjulian		rm -rf ${IMGMNT}/*
461163017Sjulian		cp -rp ${WORKDIR}/boot ${IMGMNT}
462163017Sjulian		rm ${IMGMNT}/boot/device.hints
463163017Sjulian		( \
464163017Sjulian		echo 'set vfs.root.mountfrom="ufs:/dev/md0a"' ; \
465163017Sjulian		echo 'set bootfile="/boot/kernel/kernel"' ; \
466163017Sjulian		sed -e  '/^#/ d' -e 's/^/set /' < ${WORKDIR}/boot/device.hints ; \
467163017Sjulian		echo 'load /boot/kernel/kernel' ; \
468163017Sjulian		echo 'echo Loading mfsroot' ; \
469163017Sjulian		echo 'load -t mfs_root /mfsroot' ;\
470163017Sjulian		echo 'boot' ; \
471163017Sjulian		) > ${IMGMNT}/boot/loader.rc
472163017Sjulian		mv ${CURRENTDIR}/mfsroot.gz ${IMGMNT}
473163017Sjulian	else
474163017Sjulian		( cd ${WORKDIR} && find . -print | cpio -dump ${IMGMNT} ) || true
475163017Sjulian	fi
476162485Sjulian
477162485Sjulian	df ${IMGMNT}
478163017Sjulian	sleep 1
479162485Sjulian	umount ${IMGMNT}
480162485Sjulian
481162485Sjulian	dd if=/dev/${MD} of=${CURRENTDIR}/${IMG} bs=64k
482162485Sjulian
483162485Sjulian	rm -vf ${VNODEFILE}
484162485Sjulian	rm -rvf ${IMGMNT}
485162485Sjulian	mdconfig -d -u ${MD}
486163017Sjulian	echo ""
487163017Sjulian	echo "${TS} Done!"
488163017Sjulian	echo "${TS} Your configuration options were saved in ${FULLFILENAME}"
489163017Sjulian	echo "${TS} You can see your build log in ${HOME}/tinybsd.log"
490163017Sjulian	echo "${TS} Your final image is in ${CURRENTDIR}/${IMG}"
491163017Sjulian	echo "${TS} Now use dd(1) to write it."
492162485Sjulian}
493162485Sjulian
494162485Sjulian##########################
495162485Sjulian# run things
496163017Sjulian
497163017Sjulian##########################################
498163017Sjulian## The actual program
499163017Sjulian##########################################
500163017Sjuliangetargs $*
501163017Sjuliansetdefaults
502163017Sjulian# Load as many of the configuration options as we can
503163017Sjulianloadconfig
504163017Sjuliansaveconfig
505163017Sjulian
506163806Sjulian# Rotate build log
507163806Sjulianrotate_buidlog
508163806Sjulian
509163017Sjulian# Now start logging.
510163017Sjulian(
511163017Sjulian  # Do the build
512163017Sjulian  prework
513163017Sjulian  check_alt_imgname
514163017Sjulian  create_tree
515163017Sjulian  copy_binaries
516176934Sremko  create_etc
517163854Sjulian  install_ports
518163017Sjulian  make_kernel
519163017Sjulian  copy_libraries
520163017Sjulian  symlinks
521163017Sjulian  create_ssh_keys
522163806Sjulian  personal_conf
523163017Sjulian  create_image
524162485Sjulian#set +xv
525163017Sjulian) 2>&1 |tee -a  ${HOME}/tinybsd.log
526162485Sjulian
527