xref: /openbmc/phosphor-misc/firstboot/first-boot-set-mac.sh (revision 37c76da7c277f3531f35ec726ac690e53ab4915a)
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