blob: 69d986397c769bdfe9fc96a4eba4dbc141b1e8d0 [file] [log] [blame]
#!/bin/bash
#Copyright 2020-present Open Networking Foundation
#
#Licensed under the Apache License, Version 2.0 (the "License");
#you may not use this file except in compliance with the License.
#You may obtain a copy of the License at
#
#http://www.apache.org/licenses/LICENSE-2.0
#
#Unless required by applicable law or agreed to in writing, software
#distributed under the License is distributed on an "AS IS" BASIS,
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#See the License for the specific language governing permissions and
#limitations under the License.
### BEGIN INIT INFO
# Description:
# Upgrade the NOS from Active to Standby partition,
# This script checks if installed ONL on OLT has active and standby partions
# if yes, it extracts the ONL package and keep the
# required files to the Standby partition and start the NOS from Standby partition.
#
### END INIT INFO
WORKING_DIR=$(pwd)
# Name of the script
SCRIPT_NAME="$(basename ${0})"
UPGRADE=
ONL_FILE=${1}
ONL_ROOT="/mnt/onl"
ACTIVE_BOOTDIR="${ONL_ROOT}/active_boot/"
STANDBY_BOOTDIR="${ONL_ROOT}/standby_boot/"
# Partition labels
ONL_ACTIVE_BOOT="ONL-ACTIVE-BOOT"
ONL_ACTIVE_DATA="ONL-ACTIVE-DATA"
ONL_STANDBY_BOOT="ONL-STANDBY-BOOT"
ONL_STANDBY_DATA="ONL-STANDBY-DATA"
ONL_CONFIG="ONL-CONFIG"
ONL_IMAGES="ONL-IMAGES"
# Mount paths
CONFIG="${ONL_ROOT}/config"
IMAGES="${ONL_ROOT}/images"
ACTIVE_DATA="${ONL_ROOT}/active_data"
ACTIVE_BOOT="${ONL_ROOT}/active_boot"
STANDBY_DATA="${ONL_ROOT}/standby_data"
STANDBY_BOOT="${ONL_ROOT}/standby_boot"
GRUB="grub"
ONL_SOURCE="onl_source"
ACTIVE_DATA_DEV_NAME=
ACTIVE_DATA_MNT_PATH=
ACTIVE_BOOT_DEV_NAME=
ACTIVE_BOOT_MNT_PATH=
STANDBY_DATA_DEV_NAME=
STANDBY_DATA_MNT_PATH=
STANDBY_BOOT_DEV_NAME=
STANDBY_BOOT_MNT_PATH=
# Configuration file about upgrade
IMAGES="${ONL_ROOT}/images"
ACTIVE_GRUB_ENV_FILE="${ONL_ROOT}/active_boot/grub/grubenv"
STANDBY_GRUB_ENV_FILE="${ONL_ROOT}/active_boot/grub/grubenv"
GRUB_CONFIG_FILE="${ONL_ROOT}/config/grub.cfg"
GRUB_CONFIG_FILE_CHANGED="${ONL_ROOT}/config/grub.cfg.changed"
ASF_VOLT16_VOLTHA_BAL=$(ls /*asfvolt16*.tar.gz 2>/dev/null)
BROADCOM="/broadcom"
OPT="/opt/bcm68620"
DEV_MGMT_DAEMON="dev_mgmt_daemon -d -pcie"
OPENOLT="openolt"
#------------------------------------------------------------------------------
# Function : usage
#
# Description:
# This function says how to use the script
#
# Globals:
# SCRIPT_NAME
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
usage()
{
echo "${SCRIPT_NAME}:usage:
${SCRIPT_NAME} <ONL_IMAGE_WITH_ABSOLUTE_PATH>
"
exit 1
}
#------------------------------------------------------------------------------
# Function Name: does_logger_exist
# Description:
# This function check if logger exist and executable.
#
# Globals:
# None
#
# Arguments:
# None
#
# Returns:
# returns 0 if exist and executable else 1
#------------------------------------------------------------------------------
does_logger_exist()
{
cmd=/usr/bin/logger
if [ -x ${cmd} ]; then
return 0
else
return 1
fi
}
#------------------------------------------------------------------------------
# Function Name: info_message
# Description:
# This function print the info message information to the console
#
# Globals:
# None
#
# Arguments:
# string message
#
# Returns:
# None
#------------------------------------------------------------------------------
info_message()
{
echo "INFO: $1"
logger -p user.info "$1"
}
#------------------------------------------------------------------------------
# Function Name: error_message
# Description:
# This function print the error message information to the console
#
# Globals:
# None
#
# Arguments:
# string message
#
# Returns:
# returns 1
#------------------------------------------------------------------------------
error_message()
{
echo "ERROR: $1"
logger -p user.err "$1"
return 1
}
#------------------------------------------------------------------------------
# Function: clean_up
#
# Description:
# This function delete the existing image in the standby boot partition.
# In order to copy the the new image. also delete the onl source in the
# working directory if it is there.
#
# Globals:
# WORKING_DIR, ONL_SOURCE, STANDBY_BOOT_MNT_PATH, ACTIVE_DATA_MNT_PATh
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
clean_up()
{
info_message "Deleting onl source"
rm -rf ${WORKING_DIR}/${ONL_SOURCE}
info_message "Deleting kernel and initrd files"
rm -rf ${STANDBY_BOOT_MNT_PATH}/kernel-*
rm -rf ${STANDBY_BOOT_MNT_PATH}/x86-64-accton-*
echo "INFO: Deleting configuration files"
rm -rf /etc/onl/*
rm -rf /lib/vendor-config/
info_message "Deleting standby rootfs"
rm -rf ${STANDBY_DATA_MNT_PATH}/*
}
#------------------------------------------------------------------------------
# Function: update_grub_cfg_for_temp_reboot
#
# Description:
# This function updates the grub.cfg file in order to achieve the temporary
# reboot. by making standby entry in the temporary reboot. once temporary
# reboot happens successfully grub.cfg file will have only active entry.
#
# Globals:
# GRUB_CONFIG_FILE_CHANGED, ACTIVE_KERNEL_NAME, STANDBY_KERNEL_NAME
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
update_grub_cfg_for_temp_reboot()
{
cat > ${GRUB_CONFIG_FILE_CHANGED} <<- EOF
serial --port=0x3f8 --speed=115200 --word=8 --parity=no --stop=1
terminal_input serial
terminal_output serial
set timeout=5
# Always boot the saved_entry value
load_env
if [ \$saved_entry ] ; then
set default=\$saved_entry
fi
menuentry "Open Network Linux" {
search --no-floppy --label --set=root ONL-ACTIVE-BOOT
# Always return to this entry by default.
set saved_entry="0"
save_env saved_entry
echo 'Loading Open Network Linux ...'
insmod gzio
insmod part_msdos
linux /${ACTIVE_KERNEL_NAME} nopat console=ttyS0,115200n8 tg3.short_preamble=1 tg3.bcm5718s_reset=1 intel_iommu=off onl_platform=x86-64-accton-asxvolt16-r0 data-active
initrd /x86-64-accton-asxvolt16-r0.cpio.gz
}
menuentry "Open Network Linux Standby" {
search --no-floppy --label --set=root ONL-STANDBY-BOOT
# Always return to this entry by default.
set saved_entry="0"
save_env saved_entry
echo 'Loading Open Network Linux Standby...'
insmod gzio
insmod part_msdos
linux /${STANDBY_KERNEL_NAME} nopat console=ttyS0,115200n8 tg3.short_preamble=1 tg3.bcm5718s_reset=1 intel_iommu=off onl_platform=x86-64-accton-asxvolt16-r0 data-standby
initrd /x86-64-accton-asxvolt16-r0.cpio.gz
}
# Menu entry to chainload ONIE
menuentry ONIE {
search --no-floppy --label --set=root ONIE-BOOT
set saved_entry="0"
save_env saved_entry
echo 'Loading ONIE ...'
chainloader +1
}
EOF
}
#------------------------------------------------------------------------------
# Function: revert_grub_cfg
#
# Description:
# This function revert the original grub.cfg file which was affected
# by temporary reboot.
#
# Globals:
# GRUB_CONFIG_FILE, ACTIVE_KERNEL_NAME
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
revert_grub_cfg()
{
cat > ${GRUB_CONFIG_FILE} <<- EOF
serial --port=0x3f8 --speed=115200 --word=8 --parity=no --stop=1
terminal_input serial
terminal_output serial
set timeout=5
# Always boot the saved_entry value
load_env
if [ \$saved_entry ] ; then
set default=\$saved_entry
fi
menuentry "Open Network Linux" {
search --no-floppy --label --set=root ONL-ACTIVE-BOOT
# Always return to this entry by default.
set saved_entry="0"
save_env saved_entry
echo 'Loading Open Network Linux ...'
insmod gzio
insmod part_msdos
linux /${ACTIVE_KERNEL_NAME} nopat console=ttyS0,115200n8 tg3.short_preamble=1 tg3.bcm5718s_reset=1 intel_iommu=off onl_platform=x86-64-accton-asxvolt16-r0 data-active
initrd /x86-64-accton-asxvolt16-r0.cpio.gz
}
menuentry "Open Network Linux Standby" {
search --no-floppy --label --set=root ONL-STANDBY-BOOT
# Always return to this entry by default.
set saved_entry="0"
save_env saved_entry
echo 'Loading Open Network Linux Standby...'
insmod gzio
insmod part_msdos
linux /${STANDBY_KERNEL_NAME} nopat console=ttyS0,115200n8 tg3.short_preamble=1 tg3.bcm5718s_reset=1 intel_iommu=off onl_platform=x86-64-accton-asxvolt16-r0 data-standby
initrd /x86-64-accton-asxvolt16-r0.cpio.gz
}
# Menu entry to chainload ONIE
menuentry ONIE {
search --no-floppy --label --set=root ONIE-BOOT
set saved_entry="0"
save_env saved_entry
echo 'Loading ONIE ...'
chainloader +1
}
EOF
}
#------------------------------------------------------------------------------
# Function: grub_reboot
#
# Description:
# This function gives a temporary reboot using grub-reboot command, this will
# set the boot menu entry from active default one to Standby. Now OS will
# boot up in Standby mode.
#
# Globals:
# ACTIVE_BOOTDIR, STANDBY_BOOTDIR, GRUB_CONFIG_FILE_CHANGED, ACTIVE_BOOT
# GRUB
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
grub_reboot()
{
if [ -f "${ACTIVE_BOOTDIR}/grub/grubenv" ]; then
saved_entry=$(grub-editenv ${ACTIVE_BOOTDIR}/grub/grubenv list | sed -n 's/^saved_entry=//p')
if [ ${saved_entry} -eq 0 ]; then
grub-editenv ${ACTIVE_BOOTDIR}/grub/grubenv set saved_entry=1
sed -i '/next_entry=/a\prev_saved_entry=1' ${ACTIVE_BOOTDIR}/grub/grubenv
fi
fi
if [ -f "${STANDBY_BOOTDIR}/grub/grubenv" ]; then
saved_entry=$(grub-editenv ${STANDBY_BOOTDIR}/grub/grubenv list | sed -n 's/^saved_entry=//p')
if [ ${saved_entry} -eq 0 ]; then
grub-editenv ${STANDBY_BOOTDIR}/grub/grubenv set saved_entry=1
sed -i '/next_entry=/a\prev_saved_entry=1' ${STANDBY_BOOTDIR}/grub/grubenv
fi
fi
if [ -f ${GRUB_CONFIG_FILE_CHANGED} ]; then
if [ -f "${ACTIVE_BOOT}/${GRUB}/grub.cfg" ]; then
cp ${GRUB_CONFIG_FILE_CHANGED} ${ACTIVE_BOOT}/${GRUB}/grub.cfg
fi
if [ -f "${STANDBY_BOOT}/${GRUB}/grub.cfg" ]; then
cp ${GRUB_CONFIG_FILE_CHANGED} ${STANDBY_BOOT}/${GRUB}/grub.cfg
fi
fi
grub-reboot --boot-directory=${ACTIVE_BOOTDIR} 1
reboot
}
#------------------------------------------------------------------------------
# Function: install_onl
#
# Description:
# This function copy the upgrade image.
#
# Globals:
# WORKING_DIR, ONL_SOURCE, STANDBY_BOOT_MNT_PATH, IMAGES, ACTIVE_BOOT_MNT_PATH
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
install_onl()
{
if [ -f ${ONL_FILE} ]; then
clean_up
mkdir ${WORKING_DIR}/${ONL_SOURCE}
cd ${WORKING_DIR}/${ONL_SOURCE}
chmod 777 ${ONL_FILE}
# Extract onl package
unzip ${ONL_FILE}
# Copy kernel files to standby boot partition
cp kernel-* ${STANDBY_BOOT_MNT_PATH}/
# Copy initrd file to standby boot partition
cp onl-loader-initrd-amd64.cpio.gz ${STANDBY_BOOT_MNT_PATH}/x86-64-accton-asxvolt16-r0.cpio.gz
# Create upgrade directory in the images partition to copy upgrade image
if [ -d ${IMAGES}/upgrade ]; then
rm -rf ${IMAGES}/upgrade
fi
info_message "Creating Upgrade Directory"
mkdir ${IMAGES}/upgrade
info_message "Copying SWI file to Upgrade Directory"
cp *.swi ${IMAGES}/upgrade
# Update the kernel version
STANDBY_KERNEL_NAME=$(ls ${STANDBY_BOOT_MNT_PATH} | grep kernel-4.14)
ACTIVE_KERNEL_NAME=$(ls ${ACTIVE_BOOT_MNT_PATH} | grep kernel-4.14 )
update_grub_cfg_for_temp_reboot
revert_grub_cfg
else
error_message "ONL file not found"
exit 1
fi
}
#------------------------------------------------------------------------------
# Function: upgrade_onl
#
# Description:
# This function get the labels, and install the upgrade NOS.
#
# Globals :
# ACTIVE_DATA_DEV_NAME, ACTIVE_BOOT_DEV_NAME, ACTIVE_BOOT_MNT_PATH,
# STANDBY_DATA_DEV_NAME, STANDBY_BOOT_MNT_PATH
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
upgrade_onl()
{
ACTIVE_DATA_DEV_NAME=$(blkid | grep " LABEL=\"ONL-ACTIVE-DATA\"" | awk '{print $1}' | sed 's/://')
echo "active data dev - $ACTIVE_DATA_DEV_NAME"
ACTIVE_DATA_MNT_PATH=$(mount | grep $ACTIVE_DATA_DEV_NAME | awk '{print $3}')
echo $"active data mnt - $ACTIVE_DATA_MNT_PATH"
ACTIVE_BOOT_DEV_NAME=$(blkid | grep " LABEL=\"ONL-ACTIVE-BOOT\"" | awk '{print $1}' | sed 's/://')
echo "active boot dev $ACTIVE_BOOT_DEV_NAME"
ACTIVE_BOOT_MNT_PATH=$(mount | grep $ACTIVE_BOOT_DEV_NAME | awk '{print $3}')
echo "active boot mnt - $ACTIVE_BOOT_MNT_PATH"
STANDBY_DATA_DEV_NAME=$(blkid | grep " LABEL=\"ONL-STANDBY-DATA\"" | awk '{print $1}' | sed 's/://')
echo "standby data dev - $STANDBY_DATA_DEV_NAME"
STANDBY_DATA_MNT_PATH=$(mount | grep $STANDBY_DATA_DEV_NAME | awk '{print $3}')
echo "standby data mnt - $STANDBY_DATA_MNT_PATH"
STANDBY_BOOT_DEV_NAME=$(blkid | grep " LABEL=\"ONL-STANDBY-BOOT\"" | awk '{print $1}' | sed 's/://')
echo "standby boot dev - $STANDBY_BOOT_DEV_NAME"
STANDBY_BOOT_MNT_PATH=$(mount | grep $STANDBY_BOOT_DEV_NAME | awk '{print $3}')
echo "standby boot mnt -$STANDBY_BOOT_MNT_PATH"
install_onl
grub_reboot
}
#------------------------------------------------------------------------------
# Function: command_result
#
# Description:
# This function executes the blkid command.
#
# Globals:
# None
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
command_result(){
blkid | grep $1 > /dev/null
if [ $? -eq 0 ]; then
return 0
else
return 1
fi
}
#------------------------------------------------------------------------------
# Function: is_onl_running
#
# Description:
# This function check the running NOS and also check the Upgrade is required
# or not.
#
# Globals:
# ONL_ACTIVE_BOOT, ONL_ACTIVE_DATA, ONL_STANDBY_BOOT, ONL_STANDBY_DATA
# ONL_CONFIG, ONL_IMAGES, IMAGES, ACTIVE_DATA, ACTIVE_BOOT, STANDBY_DATA
# STANDBY_BOOT
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
is_onl_running()
{
info_message "Check all directories exist or not"
if command_result "$ONL_ACTIVE_BOOT" && command_result "$ONL_ACTIVE_DATA" && command_result "$ONL_STANDBY_BOOT" && command_result "$ONL_STANDBY_DATA" && command_result "$ONL_CONFIG" && command_result "$ONL_IMAGES" ; then
if [ \( -d "$CONFIG" -a -d "$IMAGES" \) -a \( -d "$ACTIVE_DATA" -a -d "$ACTIVE_BOOT" \) -a \( -d "$STANDBY_DATA" -a -d "$STANDBY_BOOT" \) ]; then
info_message "All directories exist. Need Upgrade"
UPGRADE=1
fi
else
info_message "It is new installation"
UPGRADE=0
fi
}
#------------------------------------------------------------------------------
# Function: main
#
# Description:
# This is the main function. which decides fresh installation is required or
# upgrade is required.
#
# Globals :
# UPGRADE, ONL_FILE
# Arguments :
# None
#
# Returns :
# None
#------------------------------------------------------------------------------
main()
{
echo "INFO: Check if image upgrade or new installation"
is_onl_running
if [ $UPGRADE -eq 0 ]; then
error_message "ONL does not have active and stand by partitions \
install ONL image with active and standby partitions"
exit 1
else
info_message "Upgrade started"
upgrade_onl
fi
}
# main function call
does_logger_exist
if [ $? -eq 0 ]; then
main
else
error_message "logger does not exist"
exit 1
fi