diff options
Diffstat (limited to 'lib/container/stop')
-rwxr-xr-x | lib/container/stop | 289 |
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 |