Move the dpkg specific stuff to a dpkg element rather than being hardcoded.

This includes the install-packages implementation for dpkg, apt http proxy
config, daemon blocking and unblocking.

Change-Id: I8f159021d2b223d7003cec067de3aa605ad06974
This commit is contained in:
Robert Collins 2013-02-14 11:16:00 +13:00
parent 3860af4be5
commit 7f77729ec5
15 changed files with 110 additions and 72 deletions

View File

@ -91,9 +91,17 @@ part of the process you need to customise:
alternative distribution support is added, or customisations such as alternative distribution support is added, or customisations such as
building on an existing image. If no element configures a root, the ubuntu building on an existing image. If no element configures a root, the ubuntu
element will be automatically invoked to obtain an Ubuntu image. element will be automatically invoked to obtain an Ubuntu image.
Runs outside the chroot on the host environment, so should cleanup after Runs outside the chroot on the host environment.
itself using the root-finished.d hook.
NB: Only one element can use this at a time. Only one element can use this at a time unless particular care is taken not
to blindly overwrite but instead to adapt the context extracted by other
elements.
* inputs: $ARCH=i386|amd64 $TARGET\_ROOT=/path/to/target/workarea
* cleanup.d: Perform cleanups of the root filesystem content. For instance,
temporary settings to use the image build environment HTTP proxy are removed
here in the dpkg element. Runs outside the chroot on the host environment.
* inputs: $ARCH=i386|amd64 $TARGET\_ROOT=/path/to/target/workarea * inputs: $ARCH=i386|amd64 $TARGET\_ROOT=/path/to/target/workarea

View File

@ -109,9 +109,11 @@ mount_tmp_image ${IMAGE_BLOCK_DEVICE}
create_base create_base
run_d extra-data run_d extra-data
do_pre_install # Run pre-install scripts. These do things that prepare the chroot for package installs
run_d_in_target pre-install
do_extra_package_install do_extra_package_install
do_install # Call install scripts to pull in the software users want.
run_d_in_target install
prepare_first_boot prepare_first_boot
finalise_base finalise_base
unmount_image unmount_image

View File

@ -3,6 +3,14 @@
set -e set -e
apt-get -y update DISTRO=`lsb_release -si`
install-packages python-software-properties
add-apt-repository -y ppa:tripleo/demo case $DISTRO in
'Ubuntu'|'Debian')
# Note: add-apt-repository would be nice for RPM platforms too - so when we
# need something like it, create a wrapper in dpkg/bin and fedora/bin.
apt-get -y update
install-packages python-software-properties
add-apt-repository -y ppa:tripleo/demo
;;
esac

8
elements/dpkg/README.md Normal file
View File

@ -0,0 +1,8 @@
Provide dpkg specific image building glue.
The ubuntu element needs customisations at the start and end of the image build
process that do not apply to RPM distributions, such as using the host machine
HTTP proxy when installing packages. These customisations live here, where they
can be used by any dpkg based element.
The dpkg specific version of install-packages is also kept here.

View File

@ -0,0 +1,11 @@
#!/bin/bash
set -e
[ -n "$TARGET_ROOT" ]
sudo mv $TARGET_ROOT/sbin/start-stop-daemon.REAL $TARGET_ROOT/sbin/start-stop-daemon
sudo mv $TARGET_ROOT/sbin/initctl.REAL $TARGET_ROOT/sbin/initctl
sudo mv $TARGET_ROOT/usr/sbin/invoke-rc.d.REAL $TARGET_ROOT/usr/sbin/invoke-rc.d

View File

@ -0,0 +1,8 @@
#!/bin/bash
set -e
[ -n "$TARGET_ROOT" ]
# Undo our proxy support
sudo rm -f $TARGET_ROOT/etc/apt/apt.conf.d/60img-build-proxy

View File

@ -0,0 +1,12 @@
#!/bin/bash
set -e
[ -n "$TARGET_ROOT" ]
# If we have a network proxy, use it.
if [ -n "$http_proxy" ] ; then
sudo dd of=$TARGET_ROOT/etc/apt/apt.conf.d/60img-build-proxy << _EOF_
Acquire::http::Proxy "$http_proxy";
_EOF_
fi

View File

@ -0,0 +1,13 @@
#!/bin/bash
set -e
[ -n "$TARGET_ROOT" ]
# Configure APT not to fetch translations files
sudo dd of=$TARGET_ROOT/etc/apt/apt.conf.d/95no-translations <<EOF
APT::Acquire::Languages "none";
EOF
# And now make sure that we don't fall foul of Debian bug 641967
find $TARGET_ROOT/var/lib/apt/lists/ -type f -name '*_i18n_Translation-*' -exec sudo rm -f {} \;

View File

