tripleo-ansible/tripleo_ansible/roles/tripleo-systemd-wrapper/templates/service_sync.j2

72 lines
2.5 KiB
Django/Jinja

#!/usr/bin/env bash
{% if tripleo_systemd_wrapper_debug %}
set -x
{% endif %}
function start_service {
local NETNS=$1
shift
local NAME=$1
shift
local CLI='{{ tripleo_systemd_wrapper_container_cli }}'
local CMD="{{ tripleo_systemd_wrapper_service_dir }}/{{ tripleo_systemd_wrapper_service_name }}/command"
local CONTAINER_CMD="ip netns exec ${NETNS} ${CMD}"
{% if tripleo_systemd_wrapper_container_cli == 'podman' %}
local LOGGING="--log-driver k8s-file --log-opt path=/var/log/containers/stdouts/${NAME}.log"
{% else %}
local LOGGING=''
{% endif %}
$CLI stop $NAME &> /dev/null || true
$CLI rm -f $NAME &> /dev/null || true
$CLI run --detach \
-v "{{ tripleo_systemd_wrapper_config_bind_mount }}" \
-v "/run/netns:/run/netns:shared" \
-v "{{ tripleo_systemd_wrapper_service_dir }}:{{ tripleo_systemd_wrapper_service_dir }}:z,shared" \
-v "/dev/log:/dev/log" $LOGGING \
--net host \
--pid host \
--privileged \
-u root \
--name $NAME \
{{ tripleo_systemd_wrapper_image_name }} \
$CONTAINER_CMD $@
}
jobs_file="{{ tripleo_systemd_wrapper_service_dir }}/{{ tripleo_systemd_wrapper_service_name }}/processes"
[ -s "$jobs_file" ] || exit 0 # nothing to do, no need for locking, just exit
exec {lock_fd}>/var/lock/{{ tripleo_systemd_wrapper_service_name }}-processes.lock || exit 1
# In case service_wrapper script already locked the commands, we just wait for a 10 sec.
flock -w 10 "$lock_fd" || exit 1
IFS=$'\n'
for LINE in $(cat ${jobs_file}); do
NETNS=$(echo $LINE | awk '{ print $1 }')
CONTAINER_NAME="{{ tripleo_systemd_wrapper_service_name }}-${NETNS}"
CLI='{{ tripleo_systemd_wrapper_container_cli }}'
# We do a filter to create a short list and then have to exact name match the results. The reason is that
# containers that partially match the filter will show up in the list. This is a little unlikely but there
# is nothing to prevent that.
start_container=yes
container_list=`$CLI ps --format={% raw %}"{{.Names}}"{% endraw %} --filter="name=$CONTAINER_NAME"`
for name in ${container_list};
do
if [ "x$name" = "x$CONTAINER_NAME" ];
then
start_container=no
break
fi
done
if [ "$start_container" = "yes" ];
then
IFS=$' ' ARGS=$(echo $LINE | sed -e "s|$NETNS ||" | xargs)
start_service $NETNS $CONTAINER_NAME $ARGS
fi
done
# truncate the file so we don't start them again
:> "$jobs_file"
flock -u "$lock_fd"