#!/bin/bash {% if debug_enabled|bool -%} set -x {% endif -%} add_date() { echo "$(date) $@" } # Set up script logging for debugging purpose. # It will be taken care of by logrotate since there is the .log # suffix. exec 3>&1 4>&2 trap 'exec 2>&4 1>&3' 0 1 2 3 exec 1>>/var/log/neutron/kill-script.log 2>&1 SIG=$1 PID=$2 NETNS=$(ip netns identify ${PID}) if [ "x${NETNS}" == "x" ]; then CLI="nsenter --all --preserve-credentials -t 1 podman" SIG=9 else CLI="nsenter --net=/run/netns/${NETNS} --preserve-credentials -m -t 1 podman" fi kill_container() { add_date "Killing container $1 ($2)" signal_container $1 $2 9 } stop_container() { add_date "Stopping container $1 ($2)" $CLI stop $2 } signal_container() { SIGNAL=$3 if [ -z "$SIGNAL" ]; then SIGNAL="HUP" fi add_date "Sending signal '$SIGNAL' to $1 ($2)" $CLI kill --signal $SIGNAL $2 } delete_container() { add_date "Deleting container $1 ($2)" $CLI rm $2 || echo "Deleting container $1 ($2) failed" } {% raw -%} if [ -f /proc/$PID/cgroup ]; then # Get container ID based on process cgroups CT_ID=$(awk 'BEGIN {FS=".scope|-"} /\/libpod-/ {if ($(NF-1)) print $(NF-1);exit}' /proc/$PID/cgroup) CT_NAME=$($CLI inspect -f '{{.Name}}' $CT_ID) case $SIG in HUP) signal_container $CT_NAME $CT_ID ;; 9) kill_container $CT_NAME $CT_ID delete_container $CT_NAME $CT_ID ;; 15) stop_container $CT_NAME $CT_ID delete_container $CT_NAME $CT_ID ;; *) add_date "Unknown action ${SIG} for ${CT_NAME} ${CT_ID}" exit 1 ;; esac else add_date "No such PID: ${PID}" exit 1 fi {% endraw %}