802f14862c
This fix uses dmidecode and awk to simply multiply by 1024 when the value is represented in GB, otherwise it returns the given value. I should note that I've only observered this occurence on "some" SuperMicro Hardware Closes-Bug: #1486689 Change-Id: I352b1891326f72af3a56c7bbe8b7f3c422169404
104 lines
3.1 KiB
Plaintext
104 lines
3.1 KiB
Plaintext
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
|