diff options
Diffstat (limited to 'scripts/build/binary_onie')
-rwxr-xr-x | scripts/build/binary_onie | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/scripts/build/binary_onie b/scripts/build/binary_onie new file mode 100755 index 000000000..5e8148133 --- /dev/null +++ b/scripts/build/binary_onie @@ -0,0 +1,300 @@ +#!/bin/sh + +## live-build(7) - System Build Scripts +## Copyright (C) 2017 Erik Ziegenbalg <eziegenb@brocade.com> +## Copyright (C) 2018 Luca Boccassi <bluca@debian.org> +## +## This program comes with ABSOLUTELY NO WARRANTY; for details see COPYING. +## This is free software, and you are welcome to redistribute it +## under certain conditions; see COPYING for details. + + +set -e + +# Including common functions +[ -e "${LIVE_BUILD}/scripts/build.sh" ] && . "${LIVE_BUILD}/scripts/build.sh" || . /usr/lib/live/build.sh + +# Setting static variables +DESCRIPTION="$(Echo 'build ONIE binary image')" +HELP="" +USAGE="${PROGRAM} [--force]" + +Arguments "${@}" + +# Reading configuration files +Read_conffiles config/all config/common config/bootstrap config/chroot config/binary config/source +Set_defaults + +if [ "${LB_ONIE}" != "true" ] +then + exit 0 +fi + +case "${LIVE_IMAGE_TYPE}" in + iso) + IMAGE="${LIVE_IMAGE_NAME}-${LB_ARCHITECTURES}.iso" + ;; + iso-hybrid) + IMAGE="${LIVE_IMAGE_NAME}-${LB_ARCHITECTURES}.hybrid.iso" + ;; + *) + exit 0 + ;; +esac + +Echo_message "Begin building onie binary..." + +# Requiring stage file +Require_stagefile .build/config .build/binary_iso + +# Checking stage file +Check_stagefile .build/binary_onie + +# Checking lock file +Check_lockfile .lock + +# Creating lock file +Create_lockfile .lock + +### Adds needed helper script +## Based on https://github.com/opencomputeproject/onie/blob/master/contrib/debian-iso/sharch_body.sh +cat > sharch_body.sh << EOF +#!/bin/sh + +# +# Copyright (C) 2015 Curt Brune <curt@cumulusnetworks.com> +# +# SPDX-License-Identifier: GPL-2.0 +# + +# +# Shell archive template +# +# Strings of the form %%VAR%% are replaced during construction. +# + +echo -n "Verifying image checksum ..." +sha1=\$(sed -e '1,/^exit_marker$/d' "\$0" | sha1sum | awk '{ print \$1 }') + +payload_sha1=%%IMAGE_SHA1%% + +if [ "\$sha1" != "\$payload_sha1" ] ; then + echo + echo "ERROR: Unable to verify archive checksum" + echo "Expected: \$payload_sha1" + echo "Found : \$sha1" + exit 1 +fi + +echo " OK." + +tmp_dir= +clean_up() { + if [ "\$(id -u)" = "0" ] ; then + umount \$tmp_dir > /dev/null 2>&1 + fi + rm -rf \$tmp_dir + exit \$1 +} + +# Untar and launch install script in a tmpfs +cur_wd=\$(pwd) +archive_path=\$(realpath "\$0") +tmp_dir=\$(mktemp -d) +if [ "\$(id -u)" = "0" ] ; then + mount -t tmpfs tmpfs-installer \$tmp_dir || clean_up 1 +fi +cd \$tmp_dir +echo -n "Preparing image archive ..." +sed -e '1,/^exit_marker\$/d' \$archive_path | tar xf - || clean_up 1 +echo " OK." +cd \$cur_wd + +extract=no +args=":x" +while getopts "\$args" a ; do + case \$a in + x) + extract=yes + ;; + *) + ;; + esac +done + +if [ "\$extract" = "yes" ] ; then + # stop here + echo "Image extracted to: \$tmp_dir" + if [ "\$(id -u)" = "0" ] ; then + echo "To un-mount the tmpfs when finished type: umount \$tmp_dir" + fi + exit 0 +fi + +\$tmp_dir/installer/install.sh "\$@" +rc="\$?" + +clean_up \$rc + +exit_marker +EOF + + +### Based on onie cookbits script... +### https://github.com/opencomputeproject/onie/blob/master/contrib/debian-iso/cook-bits.sh + +CURDIR=`pwd` +OUT=${CURDIR}/output +rm -rf $OUT +mkdir -p $OUT + +WORKDIR=${CURDIR}/work +EXTRACTDIR="$WORKDIR/extract" +INSTALLDIR="$WORKDIR/installer" + +IN_IMAGE="${IMAGE}" + +output_file="${OUT}/${IN_IMAGE}-ONIE.bin" + +echo "Creating $output_file:" + +# prepare workspace +[ -d $EXTRACTDIR ] && chmod +w -R $EXTRACTDIR +rm -rf $WORKDIR +mkdir -p $EXTRACTDIR +mkdir -p $INSTALLDIR + +# Link the iso binary root to the onie extract dir +ln -s ${CURDIR}/binary/* ${EXTRACTDIR} +echo -n "." + +## pack ISO into initrd +# create initrd working dir +INITDIR=${WORKDIR}/initrd-extract +rm -rf ${INITDIR} +mkdir -p ${INITDIR} +cd ${INITDIR} +# extract current initrd +xzcat $EXTRACTDIR/live/initrd.img | cpio -d -i -m +echo -n "." +# copy inputed iso into initrd +cp "${CURDIR}/${IN_IMAGE}" ./conf/live.iso +echo -n "." +# repack +find . | cpio -o -H newc | xz --check=crc32 --x86 --lzma2=dict=512KiB > ${WORKDIR}/initrd.img +# cd back into rood dir +cd ${CURDIR} +echo -n "." + +KERNEL='vmlinuz' +IN_KERNEL=$EXTRACTDIR/live/$KERNEL +[ -r $IN_KERNEL ] || { + echo "ERROR: Unable to find kernel in ISO: $IN_KERNEL" + exit 1 +} +INITRD='initrd.img' +IN_INITRD=$WORKDIR/$INITRD +[ -r $IN_INITRD ] || { + echo "ERROR: Unable to find initrd in ISO: $IN_INITRD" + exit 1 +} + +# Note: specify kernel args you want the Debian installer to +# automatically append by putting them after the special marker "---". +# Here we want the Deb installer to auto include the serial console +# parameters. +# The minimal required parameters are included by default, and users +# can add more depending on what they need, eg: systemd parameters. +KERNEL_ARGS="--- boot=live nopersistent noeject dhcp fromiso=/conf/live.iso" +KERNEL_ARGS="${KERNEL_ARGS} ${LB_ONIE_KERNEL_CMDLINE}" + +# To debug DI preseed file add these args +# DI_DEBUG_ARGS="DEBCONF_DEBUG=5 dbg/flags=all-x" + +# Debian installer args +DI_ARGS="auto=true priority=critical $DI_DEBUG_ARGS" + +cp -r $IN_KERNEL $IN_INITRD $INSTALLDIR + +# Create custom install.sh script +touch $INSTALLDIR/install.sh +chmod +x $INSTALLDIR/install.sh + +(cat <<EOF +#!/bin/sh + +cd \$(dirname \$0) + +# remove old partitions +for p in \$(seq 3 9) ; do + sgdisk -d \$p /dev/vda > /dev/null 2&>1 +done + +# bonk out on errors +set -e + +echo "auto-detecting console..." +tty=\$(cat /sys/class/tty/console/active 2>/dev/null | awk 'END {print \$NF}') +speed=\$(stty -F /dev/\$tty speed 2>/dev/null) +bits=\$(stty -F /dev/\$tty -a 2>/dev/null | grep -o cs[5-8]) +bits=\$(echo \$bits | grep -o [5-8]) + +con='' +if [ -n "\$speed" ]; then + con="console=\$tty,\${speed}n\${bits}" +else + con="console=\$tty" +fi + +echo "using \$con" + +kcmd_console=\$(cat /proc/cmdline | grep -o 'console=.* ') +kcmd_console=\$(echo \$kcmd_console | cut -d' ' -f2) # remove tty0 + +if [ \${kcmd_console}x != \${con}x ]; then + echo "WARNING: Detected console does not match boot console: \$kcmd_console != \$con" +fi + +echo "Loading new kernel ..." +echo "kexec --load --initrd=$INITRD --append=\"$DI_ARGS $KERNEL_ARGS \$con\" $KERNEL" +kexec --load --initrd=$INITRD --append="$DI_ARGS $KERNEL_ARGS \$con" $KERNEL +kexec --exec + +EOF +) >> $INSTALLDIR/install.sh +echo -n "." + +# Repackage $INSTALLDIR into a self-extracting installer image +sharch="$WORKDIR/sharch.tar" +tar -C $WORKDIR -cf $sharch installer || { + echo "Error: Problems creating $sharch archive" + exit 1 +} + +[ -f "$sharch" ] || { + echo "Error: $sharch not found" + exit 1 +} +echo -n "." + +sha1=$(cat $sharch | sha1sum | awk '{print $1}') +echo -n "." + +cp sharch_body.sh $output_file || { + echo "Error: Problems copying sharch_body.sh" + exit 1 +} + +# Replace variables in the sharch template +sed -i -e "s/%%IMAGE_SHA1%%/$sha1/" $output_file +echo -n "." +cat $sharch >> $output_file +mv $output_file ${CURDIR} +rm -rf $tmp_dir +rm -rf $OUT $WORKDIR +echo " Done." +ls -la $(basename $output_file) +Echo_message "onie-installer created..." + +# Creating stage file +Create_stagefile .build/binary_onie |