opnsense-src/libexec/rc/rc.d/nuageinit
Baptiste Daroussin 2775b9b0bc nuageinit: add support for OpenStack network config
Add naive support for openstack network config.
if no config driver have been found, try to detect that we are running a
VM on openstack via the smbios information, use the first iface
available and temporary activate dhcp on it, to be able to fetch the
necessary informations for cloudinit.

While here make the rc script execute after devmatch, some ethernet
device might be attached via devmatch and may be needed for cloudinit.

Tested on OVHCloud Public Cloud.

MFC after:	3 weeks
Sponsored by:	OVHCloud
2024-10-29 14:23:47 +01:00

96 lines
1.9 KiB
Bash
Executable file

#!/bin/sh
#
# PROVIDE: nuageinit
# REQUIRE: mountcritlocal zfs devmatch
# BEFORE: NETWORKING
# KEYWORD: firstboot
. /etc/rc.subr
name="nuageinit"
desc="Limited Cloud Init configuration"
start_cmd="nuageinit_start"
stop_cmd=":"
rcvar="nuageinit_enable"
fetch_openstack()
{
cd /media/nuageinit/openstack/latest
for file in meta_data.json network_data.json user_data; do
fetch http://169.254.169.254/openstack/latest/$file || :
done
if [ -f user_data ]; then
chmod 755 user_data
fi
cd -
}
nuageinit_start()
{
local citype
# detect cloud init provider
# according to the specification, the config drive
# is either formatted in vfat or iso9660 and labeled
# config-2
for f in iso9660 msdosfs; do
drive="/dev/$f/[cC][oO][nN][fF][iI][gG]-2"
if [ -e $drive ]; then
citype=config-2
break
fi
drive="/dev/$f/[cC][iI][dD][aA][tT][aA]"
if [ -e $drive ]; then
citype=nocloud
break
fi
unset drive
done
if [ -n "$drive" ]; then
mkdir -p /media/nuageinit
fs=$(fstyp $drive 2> /dev/null)
mount -t $fs $drive /media/nuageinit
else
product=$(kenv smbios.system.product)
case "$product" in
OpenStack*)
mkdir -p /media/nuageinit/openstack/latest
ifaces=$(ifconfig -l ether)
set -- $ifaces
dhclient -p /tmp/ephemeraldhcp.pid $1
fetch_openstack
pkill -F /tmp/ephemeraldhcp.pid
citype=config-2
;;
*)
# try to detect networked based instance
err 1 "Impossible to find a cloud init provider"
;;
esac
fi
# according to the specification, the content is either
# in the openstack or ec2 directory
case "$citype" in
config-2)
for d in openstack ec2; do
dir=/media/nuageinit/$d/latest
if [ -d $dir ]; then
/usr/libexec/nuageinit $dir $citype
break
fi
done
;;
nocloud)
/usr/libexec/nuageinit /media/nuageinit $citype
;;
esac
if [ -n "$drive" ]; then
umount /media/nuageinit
rmdir /media/nuageinit
else
rm -rf /media/nuageinit
fi
}
load_rc_config $name
run_rc_command "$1"