summaryrefslogtreecommitdiff
path: root/app-emulation/cloud-init
diff options
context:
space:
mode:
authorroot <root@alpha.trunkmasters.com>2026-06-04 05:48:38 -0500
committerroot <root@alpha.trunkmasters.com>2026-06-04 05:48:38 -0500
commitbfd9c39e4712ebdb442d4ca0673061faed1e70e1 (patch)
tree0d7a74b4463ee387f9cf9368ceb1b757f694f72a /app-emulation/cloud-init
parentf716a9fe6455d39eef01e718aae68dae61c19704 (diff)
downloadbaldeagleos-repo-bfd9c39e4712ebdb442d4ca0673061faed1e70e1.tar.gz
baldeagleos-repo-bfd9c39e4712ebdb442d4ca0673061faed1e70e1.tar.xz
baldeagleos-repo-bfd9c39e4712ebdb442d4ca0673061faed1e70e1.zip
Revert "Adding metadata"
This reverts commit f716a9fe6455d39eef01e718aae68dae61c19704.
Diffstat (limited to 'app-emulation/cloud-init')
-rw-r--r--app-emulation/cloud-init/Manifest2
-rw-r--r--app-emulation/cloud-init/cloud-init-24.4-r4.ebuild124
-rw-r--r--app-emulation/cloud-init/cloud-init-25.1.ebuild119
-rw-r--r--app-emulation/cloud-init/cloud-init-9999.ebuild119
-rw-r--r--app-emulation/cloud-init/files/cloud-init-24.2-systemd.patch152
-rw-r--r--app-emulation/cloud-init/files/cloud-init-24.4-netcat.patch68
-rw-r--r--app-emulation/cloud-init/metadata.xml15
7 files changed, 599 insertions, 0 deletions
diff --git a/app-emulation/cloud-init/Manifest b/app-emulation/cloud-init/Manifest
new file mode 100644
index 000000000000..7559439b8e29
--- /dev/null
+++ b/app-emulation/cloud-init/Manifest
@@ -0,0 +1,2 @@
+DIST cloud-init-24.4.tar.gz 1871271 BLAKE2B 438d1296a637211d7a43c9969de6d432b1ab787beab7f617426cdeab67d1c1df28e1adfa610af4dad44c7f46850954ad3d1856bfff143648da0f87fbc4ebdefc SHA512 1c6901497848d8be29ffb0a7bcbbd2df89d0a2b35a65c33f3db9562a544d9e832308f448dcc24a555791b40f00aca32e5d25b8ad3ccb5e90dda6268e5a125f9c
+DIST cloud-init-25.1.tar.gz 1892801 BLAKE2B 7efc5cb8d1f3c63c7b22660873f8c62d49a32d4f09a16df41777a6e41555606ebb5186c29f5d20396dfabc190f2034f88517076c5e342cb8bc04249bbfcee4a4 SHA512 2a40234e92bd27e12a48ab6d62c638599d82deaaf9b69d9ba2deed6a8234e16fcd5e35e995c1880d61c2a60fbea7699ae73ea849f2f4153067ef4aa8af1b4adf
diff --git a/app-emulation/cloud-init/cloud-init-24.4-r4.ebuild b/app-emulation/cloud-init/cloud-init-24.4-r4.ebuild
new file mode 100644
index 000000000000..48ddfb02a2e6
--- /dev/null
+++ b/app-emulation/cloud-init/cloud-init-24.4-r4.ebuild
@@ -0,0 +1,124 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{13..14} )
+inherit edo python-single-r1 udev
+
+DESCRIPTION="Cloud instance initialisation magic"
+HOMEPAGE="https://launchpad.net/cloud-init"
+
+if [[ ${PV} == *9999 ]]; then
+ inherit git-r3
+ EGIT_REPO_URI="https://git.launchpad.net/cloud-init"
+else
+ SRC_URI="https://launchpad.net/${PN}/trunk/${PV}/+download/${P}.tar.gz"
+ KEYWORDS="amd64 arm64 ~loong ppc64 x86"
+fi
+
+LICENSE="GPL-3"
+SLOT="0"
+IUSE="selinux test"
+RESTRICT="!test? ( test )"
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+
+COMMON_DEPEND="
+ $(python_gen_cond_dep '
+ dev-python/jinja2[${PYTHON_USEDEP}]
+ dev-python/oauthlib[${PYTHON_USEDEP}]
+ dev-python/pyserial[${PYTHON_USEDEP}]
+ >=dev-python/configobj-5.0.2[${PYTHON_USEDEP}]
+ dev-python/pyyaml[${PYTHON_USEDEP}]
+ dev-python/requests[${PYTHON_USEDEP}]
+ dev-python/jsonpatch[${PYTHON_USEDEP}]
+ dev-python/jsonschema[${PYTHON_USEDEP}]
+ dev-python/netifaces[${PYTHON_USEDEP}]
+ ')
+"
+BDEPEND="
+ ${COMMON_DEPEND}
+ $(python_gen_cond_dep '
+ dev-python/setuptools[${PYTHON_USEDEP}]
+ ')
+ test? (
+ $(python_gen_cond_dep '
+ dev-python/mock[${PYTHON_USEDEP}]
+ dev-python/passlib[${PYTHON_USEDEP}]
+ dev-python/pytest[${PYTHON_USEDEP}]
+ dev-python/pytest-mock[${PYTHON_USEDEP}]
+ dev-python/responses[${PYTHON_USEDEP}]
+ ')
+ )
+"
+RDEPEND="
+ ${COMMON_DEPEND}
+ ${PYTHON_DEPS}
+ net-analyzer/macchanger
+ net-analyzer/openbsd-netcat
+ sys-apps/iproute2
+ sys-fs/growpart
+ virtual/logger
+ selinux? ( sec-policy/selinux-cloudinit )
+"
+
+PATCHES=(
+ "${FILESDIR}/${PN}-24.2-systemd.patch"
+ "${FILESDIR}/${PN}-24.4-netcat.patch"
+)
+
+EPYTEST_IGNORE=(
+ # Can't find file
+ tests/unittests/config/test_apt_configure_sources_list_v1.py
+ tests/unittests/config/test_apt_configure_sources_list_v3.py
+ # PORTAGE_TMPDIR too long for unix sockets
+ tests/unittests/test_all_stages.py
+ # TODO
+ tests/unittests/config/test_schema.py
+)
+
+src_prepare() {
+ default
+
+ # Fix location of documentation installation
+ sed -i "s:USR + \"/share/doc/cloud-init:USR + \"/share/doc/${PF}:" setup.py || die
+
+ if [[ ${PV} == *9999 ]] ; then
+ sed -i 's/version=get_version(),/version=9999,/g' setup.py || die
+ fi
+}
+
+src_compile() {
+ edo ${EPYTHON} setup.py build
+}
+
+src_test() {
+ epytest
+}
+
+src_install() {
+ edo ${EPYTHON} setup.py install \
+ --prefix="${EPREFIX}/usr" \
+ --root="${D}" \
+ --init-system=sysvinit_openrc,systemd \
+ --distro gentoo
+ python_optimize
+
+ keepdir /etc/cloud
+
+ # installs as non-executable
+ chmod +x "${D}"/etc/init.d/* || die
+}
+
+pkg_prerm() {
+ udev_reload
+}
+
+pkg_postinst() {
+ udev_reload
+
+ elog "cloud-init-local needs to be run in the boot runlevel because it"
+ elog "modifies services in the default runlevel. When a runlevel is started"
+ elog "it is cached, so modifications that happen to the current runlevel"
+ elog "while you are in it are not acted upon."
+}
diff --git a/app-emulation/cloud-init/cloud-init-25.1.ebuild b/app-emulation/cloud-init/cloud-init-25.1.ebuild
new file mode 100644
index 000000000000..1ace7c6fae4e
--- /dev/null
+++ b/app-emulation/cloud-init/cloud-init-25.1.ebuild
@@ -0,0 +1,119 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{13..14} )
+inherit edo python-single-r1 udev
+
+DESCRIPTION="Cloud instance initialisation magic"
+HOMEPAGE="https://launchpad.net/cloud-init"
+
+if [[ ${PV} == *9999 ]]; then
+ inherit git-r3
+ EGIT_REPO_URI="https://git.launchpad.net/cloud-init"
+else
+ SRC_URI="https://launchpad.net/${PN}/trunk/${PV}/+download/${P}.tar.gz"
+ KEYWORDS="amd64 arm64 ~loong ppc64 ~riscv x86"
+fi
+
+LICENSE="GPL-3"
+SLOT="0"
+IUSE="selinux test"
+RESTRICT="!test? ( test )"
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+
+COMMON_DEPEND="
+ $(python_gen_cond_dep '
+ dev-python/jinja2[${PYTHON_USEDEP}]
+ dev-python/oauthlib[${PYTHON_USEDEP}]
+ dev-python/pyserial[${PYTHON_USEDEP}]
+ >=dev-python/configobj-5.0.2[${PYTHON_USEDEP}]
+ dev-python/pyyaml[${PYTHON_USEDEP}]
+ dev-python/requests[${PYTHON_USEDEP}]
+ dev-python/jsonpatch[${PYTHON_USEDEP}]
+ dev-python/jsonschema[${PYTHON_USEDEP}]
+ dev-python/netifaces[${PYTHON_USEDEP}]
+ ')
+"
+BDEPEND="
+ ${COMMON_DEPEND}
+ $(python_gen_cond_dep '
+ dev-python/setuptools[${PYTHON_USEDEP}]
+ ')
+ test? (
+ $(python_gen_cond_dep '
+ dev-python/mock[${PYTHON_USEDEP}]
+ dev-python/passlib[${PYTHON_USEDEP}]
+ dev-python/pytest[${PYTHON_USEDEP}]
+ dev-python/pytest-mock[${PYTHON_USEDEP}]
+ dev-python/responses[${PYTHON_USEDEP}]
+ ')
+ )
+"
+RDEPEND="
+ ${COMMON_DEPEND}
+ ${PYTHON_DEPS}
+ net-analyzer/macchanger
+ net-analyzer/openbsd-netcat
+ sys-apps/iproute2
+ sys-fs/growpart
+ virtual/logger
+ selinux? ( sec-policy/selinux-cloudinit )
+"
+
+EPYTEST_IGNORE=(
+ # Can't find file
+ tests/unittests/config/test_apt_configure_sources_list_v1.py
+ tests/unittests/config/test_apt_configure_sources_list_v3.py
+ # PORTAGE_TMPDIR too long for unix sockets
+ tests/unittests/test_all_stages.py
+ # TODO
+ tests/unittests/config/test_schema.py
+)
+
+src_prepare() {
+ default
+
+ # Fix location of documentation installation
+ sed -i "s:USR + \"/share/doc/cloud-init:USR + \"/share/doc/${PF}:" setup.py || die
+
+ if [[ ${PV} == *9999 ]] ; then
+ sed -i 's/version=get_version(),/version=9999,/g' setup.py || die
+ fi
+}
+
+src_compile() {
+ edo ${EPYTHON} setup.py build
+}
+
+src_test() {
+ epytest
+}
+
+src_install() {
+ edo ${EPYTHON} setup.py install \
+ --prefix="${EPREFIX}/usr" \
+ --root="${D}" \
+ --init-system=sysvinit_openrc,systemd \
+ --distro gentoo
+ python_optimize
+
+ keepdir /etc/cloud
+
+ # installs as non-executable
+ chmod +x "${D}"/etc/init.d/* || die
+}
+
+pkg_prerm() {
+ udev_reload
+}
+
+pkg_postinst() {
+ udev_reload
+
+ elog "cloud-init-local needs to be run in the boot runlevel because it"
+ elog "modifies services in the default runlevel. When a runlevel is started"
+ elog "it is cached, so modifications that happen to the current runlevel"
+ elog "while you are in it are not acted upon."
+}
diff --git a/app-emulation/cloud-init/cloud-init-9999.ebuild b/app-emulation/cloud-init/cloud-init-9999.ebuild
new file mode 100644
index 000000000000..663cf91818d6
--- /dev/null
+++ b/app-emulation/cloud-init/cloud-init-9999.ebuild
@@ -0,0 +1,119 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+PYTHON_COMPAT=( python3_{13..14} )
+inherit edo python-single-r1 udev
+
+DESCRIPTION="Cloud instance initialisation magic"
+HOMEPAGE="https://launchpad.net/cloud-init"
+
+if [[ ${PV} == *9999 ]]; then
+ inherit git-r3
+ EGIT_REPO_URI="https://git.launchpad.net/cloud-init"
+else
+ SRC_URI="https://launchpad.net/${PN}/trunk/${PV}/+download/${P}.tar.gz"
+ KEYWORDS="~amd64 ~arm64 ~loong ~ppc64 ~x86"
+fi
+
+LICENSE="GPL-3"
+SLOT="0"
+IUSE="selinux test"
+RESTRICT="!test? ( test )"
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+
+COMMON_DEPEND="
+ $(python_gen_cond_dep '
+ dev-python/jinja2[${PYTHON_USEDEP}]
+ dev-python/oauthlib[${PYTHON_USEDEP}]
+ dev-python/pyserial[${PYTHON_USEDEP}]
+ >=dev-python/configobj-5.0.2[${PYTHON_USEDEP}]
+ dev-python/pyyaml[${PYTHON_USEDEP}]
+ dev-python/requests[${PYTHON_USEDEP}]
+ dev-python/jsonpatch[${PYTHON_USEDEP}]
+ dev-python/jsonschema[${PYTHON_USEDEP}]
+ dev-python/netifaces[${PYTHON_USEDEP}]
+ ')
+"
+BDEPEND="
+ ${COMMON_DEPEND}
+ $(python_gen_cond_dep '
+ dev-python/setuptools[${PYTHON_USEDEP}]
+ ')
+ test? (
+ $(python_gen_cond_dep '
+ dev-python/mock[${PYTHON_USEDEP}]
+ dev-python/passlib[${PYTHON_USEDEP}]
+ dev-python/pytest[${PYTHON_USEDEP}]
+ dev-python/pytest-mock[${PYTHON_USEDEP}]
+ dev-python/responses[${PYTHON_USEDEP}]
+ ')
+ )
+"
+RDEPEND="
+ ${COMMON_DEPEND}
+ ${PYTHON_DEPS}
+ net-analyzer/macchanger
+ net-analyzer/openbsd-netcat
+ sys-apps/iproute2
+ sys-fs/growpart
+ virtual/logger
+ selinux? ( sec-policy/selinux-cloudinit )
+"
+
+EPYTEST_IGNORE=(
+ # Can't find file
+ tests/unittests/config/test_apt_configure_sources_list_v1.py
+ tests/unittests/config/test_apt_configure_sources_list_v3.py
+ # PORTAGE_TMPDIR too long for unix sockets
+ tests/unittests/test_all_stages.py
+ # TODO
+ tests/unittests/config/test_schema.py
+)
+
+src_prepare() {
+ default
+
+ # Fix location of documentation installation
+ sed -i "s:USR + \"/share/doc/cloud-init:USR + \"/share/doc/${PF}:" setup.py || die
+
+ if [[ ${PV} == *9999 ]] ; then
+ sed -i 's/version=get_version(),/version=9999,/g' setup.py || die
+ fi
+}
+
+src_compile() {
+ edo ${EPYTHON} setup.py build
+}
+
+src_test() {
+ epytest
+}
+
+src_install() {
+ edo ${EPYTHON} setup.py install \
+ --prefix="${EPREFIX}/usr" \
+ --root="${D}" \
+ --init-system=sysvinit_openrc,systemd \
+ --distro gentoo
+ python_optimize
+
+ keepdir /etc/cloud
+
+ # installs as non-executable
+ chmod +x "${D}"/etc/init.d/* || die
+}
+
+pkg_prerm() {
+ udev_reload
+}
+
+pkg_postinst() {
+ udev_reload
+
+ elog "cloud-init-local needs to be run in the boot runlevel because it"
+ elog "modifies services in the default runlevel. When a runlevel is started"
+ elog "it is cached, so modifications that happen to the current runlevel"
+ elog "while you are in it are not acted upon."
+}
diff --git a/app-emulation/cloud-init/files/cloud-init-24.2-systemd.patch b/app-emulation/cloud-init/files/cloud-init-24.2-systemd.patch
new file mode 100644
index 000000000000..62840bafe2d3
--- /dev/null
+++ b/app-emulation/cloud-init/files/cloud-init-24.2-systemd.patch
@@ -0,0 +1,152 @@
+From 3f97be6df5c59339e09ff50e97a94869c29741d0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Fri, 6 Dec 2024 22:46:31 +0100
+Subject: [PATCH] feat(gentoo): Add compatibility for Gentoo with systemd
+ (#5918)
+
+---
+ cloudinit/distros/gentoo.py | 37 +++++++++++++++++---------
+ tests/unittests/distros/test_gentoo.py | 34 ++++++++++++++++-------
+ 2 files changed, 48 insertions(+), 23 deletions(-)
+
+diff --git a/cloudinit/distros/gentoo.py b/cloudinit/distros/gentoo.py
+index 5ab41bbd9db..94fa6f7aa01 100644
+--- a/cloudinit/distros/gentoo.py
++++ b/cloudinit/distros/gentoo.py
+@@ -1,8 +1,10 @@
+ # Copyright (C) 2014 Rackspace, US Inc.
+ # Copyright (C) 2016 Matthew Thode.
++# Copyright (C) 2024 Andreas K. Huettel
+ #
+ # Author: Nate House <nathan.house@rackspace.com>
+ # Author: Matthew Thode <prometheanfire@gentoo.org>
++# Author: Andreas K. Huettel <dilfridge@gentoo.org>
+ #
+ # This file is part of cloud-init. See LICENSE file for license information.
+
+@@ -18,7 +20,6 @@
+
+ class Distro(distros.Distro):
+ locale_gen_fn = "/etc/locale.gen"
+- hostname_conf_fn = "/etc/conf.d/hostname"
+ default_locale = "en_US.UTF-8"
+
+ # C.UTF8 makes sense to generate, but is not selected
+@@ -27,20 +28,23 @@ class Distro(distros.Distro):
+
+ def __init__(self, name, cfg, paths):
+ distros.Distro.__init__(self, name, cfg, paths)
++
++ if distros.uses_systemd():
++ self.hostname_conf_fn = "/etc/hostname"
++ else:
++ self.hostname_conf_fn = "/etc/conf.d/hostname"
++
+ # This will be used to restrict certain
+ # calls from repeatedly happening (when they
+ # should only happen say once per instance...)
+ self._runner = helpers.Runners(paths)
+ self.osfamily = "gentoo"
+- # Fix sshd restarts
+- cfg["ssh_svcname"] = "/etc/init.d/sshd"
+- if distros.uses_systemd():
+- LOG.error("Cloud-init does not support systemd with gentoo")
++ if not distros.uses_systemd():
++ # Fix sshd restarts (openrc-specific?)
++ cfg["ssh_svcname"] = "/etc/init.d/sshd"
+
+ def apply_locale(self, _, out_fn=None):
+- """rc-only - not compatible with systemd
+-
+- Locales need to be added to /etc/locale.gen and generated prior
++ """Locales need to be added to /etc/locale.gen and generated prior
+ to selection. Default to en_US.UTF-8 for simplicity.
+ """
+ util.write_file(self.locale_gen_fn, "\n".join(self.locales), mode=644)
+@@ -48,7 +52,7 @@ def apply_locale(self, _, out_fn=None):
+ # generate locales
+ subp.subp(["locale-gen"], capture=False)
+
+- # select locale
++ # select locale, works for both openrc and systemd
+ subp.subp(
+ ["eselect", "locale", "set", self.default_locale], capture=False
+ )
+@@ -77,10 +81,17 @@ def _write_hostname(self, hostname, filename):
+ if not conf:
+ conf = HostnameConf("")
+
+- # Many distro's format is the hostname by itself, and that is the
+- # way HostnameConf works but gentoo expects it to be in
+- # hostname="the-actual-hostname"
+- conf.set_hostname('hostname="%s"' % hostname)
++ if distros.uses_systemd():
++ # Gentoo uses the same format for /etc/hostname as everyone else-
++ # only the hostname by itself. Works for openrc and systemd, but
++ # openrc has its own config file and /etc/hostname is generated.
++ conf.set_hostname(hostname)
++ else:
++ # Openrc generates /etc/hostname from /etc/conf.d/hostname with the
++ # differing format
++ # hostname="the-actual-hostname"
++ conf.set_hostname('hostname="%s"' % hostname)
++
+ util.write_file(filename, str(conf), 0o644)
+
+ def _read_system_hostname(self):
+diff --git a/tests/unittests/distros/test_gentoo.py b/tests/unittests/distros/test_gentoo.py
+index a307b9a29ba..979e6d82638 100644
+--- a/tests/unittests/distros/test_gentoo.py
++++ b/tests/unittests/distros/test_gentoo.py
+@@ -2,27 +2,41 @@
+
+ from cloudinit import atomic_helper, util
+ from tests.unittests.distros import _get_distro
+-from tests.unittests.helpers import CiTestCase
++from tests.unittests.helpers import CiTestCase, mock
+
+
+ class TestGentoo(CiTestCase):
+- def test_write_hostname(self):
++ def test_write_hostname(self, whatever=False):
+ distro = _get_distro("gentoo")
+ hostname = "myhostname"
+ hostfile = self.tmp_path("hostfile")
+ distro._write_hostname(hostname, hostfile)
+- self.assertEqual(
+- 'hostname="myhostname"\n', util.load_text_file(hostfile)
+- )
++ if distro.uses_systemd():
++ self.assertEqual("myhostname\n", util.load_text_file(hostfile))
++ else:
++ self.assertEqual(
++ 'hostname="myhostname"\n', util.load_text_file(hostfile)
++ )
+
+- def test_write_existing_hostname_with_comments(self):
++ def test_write_existing_hostname_with_comments(self, whatever=False):
+ distro = _get_distro("gentoo")
+ hostname = "myhostname"
+ contents = '#This is the hostname\nhostname="localhost"'
+ hostfile = self.tmp_path("hostfile")
+ atomic_helper.write_file(hostfile, contents, omode="w")
+ distro._write_hostname(hostname, hostfile)
+- self.assertEqual(
+- '#This is the hostname\nhostname="myhostname"\n',
+- util.load_text_file(hostfile),
+- )
++ if distro.uses_systemd():
++ self.assertEqual(
++ "#This is the hostname\nmyhostname\n",
++ util.load_text_file(hostfile),
++ )
++ else:
++ self.assertEqual(
++ '#This is the hostname\nhostname="myhostname"\n',
++ util.load_text_file(hostfile),
++ )
++
++
++@mock.patch("cloudinit.distros.uses_systemd", return_value=False)
++class TestGentooOpenRC(TestGentoo):
++ pass
diff --git a/app-emulation/cloud-init/files/cloud-init-24.4-netcat.patch b/app-emulation/cloud-init/files/cloud-init-24.4-netcat.patch
new file mode 100644
index 000000000000..745ce4eaef20
--- /dev/null
+++ b/app-emulation/cloud-init/files/cloud-init-24.4-netcat.patch
@@ -0,0 +1,68 @@
+From 50932590203101f5d8217afc02d8c2b4cecabbd4 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20K=2E=20H=C3=BCttel?= <dilfridge@gentoo.org>
+Date: Sun, 15 Dec 2024 15:12:40 +0100
+Subject: [PATCH] fix: use program name of netcat as installed by upstream,
+ "nc"
+
+---
+ systemd/cloud-config.service | 2 +-
+ systemd/cloud-final.service | 2 +-
+ systemd/cloud-init-local.service.tmpl | 2 +-
+ systemd/cloud-init-network.service.tmpl | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/systemd/cloud-config.service b/systemd/cloud-config.service
+index 54599b346..68f80d2b3 100644
+--- a/systemd/cloud-config.service
++++ b/systemd/cloud-config.service
+@@ -16,7 +16,7 @@ Type=oneshot
+ # process has completed this stage. The output from the return socket is piped
+ # into a shell so that the process can send a completion message (defaults to
+ # "done", otherwise includes an error message) and an exit code to systemd.
+-ExecStart=sh -c 'echo "start" | netcat -Uu -W1 /run/cloud-init/share/config.sock -s /run/cloud-init/share/config-return.sock | sh'
++ExecStart=sh -c 'echo "start" | nc -Uu -W1 /run/cloud-init/share/config.sock -s /run/cloud-init/share/config-return.sock | sh'
+ RemainAfterExit=yes
+ TimeoutSec=0
+
+diff --git a/systemd/cloud-final.service b/systemd/cloud-final.service
+index c48f95c4f..fb74a47c8 100644
+--- a/systemd/cloud-final.service
++++ b/systemd/cloud-final.service
+@@ -19,7 +19,7 @@ Type=oneshot
+ # process has completed this stage. The output from the return socket is piped
+ # into a shell so that the process can send a completion message (defaults to
+ # "done", otherwise includes an error message) and an exit code to systemd.
+-ExecStart=sh -c 'echo "start" | netcat -Uu -W1 /run/cloud-init/share/final.sock -s /run/cloud-init/share/final-return.sock | sh'
++ExecStart=sh -c 'echo "start" | nc -Uu -W1 /run/cloud-init/share/final.sock -s /run/cloud-init/share/final-return.sock | sh'
+ RemainAfterExit=yes
+ TimeoutSec=0
+ TasksMax=infinity
+diff --git a/systemd/cloud-init-local.service.tmpl b/systemd/cloud-init-local.service.tmpl
+index e6a300fd4..b123193a1 100644
+--- a/systemd/cloud-init-local.service.tmpl
++++ b/systemd/cloud-init-local.service.tmpl
+@@ -32,7 +32,7 @@ ExecStartPre=/sbin/restorecon /run/cloud-init
+ # process has completed this stage. The output from the return socket is piped
+ # into a shell so that the process can send a completion message (defaults to
+ # "done", otherwise includes an error message) and an exit code to systemd.
+-ExecStart=sh -c 'echo "start" | netcat -Uu -W1 /run/cloud-init/share/local.sock -s /run/cloud-init/share/local-return.sock | sh'
++ExecStart=sh -c 'echo "start" | nc -Uu -W1 /run/cloud-init/share/local.sock -s /run/cloud-init/share/local-return.sock | sh'
+ RemainAfterExit=yes
+ TimeoutSec=0
+
+diff --git a/systemd/cloud-init-network.service.tmpl b/systemd/cloud-init-network.service.tmpl
+index af09fff35..bdc7c8f83 100644
+--- a/systemd/cloud-init-network.service.tmpl
++++ b/systemd/cloud-init-network.service.tmpl
+@@ -53,7 +53,7 @@ Type=oneshot
+ # process has completed this stage. The output from the return socket is piped
+ # into a shell so that the process can send a completion message (defaults to
+ # "done", otherwise includes an error message) and an exit code to systemd.
+-ExecStart=sh -c 'echo "start" | netcat -Uu -W1 /run/cloud-init/share/network.sock -s /run/cloud-init/share/network-return.sock | sh'
++ExecStart=sh -c 'echo "start" | nc -Uu -W1 /run/cloud-init/share/network.sock -s /run/cloud-init/share/network-return.sock | sh'
+ RemainAfterExit=yes
+ TimeoutSec=0
+
+--
+2.45.2
+
diff --git a/app-emulation/cloud-init/metadata.xml b/app-emulation/cloud-init/metadata.xml
new file mode 100644
index 000000000000..a754b254be6b
--- /dev/null
+++ b/app-emulation/cloud-init/metadata.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="person">
+ <email>prometheanfire@gentoo.org</email>
+ <name>Matthew Thode</name>
+ </maintainer>
+ <longdescription lang="en">
+ Cloud-init is the industry standard multi-distribution method for cross-platform cloud instance initialization. It is supported across all major public cloud providers, provisioning systems for private cloud infrastructure, and bare-metal installations.
+ </longdescription>
+ <upstream>
+ <remote-id type="launchpad">cloud-init</remote-id>
+ <remote-id type="github">canonical/cloud-init</remote-id>
+ </upstream>
+</pkgmetadata>