DISCOVERD_URL=$(get_kernel_parameter discoverd_callback_url) if [ -z "$DISCOVERD_URL" ]; then # Some old ramdisks are around DISCOVERD_URL=$(get_kernel_parameter ironic_callback_url) if [ -z "$DISCOVERD_URL" ]; then echo "No discoverd_callback_url supplied" troubleshoot else echo "WARNING: deprecated option ironic_callback_url" echo "WARNING: use discoverd_callback_url instead" fi fi echo '{"interfaces":{}}' > data.json function update() { jq "$1" data.json > temp.json || troubleshoot mv temp.json data.json } for iface in $(ls /sys/class/net/ | grep -v lo) do MAC=$(ip link show $iface | awk '/ether/ {print $2}') IP=$(ip addr show $iface | awk '/inet / { sub(/\/.*/, "", $2); print $2 }') if [ ! -z "$MAC" ]; then update ".interfaces[\"$iface\"] = {mac: \"$MAC\", ip: \"$IP\"}" fi done # NOTE(dtantsur): workaround for IPMI device not present on some systems function modprobe_ipmi() { modprobe ipmi_$1 || echo "WARNING: modprobe ipmi_$1 failed, ipmitool call may fail later" } modprobe_ipmi msghandler modprobe_ipmi devintf modprobe_ipmi si BMC_ADDRESS=$(ipmitool lan print | grep -e "IP Address [^S]" | awk '{ print $4 }') update ".ipmi_address = \"$BMC_ADDRESS\"" CPU_ARCH=$(lscpu | grep Architecture | awk '{ print $2 }') update ".cpu_arch = \"$CPU_ARCH\"" RAM=0 for i in $(dmidecode --type memory | awk '($0~/Size/ && $2~/[0-9]/) {($3~/GB/) ? size=$2*1024 : size=$2; {print size;}}') do RAM=$(( RAM + $i )); done update ".memory_mb = $RAM" CPUS=$(cat /proc/cpuinfo | grep processor | wc -l) update ".cpus = $CPUS" DISK_BYTES=$(fdisk -l | grep Disk | awk '{print $5}' | head -n 1) # NOTE(dtantsur): -1 is required to give Ironic some spacing for partitioning and may be removed later DISK_SIZE=$(($DISK_BYTES/1024/1024/1024 - 1)) update ".local_gb = $DISK_SIZE" BOOTIF=$(get_kernel_parameter BOOTIF) update ".boot_interface = \"$BOOTIF\"" echo Collected: cat data.json RESULT=$(eval curl -i -X POST \ "-H 'Accept: application/json'" \ "-H 'Content-Type: application/json'" \ "-d @data.json" \ "$DISCOVERD_URL") || troubleshoot # CURL can't return error code on 4xx error if echo $RESULT | grep "HTTP/1.0 4"; then echo "Ironic API returned error: $RESULT" troubleshoot fi JSON_RESP=$(echo $RESULT | tr '\r' '\n' | tail -n1) # drop HTTP headers if echo "$JSON_RESP" | jq '.ipmi_setup_credentials' | grep -q true; then USERNAME=$(echo "$JSON_RESP" | jq -r '.ipmi_username') if [ -z "$USERNAME" ]; then echo "Empty IPMI user name" troubleshoot fi PASSWORD=$(echo "$JSON_RESP" | jq -r '.ipmi_password') if [ -z "$PASSWORD" ]; then echo "Empty IPMI password" troubleshoot fi echo "Assigning IPMI credentials: user $USERNAME" ipmitool user set name 2 $USERNAME ipmitool user set password 2 $PASSWORD # Assign priviledges just in case ipmitool channel setaccess 1 2 link=on ipmi=on callin=on privilege=4 ipmitool user enable 2 fi echo "Node is now discovered! Halting..." # Give user a chance of seeing the output sleep 5 poweroff -f