Redfish

BMC_IP=10.0.1.123
BMC_USER=ADMIN
BMC_PASS=ADMIN
 
# Install redfishtool (CLI)
git clone  https://github.com/DMTF/Redfishtool.git
cd Redfishtool/
python3 redfishtool.py -r ${BMC_IP} -u ${BMC_USER} -p ${BMC_PASS} Systems -F
 
for BMC_IP in 10.0.1.11 10.0.1.12 10.0.1.13; do
    python3 redfishtool.py -r ${BMC_IP} -u ${BMC_USER} -p ${BMC_PASS} Systems -F | jq .SerialNumber
    python3 redfishtool.py -r ${BMC_IP} -u ${BMC_USER} -p ${BMC_PASS} Systems -F | jq .IndicatorLED
done
 
BMC_HOSTS=$(grep 10.52 /var/lib/misc/dnsmasq.leases | cut -d" " -f3 | sort)
for BMC_HOST in ${BMC_HOSTS}; do
    echo ${BMC_HOST}
    curl --connect-timeout 1 -s https://${BMC_HOST}/redfish/v1/Systems/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq -r .IndicatorLED
  echo
done
 
python3 redfishtool.py -r ${BMC_IP} -u ${BMC_USER} -p ${BMC_PASS} Chassis list
python3 redfishtool.py -r ${BMC_IP} -u ${BMC_USER} -p ${BMC_PASS} Chassis -I 1
python3 redfishtool.py -r ${BMC_IP} -u ${BMC_USER} -p ${BMC_PASS} Chassis -I HA-RAID.0.StorageEnclosure.0
 
python3 redfishtool.py -r ${BMC_IP} -u ${BMC_USER} -p ${BMC_PASS} Systems -F | jq .UUID
python3 redfishtool.py -r ${BMC_IP} -u ${BMC_USER} -p ${BMC_PASS} Systems -F | jq .IndicatorLED
 
python3 redfishtool.py -r ${BMC_IP} -u ${BMC_USER} -p ${BMC_PASS} Chassis -I 1 setIndicatorLed Off
 
BMC_IP=$(dig +short node1.example.com)
unset https_proxy 
 
# gret firmware versions
# BMC
python3 redfishtool.py -r ${BMC_HOST} -u ${BMC_USER} -p ${BMC_PASS} Managers -F | jq .FirmwareVersion
curl -s https://${BMC_IP}/redfish/v1/Managers/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq .FirmwareVersion
# BIOS
python3 redfishtool.py -r ${BMC_HOST} -u ${BMC_USER} -p ${BMC_PASS} Systems -F | jq .BiosVersion
curl -s https://${BMC_IP}/redfish/v1/Systems/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq .BiosVersion
 
# System manufactor
curl -s https://${BMC_IP}/redfish/v1/Systems/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq .Manufacturer
# System model
curl -s https://${BMC_IP}/redfish/v1/Systems/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq .PartNumber
 
# get serial
curl -s https://${BMC_IP}/redfish/v1/Systems/1 -k -u ${BMC_USER}:${BMC_PASS} | jq .UUID
curl -s https://${BMC_IP}/redfish/v1/Systems/1 -k -u ${BMC_USER}:${BMC_PASS} | jq .SerialNumber
curl -s https://${BMC_IP}/redfish/v1/Chassis/1 -k -u ${BMC_USER}:${BMC_PASS} | jq .SerialNumber
 
# get CPU information
curl -s https://${BMC_IP}/redfish/v1/Systems/1/Processors/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq -r .Model | awk '{$1=$1};1'
curl -s https://${BMC_IP}/redfish/v1/Systems/1/Processors/1 -k -u ${BMC_USER}:${BMC_PASS} | jq .TotalCores
curl -s https://${BMC_IP}/redfish/v1/Systems/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq .ProcessorSummary.Count
 
# ram
curl -s https://${BMC_IP}/redfish/v1/Systems/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq .MemorySummary.TotalSystemMemoryGiB
curl -k -u ${BMC_USER}:${BMC_PASS} -s https://${BMC_IP}/redfish/v1/Systems/1/Memory | jq ".Members | length"
 
