xref: /freebsd/libexec/rc/rc.d/nuageinit (revision 9a62e1d98dc79c69f0d20439bd34a16149106046)
1a42d6f76SBaptiste Daroussin#!/bin/sh
2a42d6f76SBaptiste Daroussin#
3a42d6f76SBaptiste Daroussin
4a42d6f76SBaptiste Daroussin# PROVIDE: nuageinit
52775b9b0SBaptiste Daroussin# REQUIRE: mountcritlocal zfs devmatch
6a42d6f76SBaptiste Daroussin# BEFORE: NETWORKING
7a42d6f76SBaptiste Daroussin# KEYWORD: firstboot
8a42d6f76SBaptiste Daroussin
9a42d6f76SBaptiste Daroussin. /etc/rc.subr
10a42d6f76SBaptiste Daroussin
11a42d6f76SBaptiste Daroussinname="nuageinit"
12a42d6f76SBaptiste Daroussindesc="Limited Cloud Init configuration"
13a42d6f76SBaptiste Daroussinstart_cmd="nuageinit_start"
14a42d6f76SBaptiste Daroussinstop_cmd=":"
15a42d6f76SBaptiste Daroussinrcvar="nuageinit_enable"
16a42d6f76SBaptiste Daroussin
172775b9b0SBaptiste Daroussinfetch_openstack()
182775b9b0SBaptiste Daroussin{
192775b9b0SBaptiste Daroussin	cd /media/nuageinit/openstack/latest
202775b9b0SBaptiste Daroussin	for file in meta_data.json network_data.json user_data; do
212775b9b0SBaptiste Daroussin		fetch http://169.254.169.254/openstack/latest/$file || :
222775b9b0SBaptiste Daroussin	done
232775b9b0SBaptiste Daroussin	if [ -f user_data ]; then
242775b9b0SBaptiste Daroussin		chmod 755 user_data
252775b9b0SBaptiste Daroussin	fi
262775b9b0SBaptiste Daroussin	cd -
272775b9b0SBaptiste Daroussin}
282775b9b0SBaptiste Daroussin
29a42d6f76SBaptiste Daroussinnuageinit_start()
30a42d6f76SBaptiste Daroussin{
31a42d6f76SBaptiste Daroussin	local citype
32a42d6f76SBaptiste Daroussin	# detect cloud init provider
33d71e2c03SJose Luis Duran	# according to the specification, the config drive
34d71e2c03SJose Luis Duran	# is either formatted in vfat or iso9660 and labeled
35a42d6f76SBaptiste Daroussin	# config-2
36a42d6f76SBaptiste Daroussin	for f in iso9660 msdosfs; do
379eae9233SBaptiste Daroussin		drive="/dev/$f/[cC][oO][nN][fF][iI][gG]-2"
38a42d6f76SBaptiste Daroussin		if [ -e $drive ]; then
39a42d6f76SBaptiste Daroussin			citype=config-2
40a42d6f76SBaptiste Daroussin			break
41a42d6f76SBaptiste Daroussin		fi
429eae9233SBaptiste Daroussin		drive="/dev/$f/[cC][iI][dD][aA][tT][aA]"
43a42d6f76SBaptiste Daroussin		if [ -e $drive ]; then
44a42d6f76SBaptiste Daroussin			citype=nocloud
45a42d6f76SBaptiste Daroussin			break
46a42d6f76SBaptiste Daroussin		fi
47a42d6f76SBaptiste Daroussin		unset drive
48a42d6f76SBaptiste Daroussin	done
492775b9b0SBaptiste Daroussin	if [ -n "$drive" ]; then
50a42d6f76SBaptiste Daroussin		mkdir -p /media/nuageinit
51d71e2c03SJose Luis Duran		fs=$(fstyp $drive 2> /dev/null)
52a42d6f76SBaptiste Daroussin		mount -t $fs $drive /media/nuageinit
532775b9b0SBaptiste Daroussin	else
542775b9b0SBaptiste Daroussin		product=$(kenv smbios.system.product)
552775b9b0SBaptiste Daroussin		case "$product" in
562775b9b0SBaptiste Daroussin		OpenStack*)
572775b9b0SBaptiste Daroussin			mkdir -p /media/nuageinit/openstack/latest
582775b9b0SBaptiste Daroussin			ifaces=$(ifconfig -l ether)
592775b9b0SBaptiste Daroussin			set -- $ifaces
602775b9b0SBaptiste Daroussin			dhclient -p /tmp/ephemeraldhcp.pid $1
612775b9b0SBaptiste Daroussin			fetch_openstack
622775b9b0SBaptiste Daroussin			pkill -F /tmp/ephemeraldhcp.pid
632775b9b0SBaptiste Daroussin			citype=config-2
642775b9b0SBaptiste Daroussin			;;
652775b9b0SBaptiste Daroussin		*)
662775b9b0SBaptiste Daroussin			# try to detect networked based instance
672775b9b0SBaptiste Daroussin			err 1 "Impossible to find a cloud init provider"
682775b9b0SBaptiste Daroussin			;;
692775b9b0SBaptiste Daroussin		esac
702775b9b0SBaptiste Daroussin	fi
71a42d6f76SBaptiste Daroussin	# according to the specification, the content is either
72a42d6f76SBaptiste Daroussin	# in the openstack or ec2 directory
73a42d6f76SBaptiste Daroussin	case "$citype" in
74a42d6f76SBaptiste Daroussin	config-2)
75a42d6f76SBaptiste Daroussin		for d in openstack ec2; do
76a42d6f76SBaptiste Daroussin			dir=/media/nuageinit/$d/latest
77a42d6f76SBaptiste Daroussin			if [ -d $dir ]; then
78*9a62e1d9SBaptiste Daroussin				/usr/libexec/nuageinit $dir $citype 2>&1 | tee -a /var/log/nuageinit.log
79a42d6f76SBaptiste Daroussin				break
80a42d6f76SBaptiste Daroussin			fi
81a42d6f76SBaptiste Daroussin		done
82a42d6f76SBaptiste Daroussin		;;
83a42d6f76SBaptiste Daroussin	nocloud)
84*9a62e1d9SBaptiste Daroussin		/usr/libexec/nuageinit /media/nuageinit $citype 2>&1 | tee -a /var/log/nuageinit.log
85a42d6f76SBaptiste Daroussin		;;
86a42d6f76SBaptiste Daroussin	esac
87a42d6f76SBaptiste Daroussin	if [ -n "$drive" ]; then
88a42d6f76SBaptiste Daroussin		umount /media/nuageinit
89a42d6f76SBaptiste Daroussin		rmdir /media/nuageinit
902775b9b0SBaptiste Daroussin	else
912775b9b0SBaptiste Daroussin		rm -rf /media/nuageinit
922775b9b0SBaptiste Daroussin	fi
93a42d6f76SBaptiste Daroussin}
94a42d6f76SBaptiste Daroussin
95a42d6f76SBaptiste Daroussinload_rc_config $name
96a42d6f76SBaptiste Daroussinrun_rc_command "$1"
97