Index: stable/4/release/picobsd/build/build =================================================================== --- stable/4/release/picobsd/build/build (revision 71691) +++ stable/4/release/picobsd/build/build (revision 71692) @@ -1,387 +1,387 @@ #!/bin/sh - # # $FreeBSD$ # # You can set the SRC variable which points to your source tree. It's # /usr/src by default (most people shouldn't change it). SRC=/usr/src OBJ=/usr/obj-pico # --------- YOU SHOULD NOT NEED TO CHANGE ANYTHING BELOW ----------- # The "build" script will ask you for parameters. Just run it... :-) # --------- YOU SHOULD NOT NEED TO CHANGE ANYTHING BELOW ----------- # EDITOR is the editor you use EDITOR=${EDITOR:-vi} # LANGUAGE language to be used (en or pl) LANGUAGE=en # SITE site-specific files SITE= # FLOPPY_SIZE floppy size in KB (default to 1440) FLOPPY_SIZE=1440 # 1440 1480 1720 (the latter will not boot!) # DEVFS is currently broken. Always set this. # NO_DEVFS=yes # RISU is where dialog replies go. RISU=.build.reply # abort in case of error... set -e . ../Version # support symbolically linked custom directory BUILDDIR=`pwd` export BUILDDIR # assign default values to variables. set_defaults() { TYPE=${TYPE:-dial} # PicoBSD type (isp, router, net, custom, ... # build image list cat /dev/null > .image.list for i in ../* ; do if [ -d $i -a -f $i/PICOBSD ] ; then a=`awk '/^#PicoBSD/ {print $2, $3, $4, $5, $6}' < $i/PICOBSD` if [ "$a" != "" ]; then echo "`basename $i` $a" >>.image.list fi fi done while read name sz init mfs_in floppy_in ; do if [ "$name" != "#" -a $name != "" ] ; then eval ${name}_DFLT_SIZE=$sz eval ${name}_INIT=$init eval ${name}_MFS_INODES=$mfs_in eval ${name}_FLOPPY_INODES=$floppy_in fi done < .image.list } set_msgs() { MSG1="Type: ${TYPE}" if [ "X${TYPE}" = "Xcustom" ] ; then MSG1="${MSG1} (from ${CUST_DIR})" fi MSG="PicoBSD build -- Current parameters:\n\n\t1. ${MSG1}\n\ \t2. MFS size: ${MFS_SIZE} kB\n\t3. Language: ${LANGUAGE}\n\ \t4. Site-info: ${SITE}\n" } # Main build procedure. It calls another script (stage1) main() { if [ "X${TYPE}" = "X" ] ; then echo "^G^G^G-> wrong floppy type" exit 10 fi export suffix clear set_msgs printf "${MSG}" echo "-> We'll use the sources living in ${SRC}" echo "" echo "-> I hope you have checked the ../${TYPE}/PICOBSD config file..." echo "" echo "" sleep 2 export MFS_SIZE LANGUAGE TYPE SRC OBJ NO_DEVFS INIT export SITE MFS_INODES FLOPPY_INODES FLOPPY_SIZE ./stage1 if [ "X$?" != "X0" ] ; then echo "" echo "-> ERROR in \"${i}\" script. Aborting the build process." echo -n "-> Cleaning temporary files... " umount -f ${MFS_MOUNTPOINT} rm -rf ${MFS_MOUNTPOINT} vnconfig -u /dev/rvn${VNUM} ./clean ${TYPE} echo "Done." exit 10 fi echo "==================== ${i} completed =====================" } # check for existing custom config directory and ask user if they want to use it # # Note that specifying an alternate directory is broken due to relative # path assumptions during the kernel compilation phase of the build. # For now just dialog-ify. check_for_old_custom() { KEEP_CUSTOM=no if [ ! -d ../custom ] ; then return fi CUSTOMLINK=`ls -l ../custom | awk -F\> '{ print $2 }' | awk '{ print $1 }'` if dialog --title "Custom directory setup" --yesno "A custom configuration\n ${CUSTOMLINK}\nalready exists. Would you like to use it?" 7 50 ; then KEEP_CUSTOM=yes CUST_DIR=${CUSTOMLINK} else KEEP_CUSTOM=no fi # If custom is just a simple directory, assume the user wants it } # Ask for, and set the custom config directory set_custom() { dialog --title "Custom directory setup" --inputbox \ "Please enter the full path to the directory containing your \ custom setup. \ This directory tree must be laid out exactly like the standard \ ones. (E.g. you can type in /home/abial/work/custom, which \ should contain crunch1/, floppy.tree/, lang/ )." \ 10 70 2> ${RISU} CUST_DIR=`cat ${RISU}` } # Set type of floppy interactively. Also set the various defaults # associated to each type. We can override them manually afterwards. set_type() { eval MFS_SIZE=$"${TYPE}_DFLT_SIZE" eval INIT=$"${TYPE}_INIT" eval MFS_INODES=$"${TYPE}_MFS_INODES" eval FLOPPY_INODES=$"${TYPE}_FLOPPY_INODES" suffix="-${TYPE}" if [ "${MFS_SIZE}" = "" ] ; then echo "TYPE $TYPE not found!" sleep 2 TYPE="" fi case ${TYPE} in custom) check_for_old_custom if [ "X${KEEP_CUSTOM}" != "Xyes" ] ; then [ -r ../custom ] && rm -f ../custom set_custom (cd ..; ln -sf ${CUST_DIR} custom) fi ;; esac } build_package() { touch build.status echo "##############################################" >>build.status echo "## `date` ">>build.status echo "##############################################" >>build.status ./clean dial for y in en pl ; do for z in dial router net isp ; do TYPE=${z} LANGUAGE=${y} set_type echo "---------------------------------------------">>build.status echo "Building TYPE=${z}, LANGUAGE=${y}, SIZE=${MFS_SIZE}" >>build.status main if [ "X$?" != "X0" ] ; then echo " ** FAILED! **">>build.status else echo " (ok)">>build.status fi mv picobsd.bin pb_${y}${suffix}.bin echo "Calling ./clean for ${TYPE}, ${LANGUAGE}, ${MFS_SIZE}">>build.status ./clean ${TYPE} done done exit 0 } # Set build parameters interactively main_dialog() { while [ true ] ; do set_msgs dialog --menu "PicoBSD build menu -- ver ${VER} (22aug1999)" 19 70 12 \ N "No change, build it" \ T "${MSG1}" \ K "edit Kernel config file for ${TYPE}" \ E "Edit crunch.conf file for ${TYPE}" \ S "MFS Size: ${MFS_SIZE}kB" \ L "Language: ${LANGUAGE}" \ I "Init type: ${INIT}" \ F "Floppy size: ${FLOPPY_SIZE}kB" \ M "MFS bytes per inode: ${MFS_INODES}" \ U "UFS bytes per inode: ${FLOPPY_INODES}" \ $ "Site-info: ${SITE}" \ Q "Quit" \ 2> ${RISU} ans=`cat ${RISU}` rm ${RISU} case ${ans} in T) dialog --menu "Setup the type of configuration" 12 70 5 \ `awk '{ print $1, $1 }' < .image.list` \ 2> ${RISU} || rm ${RISU} if [ -f ${RISU} ] ; then TYPE=`cat ${RISU}` set_type fi ;; I) dialog --menu "Choose your init(8) program" \ 10 70 2 init "Standard init (requires getty)" \ oinit "small init from TinyWare" 2> ${RISU} || rm ${RISU} if [ -f ${RISU} ] ; then INIT=`cat ${RISU}` fi ;; K) ${EDITOR} ../${TYPE}/PICOBSD ;; E) ${EDITOR} ../${TYPE}/crunch1/crunch.conf ;; S) dialog --title "MFS Size setup" --inputbox \ "MFS size depends on what you need to put on the MFS image. Typically \ ranges between 820kB (for very small bridge/router images) to \ as much as 2500kB kB for a densely packed image. \ Keep in mind that this memory is \ totally lost to other programs. Usually you want to keep \ this as small as possible. " 10 70 2> ${RISU} || rm ${RISU} if [ -f ${RISU} ] ; then MFS_SIZE=`cat ${RISU}` if [ "${MFS_SIZE}" = "" ] ; then eval MFS_SIZE=$"${TYPE}_DFLT_SIZE" fi fi ;; L) dialog --menu "Please choose language" \ 10 40 2 en English pl Polish 2> ${RISU} || rm ${RISU} if [ -f ${RISU} ] ; then LANGUAGE=`cat ${RISU}` fi ;; \$) dialog --title "Site info setup" --inputbox \ "Please enter the full path to the directory \ containing site-specific setup. \ This directory tree must contain files that replace \ standard ones in floppy.tree/ and mfs.tree/ . " \ 10 70 2> ${RISU} || rm ${RISU} if [ -f ${RISU} ] ; then SITE=`cat ${RISU}` fi ;; F) dialog --menu "Set floppy size" 15 70 4 \ 1440 "1.44MB" 1720 "1.72MB" \ 2880 "2.88MB" 4096 "4MB" 2> ${RISU} || rm ${RISU} if [ -f ${RISU} ] ; then FLOPPY_SIZE=`cat ${RISU}` fi ;; M) dialog --title "MFS bytes per inode:" --inputbox \ "Enter MFS bytes per inode (typically 4096..65536). \ A larger value means fewer inodes but more space on MFS" \ 10 70 2> ${RISU} || rm ${RISU} if [ -f ${RISU} ] ; then MFS_INODES=`cat ${RISU}` if [ "${MFS_INODES}" = "" ] ; then eval MFS_INODES=$"${TYPE}_DFLT_MFS_INODES" fi fi ;; U) dialog --title "Floppy bytes per inode:" --inputbox \ "Enter floppy bytes per inode (typically 3072..65536). \ A larger value means fewer inodes but more space on the floppy." \ 10 70 2> ${RISU} || rm ${RISU} if [ -f ${RISU} ] ; then FLOPPY_INODES=`cat ${RISU}` if [ "${FLOPPY_INODES}" = "" ] ; then eval FLOPPY_INODES=$"${TYPE}_DFLT_FLOPPY_INODES" fi fi ;; N) break 2 ;; Q) exit 0 ;; *) echo "Unknown option \"${ans}\". Try again." sleep 2 clear ;; esac done } # Call the build procedure # Install image do_install() { dialog --title "Build ${TYPE} completed" --inputbox \ "\nThe build process was completed successfuly.\n\ -`cat .build.reply` \ +`cat .build.reply` \n\n\ Now we are going to install the image on the floppy.\n\ Please insert a blank floppy in /dev/fd0.\\n WARNING: the contents of the floppy will be permanently erased!\n\ \n\ Your options:\n\ * ^C or [Cancel] to abort,\n\ * Enter to install \"picobsd.bin\",\n\ * name of other file to install.\n\ " 20 80 2> ${RISU} if [ "$?" = "0" ]; then FILENAME=`cat ${RISU}` if [ "${FILENAME}" = "" ] ; then FILENAME=picobsd.bin fi echo "Writing ${FILENAME}..." dd if=${FILENAME} of=/dev/rfd0.${FLOPPY_SIZE} else echo "Ok, the image is in picobsd.bin" fi echo "Done." } #------------------------------------------------------------------- # Main entry of the script interactive="YES" if [ "$1" = "-n" ] ; then interactive="NO" shift fi TYPE=$1 SITE=$2 set_defaults set_type # If $1="package", it creates a neat set of floppies if [ "$1" = "package" ] ; then build_package fi if [ "$interactive" = "YES" ] ; then main_dialog fi main # build ${TYPE} do_install exit 0 Index: stable/4/release/picobsd/build/stage1 =================================================================== --- stable/4/release/picobsd/build/stage1 (revision 71691) +++ stable/4/release/picobsd/build/stage1 (revision 71692) @@ -1,289 +1,289 @@ #! /bin/sh - # $FreeBSD$ # # stage1 -- this script prepares the actual picobsd image . ../Version set -e # abort in case of untested errors # By default, /tmp should exist. # MFS_NAME=fs.PICOBSD MFS_MOUNTPOINT=`mktemp -d "/tmp/picobsd.XXXXXXXXXX"` export MFS_MOUNTPOINT PICO_OBJ=${OBJ}/picobsd/${TYPE} export PICO_OBJ # Location of the boot blocks (in case you want them custom-built) boot1=/boot/boot1 boot2=/boot/boot2 rm -f kernel.gz ${MFS_NAME} # cleanup... # find a suitable vnode VNUM=`mount | awk "/vn/ { num++ } END { printf \"%d\", num }"` export VNUM echo "-> Using vn${VNUM}..." trap fail 2 # catch user interrupt # free as much as possible from the vnode free_vnode() { umount ${MFS_MOUNTPOINT} 2> /dev/null || true umount /dev/vn${VNUM} 2> /dev/null || true vnconfig -u /dev/rvn${VNUM} 2> /dev/null || true } # fail errno errcode # This function is used to trap errors and print msgs # fail() { errno=$1 errcode=$2 echo "--> Error $errno code $errcode" case $errcode in no_vnconfig) echo "Error while doing vnconfig of ${MFS_NAME} on /dev/rvn${VNUM}..." echo " Most probably your running kernel doesn't have the vn(4) device." ;; disklabel) echo "Error while labeling ${MFS_NAME} size ${MFS_SIZE}" ;; no_mount) echo "Error while mounting ${MFS_NAME} (/dev/vn${VNUM}c) on ${MFS_MOUNTPOINT}" ;; mtree) echo "Error while making hierarchy in ${MFS_MOUNTPOINT}" ;; makedevs) echo "Error while making devices in ${MFS_MOUNTPOINT}" ;; crunch) echo "Error while building ../${TYPE}/crunch1..." ;; vnconfig2) echo "Error while doing vnconfig of floppy.img on /dev/rvn${VNUM}..." ;; disklabel) echo "Error while doing disklabel on of floppy.img size $FLOPPY_SIZE" ;; kernel_compress) echo "Error while copying compressed kernel to disk" ;; mfs_compress) echo "Error while copying compressed mfs image to disk" ;; missing_kernel) echo "-> ERROR: you must build PICOBSD${suffix} kernel first" ;; *) echo "unknown error, maybe user break: $errno $errcode" ;; esac echo "-> Aborting $0" # try to cleanup the vnode. free_vnode rm -rf ${MFS_MOUNTPOINT} 2> /dev/null || true exit 10 } create_mfs() { echo "-> Preparing MFS filesystem..." free_vnode # zero-fill the MFS image dd of=${MFS_NAME} if=/dev/zero count=${MFS_SIZE} bs=1k 2> /dev/null vnconfig -s labels -c /dev/rvn${VNUM} ${MFS_NAME} 2>/dev/null || \ fail $? no_vnconfig dd if=/boot/boot1 of=${MFS_NAME} conv=notrunc 2> /dev/null # This command does weird things on 2.2.x systems. # For small image sizes, use std disktypes if [ ${MFS_SIZE} -lt 1024 ] ; then disklabel -rw /dev/rvn${VNUM} fd${MFS_SIZE} || fail $? disklabel else disklabel -rw vn${VNUM} auto || fail $? disklabel fi newfs -i ${MFS_INODES} -m 0 -p 0 -o space /dev/rvn${VNUM}c mount /dev/vn${VNUM}c ${MFS_MOUNTPOINT} || fail $? no_mount pwd=`pwd` } populate_mfs() { echo "-> Populating MFS tree..." cd ../${TYPE} make -f Makefile.mfs DESTDIR=${MFS_MOUNTPOINT} > /dev/null || \ fail $? mtree if [ X"${NO_DEVFS}" != X"" ] ; then make -f Makefile.mfs DESTDIR=${MFS_MOUNTPOINT} devnodes \ > /dev/null || fail $? makedevs fi MFS_RC=mfs_tree/etc/rc if [ ! -f ${MFS_RC} ] ; then # no private version. use generic mfs.rc MFS_RC=${BUILDDIR}/../${MFS_RC} fi if [ "${INIT}" = "oinit" ] ; then cat ${MFS_RC} | sed -e "s/@VER@/${VER}/g" > ${MFS_MOUNTPOINT}/etc/oinit.rc else cat ${MFS_RC} | sed -e "s/@VER@/${VER}/g" > ${MFS_MOUNTPOINT}/etc/rc fname=mfs_tree/etc/login.conf if [ ! -f ${fname} ] ; then fname=${BUILDDIR}/../${fname} fi cp ${fname} ${MFS_MOUNTPOINT}/etc/login.conf fi if [ "${TYPE}" = "dial" ] ; then for i in login dialup; do cp lang/${i}.${LANGUAGE} ${MFS_MOUNTPOINT}/stand/${i} done ln -s /stand/reboot ${MFS_MOUNTPOINT}/stand/shutdown (cd ../help;\ rm -rf tmp_hlp;\ mkdir tmp_hlp;\ for i in `ls *.hlp.${LANGUAGE}`; do \ cp $i tmp_hlp/`basename $i .hlp.${LANGUAGE}`;\ done;\ cd tmp_hlp;\ ar -cru help.a *;\ cp help.a ${MFS_MOUNTPOINT}/help.a) fi echo "-> Making and installing crunch1..." cd crunch1 make -f ../../build/Makefile.crunch "SRC=${SRC}" && \ make -f ../../build/Makefile.crunch install 2>&1 >/dev/null || \ fail $? crunch cd ${pwd} if [ -f ${MFS_MOUNTPOINT}/stand/sshd ] ; then echo "creating host key for sshd" ssh-keygen -f ${MFS_MOUNTPOINT}/etc/ssh_host_key -N "" -C "root@picobsd" fi cp -Rp ../mfs_tree/stand/update ${MFS_MOUNTPOINT}/stand/update (echo "-> Fixing permissions"; cd ${MFS_MOUNTPOINT}; chown -R root *) df -ik ${MFS_MOUNTPOINT} umount ${MFS_MOUNTPOINT} fsck -p /dev/rvn${VNUM}c vnconfig -u /dev/rvn${VNUM} } do_kernel() { echo "-> Preparing kernel..." (cd ../${TYPE}; make -v -f ${BUILDDIR}/Makefile.conf ) cp -p ${SRC}/sys/compile/PICOBSD${suffix}/kernel kernel || \ fail $? missing_kernel strip kernel strip --remove-section=.note --remove-section=.comment kernel } do_floppy() { # On entry we are in /usr/src/release/build. echo "==> Preparing ${FLOPPY_SIZE}kB floppy filesystem..." # correct block and number of sectors according to size. blocks=${FLOPPY_SIZE} sectors=18 if [ "${blocks}" = "1720" ]; then blocks=1722 sectors=21 elif [ "${blocks}" = "1480" ]; then blocks=1476 fi echo "${sectors} sectors per track" # create image dd of=picobsd.bin if=/dev/zero count=${blocks} bs=1k # put in boot sector so vnconfig and disklabel will not complain dd if=${boot1} of=picobsd.bin conv=notrunc 2> /dev/null vnconfig -c /dev/rvn${VNUM} picobsd.bin || fail $? vnconfig2 disklabel -Brw -b ${boot1} -s ${boot2} /dev/vn${VNUM}c \ fd${FLOPPY_SIZE} || \ fail $? disklabel newfs -i ${FLOPPY_INODES} -m 0 -p 0 -o space /dev/rvn${VNUM}c mount /dev/vn${VNUM}c ${MFS_MOUNTPOINT} # preload kernel, compress with kgzip and copy to floppy image cc -o ./wmk /usr/src/release/write_mfs_in_kernel.c ./wmk kernel ${MFS_NAME} rm wmk kgzip -o kernel.gz kernel cp -p kernel.gz ${MFS_MOUNTPOINT}/kernel echo "==> Populating floppy filesystem..." # Configuration files are first copied to a local tree, then # compressed, then transferred back to the floppy. rm -rf floppy.tree || true mkdir floppy.tree excl=${BUILDDIR}/../${TYPE}/floppy.tree.exclude if [ -f ${excl} ] ; then excl="--exclude-from ${excl}" echo "Exclude following files from ${excl}:\n===" cat ${excl} echo "===" else excl="" fi (cd ${BUILDDIR}/../floppy.tree ; tar -cf - --exclude CVS ${excl} . ) | \ (cd floppy.tree ; tar xvf - ) srcdir=${BUILDDIR}/../${TYPE}/floppy.tree if [ -d ${srcdir} ] ; then echo "-> update with private files:" (cd ${srcdir} ; tar cf - --exclude CVS . ) | \ (cd floppy.tree ; tar xvf - ) fi if [ -d ${srcdir}.${SITE} ] ; then echo "-> update with site-specific (${SITE}) files:" (cd ${srcdir}.${SITE} ; tar cf - --exclude CVS . ) | \ (cd floppy.tree ; tar xvf - ) fi files="motd" echo "-> Copying language dependent files: ${files} -> ${MFS_MOUNTPOINT}/etc ..." for i in ${files} ; do if [ -f ${BUILDDIR}/../${TYPE}/lang/${i}.${LANGUAGE} ] ; then cat ${BUILDDIR}/../${TYPE}/lang/${i}.${LANGUAGE} | \ sed -e "s/@VER@/${VER}/g" > floppy.tree/etc/${i} fi done # XXX check this! i am unsure how it is necessary. if [ "${TYPE}" = "dial" ] ; then cp -p floppy.tree/etc/master.passwd . pwd_mkdb -d . master.passwd mv spwd.db floppy.tree/etc/ rm pwd.db master.passwd fi # gzip returns an error if it fails to compress some file gzip -9 floppy.tree/etc/* || true # now transfer the floppy tree cp -Rp floppy.tree/* ${MFS_MOUNTPOINT} rm -rf floppy.tree || true # cleanup - df -ik ${MFS_MOUNTPOINT} > .build.reply + df -ik ${MFS_MOUNTPOINT} | colrm 70 > .build.reply umount ${MFS_MOUNTPOINT} rm -rf ${MFS_MOUNTPOINT} vnconfig -u /dev/rvn${VNUM} rm kernel.gz ${MFS_NAME} } do_kernel create_mfs populate_mfs do_floppy