# get BMC settings
curl -s https://${BMC_IP}/redfish/v1/Managers/1/EthernetInterfaces/2  -k -u ${BMC_USER}:${BMC_PASS} | jq .IPv4Addresses[0].Address
 
# get Health
curl -s https://${BMC_IP}/redfish/v1/Chassis/1 -k -u ${BMC_USER}:${BMC_PASS} | jq .Status.Health
# get IndicatorLED
curl -s https://${BMC_IP}/redfish/v1/Systems/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq -r .IndicatorLED
# fan mode
curl -s https://${BMC_IP}//redfish/v1/Managers/1/FanMode -k -u ${BMC_USER}:${BMC_PASS} | jq .Mode
 
# temperature
curl -s https://${BMC_IP}/redfish/v1/Chassis/1/Thermal -k -u ${BMC_USER}:${BMC_PASS} | jq '.Temperatures[] | select(.Name == "System Temp") .ReadingCelsius'
 
# GPU
curl -s https://${BMC_NODE}/redfish/v1/Chassis/1/PCIeDevices/GPU1/ -k -u ${BMC_USER}:${BMC_PASS} | jq -r .Model
 
# storage
curl -s https://${BMC_IP}/redfish/v1/Systems/1/SimpleStorage/1 -k -u ${BMC_USER}:${BMC_PASS} | jq .Devices[].Model
 
# raid
curl -s https://${BMC_IP}/redfish/v1/Chassis/HA-RAID.0.StorageEnclosure.0 -k -u ${BMC_USER}:${BMC_PASS} | python -m json.tool
curl -s https://${BMC_IP}/redfish/v1/Chassis/HA-RAID.0.StorageEnclosure.0/Drives/Disk.Bay.0 -k -u ${BMC_USER}:${BMC_PASS} | python -m json.tool
 
curl -k https://BMC_IP/registries/BiosAttributeRegistry.v1_0_0.json | python -m json.tool
 
curl -s https://BMC_IP/redfish/v1/Chassis/1/Thermal -k -u ADMIN:ADMIN |   python -m json.tool
 
# power control
curl -s https://${BMC_IP}/redfish/v1/Chassis/1/Power/ -k -u ${BMC_USER}:${BMC_PASS} | jq -r ".PowerControl[].Status.State"
 
# power consumption
curl -s https://${BMC_IP}/redfish/v1/Chassis/1/Power/ -k -u ${BMC_USER}:${BMC_PASS} | jq .PowerControl[].PowerConsumedWatts
curl -s https://${BMC_IP}/redfish/v1/Chassis/1/Power/ -k -u ${BMC_USER}:${BMC_PASS} | jq .PowerControl[].PowerMetrics.AverageConsumedWatts

Get NIC information

# get BMC mac
curl -s https://${BMC_IP}/redfish/v1/Managers/1/EthernetInterfaces/1 -k -u ${BMC_USER}:${BMC_PASS} | jq -r '.MACAddress | ascii_downcase'
 
# get NIC(s) MAC addresses
for NIC_ID in {1..4}; do
  curl -s https://${BMC_IP}/redfish/v1/Systems/1/EthernetInterfaces/${NIC_ID} -k -u ${BMC_USER}:${BMC_PASS} | jq -r '.MACAddress | ascii_downcase'
done

SuperMicro
https://www.supermicro.com/manuals/other/RedfishRefGuide.pdf
https://www.supermicro.com/manuals/other/redfish-ref-guide-html/Content/general-content/available-apis.htm

HPE Cloudline get parameter with redfish
https://servermanagementportal.ext.hpe.com/docs/redfishservices/ilos/ilo5/ilo5_295/ilo5_serviceroot_resourcedefns295/
https://hewlettpackard.github.io/ilo-rest-api-docs/ilo5/#uefi-bios-standard-redfish-support
https://support.hpe.com/hpsc/doc/public/display?docId=c04423967

# Manufacturer
curl -s https://${BMC_IP}/redfish/v1/Systems/Self -k -u ${BMC_USER}:${BMC_PASS} | jq -r .Manufacturer
 