@ -0,0 +1,30 @@
#!/bin/bash
set -e
[ -n "$TARGET_ROOT" ]
# Prevent package installs from starting daemons
sudo mv $TARGET_ROOT/sbin/start-stop-daemon $TARGET_ROOT/sbin/start-stop-daemon.REAL
sudo dd of=$TARGET_ROOT/sbin/start-stop-daemon <<EOF
#!/bin/sh
echo
echo "Warning: Fake start-stop-daemon called, doing nothing"
EOF
sudo chmod 755 $TARGET_ROOT/sbin/start-stop-daemon
sudo mv $TARGET_ROOT/sbin/initctl $TARGET_ROOT/sbin/initctl.REAL
sudo dd of=$TARGET_ROOT/sbin/initctl <<EOF
#!/bin/sh
echo "initctl (tripleo 1.0)"
echo "Warning: Fake initctl called, doing nothing"
EOF
sudo chmod 755 $TARGET_ROOT/sbin/initctl
sudo mv $TARGET_ROOT/usr/sbin/invoke-rc.d $TARGET_ROOT/usr/sbin/invoke-rc.d.REAL
sudo dd of=$TARGET_ROOT/usr/sbin/invoke-rc.d <<EOF
#!/bin/sh
echo "invoke-rc.d (tripleo 1.0)"
echo "Warning: Fake inovke-rc.d called, doing nothing"
EOF
sudo chmod 755 $TARGET_ROOT/usr/sbin/invoke-rc.d

View File

@ -0,0 +1 @@
dpkg

View File

@ -98,12 +98,6 @@ function create_base () {
sudo mount --bind /dev $TMP_MOUNT_PATH/dev sudo mount --bind /dev $TMP_MOUNT_PATH/dev
sudo mount -t sysfs none $TMP_MOUNT_PATH/sys sudo mount -t sysfs none $TMP_MOUNT_PATH/sys
# If we have a network proxy, use it.
if [ -n "$http_proxy" ] ; then
sudo dd of=$TMP_MOUNT_PATH/etc/apt/apt.conf.d/60img-build-proxy << _EOF_
Acquire::http::Proxy "$http_proxy";
_EOF_
fi
} }
# Helper function to run a command inside the chroot # Helper function to run a command inside the chroot
@ -160,8 +154,7 @@ EOF
} }
function finalise_base () { function finalise_base () {
# Undo our proxy support TARGET_ROOT=$TMP_MOUNT_PATH run_d cleanup
sudo rm -f $TMP_MOUNT_PATH/etc/apt/apt.conf.d/60img-build-proxy
# Now remove the resolv.conf we created above # Now remove the resolv.conf we created above
sudo rm -f $TMP_MOUNT_PATH/etc/resolv.conf sudo rm -f $TMP_MOUNT_PATH/etc/resolv.conf
# The we need to recreate it as a link # The we need to recreate it as a link
@ -175,62 +168,6 @@ function compress_image () {
mv $TMP_IMAGE_PATH-new $TMP_IMAGE_PATH mv $TMP_IMAGE_PATH-new $TMP_IMAGE_PATH
} }
function block_apt_translations () {
# Configure APT not to fetch translations files
sudo dd of=$TMP_MOUNT_PATH/etc/apt/apt.conf.d/95no-translations <<EOF
APT::Acquire::Languages "none";
EOF
# And now make sure that we don't fall foul of Debian bug 641967
find $TMP_MOUNT_PATH/var/lib/apt/lists/ -type f -name '*_i18n_Translation-*' -exec sudo rm -f {} \;
}
function block_daemons () {
# Prevent package installs from starting daemons
sudo mv $TMP_MOUNT_PATH/sbin/start-stop-daemon $TMP_MOUNT_PATH/sbin/start-stop-daemon.REAL
sudo dd of=$TMP_MOUNT_PATH/sbin/start-stop-daemon <<EOF
#!/bin/sh
echo
echo "Warning: Fake start-stop-daemon called, doing nothing"
EOF
sudo chmod 755 $TMP_MOUNT_PATH/sbin/start-stop-daemon
sudo mv $TMP_MOUNT_PATH/sbin/initctl $TMP_MOUNT_PATH/sbin/initctl.REAL
sudo dd of=$TMP_MOUNT_PATH/sbin/initctl <<EOF
#!/bin/sh
echo "initctl (tripleo 1.0)"
echo "Warning: Fake initctl called, doing nothing"
EOF
sudo chmod 755 $TMP_MOUNT_PATH/sbin/initctl
sudo mv $TMP_MOUNT_PATH/usr/sbin/invoke-rc.d $TMP_MOUNT_PATH/usr/sbin/invoke-rc.d.REAL
sudo dd of=$TMP_MOUNT_PATH/usr/sbin/invoke-rc.d <<EOF
#!/bin/sh
echo "invoke-rc.d (tripleo 1.0)"
echo "Warning: Fake inovke-rc.d called, doing nothing"
EOF
sudo chmod 755 $TMP_MOUNT_PATH/usr/sbin/invoke-rc.d
}
function unblock_daemons () {
sudo mv $TMP_MOUNT_PATH/sbin/start-stop-daemon.REAL $TMP_MOUNT_PATH/sbin/start-stop-daemon
sudo mv $TMP_MOUNT_PATH/sbin/initctl.REAL $TMP_MOUNT_PATH/sbin/initctl
sudo mv $TMP_MOUNT_PATH/usr/sbin/invoke-rc.d.REAL $TMP_MOUNT_PATH/usr/sbin/invoke-rc.d
}
function do_pre_install () {
block_daemons
block_apt_translations
# Run pre-install scripts. These do things that prepare the chroot for package installs
run_d_in_target pre-install
}
function do_install () {
# Call install scripts to pull in the software users want.
run_d_in_target install
unblock_daemons
}
function do_extra_package_install () { function do_extra_package_install () {
# Install any packages that were requested with the -p command line option # Install any packages that were requested with the -p command line option
if [ "$INSTALL_PACKAGES" != "" ]; then if [ "$INSTALL_PACKAGES" != "" ]; then