diff options
-rw-r--r-- | CHANGELOG.txt | 27 | ||||
-rw-r--r-- | VERSION.txt | 2 | ||||
-rwxr-xr-x | bin/container-autostart | 47 | ||||
-rwxr-xr-x | lib/container/auto | 90 | ||||
-rwxr-xr-x | lib/container/create | 16 | ||||
-rwxr-xr-x | lib/container/list | 54 | ||||
-rwxr-xr-x | lib/container/start | 102 | ||||
-rwxr-xr-x | lib/container/stop | 41 | ||||
-rw-r--r-- | share/config/container.conf.in | 6 | ||||
-rw-r--r-- | share/doc/examples/cairon-backports.cfg | 1 | ||||
-rw-r--r-- | share/doc/examples/jessie.cfg | 2 | ||||
-rw-r--r-- | share/man/container-auto.1.txt | 78 | ||||
-rwxr-xr-x | share/scripts/debconf | 44 | ||||
-rwxr-xr-x | share/scripts/debconf.d/0003-debconf | 21 | ||||
-rw-r--r-- | share/scripts/debconf.d/0003-debconf.templates | 6 | ||||
-rwxr-xr-x | share/scripts/debootstrap | 2 | ||||
-rw-r--r-- | share/systemd/container-auto.service (renamed from share/systemd/container-autostart.service) | 4 | ||||
-rw-r--r-- | share/systemd/container@.service | 12 |
18 files changed, 457 insertions, 98 deletions
diff --git a/CHANGELOG.txt b/CHANGELOG.txt index eb5f83d..c7b121c 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,30 @@ +2016-05-15 Daniel Baumann <daniel.baumann@open-infrastructure.net> + + * Releasing version 20160515. + * Adding support for multiple interfaces per container. + * Adding automatic stop of all container on host shutdown. + * Correcting errors in documentation. + + * Backward incompatible changes: + - container network configuration in the [start] section for + multi-interface support: + + old: network-veth=yes + network-bridge=br0 + + new: cnt.network-bridge=veth-foo:br0 + network-veth-extra=veth-foo:eth0 + cnt.network-bridge=veth-bar:br1 + network-veth-extra=veth-bar:eth1 + + - default container network device switched from host0 to eth0. + - container start in background by default. + - container-autostart has been renamed to container-auto. + - container autostart configuration in the [start] section: + + old: cnt.autostart=true|FQDN + new: cnt.auto=true|FQDN + 2016-05-01 Daniel Baumann <daniel.baumann@open-infrastructure.net> * Releasing version 20160501. diff --git a/VERSION.txt b/VERSION.txt index 3eb848a..232669c 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -20160501 +20160515 diff --git a/bin/container-autostart b/bin/container-autostart deleted file mode 100755 index 92e2383..0000000 --- a/bin/container-autostart +++ /dev/null @@ -1,47 +0,0 @@ -#!/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 - -if [ ! -x /usr/bin/screen ] -then - echo "'${NAME}': /usr/bin/screen - no such file." >&2 - exit 1 -fi - -HOST="$(hostname -f)" - -HOME="${HOME:-/root}" -SHELL="/bin/bash" -export HOME SHELL - -cd "${HOME}" - -#screen -S container -A -d -m -t cnt bash -cl "cntsh && bash -l" -screen -S container -A -d -m -t cnt bash -l - -for CONFIG in /etc/container-tools/config/*.conf -do - if grep -Eqs "^ *cnt.autostart=true" "${CONFIG}" || grep -Eqs "^ *cnt.autostart=${HOST}" "${CONFIG}" - then - CONTAINER="$(basename ${CONFIG} .conf)" - TITLE="$(echo ${CONTAINER} | awk -F. '{ print $1 }')" - - screen -S container -X screen -t ${TITLE} bash -cl "cnt start -n ${CONTAINER} && bash -l" - fi -done diff --git a/lib/container/auto b/lib/container/auto new file mode 100755 index 0000000..247b667 --- /dev/null +++ b/lib/container/auto @@ -0,0 +1,90 @@ +#!/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 + +COMMAND="$(basename ${0})" + +CONFIG="/etc/container-tools/config" + +Parameters () +{ + LONG_OPTIONS="start,stop" + OPTIONS="s,t" + + PARAMETERS="$(getopt --longoptions ${LONG_OPTIONS} --name=${COMMAND} --options ${OPTIONS} --shell sh -- ${@})" + + if [ "${?}" != "0" ] + then + echo "'${COMMAND}': getopt exit" >&2 + exit 1 + fi + + eval set -- "${PARAMETERS}" + + while true + do + case "${1}" in + -s|--start) + ACTION="start" + shift 1 + ;; + + -t|--stop) + ACTION="stop" + shift 1 + ;; + + --) + shift 1 + break + ;; + + *) + echo "'${COMMAND}': getopt error" >&2 + exit 1 + ;; + esac + done +} + +Usage () +{ + echo "Usage: container ${COMMAND} -s|--start -t|--stop" >&2 + exit 1 +} + +Parameters "${@}" + +if [ -z "${ACTION}" ] +then + Usage +fi + +HOST="$(hostname -f)" + +# Run +for FILE in "${CONFIG}"/*.conf +do + if grep -Eqs "^ *cnt.auto=true" "${FILE}" || grep -Eqs "^ *cnt.auto=${HOST}" "${FILE}" + then + CONTAINER="$(basename ${FILE} .conf)" + + cnt ${ACTION} -n ${CONTAINER} || true + fi +done diff --git a/lib/container/create b/lib/container/create index fab9f5b..0b0aa3a 100755 --- a/lib/container/create +++ b/lib/container/create @@ -25,7 +25,7 @@ MACHINES="/var/lib/machines" Parameters () { - LONG_OPTIONS="name:,cnt.autostart:,bind:,capability:,drop-capability:script:" + LONG_OPTIONS="name:,cnt.auto:,bind:,capability:,drop-capability:script:" OPTIONS="n:,b:,c:,d:,s:" PARAMETERS="$(getopt --longoptions ${LONG_OPTIONS} --name=${COMMAND} --options ${OPTIONS} --shell sh -- ${@})" @@ -46,8 +46,8 @@ Parameters () shift 2 ;; - --cnt.autostart) - CNT_AUTOSTART="${2}" + --cnt.auto) + CNT_AUTO="${2}" shift 2 ;; @@ -86,7 +86,7 @@ Parameters () Usage () { - echo "Usage: container ${COMMAND} -n|--name NAME [--cnt.autostart=true|false|FQDN] [-b|--bind DIRECTORY:DIRECTORY[:OPTIONS]] [-c|--capability CAPABILITY[,CAPABILITY]] [-d|--drop-capability DROP_CAPABILITY[,DROP_CAPABILITY]] [-s|--script SCRIPT] [-- SCRIPT_OPTIONS]" >&2 + echo "Usage: container ${COMMAND} -n|--name NAME [--cnt.auto=true|false|FQDN] [-b|--bind DIRECTORY:DIRECTORY[:OPTIONS]] [-c|--capability CAPABILITY[,CAPABILITY]] [-d|--drop-capability DROP_CAPABILITY[,DROP_CAPABILITY]] [-s|--script SCRIPT] [-- SCRIPT_OPTIONS]" >&2 exit 1 } @@ -110,7 +110,7 @@ then echo "'${SCRIPT}': no such script" >&2 fi -CNT_AUTOSTART="${CNT_AUTOSTART:-$(hostname -f)}" +CNT_AUTO="${CNT_AUTO:-$(hostname -f)}" BINDS="$(echo ${BIND} | sed -e 's|;| |g')" @@ -127,7 +127,8 @@ done # config mkdir -p "${CONFIG}" -sed -e "s|@CNT_AUTOSTART@|${CNT_AUTOSTART}|g" \ +sed -e "s|@CNT_AUTO@|${CNT_AUTO}|g" \ + -e "s|@CNT_NETWORK_BRIDGE@|${CNT_NETWORK_BRIDGE}|g" \ -e "s|@NAME@|${NAME}|g" \ -e "s|@BIND@|${BIND}|g" \ -e "s|@BOOT@|yes|g" \ @@ -135,8 +136,7 @@ sed -e "s|@CNT_AUTOSTART@|${CNT_AUTOSTART}|g" \ -e "s|@DIRECTORY@|${MACHINES}/${NAME}|g" \ -e "s|@DROP_CAPABILITY@|${DROP_CAPABILITY}|g" \ -e "s|@MACHINE@|${NAME}|g" \ - -e "s|@NETWORK_VETH@|yes|g" \ - -e "s|@NETWORK_BRIDGE@|br0|g" \ + -e "s|@NETWORK_VETH_EXTRA@|${NETWORK_VETH_EXTRA}|g" \ -e "s|@LINK_JOURNAL@|no|g" \ -e "s|@REGISTER@|yes|g" \ /usr/share/container-tools/config/container.conf.in > "${CONFIG}/${NAME}.conf" diff --git a/lib/container/list b/lib/container/list index 5ab5755..8b55e09 100755 --- a/lib/container/list +++ b/lib/container/list @@ -94,7 +94,7 @@ case "${FORMAT}" in NORMAL="$(tput sgr0)" cat << EOF -Container IPv4 Address Status +Container IPv4 Address(es) Status -------------------------------------------------------------------------------- EOF @@ -118,9 +118,9 @@ do if [ -e "${MACHINES}/${CONTAINER}/etc/network/interfaces" ] then - ADDRESS="$(awk '/address/ { print $2 }' ${MACHINES}/${CONTAINER}/etc/network/interfaces)" + ADDRESSES="$(awk '/address/ { print $2 }' ${MACHINES}/${CONTAINER}/etc/network/interfaces)" else - ADDRESS="n/a" + ADDRESSES="n/a" fi case "${STATE}" in @@ -142,7 +142,21 @@ do ;; full) - printf "%-72s %-29s %-7s\n" "${BLUE}${CONTAINER}${NORMAL}" "${YELLOW}${ADDRESS}${NORMAL}" "${STATUS}" + FIRST_LINE="true" + + for ADDRESS in ${ADDRESSES} + do + case "${FIRST_LINE}" in + true) + FIRST_LINE="false" + printf "%-69s %-29s %-7s\n" "${BLUE}${CONTAINER}${NORMAL}" "${YELLOW}${ADDRESS}${NORMAL}" " ${STATUS}" + ;; + + *) + printf "%-54s %-29s\n" "" "${ADDRESS}" + ;; + esac + done ;; esac ;; @@ -156,7 +170,21 @@ do ;; full) - printf "%-72s %-29s %-7s\n" "${BLUE}${CONTAINER}${NORMAL}" "${YELLOW}${ADDRESS}${NORMAL}" "${STATUS}" + FIRST_LINE="true" + + for ADDRESS in ${ADDRESSES} + do + case "${FIRST_LINE}" in + true) + FIRST_LINE="false" + printf "%-69s %-29s %-7s\n" "${BLUE}${CONTAINER}${NORMAL}" "${YELLOW}${ADDRESS}${NORMAL}" " ${STATUS}" + ;; + + *) + printf "%-54s %-29s\n" "" "${ADDRESS}" + ;; + esac + done ;; esac ;; @@ -175,7 +203,21 @@ do ;; full) - printf "%-72s %-29s %-7s\n" "${BLUE}${CONTAINER}${NORMAL}" "${YELLOW}${ADDRESS}${NORMAL}" "${STATUS}" + FIRST_LINE="true" + + for ADDRESS in ${ADDRESSES} + do + case "${FIRST_LINE}" in + true) + FIRST_LINE="false" + printf "%-69s %-29s %-7s\n" "${BLUE}${CONTAINER}${NORMAL}" "${YELLOW}${ADDRESS}${NORMAL}" " ${STATUS}" + ;; + + *) + printf "%-54s %-29s\n" "" "${ADDRESS}" + ;; + esac + done ;; esac ;; diff --git a/lib/container/start b/lib/container/start index 8d5429b..d026bf1 100755 --- a/lib/container/start +++ b/lib/container/start @@ -23,9 +23,12 @@ COMMAND="$(basename ${0})" CONFIG="/etc/container-tools/config" MACHINES="/var/lib/machines" +START="false" +SYSTEMCTL="true" + Parameters () { - LONG_OPTIONS="name:" + LONG_OPTIONS="name:,nspawn,start" OPTIONS="n:" PARAMETERS="$(getopt --longoptions ${LONG_OPTIONS} --name=${COMMAND} --options ${OPTIONS} --shell sh -- ${@})" @@ -46,6 +49,19 @@ Parameters () shift 2 ;; + --nspawn) + # internal option + SYSTEMCTL="false" + shift 1 + ;; + + --start) + # internal option + START="true" + SYSTEMCTL="false" + shift 1 + ;; + --) shift 1 break @@ -78,12 +94,16 @@ then exit 1 fi -STATE="$(machinectl show ${NAME} 2>&1 | awk -F= '/^State=/ { print $2 }')" +case "${START}" in + false) + STATE="$(machinectl show ${NAME} 2>&1 | awk -F= '/^State=/ { print $2 }')" -case "${STATE}" in - running) - echo "'${NAME}': container is already started" >&2 - exit 1 + case "${STATE}" in + running) + echo "'${NAME}': container is already started" >&2 + exit 1 + ;; + esac ;; esac @@ -185,27 +205,58 @@ then MACHINE="--machine=${NAME}" - NETWORK_BRIDGE="$(awk -F= '/^network-bridge=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + NETWORK_VETH_EXTRA_CONF="$(awk -F= '/^network-veth-extra=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + NETWORK_VETH_EXTRA="" - case "${NETWORK_BRIDGE}" in + case "${NETWORK_VETH_EXTRA_CONF}" in "") - NETWORK_BRIDGE="" ;; *) - NETWORK_BRIDGE="--network-bridge=${NETWORK_BRIDGE}" + for VETH in ${NETWORK_VETH_EXTRA_CONF} + do + NETWORK_VETH_EXTRA="${NETWORK_VETH_EXTRA} --network-veth-extra=${VETH}" + INTERFACE="$(echo ${VETH} | awk -F: '{ print $1 }')" + +cat > "/etc/network/interfaces.d/${INTERFACE}" << EOF +allow-hotplug ${INTERFACE} +iface ${INTERFACE} inet manual + pre-up ifconfig ${INTERFACE} up + post-down ifconfig ${INTERFACE} down +EOF + + done ;; esac - NETWORK_VETH="$(awk -F= '/^network-veth=/ { print $2 }' ${CONFIG}/${NAME}.conf || echo yes)" + NETWORK_BRIDGES="$(awk -F= '/^cnt.network-bridge=/ { print $2 }' ${CONFIG}/${NAME}.conf)" - case "${NETWORK_VETH}" in - yes) - NETWORK_VETH="--network-veth" + case "${NETWORK_BRIDGES}" in + "") ;; *) - NETWORK_VETH="" + for BRIDGE_DEFINITION in ${NETWORK_BRIDGES} + do + INTERFACE="$(echo ${BRIDGE_DEFINITION} | awk -F: '{ print $1 }')" + BRIDGE="$(echo ${BRIDGE_DEFINITION} | awk -F: '{ print $2 }')" + + if [ -n "${BRIDGE}" ] && [ -n "${INTERFACE}" ] + then + +cat > "/etc/network/interfaces.d/${INTERFACE}" << EOF +allow-hotplug ${INTERFACE} +iface ${INTERFACE} inet manual + pre-up ifconfig ${INTERFACE} up + post-up brctl addif ${BRIDGE} ${INTERFACE} + pre-down brctl delif ${BRIDGE} ${INTERFACE} + post-down ifconfig ${INTERFACE} down +EOF + + else + echo "Warning bridge definition '${BRIDGE_DEFINITION}' not recognized (expected <bridge>:<interface>): Ignoring" + fi + done ;; esac @@ -298,14 +349,25 @@ then fi fi -# Run -case "${SET_PROPERTY}" in +case "${SYSTEMCTL}" in true) - ${SETARCH} systemd-nspawn ${BIND} ${BOOT} ${CAPABILITY} ${DIRECTORY} ${DROP_CAPABILITY} ${MACHINE} ${NETWORK_BRIDGE} ${NETWORK_VETH} ${LINK_JOURNAL} ${REGISTER} & \ - systemctl --runtime set-property ${NAME} ${BLOCK_IO_DEVICE_WEIGHT} ${BLOCK_IO_READ_BANDWITH} ${BLOCK_IO_WEIGHT} ${BLOCK_IO_WRITE_BANDWITH} ${CPU_QUOTA} ${CPU_SHARES} ${MEMORY_LIMIT} ${TASKS_MAX} + systemctl start container@${NAME}.service + # FIXME start console .. after sleep? + configuration option + exit 0 + ;; +esac + +case "${START}" in + true) + case "${SET_PROPERTY}" in + true) + systemctl --runtime set-property ${NAME} ${BLOCK_IO_DEVICE_WEIGHT} ${BLOCK_IO_READ_BANDWITH} ${BLOCK_IO_WEIGHT} ${BLOCK_IO_WRITE_BANDWITH} ${CPU_QUOTA} ${CPU_SHARES} ${MEMORY_LIMIT} ${TASKS_MAX} + ;; + esac ;; *) - ${SETARCH} systemd-nspawn ${BIND} ${BOOT} ${CAPABILITY} ${DIRECTORY} ${DROP_CAPABILITY} ${MACHINE} ${NETWORK_BRIDGE} ${NETWORK_VETH} ${LINK_JOURNAL} ${REGISTER} + # Run + ${SETARCH} systemd-nspawn --keep-unit ${BIND} ${BOOT} ${CAPABILITY} ${DIRECTORY} ${DROP_CAPABILITY} ${MACHINE} ${NETWORK_VETH_EXTRA} ${LINK_JOURNAL} ${REGISTER} ;; esac diff --git a/lib/container/stop b/lib/container/stop index cd3de10..67cc403 100755 --- a/lib/container/stop +++ b/lib/container/stop @@ -20,11 +20,14 @@ set -e COMMAND="$(basename ${0})" +CONFIG="/etc/container-tools/config" MACHINES="/var/lib/machines" +CLEAN="false" + Parameters () { - LONG_OPTIONS="name:,force" + LONG_OPTIONS="name:,force,clean" OPTIONS="n:,f" PARAMETERS="$(getopt --longoptions ${LONG_OPTIONS} --name=${COMMAND} --options ${OPTIONS} --shell sh -- ${@})" @@ -49,6 +52,12 @@ Parameters () FORCE="true" ;; + --clean) + # internal option + CLEAN="true" + shift 1 + ;; + --) shift 1 break @@ -83,6 +92,36 @@ fi STATE="$(machinectl show ${NAME} 2>&1 | awk -F= '/^State=/ { print $2 }')" +# Removing network configuration +case "${CLEAN}" in + true) + NETWORK_VETH_EXTRA_CONF="$(awk -F= '/^network-veth-extra=/ { print $2 }' ${CONFIG}/${NAME}.conf)" + + case "${NETWORK_VETH_EXTRA_CONF}" in + "") + ;; + + *) + for VETH in ${NETWORK_VETH_EXTRA_CONF} + do + INTERFACE="$(echo ${VETH} | awk -F: '{ print $1 }')" + FILE="/etc/network/interfaces.d/${INTERFACE}" + + if [ -f "${FILE}" ] + then + rm -f "${FILE}" + fi + done + ;; + esac + + exit 0 + ;; + + *) + ;; +esac + case "${STATE}" in running) ;; diff --git a/share/config/container.conf.in b/share/config/container.conf.in index fbf8078..dd52adb 100644 --- a/share/config/container.conf.in +++ b/share/config/container.conf.in @@ -1,15 +1,15 @@ # container-tools: @NAME@ [start] -cnt.autostart=@CNT_AUTOSTART@ +cnt.auto=@CNT_AUTO@ +cnt.network-bridge=@CNT_NETWORK_BRIDGE@ bind=@BIND@ boot=@BOOT@ capability=@CAPABILITY@ directory=@DIRECTORY@ drop-capability=@DROP_CAPABILITY@ machine=@MACHINE@ -network-veth=@NETWORK_VETH@ -network-bridge=@NETWORK_BRIDGE@ +network-veth-extra=@NETWORK_VETH_EXTRA@ link-journal=@LINK_JOURNAL@ register=@REGISTER@ diff --git a/share/doc/examples/cairon-backports.cfg b/share/doc/examples/cairon-backports.cfg index 2fca922..dd459f2 100644 --- a/share/doc/examples/cairon-backports.cfg +++ b/share/doc/examples/cairon-backports.cfg @@ -30,6 +30,7 @@ container-tools cnt-debconf/root-password string progress # Network IP configuration container-tools cnt-debconf/network0/bridge string br0 +container-tools cnt-debconf/network0/veth string veth0 container-tools cnt-debconf/network0/ipv4-method select static container-tools cnt-debconf/network0/ipv4-comment string Primary network interfaces container-tools cnt-debconf/network0/ipv4-address string 192.168.0.2 diff --git a/share/doc/examples/jessie.cfg b/share/doc/examples/jessie.cfg index e9f9d46..0ec33e6 100644 --- a/share/doc/examples/jessie.cfg +++ b/share/doc/examples/jessie.cfg @@ -28,5 +28,5 @@ container-tools cnt-debconf/packages string openssh-server container-tools cnt-debconf/root-password string debian #container-tools cnt-debconf/root-password-crypted string -container-tools cnt-debconf/network-bridge string br0 +container-tools cnt-debconf/network0/bridge string br0 #container-tools cnt-debconf/network-mac string diff --git a/share/man/container-auto.1.txt b/share/man/container-auto.1.txt new file mode 100644 index 0000000..af2d3c7 --- /dev/null +++ b/share/man/container-auto.1.txt @@ -0,0 +1,78 @@ +// 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-START(1) +================== +:doctype: manpage +:man manual: Open Infrastructure +:man source: container-tools +:man version: {revnumber} + + +NAME +---- +container-auto - Start/stop all container automatically at boot/shutdown + + +SYNOPSIS +-------- +*container auto* ['OPTIONS'] + + +DESCRIPTION +----------- +The container auto command starts or stops all container on the host system. + + +OPTIONS +------- +The following container options are available: + +*-s, --start*:: + Start all container on the host system. + +*-t, --stop*:: + Stop all container on the host system. + + +EXAMPLES +-------- +*Start all container on the host system:*:: + sudo container auto --start + +*Stop all container on the host system:*:: + sudo container auto --stop + + +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 http://open-infrastructure.net. + + +BUGS +---- +Bugs can be reported by opening an issue in the GitHub repository at http://github.com/open-infrastructure/container-tools. + + +AUTHORS +------- +container-tools was written by Daniel Baumann <daniel.baumann@open-infrastructure.net>. diff --git a/share/scripts/debconf b/share/scripts/debconf index cbde345..55c2b8b 100755 --- a/share/scripts/debconf +++ b/share/scripts/debconf @@ -46,7 +46,7 @@ Parameters () shift 2 ;; - --cnt.autostart) + --cnt.auto) # ignore shift 2 ;; @@ -702,7 +702,7 @@ EOF then echo "${CONTAINER_COMMAND}" > "${DIRECTORY}/.container-command" - chmod 0755 "sh /.container-command" + chmod 0755 "${DIRECTORY}/.container-command" Chroot "${DIRECTORY}" "sh /.container-command" rm -f "${DIRECTORY}/.container-command" @@ -749,7 +749,7 @@ EOF none) cat >> "${DIRECTORY}/etc/network/interfaces.tmp" << EOF -iface host${NUMBER} inet manual +iface eth${NUMBER} inet manual EOF ;; @@ -757,8 +757,8 @@ EOF dhcp) cat >> "${DIRECTORY}/etc/network/interfaces.tmp" << EOF -auto host${NUMBER} -iface host${NUMBER} inet dhcp +auto eth${NUMBER} +iface eth${NUMBER} inet dhcp EOF ;; @@ -766,8 +766,8 @@ EOF static) cat >> "${DIRECTORY}/etc/network/interfaces.tmp" << EOF -auto host${NUMBER} -iface host${NUMBER} inet static +auto eth${NUMBER} +iface eth${NUMBER} inet static address ${IPV4_ADDRESS} EOF @@ -902,7 +902,33 @@ Commands () fi # config (FIXME) - sed -i -e "s|^network-bridge=.*|network-bridge=${NETWORK0_BRIDGE}|" "${CONFIG}/${NAME}.conf" + + # maximum of 15 characters, prefix is 'veth-' + HOSTNAME_SHORT="$(echo ${NAME} | cut -c-8)" + HOST_INTERFACE_NAME="$(echo ${NETWORK0_VETH:-veth-${HOSTNAME_SHORT}-0})" + + sed -i -e "s|^cnt.network-bridge=.*|cnt.network-bridge=${HOST_INTERFACE_NAME}:${NETWORK0_BRIDGE:-br0}|g" "${CONFIG}/${NAME}.conf" + sed -i -e "s|^network-veth-extra=.*|network-veth-extra=${HOST_INTERFACE_NAME}:eth0|g" "${CONFIG}/${NAME}.conf" + + for NUMBER in $(seq 1 ${NETWORK_NUMBER}) + do + eval IPV4_METHOD="$`echo NETWORK${NUMBER}_IPV4_METHOD`" + + if [ -z "${IPV4_METHOD}" ] + then + continue + fi + + eval HOST_INTERFACE_NAME="$`echo NETWORK${NUMBER}_VETH`" + + HOST_INTERFACE_NAME="$(echo ${HOST_INTERFACE_NAME:-veth-${HOSTNAME_SHORT}-${NUMBER}})" + CONTAINER_INTERFACE_NAME="eth${NUMBER}" + + sed -i -e "/^register=.*/ a network-veth-extra=${HOST_INTERFACE_NAME}:${CONTAINER_INTERFACE_NAME}" "${CONFIG}/${NAME}.conf" + + eval BRIDGE="$`echo NETWORK${NUMBER}_BRIDGE`" + sed -i -e "/^register=.*/ a cnt.network-bridge=${HOST_INTERFACE_NAME}:${BRIDGE:-br${NUMBER}}" "${CONFIG}/${NAME}.conf" + done # Setting root password echo root:${ROOT_PASSWORD} | chroot "${DIRECTORY}" chpasswd @@ -932,6 +958,8 @@ SYSTEM="${MACHINES}/${NAME}" Debconf +export NAME + # Run debconf parts for SCRIPT in /usr/share/container-tools/scripts/debconf.d/* do diff --git a/share/scripts/debconf.d/0003-debconf b/share/scripts/debconf.d/0003-debconf index 03db192..df14ef0 100755 --- a/share/scripts/debconf.d/0003-debconf +++ b/share/scripts/debconf.d/0003-debconf @@ -673,6 +673,10 @@ Network_defaults () # * respect pre-existing interfaces (or interfaces.d) # * add support for bridges (make interface configuration more generic?) + HOSTNAME_SHORT="$(echo veth-$(echo ${NAME} | cut -c-8)-0)" + VETH_NAME="$(echo ${HOSTNAME_SHORT:-veth0})" + + NETWORK0_VETH="${NETWORK0_VETH:-$VETH_NAME}" NETWORK0_BRIDGE="${NETWORK0_BRIDGE:-br0}" NETWORK0_IPV4_METHOD="${NETWORK0_IPV4_METHOD:-dhcp}" NETWORK0_IPV4_ADDRESS="${NETWORK0_IPV4_ADDRESS:-192.168.1.2}" @@ -695,6 +699,9 @@ Network () db_get cnt-debconf/network0/bridge NETWORK0_BRIDGE="${RET}" # string (w/o empty) + db_get cnt-debconf/network0/veth + NETWORK0_VETH="${RET}" # string (w/o empty) + db_get cnt-debconf/network0/ipv4-method NETWORK0_IPV4_METHOD="${RET}" # select @@ -739,6 +746,9 @@ Network () db_set cnt-debconf/network0/bridge "${NETWORK0_BRIDGE}" db_fset cnt-debconf/network0/bridge seen false + db_set cnt-debconf/network0/veth "${NETWORK0_VETH}" + db_fset cnt-debconf/network0/veth seen false + db_set cnt-debconf/network0/ipv4-method "${NETWORK0_IPV4_METHOD}" db_fset cnt-debconf/network0/ipv4-method seen false @@ -785,6 +795,9 @@ Network () db_get cnt-debconf/network0/bridge NETWORK0_BRIDGE="${RET}" # select + db_get cnt-debconf/network0/veth + NETWORK0_VETH="${RET}" # select + db_get cnt-debconf/network0/ipv4-method NETWORK0_IPV4_METHOD="${RET}" # select @@ -840,6 +853,11 @@ Network () eval NETWORK${NUMBER}_BRIDGE="\"${RET}\"" # string (w/o empty) fi + if db_get cnt-debconf/network${NUMBER}/veth + then + eval NETWORK${NUMBER}_VETH="\"${RET}\"" # string (w/o empty) + fi + if db_get cnt-debconf/network${NUMBER}/ipv4-comment then eval NETWORK${NUMBER}_IPV4_COMMENT="\"${RET}\"" # string (w/ empty) @@ -911,6 +929,9 @@ Network () eval BRIDGE="$`echo NETWORK${NUMBER}_BRIDGE`" echo "NETWORK${NUMBER}_BRIDGE=\"${BRIDGE}\"" >> "${DEBCONF_TMPDIR}/debconf.default" + eval VETH="$`echo NETWORK${NUMBER}_VETH`" + echo "NETWORK${NUMBER}_VETH=\"${VETH}\"" >> "${DEBCONF_TMPDIR}/debconf.default" + eval COMMENT="$`echo NETWORK${NUMBER}_IPV4_COMMENT`" echo "NETWORK${NUMBER}_IPV4_COMMENT=\"${COMMENT}\"" >> "${DEBCONF_TMPDIR}/debconf.default" diff --git a/share/scripts/debconf.d/0003-debconf.templates b/share/scripts/debconf.d/0003-debconf.templates index c568d72..82a7ca1 100644 --- a/share/scripts/debconf.d/0003-debconf.templates +++ b/share/scripts/debconf.d/0003-debconf.templates @@ -98,6 +98,12 @@ Default: Description: Bridge Bridge. +Template: cnt-debconf/network0/veth +Type: string +Default: +Description: Veth name + Veth name. + Template: cnt-debconf/network0/ipv4-method Type: select Choices: dhcp, static, none diff --git a/share/scripts/debootstrap b/share/scripts/debootstrap index 208e050..0a9e733 100755 --- a/share/scripts/debootstrap +++ b/share/scripts/debootstrap @@ -45,7 +45,7 @@ Parameters () shift 2 ;; - --cnt.autostart) + --cnt.auto) # ignore shift 2 ;; diff --git a/share/systemd/container-autostart.service b/share/systemd/container-auto.service index 076aa41..e9addd7 100644 --- a/share/systemd/container-autostart.service +++ b/share/systemd/container-auto.service @@ -5,8 +5,8 @@ After=network.target [Service] Type=oneshot RemainAfterExit=yes -ExecStart=/usr/bin/container-autostart -#ExecStop= +ExecStart=/usr/bin/container auto --start +ExecStop=/usr/bin/container auto --stop Delegate=yes StandardOutput=syslog StandardError=syslog diff --git a/share/systemd/container@.service b/share/systemd/container@.service new file mode 100644 index 0000000..0bd6766 --- /dev/null +++ b/share/systemd/container@.service @@ -0,0 +1,12 @@ +[Unit] +Description="Container: %i" + +[Service] +Type=simple +ExecStart=/usr/bin/container start --name %i --nspawn +ExecStartPost=/usr/bin/container start --name %i --start +ExecStopPost=/usr/bin/container stop -n %i --clean +KillMode=mixed + +[Install] +WantedBy=multi-user.target |