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 | grep Size | awk '{ print $2; }' | grep -E '[0-9]+');
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
