diff options
author | Daniel Baumann <mail@daniel-baumann.ch> | 2016-11-12 07:51:17 +0000 |
---|---|---|
committer | Daniel Baumann <mail@daniel-baumann.ch> | 2016-12-11 12:27:10 +0000 |
commit | d06d7b1b2e7ea48c42497ea6381a7d58ed4121e0 (patch) | |
tree | f41ae8266df0ed99de0941d748d523d6f289c4bc | |
parent | Adding upstream version 20161105. (diff) | |
download | open-infrastructure-compute-tools-d06d7b1b2e7ea48c42497ea6381a7d58ed4121e0.tar.xz open-infrastructure-compute-tools-d06d7b1b2e7ea48c42497ea6381a7d58ed4121e0.zip |
Adding upstream version 20161112.
Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-rw-r--r-- | CHANGELOG.txt | 18 | ||||
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | VERSION.txt | 2 | ||||
-rwxr-xr-x | lib/container/list | 5 | ||||
-rwxr-xr-x | lib/container/remove | 2 | ||||
-rw-r--r-- | share/bash-completion/container | 6 | ||||
-rwxr-xr-x | share/doc/examples/container-images.sh | 37 | ||||
-rw-r--r-- | share/man/container-create-curl.1.txt | 116 | ||||
-rw-r--r-- | share/man/container-create.1.txt | 6 | ||||
-rw-r--r-- | share/man/container-tools.7.txt | 11 | ||||
-rw-r--r-- | share/man/container-version.1.txt | 2 | ||||
-rwxr-xr-x | share/scripts/curl | 187 | ||||
-rwxr-xr-x | share/scripts/debconf | 2 | ||||
-rwxr-xr-x | share/scripts/debconf.d/0003-debconf | 4 | ||||
-rwxr-xr-x | share/scripts/debootstrap | 2 |
15 files changed, 389 insertions, 12 deletions
diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 8f94beb..ba5a496 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,21 @@ +2016-11-12 Daniel Baumann <daniel.baumann@open-infrastructure.net> + + * Releasing version 20161112. + * Backward incompatible changes: + - removes support to create Debian 8 (jessie) container in debconf container create script. + + [ Daniel Baumann ] + * Removing support for Debian 9 (jessie) in debconf container create script. + * Adding shortcuts for container commands to bash-completion as well. + * Ignoring symlinks as container commands in bash-completion. + * Adding container version to ver symlink. + * Updating development section in container-tools manpage. + * Avoid repeating ipv4 address of the previous container in container list command. + * Using fallback to ifupdown addresses in container list command for container not using networkd yet. + * Fail to find container in remove command only when both the rootfs and the config are gone already. + * Correcting syntax in usage message of container create scripts. + * Adding initial curl container create script. + 2016-11-05 Daniel Baumann <daniel.baumann@open-infrastructure.net> * Releasing version 20161105. @@ -102,6 +102,7 @@ install: build ln -sf list $(DESTDIR)/usr/lib/$(SOFTWARE)/container/ls ln -sf remove $(DESTDIR)/usr/lib/$(SOFTWARE)/container/rm + ln -sf version $(DESTDIR)/usr/lib/$(SOFTWARE)/container/ver mkdir -p $(DESTDIR)/lib/systemd/system cp -r share/systemd/* $(DESTDIR)/lib/systemd/system diff --git a/VERSION.txt b/VERSION.txt index 72dace3..45c4023 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -20161105 +20161112 diff --git a/lib/container/list b/lib/container/list index e5e76fe..04e9f0f 100755 --- a/lib/container/list +++ b/lib/container/list @@ -183,9 +183,14 @@ do ;; esac + ADDRESSES="" + if ls "${MACHINES}/${CONTAINER}/etc/systemd/network"/*.network > /dev/null 2>&1 then ADDRESSES="$(awk -F= '/Address/ { print $2 }' ${MACHINES}/${CONTAINER}/etc/systemd/network/*.network)" + elif [ -e "${MACHINES}/${CONTAINER}/etc/network/interfaces" ] + then + ADDRESSES="$(awk '/address/ { print $2 }' ${MACHINES}/${CONTAINER}/etc/network/interfaces)" fi ADDRESSES="${ADDRESSES:-n/a}" diff --git a/lib/container/remove b/lib/container/remove index 843e9c3..04e7d30 100755 --- a/lib/container/remove +++ b/lib/container/remove @@ -82,7 +82,7 @@ then Usage fi -if [ ! -e "${MACHINES}/${NAME}" ] +if [ ! -e "${MACHINES}/${NAME}" ] && [ ! -e "${CONFIG}/${NAME}.conf" ] then echo "'${NAME}': no such container" >&2 exit 1 diff --git a/share/bash-completion/container b/share/bash-completion/container index f6434f8..e49311a 100644 --- a/share/bash-completion/container +++ b/share/bash-completion/container @@ -122,7 +122,7 @@ _container() esac ;; - list) + list|ls) case "${cur}" in -*) opts="-a --all -f --format -h --host -o --other -s --started -t --stopped" @@ -148,7 +148,7 @@ _container() esac ;; - remove) + remove|rm) case "${cur}" in -*) opts="-n --name -f --force" @@ -249,7 +249,7 @@ _container() ;; *) - local commands=$(cd /usr/lib/container-tools/container 2>/dev/null && ls) + local commands=$(cd /usr/lib/container-tools/container 2>/dev/null && find * -type f -print) COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) ) return 0 ;; diff --git a/share/doc/examples/container-images.sh b/share/doc/examples/container-images.sh new file mode 100755 index 0000000..74e7ee0 --- /dev/null +++ b/share/doc/examples/container-images.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +# container-tools - Manage systemd-nspawn containers +# +# Description: example for automated Debian base system container image creation +# Requires: debootstrap xz-utils +# Usage: sudo ./container-images.sh + +set -e + +ARCHITECTURES="amd64 i386" +DISTRIBUTIONS="stretch sid" +MIRROR="http://deb.debian.org/debian" +INCLUDE="dbus" + +DATE="$(date +%Y%m%d)" + +for DISTRIBUTION in ${DISTRIBUTIONS} +do + for ARCHITECTURE in ${ARCHITECTURES} + do + SOURCE="debian-${DISTRIBUTION}-${ARCHITECTURE}_${DATE}" + TARGET="debian-${DISTRIBUTION}-${ARCHITECTURE}" + + debootstrap --arch=${ARCHITECTURE} --include=${INCLUDE} ${DISTRIBUTION} ${SOURCE} ${MIRROR} + chroot "${SOURCE}" apt-get clean + + rm -f "${SOURCE}/etc/apt/apt.conf.d/01autoremove-kernels" + rm -f "${SOURCE}/etc/hostname" + echo "" > "${SOURCE}/etc/machine-id" + rm -f "${SOURCE}/etc/resolv.conf" + rm -f "${SOURCE}/var/lib/systemd/catalog/database" + + echo "Creating ${TARGET}.tar.xz" + tar cfJ "${TARGET}.tar.xz" "${SOURCE}" + done +done diff --git a/share/man/container-create-curl.1.txt b/share/man/container-create-curl.1.txt new file mode 100644 index 0000000..f310eaf --- /dev/null +++ b/share/man/container-create-curl.1.txt @@ -0,0 +1,116 @@ +// container-tools - Manage systemd-nspawn containers +// Copyright (C) 2014-2016 Daniel Baumann <daniel.baumann@open-infrastructure.net> +// +// 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, either version 3 of the License, or +// (at your option) any later version. +// +// 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/>. + +CONTAINER-CREATE-CURL(1) +======================== +:doctype: manpage +:man manual: Open Infrastructure +:man source: container-tools +:man version: {revnumber} + + +NAME +---- +container-create-curl - Create a Debian based container by downloading a tarball over the network + + +SYNOPSIS +-------- +*container create -s curl* ['OPTIONS'] + + +DESCRIPTION +----------- +The curl container creation script uses curl(1) to download a tarball over the +network to create a Debian based container. + +Depending on the tarball this script otherwise creates a pure Debian system with three modificiations: + + * hostname is set (container name) in /etc/hostname + * systemd machine-id is generated in /etc/machine-id + * root password is set (user specified or 16 random characters) + + +OPTIONS +------- +The following script options are available: + +*-n, --name='NAME'*:: + Specify container name. + +*--image='IMAGE'*:: + Specify the image name to download, defaults to debian-stretch-${ARCHITECTURE}.tar.xz (where ${ARCHITECTURE} is the host systems architecture). + +*--server='SERVER'*:: + Specify the image server to download from, defaults to https://files.open-infrastructure.net/images/container-tools/current. + +*-p, --root-password='PASSWORD'*:: + Specify the root password, defaults to a random 16 character password. + + +EXAMPLES +-------- +*Create a Debian 9 (stretch) based container with same architecture as the host system:*:: + sudo container create -s curl -n stretch.example.net + +*Create a Debian 9 (stretch) based container with different architecture as the host system:*:: + sudo container create -s curl -n stretch-i386.example.net -- --image debian-stretch-i386.tar.xz + +FILES +----- +The following files are used: + +*/etc/container-tools/config*:: + Container configuration files. + +*/usr/share/container-tools/scripts*:: + Container creation scripts. + +*/usr/share/doc/container-tools*:: + Container documentation. + +*/var/lib/machines*:: + Container directory. + +*/var/cache/container-tools*:: + Container cache directory. + + +CONTAINER IMAGES +---------------- + +container-tools will download tarballs from a server expecting that the images are tarballs with either gzip, lzip, xz, or no compression. See container-images.sh as an example on how to create your own container images. + + +SEE ALSO +-------- +container-tools(7), +container(1). + + +HOMEPAGE +-------- +More information about container-tools and the Open Infrastructure project can be found on the homepage at https://open-infrastructure.net. + + +BUGS +---- +Bugs can be reported by sending a bug report to the Debian Bug Tracking System at https://bugs.debian.org. + + +AUTHORS +------- +container-tools was written by Daniel Baumann <daniel.baumann@open-infrastructure.net>. diff --git a/share/man/container-create.1.txt b/share/man/container-create.1.txt index 4fe592f..6918585 100644 --- a/share/man/container-create.1.txt +++ b/share/man/container-create.1.txt @@ -64,6 +64,9 @@ SCRIPTS ------- The following container scripts are available: +*curl*:: + Basic script to create Debian based container, see container-create-curl(1). + *debootstrap*:: Basic script to create Debian based container, see container-create-debootstrap(1). @@ -76,6 +79,9 @@ The following container scripts are available: EXAMPLES -------- +*Create example.net container using curl script:*:: + sudo container create -n example.net -s curl + *Create example.net container using debootstrap script:*:: sudo container create -n example.net -s debootstrap diff --git a/share/man/container-tools.7.txt b/share/man/container-tools.7.txt index 2e71b05..23f8403 100644 --- a/share/man/container-tools.7.txt +++ b/share/man/container-tools.7.txt @@ -63,14 +63,19 @@ DEBIAN 9 (STRETCH) AND NEWER DEVELOPMENT ----------- -Bug reports, feature requests, and patches are welcome via Debian Bug Tracking System: +Bug reports, feature requests, help, patches, support and everything else +are welcome on the Open Infrastructure Software Mailing List: - * https://bugs.debian.org + * https://lists.open-infrastructure.net/listinfo/software -Please base them against the 'next' Git branch using common sense: +Please base patches against the 'next' Git branch using common sense: * https://www.kernel.org/doc/Documentation/SubmittingPatches +Debian specific bugs can also be reported in the Debian Bug Tracking System: + + * https://bugs.debian.org + KNOWN LIMITATIONS ----------------- diff --git a/share/man/container-version.1.txt b/share/man/container-version.1.txt index 5e50ad4..9b0ae5e 100644 --- a/share/man/container-version.1.txt +++ b/share/man/container-version.1.txt @@ -31,6 +31,8 @@ SYNOPSIS -------- *container version* ['OPTIONS'] +*container ver* ['OPTIONS'] + DESCRIPTION ----------- diff --git a/share/scripts/curl b/share/scripts/curl new file mode 100755 index 0000000..0cf38e9 --- /dev/null +++ b/share/scripts/curl @@ -0,0 +1,187 @@ +#!/bin/sh + +# container-tools - Manage systemd-nspawn containers +# Copyright (C) 2014-2016 Daniel Baumann <daniel.baumann@open-infrastructure.net> +# +# 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, either version 3 of the License, or +# (at your option) any later version. +# +# 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/>. + +set -e + +SCRIPT="${0}" + +MACHINES="/var/lib/machines" +CACHE="/var/cache/container-tools/curl" + +Parameters () +{ + LONG_OPTIONS="bind:,script:,name:,image:,server:,password:" + OPTIONS="b:,s:,n:,p:" + + PARAMETERS="$(getopt --longoptions ${LONG_OPTIONS} --name=${SCRIPT} --options ${OPTIONS} --shell sh -- ${@})" + + if [ "${?}" != "0" ] + then + echo "'${SCRIPT}': getopt exit" >&2 + exit 1 + fi + + eval set -- "${PARAMETERS}" + + while true + do + case "${1}" in + -b|--bind) + # ignore + shift 2 + ;; + + --cnt.auto) + # ignore + shift 2 + ;; + + -s|--script) + # ignore + shift 2 + ;; + + -n|--name) + NAME="${2}" + shift 2 + ;; + + --image) + IMAGE="${2}" + shift 2 + ;; + + --server) + SERVER="${2}" + shift 2 + ;; + + -p|--password) + PASSWORD="${2}" + shift 2 + ;; + + --) + shift 1 + break + ;; + + *) + echo "'${SCRIPT}': getopt error" >&2 + exit 1 + ;; + esac + done +} + +Usage () +{ + echo "Usage: container create -n|--name NAME -s|--script ${SCRIPT} -- [--image IMAGE] [--server SERVER] [-p|--password PASSWORD}" >&2 + exit 1 +} + +Parameters "${@}" + +if [ -z "${NAME}" ] +then + Usage +fi + +if [ -e "${MACHINES}/${NAME}" ] +then + echo "'${NAME}': container already exists" >&2 + exit 1 +fi + +if [ ! -x /usr/bin/curl ] +then + echo "'${NAME}': /usr/bin/curl - no such file." >&2 + exit 1 +fi + +if [ "$(id -u)" -ne 0 ] +then + echo "'${NAME}': need root privileges" >&2 + exit 1 +fi + +ARCHITECTURE="${ARCHITECTURE:-$(dpkg --print-architecture)}" +IMAGE="${IMAGE:-debian-stretch-${ARCHITECTURE}.tar.xz}" +SERVER="${SERVER:-https://files.open-infrastructure.net/images/container-tools/current}" +PASSWORD="${PASSWORD:-$(dd if=/dev/urandom bs=12 count=1 2> /dev/null | base64)}" + +VERSION="$(container version)" + +# Run + +# FIXME: Show available image directories on server +# FIXME: Fetch debconf-choices.txt to show debconf select +# FIXME: gpg verification against debian-keyring or local keyring +# FIXME: default server via configuration file + +echo "Downloading ${IMAGE}" +mkdir -p "${CACHE}" + +if [ -e "${CACHE}/${IMAGE}" ] +then + CURL_OPTIONS="--time-cond ${CACHE}/${IMAGE}" +fi + +curl --http2 --location --progress-bar --user-agent container-tools/${VERSION} ${CURL_OPTIONS} \ + "${SERVER}/${IMAGE}" -o "${CACHE}/${IMAGE}" + +echo "Unpacking ${IMAGE}" +mkdir -p "${MACHINES}/${NAME}" + +case "${IMAGE}" in + *.gz) + TAR_OPTIONS="--gzip" + ;; + + *.lz) + TAR_OPTIONS="--lzip" + ;; + + *.xz) + TAR_OPTIONS="--xz" + ;; + + *) + TAR_OPTIONS="" + ;; +esac + +if [ -e /usr/bin/pv ] +then + pv --format '%p' --width 77 "${CACHE}/${IMAGE}" | tar xf - ${TAR_OPTIONS} -C "${MACHINES}/${NAME}" --strip 1 +else + tar xf "${CACHE}/${IMAGE}" ${TAR_OPTIONS} -C "${MACHINES}/${NAME}" --strip 1 +fi + +# Creating machine-id +chroot "${MACHINES}/${NAME}" systemd-machine-id-setup > /dev/null 2>&1 + +# Setting hostname +echo "${NAME}" > "${MACHINES}/${NAME}/etc/hostname" + +# Copying resolv.conf +cp -L /etc/resolv.conf "${MACHINES}/${NAME}/etc/resolv.conf" + +# Setting root password +echo root:${PASSWORD} | chroot "${MACHINES}/${NAME}" chpasswd +echo "${NAME}: root password set to '${PASSWORD}'." diff --git a/share/scripts/debconf b/share/scripts/debconf index 6fab784..75cbfb0 100755 --- a/share/scripts/debconf +++ b/share/scripts/debconf @@ -81,7 +81,7 @@ Parameters () Usage () { - echo "Usage: container create -n|--name NAME -s|--script ${SCRIPT} [-p|--preseed-file FILE]" >&2 + echo "Usage: container create -n|--name NAME -s|--script ${SCRIPT} -- [-p|--preseed-file FILE]" >&2 exit 1 } diff --git a/share/scripts/debconf.d/0003-debconf b/share/scripts/debconf.d/0003-debconf index c0944fa..77dc030 100755 --- a/share/scripts/debconf.d/0003-debconf +++ b/share/scripts/debconf.d/0003-debconf @@ -32,8 +32,8 @@ Distribution () then case "${MODE}" in debian) - db_subst cnt-debconf/distribution CHOICES "Debian GNU/Linux 8 \"jessie\", Debian GNU/Linux 9 \"stretch\", Debian GNU/Linux unstable/sid" - db_subst cnt-debconf/distribution CHOICES_C "jessie, stretch, sid" + db_subst cnt-debconf/distribution CHOICES "Debian GNU/Linux 9 \"stretch\", Debian GNU/Linux unstable/sid" + db_subst cnt-debconf/distribution CHOICES_C "stretch, sid" db_set cnt-debconf/distribution stretch db_fset cnt-debconf/distribution seen false diff --git a/share/scripts/debootstrap b/share/scripts/debootstrap index 1ead471..e04f32d 100755 --- a/share/scripts/debootstrap +++ b/share/scripts/debootstrap @@ -95,7 +95,7 @@ Parameters () Usage () { - echo "Usage: container create -n|--name NAME -s|--script ${SCRIPT} [-a|--architecture ARCHITECTURE] [-d|--distribution DISTRIBUTION] [-m|--mirror MIRROR] [-p|--password PASSWORD}" >&2 + echo "Usage: container create -n|--name NAME -s|--script ${SCRIPT} -- [-a|--architecture ARCHITECTURE] [-d|--distribution DISTRIBUTION] [-m|--mirror MIRROR] [-p|--password PASSWORD}" >&2 exit 1 } |