| #!/bin/bash |
| # |
| # This script is used to get the BMC MAC Address from FRU EEPROM at Board Extra. |
| # and if the eth address is not exist on U-boot Enviroment, this script will update it. |
| # |
| |
| function Usage () { |
| echo "Usage:" |
| echo " ampere_update_mac.sh <ethX> <fru bus> <fru addr>" |
| echo "Example:" |
| echo " ampere_update_mac.sh eth1 3 80" |
| } |
| |
| function read_mac_address () { |
| fruBus=$1 |
| fruAddr=$2 |
| |
| if FRU_OBJECT_PATH=$(busctl tree xyz.openbmc_project.FruDevice | grep "/xyz/openbmc_project/FruDevice/" | tr -s '\n' ' ' | tr -d "|-" | tr -d '`') |
| then |
| IFS=' ' read -r -a FRU_OBJ_PATH_ARR <<< "$FRU_OBJECT_PATH" |
| |
| for fruObj in "${FRU_OBJ_PATH_ARR[@]}" |
| do |
| BUS_IDX_RW=$(busctl get-property xyz.openbmc_project.FruDevice "$fruObj" xyz.openbmc_project.FruDevice BUS) |
| BUS_ADDR_RW=$(busctl get-property xyz.openbmc_project.FruDevice "$fruObj" xyz.openbmc_project.FruDevice ADDRESS) |
| |
| if [ -z "$BUS_IDX_RW" ] || [ -z "$BUS_IDX_RW" ]; then |
| continue |
| else |
| BUS_IDX_CV=$(echo "$BUS_IDX_RW" | cut -d " " -f 2) |
| BUS_ADDR_CV=$(echo "$BUS_ADDR_RW" | cut -d " " -f 2) |
| if [ "$BUS_IDX_CV" != "$fruBus" ] || [ "$BUS_ADDR_CV" != "$fruAddr" ]; then |
| continue |
| fi |
| fi |
| |
| MAC_ADDR_RAW=$(busctl get-property xyz.openbmc_project.FruDevice "$fruObj" xyz.openbmc_project.FruDevice BOARD_INFO_AM1) |
| MAC_ADDR=$(echo "$MAC_ADDR_RAW" | cut -d "\"" -f 2) |
| break |
| done |
| fi |
| echo "$MAC_ADDR" |
| } |
| |
| ETHERNET_INTERFACE=$1 |
| BMC_FRU_BUS=$2 |
| BMC_FRU_ADDR=$3 |
| |
| if [ -z "$BMC_FRU_ADDR" ]; |
| then |
| Usage |
| exit |
| fi |
| |
| # Check eth port |
| case ${ETHERNET_INTERFACE} in |
| "eth0") |
| ENV_PORT="1" |
| ;; |
| "eth1") |
| ENV_PORT="2" |
| ;; |
| "eth2") |
| ENV_PORT="3" |
| ;; |
| *) |
| Usage |
| exit |
| ;; |
| esac |
| |
| # Read FRU Board Custom Field 1 to get the MAC address |
| for i in {1..10}; do |
| MAC_ADDR=$(read_mac_address "$BMC_FRU_BUS" "$BMC_FRU_ADDR") |
| |
| # Check if BMC MAC address is exported |
| if [ -z "${MAC_ADDR}" ]; then |
| sleep 2 |
| continue |
| fi |
| |
| if echo "$MAC_ADDR" | grep -q -vE "^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$" ; then |
| echo "ERROR: No valid BMC MAC Address detected from BMC FRU! $MAC_ADDR" |
| exit 0 |
| else |
| echo "mac-update: detect BMC MAC $MAC_ADDR at loop $i" |
| break |
| fi |
| done |
| |
| # Check if the Ethernet port has correct MAC Address |
| ETH_INCLUDE_MAC=$(ifconfig "${ETHERNET_INTERFACE}" | grep -i "$MAC_ADDR") |
| if [ -n "$ETH_INCLUDE_MAC" ]; then |
| echo "BMC MAC Address is already configured" |
| exit 0 |
| fi |
| |
| # Request to restart the service |
| ifconfig "${ETHERNET_INTERFACE}" down |
| fw_setenv bmc_macaddr "${MAC_ADDR}" |
| |
| ifconfig "${ETHERNET_INTERFACE}" hw ether "${MAC_ADDR}" |
| retval=$? |
| if [[ $retval -ne 0 ]]; then |
| echo "ERROR: Can not update MAC ADDR to ${ETHERNET_INTERFACE}" |
| exit 1 |
| fi |
| # Setting LAN MAC Address to xx:xx:xx:xx:xx:xx |
| ipmitool lan set "${ENV_PORT}" macaddr "${ETHERNET_INTERFACE}" |
| # Enableing BMC-generated ARP responses & Setting SNMP Community String to public |
| ipmitool lan set "${ENV_PORT}" arp respond on |
| ipmitool lan set "${ENV_PORT}" snmp public |
| ifconfig "${ETHERNET_INTERFACE}" up |
| |
| echo "Successfully update the MAC address ${MAC_ADDR} to ${ETHERNET_INTERFACE}" |