meta-virtualization/classes/meta-virt-hosts.bbclass
Bruce Ashfield 491a385ca6 config: introduce hostname generation hooks
Overriding hostname in a .conf file, via base-files:

  HOST_NAME="k3s-host"
  hostname_pn-base-files = "${HOST_NAME}"

Is always a valid option, but if it is not configured, we can easily
have two hosts with the same name on the network, confusing adddress
assignement, etc.

This commit introduces a way to generate a unique hostname based
on the uuid of the build host, and the machine being built.

If virt-unique-hostname is added to IMAGE_FEATURES, like the following:

  IMAGE_FEATURES += "virt-unique-hostname"
  IMAGE_FEATURES[validitems] += "virt-unique-hostname"

Then a rootfs postprocessing hook will override hostnae to something
unique.

Note: this means your image will be reproducible on a single builder,
but not between them.

Signed-off-by: Bruce Ashfield <bruce.ashfield@gmail.com>
2021-12-13 15:59:35 -05:00

30 lines
1.1 KiB
Plaintext

# This doesn't work, since it seems to be too late for sanity checking.
# IMAGE_FEATURES[validitems] += ' ${@bb.utils.contains("DISTRO_FEATURES", "virtualization", "virt-unique-hostname; ", "",d)}'
ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("IMAGE_FEATURES", "virt-unique-hostname", "virt_gen_hostname; ", "",d)}'
ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("IMAGE_FEATURES", "virt-unique-hostname", "virt_set_hostname; ", "",d)}'
python virt_gen_hostname() {
import uuid
targetname = d.getVar("VIRT_TARGETNAME")
if targetname != None:
return
status, date = oe.utils.getstatusoutput("date +%d-%m-%y")
if status:
bb.warn("Can't get the date string for target hostname")
uuid = ':'.join(['{:02x}'.format((uuid.getnode() >> ele) & 0xff) for ele in range(0,8*6,8)][::-1])
if uuid:
targetname = "%s-%s" % (d.getVar("MACHINE"), uuid.split(":")[0])
else:
targetname = "%s-%s" % (d.getVar("MACHINE"), date)
d.setVar("VIRT_TARGETNAME", targetname)
}
virt_set_hostname() {
echo "${VIRT_TARGETNAME}" > ${IMAGE_ROOTFS}/etc/hostname
}