#!/bin/bash function clear_volatile() { service=$(mapper get-service /org/open_power/control/volatile) clearVolatileEnabled=$(busctl get-property "$service" /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled) if [[ "$clearVolatileEnabled" != "b true" ]]; then return 0 fi PNOR_TOC_FILE="pnor.toc" PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro/" PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw/" PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv/" # toc partition string format: # partition27=HB_VOLATILE,0x02ba9000,0x02bae000,00,ECC,VOLATILE,READWRITE tocFilePath="${PNOR_RO_ACTIVE_PATH}${PNOR_TOC_FILE}" if [ ! -f "${tocFilePath}" ]; then tocFilePath="${PNOR_RW_ACTIVE_PATH}${PNOR_TOC_FILE}" fi mapfile -t volatiles < <(grep VOLATILE "${tocFilePath}" | grep -Eo '^partition([0-9]+)=([A-Za-z0-9_]+)') for (( index=0; index<${#volatiles[@]}; index++ )); do volatileName="$(echo "${volatiles[${index}]}" | awk -F '=' '{print $2}')" rwVolatile="${PNOR_RW_ACTIVE_PATH}${volatileName}" if [ -f "${rwVolatile}" ]; then echo "Clear $rwVolatile" rm "${rwVolatile}" fi prsvVolatile="${PNOR_PRSV_ACTIVE_PATH}${volatileName}" if [ -f "${prsvVolatile}" ]; then echo "Clear $prsvVolatile" rm "${prsvVolatile}" fi if [ ! -f "${PNOR_RO_ACTIVE_PATH}${volatileName}" ]; then cp -a "${PNOR_RO_ACTIVE_PATH}81e0066f.lid" "${PNOR_PRSV_ACTIVE_PATH}" ln -s "81e0066f.lid" "${PNOR_PRSV_ACTIVE_PATH}${volatileName}" fi done # Always reset the sensor after clearing busctl set-property "$service" /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled b false } function update_symlinks() { PNOR_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/" HOSTFW_ACTIVE_PATH="/var/lib/phosphor-software-manager/hostfw/" PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro" PNOR_RO_PREFIX="/media/pnor-ro-" PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw" PNOR_RW_PREFIX="/media/pnor-rw-" PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv" PNOR_PRSV="/media/pnor-prsv" PERSISTENCE_PATH="/var/lib/obmc/openpower-pnor-code-mgmt/" PNOR_PATCH_LOCATION="/usr/local/share/pnor/" MMC_BASE_PATH="/media/hostfw" MMC_RO_PATH="${MMC_BASE_PATH}/running-ro" MMC_RUNNING_PATH="${MMC_BASE_PATH}/running" MMC_ALTERNATE_PATH="${MMC_BASE_PATH}/alternate" MMC_STAGING_PATH="${MMC_BASE_PATH}/staging" MMC_NVRAM_PATH="${MMC_BASE_PATH}/nvram" HOSTFW_RUNNING_PATH="${HOSTFW_ACTIVE_PATH}/running" HOSTFW_ALTERNATE_PATH="${HOSTFW_ACTIVE_PATH}/alternate" HOSTFW_STAGING_PATH="${HOSTFW_ACTIVE_PATH}/staging" HOSTFW_NVRAM_PATH="${HOSTFW_ACTIVE_PATH}/nvram" # Get a list of all active PNOR versions data="$(ls -d ${PNOR_RO_PREFIX}* 2>/dev/null)" mapfile -t array <<< "${data}" currentVersion="" lowestPriority=255 for element in "${array[@]}"; do #Remove the PNOR_RO_PREFIX from the path to get version ID. versionId="${element#"${PNOR_RO_PREFIX}"}" # Get the priority of active versions from persistence files. if [[ -f "${PERSISTENCE_PATH}${versionId}" ]]; then data="$(grep -r "priority" "${PERSISTENCE_PATH}${versionId}")" priority="${data: -1}" if [[ priority -le lowestPriority ]]; then lowestPriority=${priority} currentVersion=${versionId} fi fi done if [ -n "$currentVersion" ]; then # Use active version roTarget="${PNOR_RO_PREFIX}${currentVersion}" rwTarget="${PNOR_RW_PREFIX}${currentVersion}" prsvTarget="${PNOR_PRSV}" elif [ -d "${MMC_BASE_PATH}" ]; then # Use eMMC roTarget="${MMC_RO_PATH}" rwTarget="${MMC_RUNNING_PATH}" prsvTarget="${MMC_RUNNING_PATH}" if [ ! -d "${HOSTFW_ACTIVE_PATH}" ]; then mkdir -p "${HOSTFW_ACTIVE_PATH}" fi # Symlinks used by PLDM if [[ $(readlink -f "${HOSTFW_RUNNING_PATH}") != "${MMC_RUNNING_PATH}" ]]; then rm -f ${HOSTFW_RUNNING_PATH} ln -sfv ${MMC_RUNNING_PATH} ${HOSTFW_RUNNING_PATH} fi if [[ $(readlink -f "${HOSTFW_ALTERNATE_PATH}") != "${MMC_ALTERNATE_PATH}" ]]; then rm -f ${HOSTFW_ALTERNATE_PATH} ln -sfv ${MMC_ALTERNATE_PATH} ${HOSTFW_ALTERNATE_PATH} fi if [[ $(readlink -f "${HOSTFW_STAGING_PATH}") != "${MMC_STAGING_PATH}" ]]; then rm -f ${HOSTFW_STAGING_PATH} ln -sfv ${MMC_STAGING_PATH} ${HOSTFW_STAGING_PATH} fi if [[ $(readlink -f "${HOSTFW_NVRAM_PATH}") != "${MMC_NVRAM_PATH}" ]]; then rm -f ${HOSTFW_NVRAM_PATH} ln -sfv ${MMC_NVRAM_PATH} ${HOSTFW_NVRAM_PATH} fi fi if [ ! -d "${PNOR_ACTIVE_PATH}" ]; then mkdir -p "${PNOR_ACTIVE_PATH}" fi # If the RW or RO active links doesn't point to the version with # lowest priority, then remove the symlink and create new ones. if [[ $(readlink -f "${PNOR_RO_ACTIVE_PATH}") != "${roTarget}" ]]; then rm -f ${PNOR_RO_ACTIVE_PATH} rm -rf ${PNOR_PATCH_LOCATION}* ln -sfv "${roTarget}" ${PNOR_RO_ACTIVE_PATH} fi if [[ $(readlink -f "${PNOR_RW_ACTIVE_PATH}") != "${rwTarget}" ]]; then rm -f ${PNOR_RW_ACTIVE_PATH} ln -sfv "${rwTarget}" ${PNOR_RW_ACTIVE_PATH} fi if [[ $(readlink -f "${PNOR_PRSV_ACTIVE_PATH}") != "${prsvTarget}" ]]; then rm -f ${PNOR_PRSV_ACTIVE_PATH} ln -sfv "${prsvTarget}" ${PNOR_PRSV_ACTIVE_PATH} fi } case "$1" in clearvolatile) clear_volatile ;; updatesymlinks) update_symlinks ;; *) echo "Invalid argument" exit 1 ;; esac rc=$? if [ ${rc} -ne 0 ]; then echo "$0: error ${rc}" exit ${rc} fi