1272b453cSPatrick Williams#!/bin/bash -eu 25a3ac185SBrad Bishop 3*37c76da7SPatrick Williamsfunction show_error() { 45a3ac185SBrad Bishop if [ -n "${JOURNAL_STREAM-}" ]; then 55a3ac185SBrad Bishop echo "$@" | systemd-cat -t first-boot-set-mac -p emerg 65a3ac185SBrad Bishop else 75a3ac185SBrad Bishop echo "$@" >&2 85a3ac185SBrad Bishop fi 95a3ac185SBrad Bishop} 105a3ac185SBrad Bishop 11*37c76da7SPatrick Williamsfunction sync_mac() { 125a3ac185SBrad Bishop 135a3ac185SBrad Bishop MAPPER_IFACE='xyz.openbmc_project.ObjectMapper' 145a3ac185SBrad Bishop MAPPER_PATH='/xyz/openbmc_project/object_mapper' 155a3ac185SBrad Bishop INVENTORY_PATH='/xyz/openbmc_project/inventory' 165a3ac185SBrad Bishop NETWORK_ITEM_IFACE='xyz.openbmc_project.Inventory.Item.NetworkInterface' 175a3ac185SBrad Bishop 185a3ac185SBrad Bishop # Get the NETWORK ITEM count 195a3ac185SBrad Bishop NETWORK_ITEM_PATH_COUNT=$(busctl --no-pager --verbose call \ 20272b453cSPatrick Williams ${MAPPER_IFACE} ${MAPPER_PATH} ${MAPPER_IFACE} \ 215a3ac185SBrad Bishop GetSubTree sias \ 225a3ac185SBrad Bishop ${INVENTORY_PATH} 0 1 ${NETWORK_ITEM_IFACE} \ 23272b453cSPatrick Williams 2>/dev/null | grep -c "${INVENTORY_PATH}" || true) 245a3ac185SBrad Bishop 25272b453cSPatrick Williams if [ "$NETWORK_ITEM_PATH_COUNT" -gt 1 ]; then 265a3ac185SBrad Bishop # If there are more than 2 NETOWRK ITEM and path must contain $1 275a3ac185SBrad Bishop # for finding the right NETWORK ITEM 285a3ac185SBrad Bishop NETWORK_ITEM_PATH=$(busctl --no-pager --verbose call \ 29272b453cSPatrick Williams ${MAPPER_IFACE} ${MAPPER_PATH} ${MAPPER_IFACE} \ 305a3ac185SBrad Bishop GetSubTree sias \ 315a3ac185SBrad Bishop ${INVENTORY_PATH} 0 1 ${NETWORK_ITEM_IFACE} \ 32272b453cSPatrick Williams 2>/dev/null | grep ${INVENTORY_PATH} | grep "$1" || true) 335a3ac185SBrad Bishop else 345a3ac185SBrad Bishop NETWORK_ITEM_PATH=$(busctl --no-pager --verbose call \ 35272b453cSPatrick Williams ${MAPPER_IFACE} ${MAPPER_PATH} ${MAPPER_IFACE} \ 365a3ac185SBrad Bishop GetSubTree sias \ 375a3ac185SBrad Bishop ${INVENTORY_PATH} 0 1 ${NETWORK_ITEM_IFACE} \ 385a3ac185SBrad Bishop 2>/dev/null | grep ${INVENTORY_PATH} || true) 395a3ac185SBrad Bishop fi 405a3ac185SBrad Bishop 415a3ac185SBrad Bishop # ' STRING "/xyz/openbmc_project/inventory/system/chassis/ethernet";' 425a3ac185SBrad Bishop NETWORK_ITEM_PATH=${NETWORK_ITEM_PATH#*\"} 435a3ac185SBrad Bishop NETWORK_ITEM_PATH=${NETWORK_ITEM_PATH%\"*} 445a3ac185SBrad Bishop 455a3ac185SBrad Bishop NETWORK_ITEM_SERVICE=$(mapper get-service \ 46272b453cSPatrick Williams "${NETWORK_ITEM_PATH}" 2>/dev/null || true) 475a3ac185SBrad Bishop 485a3ac185SBrad Bishop if [[ -z "${NETWORK_ITEM_SERVICE}" ]]; then 495a3ac185SBrad Bishop show_error 'No Ethernet interface found in the Inventory. Is VPD EEPROM empty?' 505a3ac185SBrad Bishop return 515a3ac185SBrad Bishop fi 525a3ac185SBrad Bishop 53272b453cSPatrick Williams MAC_ADDR=$(busctl get-property "${NETWORK_ITEM_SERVICE}" \ 54272b453cSPatrick Williams "${NETWORK_ITEM_PATH}" "${NETWORK_ITEM_IFACE}" MACAddress) 555a3ac185SBrad Bishop 565a3ac185SBrad Bishop # 's "54:52:01:02:03:04"' 575a3ac185SBrad Bishop MAC_ADDR=${MAC_ADDR#*\"} 585a3ac185SBrad Bishop MAC_ADDR=${MAC_ADDR%\"*} 595a3ac185SBrad Bishop 605a3ac185SBrad Bishop if [[ -n "${MAC_ADDR}" ]]; then 615a3ac185SBrad Bishop busctl set-property xyz.openbmc_project.Network \ 62272b453cSPatrick Williams "/xyz/openbmc_project/network/$1" \ 635a3ac185SBrad Bishop xyz.openbmc_project.Network.MACAddress \ 64272b453cSPatrick Williams MACAddress s "${MAC_ADDR}" 655a3ac185SBrad Bishop fi 665a3ac185SBrad Bishop} 675a3ac185SBrad Bishop 685a3ac185SBrad Bishopif [ $# -eq 0 ]; then 695a3ac185SBrad Bishop show_error 'No Ethernet interface name is given' 705a3ac185SBrad Bishop exit 1 715a3ac185SBrad Bishopfi 725a3ac185SBrad Bishop 73272b453cSPatrick Williamssync_mac "$1" 745a3ac185SBrad Bishop 755a3ac185SBrad Bishop# Prevent start at next boot time 765a3ac185SBrad Bishopmkdir -p "/var/lib/first-boot-set-mac" 775a3ac185SBrad Bishoptouch "/var/lib/first-boot-set-mac/${1}" 78