1#!/bin/sh 2 3clear_volatile() { 4 service=$(mapper get-service /org/open_power/control/volatile) 5 clearVolatileEnabled=$(busctl get-property $service /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled) 6 if [[ "$clearVolatileEnabled" != "b true" ]]; then 7 return 0 8 fi 9 10 PNOR_TOC_FILE="pnor.toc" 11 PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro/" 12 PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw/" 13 PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv/" 14 15 # toc partition string format: 16 # partition27=HB_VOLATILE,0x02ba9000,0x02bae000,00,ECC,VOLATILE,READWRITE 17 tocFilePath="${PNOR_RO_ACTIVE_PATH}${PNOR_TOC_FILE}" 18 volatiles=($(grep VOLATILE "${tocFilePath}" | grep -Eo '^partition([0-9]+)=([A-Za-z0-9_]+)')) 19 for (( index=0; index<${#volatiles[@]}; index++ )); do 20 volatileName="$(echo ${volatiles[${index}]} | awk -F '=' '{print $2}')" 21 22 rwVolatile="${PNOR_RW_ACTIVE_PATH}${volatileName}" 23 if [ -f "${rwVolatile}" ]; then 24 echo "Clear $rwVolatile" 25 rm "${rwVolatile}" 26 fi 27 prsvVolatile="${PNOR_PRSV_ACTIVE_PATH}${volatileName}" 28 if [ -f "${prsvVolatile}" ]; then 29 echo "Clear $prsvVolatile" 30 rm "${prsvVolatile}" 31 fi 32 done 33 # Always reset the sensor after clearing 34 busctl set-property $service /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled b false 35} 36 37update_symlinks() { 38 PNOR_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/" 39 PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro" 40 PNOR_RO_PREFIX="/media/pnor-ro-" 41 PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw" 42 PNOR_RW_PREFIX="/media/pnor-rw-" 43 PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv" 44 PNOR_PRSV="/media/pnor-prsv" 45 PERSISTENCE_PATH="/var/lib/obmc/openpower-pnor-code-mgmt/" 46 PNOR_PATCH_LOCATION="/usr/local/share/pnor/" 47 48 # Get a list of all active PNOR versions 49 data="$(ls -d ${PNOR_RO_PREFIX}*)" 50 IFS=$'\n' array=(${data}) 51 52 currentVersion="" 53 lowestPriority=255 54 for element in ${array[@]}; do 55 #Remove the PNOR_RO_PREFIX from the path to get version ID. 56 versionId="${element#${PNOR_RO_PREFIX}}" 57 58 # Get the priority of active versions from persistence files. 59 if [[ -f "${PERSISTENCE_PATH}${versionId}" ]]; then 60 data="$(grep -r "priority" ${PERSISTENCE_PATH}${versionId})" 61 priority="${data: -1}" 62 if [[ priority -le lowestPriority ]]; then 63 lowestPriority=${priority} 64 currentVersion=${versionId} 65 fi 66 fi 67 done 68 69 # Return if no active version found 70 if [ -z $currentVersion ]; then 71 return 0; 72 fi 73 74 if [ ! -d "${PNOR_ACTIVE_PATH}" ]; then 75 mkdir -p "${PNOR_ACTIVE_PATH}" 76 fi 77 78 # If the RW or RO active links doesn't point to the version with 79 # lowest priority, then remove the symlink and create new ones. 80 if [[ $(readlink -f "${PNOR_RO_ACTIVE_PATH}") != ${PNOR_RO_PREFIX}${currentVersion} ]]; then 81 rm -f ${PNOR_RO_ACTIVE_PATH} 82 rm -rf ${PNOR_PATCH_LOCATION}* 83 ln -sfv ${PNOR_RO_PREFIX}${currentVersion} ${PNOR_RO_ACTIVE_PATH} 84 fi 85 86 if [[ $(readlink -f "${PNOR_RW_ACTIVE_PATH}") != ${PNOR_RW_PREFIX}${currentVersion} ]]; then 87 rm -f ${PNOR_RW_ACTIVE_PATH} 88 ln -sfv ${PNOR_RW_PREFIX}${currentVersion} ${PNOR_RW_ACTIVE_PATH} 89 fi 90 91 if [[ ! -h ${PNOR_PRSV_ACTIVE_PATH} ]]; then 92 ln -sfv ${PNOR_PRSV} ${PNOR_PRSV_ACTIVE_PATH} 93 fi 94} 95 96case "$1" in 97 clearvolatile) 98 clear_volatile 99 ;; 100 updatesymlinks) 101 update_symlinks 102 ;; 103 *) 104 echo "Invalid argument" 105 exit 1 106 ;; 107esac 108rc=$? 109if [ ${rc} -ne 0 ]; then 110 echo "$0: error ${rc}" 111 exit ${rc} 112fi 113