# Model
curl -s https://${BMC_IP}/redfish/v1/Systems/Self -k -u ${BMC_USER}:${BMC_PASS} | jq -r .Model
 
# Serial
curl -s https://${BMC_IP}/redfish/v1/Systems/Self -k -u ${BMC_USER}:${BMC_PASS} | jq -r .SerialNumber
 
# UUID
curl -s https://${BMC_IP}/redfish/v1/Systems/Self -k -u ${BMC_USER}:${BMC_PASS} | jq -r .UUID
 
# Indicatior LED
curl -s -k -u ${BMC_USER}:${BMC_PASS} https://${BMC_IP}/redfish/v1/Chassis/Self | jq -r .IndicatorLED
 
# CPU
curl -s https://${BMC_IP}/redfish/v1/Systems/Self -k -u ${BMC_USER}:${BMC_PASS} | jq -r .ProcessorSummary.Model 
curl -s https://${BMC_IP}/redfish/v1/Systems/Self -k -u ${BMC_USER}:${BMC_PASS} | jq -r .ProcessorSummary.Count 
 
# Memory
for DIMM_ID in {0..24}; do
    DIMM_CAPACITY=$(curl -s https://${BMC_IP}/redfish/v1/Systems/Self/Memory/DevType2_DIMM${DIMM_ID} -k -u ${BMC_USER}:${BMC_PASS} | jq -r ".CapacityMiB | select( . != null)")
    if [ "${DIMM_CAPACITY}" ]; then
        if [ ${DIMM_CAPACITY} -gt 0 ]; then
            echo ${DIMM_CAPACITY}
        fi
    fi
done
 
# Disks
for DEVICE_ID in {0..16}; do
    for PORT_ID in {0..16}; do
        DISK_MODEL=$(curl -s https://${BMC_IP}/redfish/v1/Systems/Self/Storage/1/Drives/SATA_Device${DEVICE_ID}_Port${PORT_ID} -k -u ${BMC_USER}:${BMC_PASS} | jq -r ".Model | select( . != null)")
        if [ "${DISK_MODEL}" ]; then
            echo ${DISK_MODEL}
        fi
    done
done
 
# get MAC
curl -k -s -u ${BMC_USER}:${BMC_PASS}  https://${BMC_IP}/redfish/v1/Managers/Self/EthernetInterfaces/eth0 | jq -r .MACAddress
 
# NICs
for NIC_ID in {0..8}; do
    NIC_MAC=$(curl -s https://${BMC_IP}/redfish/v1/Systems/Self/EthernetInterfaces/NicInterface${NIC_ID} -k -u ${BMC_USER}:${BMC_PASS} | jq -r ".MACAddress | select( . != null) | ascii_downcase")
    if [ "${NIC_MAC}" ]; then
        echo ${NIC_MAC}
    fi
done
 
# BIOS settings
curl -s https://${BMC_IP}/redfish/v1/Systems/Self/Bios -k -u ${BMC_USER}:${BMC_PASS} | jq -r 

ilorest
https://servermanagementportal.ext.hpe.com/docs/concepts/gettingstarted/#tips-for-using-the-redfish-restful-api

sudo dpkg -i /home/pko/Downloads/ilorest-4.9.0.0-10_amd64.deb

python-ilorest-library

pip install python-ilorest-library
git clone https://github.com/HewlettPackard/python-ilorest-library.git
cd python-ilorest-library/exampls
vi quickstart_redfish.py
python3 quickstart_redfish.py

# Redfishtool (redfish CLI)
https://github.com/DMTF/Redfishtool

# boot to bios
python3 redfishtool.py -r ${BMC_IP} -u ${BMC_USER} -p ${BMC_PASS} Systems setBootOverride Once BiosSetup
python3 redfishtool.py -r ${BMC_IP} -u ${BMC_USER} -p ${BMC_PASS} Systems reset ForceRestart

Manage Redfish with Curl

curl -d '{
    "Boot": {
        "BootSourceOverrideEnabled": "Once",
        "BootSourceOverrideTarget": "Pxe"
    }
}' \
-H "Content-Type: application/json" \
-X PATCH \
--insecure \
--silent \
https://${BMC_HOST}}/redfish/v1/Systems/1/
 
curl -sk -H "$token" -H "Content-Type: application/json" -X POST https://$1/redfish/v1/Systems/1/Actions/ComputerSystem.Reset/ -d '{"ResetType": "ForceRestart"}'
curl -sk -H "$token" -H "Content-Type: application/json" -X POST https://$1/redfish/v1/Systems/1/Actions/ComputerSystem.Reset/ -d '{"ResetType": "ForceOff"}'
curl -sk -H "$token" -H "Content-Type: application/json" -X POST https://$1/redfish/v1/Systems/1/Actions/ComputerSystem.Reset/ -d '{"ResetType": "On"}'

Get server data

for BMC_IP in $(cat /var/lib/misc/dnsmasq.leases | grep 10.0.98 | cut -d" " -f3); do
    echo ${BMC_IP}
    curl -s https://${BMC_IP}/redfish/v1/Systems/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq -r .Manufacturer
    curl -s https://${BMC_IP}/redfish/v1/Systems/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq -r .PartNumber
    curl -s https://${BMC_IP}/redfish/v1/Systems/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq -r .IndicatorLED
    curl -s https://${BMC_IP}/redfish/v1/Systems/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq .BiosVersion
    curl -s https://${BMC_IP}/redfish/v1/Managers/1/ -k -u ${BMC_USER}:${BMC_PASS} | jq .FirmwareVersion
    echo
done

VirtualMedia / ISO

# mount ISO image
curl https://${BMC_HOST}/redfish/v1/Managers/1/VirtualMedia/CD1/Actions/VirtualMedia.InsertMedia \
  -u ${BMC_USER}:${BMC_PASS} \
  --insecure \
  --silent \
  -X POST \
  -H "Content-Type: application/json" \
  -d "{ 
        \"Image\": \"http://${DL_SRV_IP}/iso/${ISO}\"
    }"
 
# get VirtualMedia state
curl -k -u ${BMC_USER}:${BMC_PASS} -s https://${BMC_IP}/redfish/v1/Managers/1/VirtualMedia/CD1 | jq
 
# boot from ISO (use "UsbCd" on Supermicro else "Cd")
    curl https://${BMC_HOST}/redfish/v1/Systems/1/ \
      -u ${BMC_USER}:${BMC_PASS} \
      --insecure \
      --silent \
      -X PATCH \
      -H "Content-Type: application/json" \
      -d '{
            "Boot":{
                "BootSourceOverrideEnabled":"Once",
                "BootSourceOverrideMode":"UEFI",
                "BootSourceOverrideTarget": "UsbCd"
            }
        }'
 
