From 087306910df9f30a91abf4a3b266826113fa2e40 Mon Sep 17 00:00:00 2001 From: Yury Murashka Date: Thu, 21 Feb 2019 18:08:43 +0000 Subject: [PATCH] Add initramfs hook for Arista devices We are going to use initramfs hook for firmware upgrades To install Arista hook: - create folder /mnt/flash//platform/hooks/boot1/ from Aboot or /host//platform/hooks/boot1/ from Sonic - add executable script to created folder --- build_debian.sh | 2 + files/initramfs-tools/arista-hook | 74 +++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 files/initramfs-tools/arista-hook diff --git a/build_debian.sh b/build_debian.sh index 85d0b503f962..41f0966d04d4 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -130,6 +130,8 @@ cat files/initramfs-tools/modules | sudo tee -a $FILESYSTEM_ROOT/etc/initramfs-t sudo mkdir -p $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/ sudo cp files/initramfs-tools/arista-convertfs $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-convertfs sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-convertfs +sudo cp files/initramfs-tools/arista-hook $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-hook +sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-hook sudo cp files/initramfs-tools/mke2fs $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/mke2fs sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/mke2fs sudo cp files/initramfs-tools/setfacl $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/setfacl diff --git a/files/initramfs-tools/arista-hook b/files/initramfs-tools/arista-hook new file mode 100644 index 000000000000..654fe88baa53 --- /dev/null +++ b/files/initramfs-tools/arista-hook @@ -0,0 +1,74 @@ +#!/bin/sh + +PREREQS="arista-convertfs" + +prereqs() { echo "$PREREQS"; } + +case $1 in + prereqs) + prereqs + exit 0 + ;; +esac + +info() { printf "%04.2f: $@\n" "$(cut -f1 -d' ' /proc/uptime)"; } +err() { info "Error: $@"; } +warn() { info "Warning: $@"; } + +set -e + +root_mnt='/mnt/arista-firmware' +root_dev='' +aboot_flag='' + +# Alway run cleanup before exit +cleanup() { + if grep -q "$root_mnt" /proc/mounts; then + umount "$root_mnt" + fi + [ -e "$root_mnt" ] && rmdir "$root_mnt" +} +trap cleanup EXIT + +# Extract kernel parameters +set -- $(cat /proc/cmdline) +for x in "$@"; do + case "$x" in + Aboot=*) + aboot_flag="${x#Aboot=}" + ;; + loop=*) + x1="${x#loop=}" + image_dir="${x1%/*}" + ;; + esac +done + +[ -z "$aboot_flag" ] && exit 0 + +root_dev="$ROOT" +if [ -z "$root_dev" ]; then + err "Error: root device name is not provided" + exit 1 +fi + +mkdir -p "$root_mnt" +mount -t ext4 "$root_dev" "$root_mnt" + +get_sorted_hooks() { + echo $(find "$1" -name '[0-9][0-9]-*' -type f | sort) +} + +if [ -d "$root_mnt/$image_dir/platform/hooks/boot1" ]; then + for hook in $(get_sorted_hooks "$root_mnt/$image_dir/platform/hooks/boot1"); do + if [ ! -z "$hook" ]; then + cp "$hook" /tmp/ + hook="/tmp/`basename $hook`" + info "Running hook $(basename $hook)" + . "$hook" + fi + done +fi + +umount "$root_mnt" +rmdir "$root_mnt"