summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin H. Johnson <robbat2@gentoo.org>2015-08-08 13:49:04 -0700
committerRobin H. Johnson <robbat2@gentoo.org>2015-08-08 17:38:18 -0700
commit56bd759df1d0c750a065b8c845e93d5dfa6b549d (patch)
tree3f91093cdb475e565ae857f1c5a7fd339e2d781e /app-emulation/cloud-init
downloadgentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.gz
gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.tar.bz2
gentoo-56bd759df1d0c750a065b8c845e93d5dfa6b549d.zip
proj/gentoo: Initial commit
This commit represents a new era for Gentoo: Storing the gentoo-x86 tree in Git, as converted from CVS. This commit is the start of the NEW history. Any historical data is intended to be grafted onto this point. Creation process: 1. Take final CVS checkout snapshot 2. Remove ALL ChangeLog* files 3. Transform all Manifests to thin 4. Remove empty Manifests 5. Convert all stale $Header$/$Id$ CVS keywords to non-expanded Git $Id$ 5.1. Do not touch files with -kb/-ko keyword flags. Signed-off-by: Robin H. Johnson <robbat2@gentoo.org> X-Thanks: Alec Warner <antarus@gentoo.org> - did the GSoC 2006 migration tests X-Thanks: Robin H. Johnson <robbat2@gentoo.org> - infra guy, herding this project X-Thanks: Nguyen Thai Ngoc Duy <pclouds@gentoo.org> - Former Gentoo developer, wrote Git features for the migration X-Thanks: Brian Harring <ferringb@gentoo.org> - wrote much python to improve cvs2svn X-Thanks: Rich Freeman <rich0@gentoo.org> - validation scripts X-Thanks: Patrick Lauer <patrick@gentoo.org> - Gentoo dev, running new 2014 work in migration X-Thanks: Michał Górny <mgorny@gentoo.org> - scripts, QA, nagging X-Thanks: All of other Gentoo developers - many ideas and lots of paint on the bikeshed
Diffstat (limited to 'app-emulation/cloud-init')
-rw-r--r--app-emulation/cloud-init/Manifest2
-rw-r--r--app-emulation/cloud-init/cloud-init-0.7.5-r1.ebuild52
-rw-r--r--app-emulation/cloud-init/cloud-init-0.7.5-r2.ebuild84
-rw-r--r--app-emulation/cloud-init/cloud-init-0.7.5-r3.ebuild88
-rw-r--r--app-emulation/cloud-init/cloud-init-0.7.6-r1.ebuild105
-rw-r--r--app-emulation/cloud-init/cloud-init-0.7.6.ebuild98
-rw-r--r--app-emulation/cloud-init/files/cloud-init-0.7.5-tests-exclude.patch12
-rw-r--r--app-emulation/cloud-init/files/cloud.cfg79
-rwxr-xr-xapp-emulation/cloud-init/files/growpart778
-rw-r--r--app-emulation/cloud-init/files/hosts.gentoo.tmpl23
-rw-r--r--app-emulation/cloud-init/metadata.xml19
11 files changed, 1340 insertions, 0 deletions
diff --git a/app-emulation/cloud-init/Manifest b/app-emulation/cloud-init/Manifest
new file mode 100644
index 00000000000..93c02cdc8f4
--- /dev/null
+++ b/app-emulation/cloud-init/Manifest
@@ -0,0 +1,2 @@
+DIST cloud-init-0.7.5.tar.gz 503717 SHA256 a92bb83809c139a7db378916414c18b0819e306852d6c60dd89388868857ed33 SHA512 79e1e4a9e1130a3a9deb0482278215baf5ed41e02beebed0a2c6fac4e215340a9537158bd259758a2e074f334c0c0b9e7b936c23eeb9c848c67f7e7835cf0f5d WHIRLPOOL 7d92a0e1b6a3faf550bc442b02c117280c47d160e7e318d9fb859d6d8b59a0ef947d057dfb615bd925420a25ca28852742ee87ffd6066664faf640ca53a13073
+DIST cloud-init-0.7.6.tar.gz 515670 SHA256 9e8fd22eb7f6e40ae6a5f66173ddc3cc18f65ee406c460a728092b37db2f3ed7 SHA512 aa2397328afda8e77ed6d642e7642f41a4b4b5bcd3d0e87056aa8c88b56624ec65c57cfc66b0d13ccc235f1840baf1d577316974902a0439cf2f2eb0f8eef36d WHIRLPOOL 639a556e51b4b4b180951f9e481f9a0dcd45067d1d5760ce7e871ceea8bbb4e195258d96273d3ef88c7e2f2520318e9172c3ad0cb23d6ad0ae1835e17087e3a5
diff --git a/app-emulation/cloud-init/cloud-init-0.7.5-r1.ebuild b/app-emulation/cloud-init/cloud-init-0.7.5-r1.ebuild
new file mode 100644
index 00000000000..2b8007b430d
--- /dev/null
+++ b/app-emulation/cloud-init/cloud-init-0.7.5-r1.ebuild
@@ -0,0 +1,52 @@
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+PYTHON_COMPAT=( python2_7 )
+
+inherit distutils-r1 eutils multilib
+
+DESCRIPTION="Package provides configuration and customization of cloud instance"
+HOMEPAGE="https://launchpad.net/cloud-init"
+SRC_URI="http://launchpad.net/${PN}/trunk/${PV}/+download/${P}.tar.gz"
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE="test"
+
+RDEPEND="dev-python/cheetah[${PYTHON_USEDEP}]
+ >=dev-python/prettytable-0.7.1[${PYTHON_USEDEP}]
+ dev-python/oauth[${PYTHON_USEDEP}]
+ dev-python/pyserial[${PYTHON_USEDEP}]
+ dev-python/configobj[${PYTHON_USEDEP}]
+ dev-python/pyyaml[${PYTHON_USEDEP}]
+ dev-python/requests[${PYTHON_USEDEP}]
+ dev-python/jsonpatch[${PYTHON_USEDEP}]"
+DEPEND="dev-python/setuptools[${PYTHON_USEDEP}]
+ test? ( ${RDEPEND}
+ sys-apps/iproute2 )"
+
+PATCHES=( "${FILESDIR}"/${P}-tests-exclude.patch )
+
+#python_prepare_all() {
+# distutils-r_python_prepare_all
+#}
+
+python_test() {
+ # These tests are not broken but expect to locate an installed exe file
+ # other than where a gentoo system installs it; (/bin/ip sought in /sbin)
+ # See cloudinit/sources/DataSourceOpenNebula.py for possible patching
+ sed -e 's:test_hostname:_&:' \
+ -e 's:test_network_interfaces:_&:' \
+ -i tests/unittests/test_datasource/test_opennebula.py
+ emake test
+}
+
+python_install() {
+ distutils-r1_python_install
+ for svc in config final init init-local; do
+ newinitd "${WORKDIR}/${P}/sysvinit/gentoo/cloud-${svc}" "cloud-${svc}"
+ done
+}
diff --git a/app-emulation/cloud-init/cloud-init-0.7.5-r2.ebuild b/app-emulation/cloud-init/cloud-init-0.7.5-r2.ebuild
new file mode 100644
index 00000000000..6d04f898d9c
--- /dev/null
+++ b/app-emulation/cloud-init/cloud-init-0.7.5-r2.ebuild
@@ -0,0 +1,84 @@
+# Copyright 1999-2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+PYTHON_COMPAT=( python2_7 )
+DISTUTILS_SINGLE_IMPL=TRUE
+
+inherit distutils-r1 eutils multilib systemd
+
+DESCRIPTION="Cloud instance initialization"
+HOMEPAGE="http://launchpad.net/cloud-init"
+SRC_URI="http://launchpad.net/${PN}/trunk/${PV}/+download/${P}.tar.gz"
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE="test"
+
+CDEPEND="
+ dev-python/cheetah[${PYTHON_USEDEP}]
+ dev-python/configobj[${PYTHON_USEDEP}]
+ dev-python/jsonpatch[${PYTHON_USEDEP}]
+ dev-python/oauth[${PYTHON_USEDEP}]
+ >=dev-python/prettytable-0.7.1[${PYTHON_USEDEP}]
+ dev-python/pyserial[${PYTHON_USEDEP}]
+ dev-python/pyyaml[${PYTHON_USEDEP}]
+ dev-python/requests[${PYTHON_USEDEP}]
+"
+DEPEND="
+ test? (
+ ${CDEPEND}
+ >=dev-python/httpretty-0.7.1[${PYTHON_USEDEP}]
+ dev-python/mocker[${PYTHON_USEDEP}]
+ dev-python/nose[${PYTHON_USEDEP}]
+ dev-python/pep8[${PYTHON_USEDEP}]
+ dev-python/pyflakes[${PYTHON_USEDEP}]
+ dev-python/pylint[${PYTHON_USEDEP}]
+ sys-apps/iproute2
+ )
+"
+RDEPEND="
+ ${CDEPEND}
+ virtual/logger
+"
+
+python_prepare_all() {
+ local PATCHES=(
+ "${FILESDIR}"/${P}-tests-exclude.patch
+ )
+
+ distutils-r1_python_prepare_all
+
+ # Skip SmartOS tests since they don't generally apply and don't skip based
+ # on environment. Documented in bug #511384.
+ rm tests/unittests/test_datasource/test_smartos.py
+}
+
+python_test() {
+ # These tests are not broken but expect to locate an installed exe file
+ # other than where a gentoo system installs it; (/bin/ip sought in /sbin)
+ # See cloudinit/sources/DataSourceOpenNebula.py for possible patching
+ sed \
+ -e 's:test_hostname:_&:' \
+ -e 's:test_network_interfaces:_&:' \
+ -i tests/unittests/test_datasource/test_opennebula.py
+
+ emake test
+}
+
+python_install_all() {
+ distutils-r1_python_install_all
+
+ doinitd "${S}"/sysvinit/gentoo/cloud-config
+ doinitd "${S}"/sysvinit/gentoo/cloud-final
+ doinitd "${S}"/sysvinit/gentoo/cloud-init
+ doinitd "${S}"/sysvinit/gentoo/cloud-init-local
+
+ systemd_dounit "${S}"/systemd/cloud-config.service
+ systemd_dounit "${S}"/systemd/cloud-config.target
+ systemd_dounit "${S}"/systemd/cloud-final.service
+ systemd_dounit "${S}"/systemd/cloud-init-local.service
+ systemd_dounit "${S}"/systemd/cloud-init.service
+}
diff --git a/app-emulation/cloud-init/cloud-init-0.7.5-r3.ebuild b/app-emulation/cloud-init/cloud-init-0.7.5-r3.ebuild
new file mode 100644
index 00000000000..a30aedd0c2f
--- /dev/null
+++ b/app-emulation/cloud-init/cloud-init-0.7.5-r3.ebuild
@@ -0,0 +1,88 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+PYTHON_COMPAT=( python2_7 )
+DISTUTILS_SINGLE_IMPL=TRUE
+
+inherit distutils-r1 eutils multilib systemd
+
+DESCRIPTION="Cloud instance initialization"
+HOMEPAGE="http://launchpad.net/cloud-init"
+SRC_URI="http://launchpad.net/${PN}/trunk/${PV}/+download/${P}.tar.gz"
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE="test"
+
+CDEPEND="
+ dev-python/cheetah[${PYTHON_USEDEP}]
+ dev-python/configobj[${PYTHON_USEDEP}]
+ dev-python/jsonpatch[${PYTHON_USEDEP}]
+ dev-python/oauth[${PYTHON_USEDEP}]
+ >=dev-python/prettytable-0.7.1[${PYTHON_USEDEP}]
+ dev-python/pyserial[${PYTHON_USEDEP}]
+ dev-python/pyyaml[${PYTHON_USEDEP}]
+ dev-python/requests[${PYTHON_USEDEP}]
+"
+DEPEND="
+ test? (
+ ${CDEPEND}
+ >=dev-python/httpretty-0.7.1[${PYTHON_USEDEP}]
+ dev-python/mocker[${PYTHON_USEDEP}]
+ dev-python/nose[${PYTHON_USEDEP}]
+ dev-python/pep8[${PYTHON_USEDEP}]
+ dev-python/pyflakes[${PYTHON_USEDEP}]
+ dev-python/pylint[${PYTHON_USEDEP}]
+ sys-apps/iproute2
+ )
+"
+RDEPEND="
+ ${CDEPEND}
+ virtual/logger
+"
+
+python_prepare_all() {
+ local PATCHES=(
+ "${FILESDIR}"/${P}-tests-exclude.patch
+ )
+
+ distutils-r1_python_prepare_all
+
+ # Skip SmartOS tests since they don't generally apply and don't skip based
+ # on environment. Documented in bug #511384.
+ rm tests/unittests/test_datasource/test_smartos.py
+}
+
+python_test() {
+ # These tests are not broken but expect to locate an installed exe file
+ # other than where a gentoo system installs it; (/bin/ip sought in /sbin)
+ # See cloudinit/sources/DataSourceOpenNebula.py for possible patching
+ sed \
+ -e 's:test_hostname:_&:' \
+ -e 's:test_network_interfaces:_&:' \
+ -i tests/unittests/test_datasource/test_opennebula.py
+
+ emake test
+}
+
+python_install_all() {
+ distutils-r1_python_install_all
+
+ doinitd "${S}"/sysvinit/gentoo/cloud-config
+ doinitd "${S}"/sysvinit/gentoo/cloud-final
+ doinitd "${S}"/sysvinit/gentoo/cloud-init
+ doinitd "${S}"/sysvinit/gentoo/cloud-init-local
+
+ systemd_dounit "${S}"/systemd/cloud-config.service
+ systemd_dounit "${S}"/systemd/cloud-config.target
+ systemd_dounit "${S}"/systemd/cloud-final.service
+ systemd_dounit "${S}"/systemd/cloud-init-local.service
+ systemd_dounit "${S}"/systemd/cloud-init.service
+
+ rm /etc/cloud/cloud.cfg
+ insinto /etc/cloud
+ doins "${FILESDIR}/cloud.cfg"
+}
diff --git a/app-emulation/cloud-init/cloud-init-0.7.6-r1.ebuild b/app-emulation/cloud-init/cloud-init-0.7.6-r1.ebuild
new file mode 100644
index 00000000000..e6f4ac9b48c
--- /dev/null
+++ b/app-emulation/cloud-init/cloud-init-0.7.6-r1.ebuild
@@ -0,0 +1,105 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+PYTHON_COMPAT=( python2_7 )
+
+inherit distutils-r1 eutils multilib systemd
+
+DESCRIPTION="EC2 initialisation magic"
+HOMEPAGE="http://launchpad.net/cloud-init"
+SRC_URI="http://launchpad.net/${PN}/trunk/${PV}/+download/${P}.tar.gz"
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE="test"
+
+CDEPEND="
+ dev-python/cheetah[${PYTHON_USEDEP}]
+ dev-python/configobj[${PYTHON_USEDEP}]
+ dev-python/jinja[${PYTHON_USEDEP}]
+ dev-python/jsonpatch[${PYTHON_USEDEP}]
+ dev-python/oauth[${PYTHON_USEDEP}]
+ dev-python/prettytable[${PYTHON_USEDEP}]
+ dev-python/pyserial[${PYTHON_USEDEP}]
+ dev-python/pyyaml[${PYTHON_USEDEP}]
+ dev-python/requests[${PYTHON_USEDEP}]
+"
+DEPEND="
+ dev-python/setuptools[${PYTHON_USEDEP}]
+ test? (
+ ${CDEPEND}
+ >=dev-python/httpretty-0.7.1[${PYTHON_USEDEP}]
+ dev-python/mocker[${PYTHON_USEDEP}]
+ dev-python/nose[${PYTHON_USEDEP}]
+ ~dev-python/pep8-1.5.7[${PYTHON_USEDEP}]
+ dev-python/pyflakes[${PYTHON_USEDEP}]
+ sys-apps/iproute2
+ )
+"
+RDEPEND="
+ ${CDEPEND}
+ sys-apps/gptfdisk
+ virtual/logger
+"
+
+python_prepare_all() {
+ # Note: Gentoo places ip in /sbin/ not /bin/
+ ebegin 'patching cloudinit/sources/DataSourceOpenNebula.py'
+ sed \
+ -e '438s/sbin/bin/' \
+ -i cloudinit/sources/DataSourceOpenNebula.py
+ STATUS=$?
+ eend ${STATUS}
+ [[ ${STATUS} -gt 0 ]] && die
+
+ # https://bugs.launchpad.net/cloud-init/+bug/1380424
+ ebegin 'patching tests/unittests/test_distros/test_netconfig.py'
+ sed \
+ -e '177s/test_simple_write_freebsd/_&/' \
+ -i tests/unittests/test_distros/test_netconfig.py
+ STATUS=$?
+ eend ${STATUS}
+ [[ ${STATUS} -gt 0 ]] && die
+
+ # Note Gentoo installs its own RC files
+ ebegin 'patching setup.py'
+ sed \
+ -e "144 s/'tests'/'tests.*', &/" \
+ -e '163,167 d' \
+ -i setup.py
+ STATUS=$?
+ eend ${STATUS}
+ [[ ${STATUS} -gt 0 ]] && die
+
+ distutils-r1_python_prepare_all
+}
+
+python_test() {
+ emake test
+}
+
+python_install_all() {
+ keepdir /etc/cloud
+
+ distutils-r1_python_install_all
+
+ doinitd "${S}"/sysvinit/gentoo/cloud-config
+ doinitd "${S}"/sysvinit/gentoo/cloud-final
+ doinitd "${S}"/sysvinit/gentoo/cloud-init
+ doinitd "${S}"/sysvinit/gentoo/cloud-init-local
+ insinto /etc/cloud/templates
+ doins "${FILESDIR}/hosts.gentoo.tmpl"
+ exeinto /usr/bin
+ doexe "${FILESDIR}/growpart"
+ insinto /etc/cloud
+ doins "${FILESDIR}/cloud.cfg"
+
+ systemd_dounit "${S}"/systemd/cloud-config.service
+ systemd_dounit "${S}"/systemd/cloud-config.target
+ systemd_dounit "${S}"/systemd/cloud-final.service
+ systemd_dounit "${S}"/systemd/cloud-init-local.service
+ systemd_dounit "${S}"/systemd/cloud-init.service
+}
diff --git a/app-emulation/cloud-init/cloud-init-0.7.6.ebuild b/app-emulation/cloud-init/cloud-init-0.7.6.ebuild
new file mode 100644
index 00000000000..07a19188176
--- /dev/null
+++ b/app-emulation/cloud-init/cloud-init-0.7.6.ebuild
@@ -0,0 +1,98 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+PYTHON_COMPAT=( python2_7 )
+
+inherit distutils-r1 eutils multilib systemd
+
+DESCRIPTION="EC2 initialisation magic"
+HOMEPAGE="http://launchpad.net/cloud-init"
+SRC_URI="http://launchpad.net/${PN}/trunk/${PV}/+download/${P}.tar.gz"
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="amd64 x86"
+IUSE="test"
+
+CDEPEND="
+ dev-python/cheetah[${PYTHON_USEDEP}]
+ dev-python/configobj[${PYTHON_USEDEP}]
+ dev-python/jinja[${PYTHON_USEDEP}]
+ dev-python/jsonpatch[${PYTHON_USEDEP}]
+ dev-python/oauth[${PYTHON_USEDEP}]
+ dev-python/prettytable[${PYTHON_USEDEP}]
+ dev-python/pyserial[${PYTHON_USEDEP}]
+ dev-python/pyyaml[${PYTHON_USEDEP}]
+ dev-python/requests[${PYTHON_USEDEP}]
+"
+DEPEND="
+ dev-python/setuptools[${PYTHON_USEDEP}]
+ test? (
+ ${CDEPEND}
+ >=dev-python/httpretty-0.7.1[${PYTHON_USEDEP}]
+ dev-python/mocker[${PYTHON_USEDEP}]
+ dev-python/nose[${PYTHON_USEDEP}]
+ ~dev-python/pep8-1.5.7[${PYTHON_USEDEP}]
+ dev-python/pyflakes[${PYTHON_USEDEP}]
+ sys-apps/iproute2
+ )
+"
+RDEPEND="
+ ${CDEPEND}
+ virtual/logger
+"
+
+python_prepare_all() {
+ # Note: Gentoo places ip in /sbin/ not /bin/
+ ebegin 'patching cloudinit/sources/DataSourceOpenNebula.py'
+ sed \
+ -e '438s/sbin/bin/' \
+ -i cloudinit/sources/DataSourceOpenNebula.py
+ STATUS=$?
+ eend ${STATUS}
+ [[ ${STATUS} -gt 0 ]] && die
+
+ # https://bugs.launchpad.net/cloud-init/+bug/1380424
+ ebegin 'patching tests/unittests/test_distros/test_netconfig.py'
+ sed \
+ -e '177s/test_simple_write_freebsd/_&/' \
+ -i tests/unittests/test_distros/test_netconfig.py
+ STATUS=$?
+ eend ${STATUS}
+ [[ ${STATUS} -gt 0 ]] && die
+
+ # Note Gentoo installs its own RC files
+ ebegin 'patching setup.py'
+ sed \
+ -e "144 s/'tests'/'tests.*', &/" \
+ -e '163,167 d' \
+ -i setup.py
+ STATUS=$?
+ eend ${STATUS}
+ [[ ${STATUS} -gt 0 ]] && die
+
+ distutils-r1_python_prepare_all
+}
+
+python_test() {
+ emake test
+}
+
+python_install_all() {
+ keepdir /etc/cloud
+
+ distutils-r1_python_install_all
+
+ doinitd "${S}"/sysvinit/gentoo/cloud-config
+ doinitd "${S}"/sysvinit/gentoo/cloud-final
+ doinitd "${S}"/sysvinit/gentoo/cloud-init
+ doinitd "${S}"/sysvinit/gentoo/cloud-init-local
+
+ systemd_dounit "${S}"/systemd/cloud-config.service
+ systemd_dounit "${S}"/systemd/cloud-config.target
+ systemd_dounit "${S}"/systemd/cloud-final.service
+ systemd_dounit "${S}"/systemd/cloud-init-local.service
+ systemd_dounit "${S}"/systemd/cloud-init.service
+}
diff --git a/app-emulation/cloud-init/files/cloud-init-0.7.5-tests-exclude.patch b/app-emulation/cloud-init/files/cloud-init-0.7.5-tests-exclude.patch
new file mode 100644
index 00000000000..225f1a1d76c
--- /dev/null
+++ b/app-emulation/cloud-init/files/cloud-init-0.7.5-tests-exclude.patch
@@ -0,0 +1,12 @@
+diff -ur cloud-init-0.7.5.orig/setup.py cloud-init-0.7.5/setup.py
+--- setup.py 2014-04-02 02:26:07.000000000 +0800
++++ setup.py 2014-05-01 23:38:15.848225975 +0800
+@@ -114,7 +114,7 @@
+ author='Scott Moser',
+ author_email='scott.moser@canonical.com',
+ url='http://launchpad.net/cloud-init/',
+- packages=setuptools.find_packages(exclude=['tests']),
++ packages=setuptools.find_packages(exclude=['tests','tests.*']),
+ scripts=['bin/cloud-init',
+ 'tools/cloud-init-per',
+ ],
diff --git a/app-emulation/cloud-init/files/cloud.cfg b/app-emulation/cloud-init/files/cloud.cfg
new file mode 100644
index 00000000000..d62e3a22241
--- /dev/null
+++ b/app-emulation/cloud-init/files/cloud.cfg
@@ -0,0 +1,79 @@
+# The top level settings are used as module
+# and system configuration.
+
+# A set of users which may be applied and/or used by various modules
+# when a 'default' entry is found it will reference the 'default_user'
+# from the distro configuration specified below
+users:
+ - default
+
+# If this is set, 'root' will not be able to ssh in and they
+# will get a message to login instead as the above $user (ubuntu)
+disable_root: true
+ssh_pwauth: false
+
+# This will cause the set+update hostname module to not operate (if true)
+# preserve_hostname: false
+
+syslog_fix_perms: root:root
+
+ssh_deletekeys: false
+ssh_genkeytypes: [rsa, dsa]
+
+cloud_init_modules:
+ - seed_random
+ - bootcmd
+ - write-files
+ - growpart
+ - resizefs
+ - set_hostname
+ - update_hostname
+ - update_etc_hosts
+ - ca-certs
+ - users-groups
+ - ssh
+
+cloud_config_modules:
+ - disk_setup
+ - mounts
+ - ssh-import-id
+ - set-passwords
+ - timezone
+ - puppet
+ - chef
+ - salt-minion
+ - mcollective
+ - disable-ec2-metadata
+ - runcmd
+
+cloud_final_modules:
+ - scripts-vendor
+ - scripts-per-once
+ - scripts-per-boot
+ - scripts-per-instance
+ - scripts-user
+ - ssh-authkey-fingerprints
+ - keys-to-console
+ - phone-home
+ - final-message
+ - power-state-change
+
+# System and/or distro specific settings
+# (not accessible to handlers/transforms)
+system_info:
+ # This will affect which distro class gets used
+ distro: gentoo
+ # Default user name + that default users groups (if added/used)
+ default_user:
+ name: gentoo
+ lock_passwd: True
+ gecos: Gentoo
+ groups: [users, wheel]
+ primary_group: users
+ no-user-group: true
+ sudo: ["ALL=(ALL) NOPASSWD:ALL"]
+ shell: /bin/bash
+ # Other config here will be given to the distro class and/or path classes
+ paths:
+ cloud_dir: /var/lib/cloud/
+ templates_dir: /etc/cloud/templates/
diff --git a/app-emulation/cloud-init/files/growpart b/app-emulation/cloud-init/files/growpart
new file mode 100755
index 00000000000..4b67d8b9082
--- /dev/null
+++ b/app-emulation/cloud-init/files/growpart
@@ -0,0 +1,778 @@
+#!/bin/sh
+# Copyright (C) 2011 Canonical Ltd.
+# Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Authors: Scott Moser <smoser@canonical.com>
+# Juerg Haefliger <juerg.haefliger@hp.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# the fudge factor. if within this many bytes dont bother
+FUDGE=${GROWPART_FUDGE:-$((1024*1024))}
+TEMP_D=""
+RESTORE_FUNC=""
+RESTORE_HUMAN=""
+VERBOSITY=0
+DISK=""
+PART=""
+PT_UPDATE=false
+DRY_RUN=0
+
+SFDISK_VERSION=""
+SFDISK_2_26="22600"
+MBR_BACKUP=""
+GPT_BACKUP=""
+_capture=""
+
+error() {
+ echo "$@" 1>&2
+}
+
+fail() {
+ [ $# -eq 0 ] || echo "FAILED:" "$@"
+ exit 2
+}
+
+nochange() {
+ echo "NOCHANGE:" "$@"
+ exit 1
+}
+
+changed() {
+ echo "CHANGED:" "$@"
+ exit 0
+}
+
+change() {
+ echo "CHANGE:" "$@"
+ exit 0
+}
+
+cleanup() {
+ if [ -n "${RESTORE_FUNC}" ]; then
+ error "***** WARNING: Resize failed, attempting to revert ******"
+ if ${RESTORE_FUNC} ; then
+ error "***** Appears to have gone OK ****"
+ else
+ error "***** FAILED! ******"
+ if [ -n "${RESTORE_HUMAN}" -a -f "${RESTORE_HUMAN}" ]; then
+ error "**** original table looked like: ****"
+ cat "${RESTORE_HUMAN}" 1>&2
+ else
+ error "We seem to have not saved the partition table!"
+ fi
+ fi
+ fi
+ [ -z "${TEMP_D}" -o ! -d "${TEMP_D}" ] || rm -Rf "${TEMP_D}"
+}
+
+debug() {
+ local level=${1}
+ shift
+ [ "${level}" -gt "${VERBOSITY}" ] && return
+ if [ "${DEBUG_LOG}" ]; then
+ echo "$@" >>"${DEBUG_LOG}"
+ else
+ error "$@"
+ fi
+}
+
+debugcat() {
+ local level="$1"
+ shift;
+ [ "${level}" -gt "$VERBOSITY" ] && return
+ if [ "${DEBUG_LOG}" ]; then
+ cat "$@" >>"${DEBUG_LOG}"
+ else
+ cat "$@" 1>&2
+ fi
+}
+
+mktemp_d() {
+ # just a mktemp -d that doens't need mktemp if its not there.
+ _RET=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXX" 2>/dev/null) &&
+ return
+ _RET=$(umask 077 && t="${TMPDIR:-/tmp}/${0##*/}.$$" &&
+ mkdir "${t}" && echo "${t}")
+ return
+}
+
+Usage() {
+ cat <<EOF
+${0##*/} disk partition
+ rewrite partition table so that partition takes up all the space it can
+ options:
+ -h | --help print Usage and exit
+ --fudge F if part could be resized, but change would be
+ less than 'F' bytes, do not resize (default: ${FUDGE})
+ -N | --dry-run only report what would be done, show new 'sfdisk -d'
+ -v | --verbose increase verbosity / debug
+ -u | --update R update the the kernel partition table info after growing
+ this requires kernel support and 'partx --update'
+ R is one of:
+ - 'auto' : [default] update partition if possible
+ - 'force' : try despite sanity checks (fail on failure)
+ - 'off' : do not attempt
+ - 'on' : fail if sanity checks indicate no support
+
+ Example:
+ - ${0##*/} /dev/sda 1
+ Resize partition 1 on /dev/sda
+EOF
+}
+
+bad_Usage() {
+ Usage 1>&2
+ error "$@"
+ exit 2
+}
+
+sfdisk_restore_legacy() {
+ sfdisk --no-reread "${DISK}" -I "${MBR_BACKUP}"
+}
+
+sfdisk_restore() {
+ # files are named: sfdisk-<device>-<offset>.bak
+ local f="" offset="" fails=0
+ for f in "${MBR_BACKUP}"*.bak; do
+ [ -f "$f" ] || continue
+ offset=${f##*-}
+ offset=${offset%.bak}
+ [ "$offset" = "$f" ] && {
+ error "WARN: confused by file $f";
+ continue;
+ }
+ dd "if=$f" "of=${DISK}" seek=$(($offset)) bs=1 conv=notrunc ||
+ { error "WARN: failed restore from $f"; fails=$(($fails+1)); }
+ done
+ return $fails
+}
+
+sfdisk_worked_but_blkrrpart_failed() {
+ local ret="$1" output="$2"
+ # exit code found was just 1, but dont insist on that
+ #[ $ret -eq 1 ] || return 1
+ # Successfully wrote the new partition table
+ grep -qi "Success.* wrote.* new.* partition" "$output" &&
+ grep -qi "BLKRRPART: Device or resource busy" "$output"
+ return
+}
+
+get_sfdisk_version() {
+ # set SFDISK_VERSION to MAJOR*10000+MINOR*100+MICRO
+ local out oifs="$IFS" ver=""
+ [ -n "$SFDISK_VERSION" ] && return 0
+ # expected output: sfdisk from util-linux 2.25.2
+ out=$(sfdisk --version) ||
+ { error "failed to get sfdisk version"; return 1; }
+ set -- $out
+ ver=$4
+ case "$ver" in
+ [0-9]*.[0-9]*.[0-9]|[0-9].[0-9]*)
+ IFS="."; set -- $ver; IFS="$oifs"
+ SFDISK_VERSION=$(($1*10000+$2*100+${3:-0}))
+ return 0;;
+ *) error "unexpected output in sfdisk --version [$out]"
+ return 1;;
+ esac
+}
+
+resize_sfdisk() {
+ local humanpt="${TEMP_D}/recovery"
+ local mbr_backup="${TEMP_D}/orig.save"
+ local restore_func=""
+ local format="$1"
+
+ local change_out=${TEMP_D}/change.out
+ local dump_out=${TEMP_D}/dump.out
+ local new_out=${TEMP_D}/new.out
+ local dump_mod=${TEMP_D}/dump.mod
+ local tmp="${TEMP_D}/tmp.out"
+ local err="${TEMP_D}/err.out"
+ local mbr_max_512="4294967296"
+
+ local pt_start pt_size pt_end max_end new_size change_info dpart
+ local sector_num sector_size disk_size tot out
+
+ rqe sfd_list sfdisk --list --unit=S "$DISK" >"$tmp" ||
+ fail "failed: sfdisk --list $DISK"
+ if [ "${SFDISK_VERSION}" -lt ${SFDISK_2_26} ]; then
+ # exected output contains: Units: sectors of 512 bytes, ...
+ out=$(awk '$1 == "Units:" && $5 ~ /bytes/ { print $4 }' "$tmp") ||
+ fail "failed to read sfdisk output"
+ if [ -z "$out" ]; then
+ error "WARN: sector size not found in sfdisk output, assuming 512"
+ sector_size=512
+ else
+ sector_size="$out"
+ fi
+ local _w _cyl _w1 _heads _w2 sectors _w3 t s
+ # show-size is in units of 1024 bytes (same as /proc/partitions)
+ t=$(sfdisk --show-size "${DISK}") ||
+ fail "failed: sfdisk --show-size $DISK"
+ disk_size=$((t*1024))
+ sector_num=$(($disk_size/$sector_size))
+ msg="disk size '$disk_size' not evenly div by sector size '$sector_size'"
+ [ "$((${disk_size}%${sector_size}))" -eq 0 ] ||
+ error "WARN: $msg"
+ restore_func=sfdisk_restore_legacy
+ else
+ # --list first line output:
+ # Disk /dev/vda: 20 GiB, 21474836480 bytes, 41943040 sectors
+ local _x
+ read _x _x _x _x disk_size _x sector_num _x < "$tmp"
+ sector_size=$((disk_size/$sector_num))
+ restore_func=sfdisk_restore
+ fi
+
+ debug 1 "$sector_num sectors of $sector_size. total size=${disk_size} bytes"
+ [ $(($disk_size/512)) -gt $mbr_max_512 ] &&
+ debug 1 "WARN: disk is larger than 2TB. additional space will go unused."
+
+ rqe sfd_dump sfdisk --unit=S --dump "${DISK}" >"${dump_out}" ||
+ fail "failed to dump sfdisk info for ${DISK}"
+ RESTORE_HUMAN="$dump_out"
+
+ {
+ echo "## sfdisk --unit=S --dump ${DISK}"
+ cat "${dump_out}"
+ } >"$humanpt"
+
+ [ $? -eq 0 ] || fail "failed to save sfdisk -d output"
+ RESTORE_HUMAN="$humanpt"
+
+ debugcat 1 "$humanpt"
+
+ sed -e 's/,//g; s/start=/start /; s/size=/size /' "${dump_out}" \
+ >"${dump_mod}" ||
+ fail "sed failed on dump output"
+
+ dpart="${DISK}${PART}" # disk and partition number
+ if [ -b "${DISK}p${PART}" -a "${DISK%[0-9]}" != "${DISK}" ]; then
+ # for block devices that end in a number (/dev/nbd0)
+ # the partition is "<name>p<partition_number>" (/dev/nbd0p1)
+ dpart="${DISK}p${PART}"
+ elif [ "${DISK#/dev/loop[0-9]}" != "${DISK}" ]; then
+ # for /dev/loop devices, sfdisk output will be <name>p<number>
+ # format also, even though there is not a device there.
+ dpart="${DISK}p${PART}"
+ fi
+
+ pt_start=$(awk '$1 == pt { print $4 }' "pt=${dpart}" <"${dump_mod}") &&
+ pt_size=$(awk '$1 == pt { print $6 }' "pt=${dpart}" <"${dump_mod}") &&
+ [ -n "${pt_start}" -a -n "${pt_size}" ] &&
+ pt_end=$((${pt_size}+${pt_start})) ||
+ fail "failed to get start and end for ${dpart} in ${DISK}"
+
+ # find the minimal starting location that is >= pt_end
+ max_end=$(awk '$3 == "start" { if($4 >= pt_end && $4 < min)
+ { min = $4 } } END { printf("%s\n",min); }' \
+ min=${sector_num} pt_end=${pt_end} "${dump_mod}") &&
+ [ -n "${max_end}" ] ||
+ fail "failed to get max_end for partition ${PART}"
+
+ mbr_max_sectors=$((mbr_max_512*$((sector_size/512))))
+ if [ "$max_end" -gt "$mbr_max_sectors" ]; then
+ max_end=$mbr_max_sectors
+ fi
+
+ if [ "$format" = "gpt" ]; then
+ # sfdisk respects 'last-lba' in input, and complains about
+ # partitions that go past that. without it, it does the right thing.
+ sed -i '/^last-lba:/d' "$dump_out" ||
+ fail "failed to remove last-lba from output"
+ fi
+
+ local gpt_second_size="33"
+ if [ "${max_end}" -gt "$((${sector_num}-${gpt_second_size}))" ]; then
+ # if mbr allow subsequent conversion to gpt without shrinking the
+ # partition. safety net at cost of 33 sectors, seems reasonable.
+ # if gpt, we can't write there anyway.
+ debug 1 "padding ${gpt_second_size} sectors for gpt secondary header"
+ max_end=$((${sector_num}-${gpt_second_size}))
+ fi
+
+ debug 1 "max_end=${max_end} tot=${sector_num} pt_end=${pt_end}" \
+ "pt_start=${pt_start} pt_size=${pt_size}"
+ [ $((${pt_end})) -eq ${max_end} ] &&
+ nochange "partition ${PART} is size ${pt_size}. it cannot be grown"
+ [ $((${pt_end}+(${FUDGE}/$sector_size))) -gt ${max_end} ] &&
+ nochange "partition ${PART} could only be grown by" \
+ "$((${max_end}-${pt_end})) [fudge=$((${FUDGE}/$sector_size))]"
+
+ # now, change the size for this partition in ${dump_out} to be the
+ # new size
+ new_size=$((${max_end}-${pt_start}))
+ sed "\|^\s*${dpart} |s/${pt_size},/${new_size},/" "${dump_out}" \
+ >"${new_out}" ||
+ fail "failed to change size in output"
+
+ change_info="partition=${PART} start=${pt_start} old: size=${pt_size} end=${pt_end} new: size=${new_size},end=${max_end}"
+ if [ ${DRY_RUN} -ne 0 ]; then
+ echo "CHANGE: ${change_info}"
+ {
+ echo "# === old sfdisk -d ==="
+ cat "${dump_out}"
+ echo "# === new sfdisk -d ==="
+ cat "${new_out}"
+ } 1>&2
+ exit 0
+ fi
+
+ MBR_BACKUP="${mbr_backup}"
+ LANG=C sfdisk --no-reread "${DISK}" --force \
+ -O "${mbr_backup}" <"${new_out}" >"${change_out}" 2>&1
+ ret=$?
+ [ $ret -eq 0 ] || RESTORE_FUNC="${restore_func}"
+
+ if [ $ret -eq 0 ]; then
+ :
+ elif $PT_UPDATE &&
+ sfdisk_worked_but_blkrrpart_failed "$ret" "${change_out}"; then
+ # if the command failed, but it looks like only because
+ # the device was busy and we have pt_update, then go on
+ debug 1 "sfdisk failed, but likely only because of blkrrpart"
+ else
+ error "attempt to resize ${DISK} failed. sfdisk output below:"
+ sed 's,^,| ,' "${change_out}" 1>&2
+ fail "failed to resize"
+ fi
+
+ rq pt_update pt_update "$DISK" "$PART" ||
+ fail "pt_resize failed"
+
+ RESTORE_FUNC=""
+
+ changed "${change_info}"
+
+ # dump_out looks something like:
+ ## partition table of /tmp/out.img
+ #unit: sectors
+ #
+ #/tmp/out.img1 : start= 1, size= 48194, Id=83
+ #/tmp/out.img2 : start= 48195, size= 963900, Id=83
+ #/tmp/out.img3 : start= 1012095, size= 305235, Id=82
+ #/tmp/out.img4 : start= 1317330, size= 771120, Id= 5
+ #/tmp/out.img5 : start= 1317331, size= 642599, Id=83
+ #/tmp/out.img6 : start= 1959931, size= 48194, Id=83
+ #/tmp/out.img7 : start= 2008126, size= 80324, Id=83
+}
+
+gpt_restore() {
+ sgdisk -l "${GPT_BACKUP}" "${DISK}"
+}
+
+resize_sgdisk() {
+ GPT_BACKUP="${TEMP_D}/pt.backup"
+
+ local pt_info="${TEMP_D}/pt.info"
+ local pt_pretend="${TEMP_D}/pt.pretend"
+ local pt_data="${TEMP_D}/pt.data"
+ local out="${TEMP_D}/out"
+
+ local dev="disk=${DISK} partition=${PART}"
+
+ local pt_start pt_end pt_size last pt_max code guid name new_size
+ local old new change_info sector_size
+
+ # Dump the original partition information and details to disk. This is
+ # used in case something goes wrong and human interaction is required
+ # to revert any changes.
+ rqe sgd_info sgdisk "--info=${PART}" --print "${DISK}" >"${pt_info}" ||
+ fail "${dev}: failed to dump original sgdisk info"
+ RESTORE_HUMAN="${pt_info}"
+
+ sector_size=$(awk '$0 ~ /^Logical sector size:.*bytes/ { print $4 }' \
+ "$pt_info") && [ -n "$sector_size" ] || {
+ sector_size=512
+ error "WARN: did not find sector size, assuming 512"
+ }
+
+ debug 1 "$dev: original sgdisk info:"
+ debugcat 1 "${pt_info}"
+
+ # Pretend to move the backup GPT header to the end of the disk and dump
+ # the resulting partition information. We use this info to determine if
+ # we have to resize the partition.
+ rqe sgd_pretend sgdisk --pretend --move-second-header \
+ --print "${DISK}" >"${pt_pretend}" ||
+ fail "${dev}: failed to dump pretend sgdisk info"
+
+ debug 1 "$dev: pretend sgdisk info"
+ debugcat 1 "${pt_pretend}"
+
+ # Extract the partition data from the pretend dump
+ awk 'found { print } ; $1 == "Number" { found = 1 }' \
+ "${pt_pretend}" >"${pt_data}" ||
+ fail "${dev}: failed to parse pretend sgdisk info"
+
+ # Get the start and end sectors of the partition to be grown
+ pt_start=$(awk '$1 == '"${PART}"' { print $2 }' "${pt_data}") &&
+ [ -n "${pt_start}" ] ||
+ fail "${dev}: failed to get start sector"
+ pt_end=$(awk '$1 == '"${PART}"' { print $3 }' "${pt_data}") &&
+ [ -n "${pt_end}" ] ||
+ fail "${dev}: failed to get end sector"
+ pt_size="$((${pt_end} - ${pt_start}))"
+
+ # Get the last usable sector
+ last=$(awk '/last usable sector is/ { print $NF }' \
+ "${pt_pretend}") && [ -n "${last}" ] ||
+ fail "${dev}: failed to get last usable sector"
+
+ # Find the minimal start sector that is >= pt_end
+ pt_max=$(awk '{ if ($2 >= pt_end && $2 < min) { min = $2 } } END \
+ { print min }' min="${last}" pt_end="${pt_end}" \
+ "${pt_data}") && [ -n "${pt_max}" ] ||
+ fail "${dev}: failed to find max end sector"
+
+ debug 1 "${dev}: pt_start=${pt_start} pt_end=${pt_end}" \
+ "pt_size=${pt_size} pt_max=${pt_max} last=${last}"
+
+ # Check if the partition can be grown
+ [ "${pt_end}" -eq "${pt_max}" ] &&
+ nochange "${dev}: size=${pt_size}, it cannot be grown"
+ [ "$((${pt_end} + ${FUDGE}/${sector_size}))" -gt "${pt_max}" ] &&
+ nochange "${dev}: could only be grown by" \
+ "$((${pt_max} - ${pt_end})) [fudge=$((${FUDGE}/$sector_size))]"
+
+ # The partition can be grown if we made it here. Get some more info
+ # about it so we can do it properly.
+ # FIXME: Do we care about the attribute flags?
+ code=$(awk '/^Partition GUID code:/ { print $4 }' "${pt_info}")
+ guid=$(awk '/^Partition unique GUID:/ { print $4 }' "${pt_info}")
+ name=$(awk '/^Partition name:/ { gsub(/'"'"'/, "") ; \
+ if (NF >= 3) print substr($0, index($0, $3)) }' "${pt_info}")
+ [ -n "${code}" -a -n "${guid}" ] ||
+ fail "${dev}: failed to parse sgdisk details"
+
+ debug 1 "${dev}: code=${code} guid=${guid} name='${name}'"
+ local wouldrun=""
+ [ "$DRY_RUN" -ne 0 ] && wouldrun="would-run"
+
+ # Calculate the new size of the partition
+ new_size=$((${pt_max} - ${pt_start}))
+ old="old: size=${pt_size},end=${pt_end}"
+ new="new: size=${new_size},end=${pt_max}"
+ change_info="${dev}: start=${pt_start} ${old} ${new}"
+
+ # Backup the current partition table, we're about to modify it
+ rq sgd_backup $wouldrun sgdisk "--backup=${GPT_BACKUP}" "${DISK}" ||
+ fail "${dev}: failed to backup the partition table"
+
+ # Modify the partition table. We do it all in one go (the order is
+ # important!):
+ # - move the GPT backup header to the end of the disk
+ # - delete the partition
+ # - recreate the partition with the new size
+ # - set the partition code
+ # - set the partition GUID
+ # - set the partition name
+ rq sgdisk_mod $wouldrun sgdisk --move-second-header "--delete=${PART}" \
+ "--new=${PART}:${pt_start}:${pt_max}" \
+ "--typecode=${PART}:${code}" \
+ "--partition-guid=${PART}:${guid}" \
+ "--change-name=${PART}:${name}" "${DISK}" &&
+ rq pt_update $wouldrun pt_update "$DISK" "$PART" || {
+ RESTORE_FUNC=gpt_restore
+ fail "${dev}: failed to repartition"
+ }
+
+ # Dry run
+ [ "${DRY_RUN}" -ne 0 ] && change "${change_info}"
+
+ changed "${change_info}"
+}
+
+kver_to_num() {
+ local kver="$1" maj="" min="" mic="0"
+ kver=${kver%%-*}
+ maj=${kver%%.*}
+ min=${kver#${maj}.}
+ min=${min%%.*}
+ mic=${kver#${maj}.${min}.}
+ [ "$kver" = "$mic" ] && mic=0
+ _RET=$(($maj*1000*1000+$min*1000+$mic))
+}
+
+kver_cmp() {
+ local op="$2" n1="" n2=""
+ kver_to_num "$1"
+ n1="$_RET"
+ kver_to_num "$3"
+ n2="$_RET"
+ [ $n1 $op $n2 ]
+}
+
+rq() {
+ # runquieterror(label, command)
+ # gobble stderr of a command unless it errors
+ local label="$1" ret="" efile=""
+ efile="$TEMP_D/$label.err"
+ shift;
+
+ local rlabel="running"
+ [ "$1" = "would-run" ] && rlabel="would-run" && shift
+
+ local cmd="" x=""
+ for x in "$@"; do
+ [ "${x#* }" != "$x" -o "${x#* \"}" != "$x" ] && x="'$x'"
+ cmd="$cmd $x"
+ done
+ cmd=${cmd# }
+
+ debug 2 "$rlabel[$label][$_capture]" "$cmd"
+ [ "$rlabel" = "would-run" ] && return 0
+
+ if [ "${_capture}" = "erronly" ]; then
+ "$@" 2>"$TEMP_D/$label.err"
+ ret=$?
+ else
+ "$@" >"$TEMP_D/$label.err" 2>&1
+ ret=$?
+ fi
+ if [ $ret -ne 0 ]; then
+ error "failed [$label:$ret]" "$@"
+ cat "$efile" 1>&2
+ fi
+ return $ret
+}
+
+rqe() {
+ local _capture="erronly"
+ rq "$@"
+}
+
+verify_ptupdate() {
+ local input="$1" found="" reason="" kver=""
+
+ # we can always satisfy 'off'
+ if [ "$input" = "off" ]; then
+ _RET="false";
+ return 0;
+ fi
+
+ if command -v partx >/dev/null 2>&1; then
+ local out="" ret=0
+ out=$(partx --help 2>&1)
+ ret=$?
+ if [ $ret -eq 0 ]; then
+ echo "$out" | grep -q -- --update || {
+ reason="partx has no '--update' flag in usage."
+ found="off"
+ }
+ else
+ reason="'partx --help' returned $ret. assuming it is old."
+ found="off"
+ fi
+ else
+ reason="no 'partx' command"
+ found="off"
+ fi
+
+ if [ -z "$found" ]; then
+ if [ "$(uname)" != "Linux" ]; then
+ reason="Kernel is not Linux per uname."
+ found="off"
+ fi
+ fi
+
+ if [ -z "$found" ]; then
+ kver=$(uname -r) || debug 1 "uname -r failed!"
+
+ if ! kver_cmp "${kver-0.0.0}" -ge 3.8.0; then
+ reason="Kernel '$kver' < 3.8.0."
+ found="off"
+ fi
+ fi
+
+ if [ -z "$found" ]; then
+ _RET="true"
+ return 0
+ fi
+
+ case "$input" in
+ on) error "$reason"; return 1;;
+ auto)
+ _RET="false";
+ debug 1 "partition update disabled: $reason"
+ return 0;;
+ force)
+ _RET="true"
+ error "WARNING: ptupdate forced on even though: $reason"
+ return 0;;
+ esac
+ error "unknown input '$input'";
+ return 1;
+}
+
+pt_update() {
+ local dev="$1" part="$2" update="${3:-$PT_UPDATE}"
+ if ! $update; then
+ return 0
+ fi
+ # partx only works on block devices (do not run on file)
+ [ -b "$dev" ] || return 0
+ partx --update "$part" "$dev"
+}
+
+has_cmd() {
+ command -v "${1}" >/dev/null 2>&1
+}
+
+resize_sgdisk_gpt() {
+ resize_sgdisk gpt
+}
+
+resize_sgdisk_dos() {
+ fail "unable to resize dos label with sgdisk"
+}
+
+resize_sfdisk_gpt() {
+ resize_sfdisk gpt
+}
+
+resize_sfdisk_dos() {
+ resize_sfdisk dos
+}
+
+get_table_format() {
+ local out="" disk="$1"
+ if has_cmd blkid && out=$(blkid -o value -s PTTYPE "$disk") &&
+ [ "$out" = "dos" -o "$out" = "gpt" ]; then
+ _RET="$out"
+ return
+ fi
+ _RET="dos"
+ if [ ${SFDISK_VERSION} -lt ${SFDISK_2_26} ] &&
+ out=$(sfdisk --id --force "$disk" 1 2>/dev/null); then
+ if [ "$out" = "ee" ]; then
+ _RET="gpt"
+ else
+ _RET="dos"
+ fi
+ return
+ elif out=$(LANG=C sfdisk --list "$disk"); then
+ out=$(echo "$out" | sed -e '/Disklabel type/!d' -e 's/.*: //')
+ case "$out" in
+ gpt|dos) _RET="$out";;
+ *) error "WARN: unknown label $out";;
+ esac
+ fi
+}
+
+get_resizer() {
+ local format="$1" user=${2:-"auto"}
+
+ case "$user" in
+ sgdisk) _RET="resize_sgdisk_$format"; return;;
+ sfdisk) _RET="resize_sfdisk_$format"; return;;
+ auto) :;;
+ *) error "unexpected input: '$user'";;
+ esac
+
+ if [ "$format" = "dos" ]; then
+ _RET="resize_sfdisk_dos"
+ return 0
+ fi
+
+ if [ "${SFDISK_VERSION}" -ge ${SFDISK_2_26} ]; then
+ _RET="resize_sfdisk_gpt"
+ elif has_cmd sgdisk; then
+ _RET="resize_sgdisk_$format"
+ else
+ error "no tools available to resize disk with '$format'"
+ return 1
+ fi
+ return 0
+}
+
+pt_update="auto"
+resizer=${GROWPART_RESIZER:-"auto"}
+while [ $# -ne 0 ]; do
+ cur=${1}
+ next=${2}
+ case "$cur" in
+ -h|--help)
+ Usage
+ exit 0
+ ;;
+ --fudge)
+ FUDGE=${next}
+ shift
+ ;;
+ -N|--dry-run)
+ DRY_RUN=1
+ ;;
+ -u|--update|--update=*)
+ if [ "${cur#--update=}" != "$cur" ]; then
+ next="${cur#--update=}"
+ else
+ shift
+ fi
+ case "$next" in
+ off|auto|force|on) pt_update=$next;;
+ *) fail "unknown --update option: $next";;
+ esac
+ ;;
+ -v|--verbose)
+ VERBOSITY=$(($VERBOSITY+1))
+ ;;
+ --)
+ shift
+ break
+ ;;
+ -*)
+ fail "unknown option ${cur}"
+ ;;
+ *)
+ if [ -z "${DISK}" ]; then
+ DISK=${cur}
+ else
+ [ -z "${PART}" ] || fail "confused by arg ${cur}"
+ PART=${cur}
+ fi
+ ;;
+ esac
+ shift
+done
+
+[ -n "${DISK}" ] || bad_Usage "must supply disk and partition-number"
+[ -n "${PART}" ] || bad_Usage "must supply partition-number"
+
+has_cmd "sfdisk" || fail "sfdisk not found"
+get_sfdisk_version || fail
+
+[ -e "${DISK}" ] || fail "${DISK}: does not exist"
+
+[ "${PART#*[!0-9]}" = "${PART}" ] || fail "partition-number must be a number"
+
+verify_ptupdate "$pt_update" || fail
+PT_UPDATE=$_RET
+
+debug 1 "update-partition set to $PT_UPDATE"
+
+mktemp_d && TEMP_D="${_RET}" || fail "failed to make temp dir"
+trap cleanup 0 # EXIT - some shells may not like 'EXIT' but are ok with 0
+
+# get the ID of the first partition to determine if it's MBR or GPT
+get_table_format "$DISK" || fail
+format=$_RET
+get_resizer "$format" "$resizer" ||
+ fail "failed to get a resizer for id '$id'"
+resizer=$_RET
+
+debug 1 "resizing $PART on $DISK using $resizer"
+"$resizer"
+
+# vi: ts=4 noexpandtab
diff --git a/app-emulation/cloud-init/files/hosts.gentoo.tmpl b/app-emulation/cloud-init/files/hosts.gentoo.tmpl
new file mode 100644
index 00000000000..bc0bca47c5c
--- /dev/null
+++ b/app-emulation/cloud-init/files/hosts.gentoo.tmpl
@@ -0,0 +1,23 @@
+## template:jinja
+{#
+This file /etc/cloud/templates/hosts.gentoo.tmpl is only utilized
+if enabled in cloud-config. Specifically, in order to enable it
+you need to add the following to config:
+ manage_etc_hosts: template
+-#}
+# Your system has configured 'manage_etc_hosts' as 'template'.
+# As a result, if you wish for changes to this file to persist
+# then you will need to either
+# a.) make changes to the master file in /etc/cloud/templates/hosts.gentoo.tmpl
+# b.) change or remove the value of 'manage_etc_hosts' in
+# /etc/cloud/cloud.cfg or cloud-config from user-data
+#
+# The following lines are desirable for IPv4 capable hosts
+127.0.0.1 {{fqdn}} {{hostname}}
+127.0.0.1 localhost.localdomain localhost
+127.0.0.1 localhost4.localdomain4 localhost4
+
+# The following lines are desirable for IPv6 capable hosts
+::1 {{fqdn}} {{hostname}}
+::1 localhost.localdomain localhost
+::1 localhost6.localdomain6 localhost6 \ No newline at end of file
diff --git a/app-emulation/cloud-init/metadata.xml b/app-emulation/cloud-init/metadata.xml
new file mode 100644
index 00000000000..1c248771204
--- /dev/null
+++ b/app-emulation/cloud-init/metadata.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <herd>python</herd>
+ <maintainer>
+ <email>prometheanfire@gentoo.org</email>
+ <name>Matthew Thode</name>
+ </maintainer>
+ <maintainer>
+ <email>alunduil@gentoo.org</email>
+ <name>Alex Brandt</name>
+ </maintainer>
+ <longdescription lang="en">
+ Package provides configuration and customization of cloud instance.
+ </longdescription>
+ <upstream>
+ <remote-id type="launchpad">cloud-init</remote-id>
+ </upstream>
+</pkgmetadata>