summaryrefslogtreecommitdiff
path: root/scripts/build/binary_onie
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/build/binary_onie')
-rwxr-xr-xscripts/build/binary_onie300
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