#!/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"