# boot from HDD
curl https://${BMC_HOST}/redfish/v1/Systems/1/ \
  -u ${BMC_USER}:${BMC_PASS} \
  --insecure \
  --silent \
  -X PATCH \
  -H "Content-Type: application/json" \
  -d '{
        "Boot":{
          "BootSourceOverrideEnabled":"Continuous",
          "BootSourceOverrideMode":"UEFI",
           "BootSourceOverrideTarget": "Hdd"
         }
      }'
 
# get boot state
curl --silent -k --user ${BMC_USER}:${BMC_PASS} https://${BMC_HOST}/redfish/v1/Systems/1/ | jq '.Boot'
 
# reboot server
curl https://${BMC_HOST}/redfish/v1/Systems/1/Actions/ComputerSystem.Reset \
    -u ${BMC_USER}:${BMC_PASS} \
    --insecure \
    --silent \
    -H "Content-Type: application/json" \
    -X POST \
    -d '{ 
            "ResetType": "GracefulRestart"
        }'

Redfish Interface Emulator
https://github.com/DMTF/Redfish-Interface-Emulator

git clone https://github.com/DMTF/Redfish-Interface-Emulator.git
cd Redfish-Interface-Emulator
pip install -r requirements.txt
python emulator.py -debug

REST API browser
https://chromewebstore.google.com/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm

Links
https://www.thomas-krenn.com/de/wiki/Redfish
https://github.com/DMTF/python-redfish-library
https://docs.linuxfabrik.ch/topics/redfish.html