summaryrefslogtreecommitdiffstats
path: root/lib/container/stop
diff options
context:
space:
mode:
Diffstat (limited to 'lib/container/stop')
-rwxr-xr-xlib/container/stop289
1 files changed, 0 insertions, 289 deletions
diff --git a/lib/container/stop b/lib/container/stop
deleted file mode 100755
index 6b8caee..0000000
--- a/lib/container/stop
+++ /dev/null
@@ -1,289 +0,0 @@
-#!/bin/sh
-
-# Copyright (C) 2014-2021 Daniel Baumann <daniel.baumann@open-infrastructure.net>
-#
-# SPDX-License-Identifier: GPL-3.0+
-#
-# 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
-
-PROJECT="open-infrastructure"
-PROGRAM="container"
-COMMAND="$(basename ${0})"
-
-CONFIG="/etc/${PROJECT}/${PROGRAM}/config"
-HOOKS="/etc/${PROJECT}/${PROGRAM}/hooks"
-MACHINES="/var/lib/machines"
-
-CLEAN="false"
-
-Parameters ()
-{
- OPTIONS_ALL=""
-
- GETOPT_LONGOPTIONS="name:,force,clean,verbose,"
- GETOPT_OPTIONS="n:,f,v,"
-
- PARAMETERS="$(getopt --longoptions ${GETOPT_LONGOPTIONS} --name=${COMMAND} --options ${GETOPT_OPTIONS} --shell sh -- ${@})"
-
- if [ "${?}" != "0" ]
- then
- echo "'${COMMAND}': getopt exit" >&2
- exit 1
- fi
-
- eval set -- "${PARAMETERS}"
-
- while true
- do
- case "${1}" in
- -n|--name)
- NAME="${2}"
- shift 2
- ;;
-
- -f|--force)
- FORCE="true"
- shift 1
-
- OPTIONS_ALL="${OPTIONS_ALL} --force"
- ;;
-
- --clean)
- # internal option
- CLEAN="true"
- shift 1
-
- OPTONS_ALL="${OPTIONS_ALL} --clean"
- ;;
-
- -v|--verbose)
- VERBOSE="true"
- shift 1
-
- OPTIONS_ALL="${OPTIONS_ALL} --verbose"
- ;;
-
- --)
- shift 1
- break
- ;;
-
- *)
- echo "'${COMMAND}': getopt error" >&2
- exit 1
- ;;
- esac
- done
-}
-
-Usage ()
-{
- echo "Usage: ${PROGRAM} ${COMMAND} -n|--name NAME [-f|--force] [-v|--verbose]" >&2
- exit 1
-}
-
-Rmdir ()
-{
- DIRECTORIES="${@}"
-
- for DIRECTORY in ${DIRECTORIES}
- do
- PARENT_DIRECTORY="/$(echo ${DIRECTORY} | cut -d / -f 2)"
-
- if [ "${PARENT_DIRECTORY}" != "${DIRECTORY}" ]
- then
- # the directory is at least two levels down from /
- cd "${PARENT_DIRECTORY}"
-
- CRUFT="$(echo ${DIRECTORY} | cut -d / -f 3-)"
- rmdir --ignore-fail-on-non-empty --parents "${CRUFT}" > /dev/null 2>&1 || true
-
- cd "${OLDPWD}"
- fi
- done
-}
-
-Parameters "${@}"
-
-if [ -z "${NAME}" ]
-then
- Usage
-fi
-
-case "${NAME}" in
- ALL)
- NAMES="$(${PROGRAM} list --format shell --started)"
-
- for NAME in ${NAMES}
- do
- ${PROGRAM} stop --name ${NAME} ${OPTIONS_ALL} || true
- done
-
- exit 0
- ;;
-esac
-
-if [ ! -e "${MACHINES}/${NAME}" ]
-then
- echo "'${NAME}': no such container" >&2
- exit 1
-fi
-
-# Pre hooks
-for FILE in "${HOOKS}/pre-${COMMAND}".* "${HOOKS}/${NAME}.pre-${COMMAND}"
-do
- if [ -x "${FILE}" ]
- then
- "${FILE}"
- fi
-done
-
-STATE="$(machinectl show ${NAME} 2>&1 | awk -FState= '/^State=/ { print $2 }')"
-
-case "${CLEAN}" in
- true)
- # Removing overlay mounts
- CNT_OVERLAY="$(awk -Fcnt.overlay= '/^cnt.overlay=/ { print $2 }' ${CONFIG}/${NAME}.conf)"
-
- if [ -n "${CNT_OVERLAY}" ]
- then
- CNT_OVERLAYS="$(echo ${CNT_OVERLAY} | sed -e 's|;| |g')"
-
- for CNT_OVERLAY in ${CNT_OVERLAYS}
- do
- DIRECTORY_LOWER="$(echo ${CNT_OVERLAY} | awk -F: '{ print $1 }')"
- DIRECTORY_UPPER="$(echo ${CNT_OVERLAY} | awk -F: '{ print $2 }')"
- DIRECTORY_WORK="$(echo ${CNT_OVERLAY} | awk -F: '{ print $3 }')"
- DIRECTORY_MERGED="$(echo ${CNT_OVERLAY} | awk -F: '{ print $4 }')"
-
- umount -f "${DIRECTORY_MERGED}"
-
- Rmdir "${DIRECTORY_LOWER}" "${DIRECTORY_UPPER}" "${DIRECTORY_WORK}" "${DIRECTORY_MERGED}"
- done
- fi
-
- # Removing rw bind mounts
- BIND="$(awk -Fbind= '/^bind=/ { print $2 }' ${CONFIG}/${NAME}.conf)"
-
- if [ -n "${BIND}" ]
- then
- BINDS="$(echo ${BIND} | sed -e 's|;| |g')"
-
- for BIND in ${BINDS}
- do
- DIRECTORY="$(echo ${BIND} | awk -F: '{ print $1 }')"
-
- Rmdir "${DIRECTORY}"
- done
- fi
-
- # Removing ro bind mounts
- BIND_RO="$(awk -Fbind-ro= '/^bind-ro=/ { print $2 }' ${CONFIG}/${NAME}.conf)"
-
- if [ -n "${BIND_RO}" ]
- then
- BINDS_RO="$(echo ${BIND_RO} | sed -e 's|;| |g')"
-
- for BIND_RO in ${BINDS_RO}
- do
- DIRECTORY="$(echo ${BIND_RO} | awk -F: '{ print $1 }')"
-
- Rmdir "${DIRECTORY}"
- done
- fi
-
- # Removing network configuration
- VETHS="$(awk -Fnetwork-veth-extra= '/^network-veth-extra=/ { print $2 }' ${CONFIG}/${NAME}.conf)"
-
- case "${VETHS}" in
- "")
- ;;
-
- *)
- for VETH in ${VETHS}
- 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)
- ;;
-
- *)
- echo "'${NAME}': container is already stopped" >&2
- exit 1
- ;;
-esac
-
-case "${FORCE}" in
- true)
- MODE="terminate"
- ;;
-
- *)
- MODE="poweroff"
- ;;
-esac
-
-# Run
-case "${VERBOSE}" in
- true)
- echo -n "Stopping container ${NAME}..."
- ;;
-esac
-
-machinectl ${MODE} ${NAME}
-
-case "${FORCE}" in
- true)
- VETHS="$(awk -Fnetwork-veth-extra= '/^network-veth-extra=/ { print $2 }' ${CONFIG}/${NAME}.conf | awk -F: '{ print $1 }')"
-
- for VETH in ${VETHS}
- do
- ip link delete ${VETH} > /dev/null 2>&1 || true
- done
- ;;
-esac
-
-case "${VERBOSE}" in
- true)
- echo " done."
- ;;
-esac
-
-# Post hooks
-for FILE in "${HOOKS}/post-${COMMAND}".* "${HOOKS}/${NAME}.post-${COMMAND}"
-do
- if [ -x "${FILE}" ]
- then
- "${FILE}"
- fi
-done