summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--CHANGELOG.txt27
-rw-r--r--VERSION.txt2
-rwxr-xr-xbin/container-autostart47
-rwxr-xr-xlib/container/auto90
-rwxr-xr-xlib/container/create16
-rwxr-xr-xlib/container/list54
-rwxr-xr-xlib/container/start102
-rwxr-xr-xlib/container/stop41
-rw-r--r--share/config/container.conf.in6
-rw-r--r--share/doc/examples/cairon-backports.cfg1
-rw-r--r--share/doc/examples/jessie.cfg2
-rw-r--r--share/man/container-auto.1.txt78
-rwxr-xr-xshare/scripts/debconf44
-rwxr-xr-xshare/scripts/debconf.d/0003-debconf21
-rw-r--r--share/scripts/debconf.d/0003-debconf.templates6
-rwxr-xr-xshare/scripts/debootstrap2
-rw-r--r--share/systemd/container-auto.service (renamed from share/systemd/container-autostart.service)4
-rw-r--r--share/systemd/container@.service12
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