diskimage-builder/elements/ironic-discoverd-ramdisk/init.d/80-ironic-discoverd-ramdisk
Dmitry Tantsur 3a0cdeb310 Support assigning IPMI credentials in ironic-discoverd-ramdisk
When setting IPMI credentials is requested, ironic-discoverd
will return ipmi_setup_credentials=true, ipmi_username and ipmi_password
in response. Use ipmitool to set credentials in this case.

Change-Id: I8ace9e817e5ce9dbfb8564feec4a3ce6c0e1b233
2015-02-13 10:41:34 +01:00

95 lines
3.4 KiB
Plaintext

DISCOVERD_URL=$(get_kernel_parameter discoverd_callback_url)
BOOTIF=$(get_kernel_parameter BOOTIF)
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
function request_curl(){
HTTP_METHOD=$1
URL=$2
DATA=$3
if [ ! -z "$DATA" ]; then
DATA="\"-d \"$DATA\"\""
fi
RESULT=$(eval curl -i -X "$HTTP_METHOD" \
"-H 'Accept: application/json'" \
"-H 'Content-Type: application/json'" \
"$DATA" \
"$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
echo $RESULT
}
IFACES=
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
IFACES="$IFACES,\"$iface\":{\"mac\":\"$MAC\",\"ip\":\"$IP\"}"
fi
done
IFACES="{$(echo $IFACES | sed s/,//)}"
# NOTE(dtantsur): workaround for IPMI device not present on some systems
modprobe ipmi_msghandler || echo "WARNING: modprobe failed, ipmitool call may fail"
modprobe ipmi_devintf || echo "WARNING: modprobe failed, ipmitool call may fail"
modprobe ipmi_si || echo "WARNING: modprobe failed, ipmitool call may fail"
BMC_ADDRESS=$(ipmitool lan print | grep -e "IP Address [^S]" | awk '{ print $4 }')
CPU_ARCH=$(lscpu | grep Architecture | awk '{ print $2 }')
# NOTE(lucasagomes): dmidecode because we want to know the total
# memory in the system, even the reserved part to the BIOS
RAM=$(dmidecode -t 16 | grep 'Maximum Capacity' | awk '{if ($4 == "GB") s+=$3*1024; else s+=$3;} END {print s}')
CPUS=$(cat /proc/cpuinfo | grep processor | wc -l)
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))
NODE_DATA="'{\"ipmi_address\":\"$BMC_ADDRESS\",\"local_gb\":$DISK_SIZE,\"memory_mb\":$RAM,\"cpus\":$CPUS,\"cpu_arch\":\"$CPU_ARCH\""
NODE_DATA="$NODE_DATA,\"interfaces\":$IFACES,\"boot_interface\":\"$BOOTIF\"}'"
echo Collected $NODE_DATA
NODE_RESP=$(request_curl POST $DISCOVERD_URL $NODE_DATA | tail -n1)
JSON_RESP=$(echo "$NODE_RESP" | 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