#!/bin/bash
# Find a synapse worker's PID and write it to a file so systemd can manage it as a service

# example invocation:
# matrix-synapse-worker-write-pid user_dir:18700 /run/matrix-synapse-worker.user_dir:18700.pid

docker_api_call() { curl --silent --unix-socket /var/run/docker.sock ${@}; }

TARGETCONTAINER=matrix-synapse
TARGETWORKER=${1}
PIDFILE=${2}

# get ID list of subprocesses executed in $TARGETCONTAINER, and for each..
for EXECID in $(docker_api_call http://localhost/containers/${TARGETCONTAINER}/json | jq --raw-output '.ExecIDs[]')
do
  # fetch detailed process info
  EXECINFO=$(docker_api_call http://localhost/exec/${EXECID}/json)

  # extract config file path from last command argument
  WORKERCONFIGFILE=$(echo ${EXECINFO} | jq --raw-output .ProcessConfig.arguments[-1])

  # reconstruct worker name
  WORKERNAME=${WORKERCONFIGFILE#*/worker.}
  WORKERNAME=${WORKERNAME%.yaml}

  # if name matches the target worker: write out most recent PID & quit
  [ "${WORKERNAME}" = "${TARGETWORKER}" ] \
    && echo ${EXECINFO} | jq --raw-output .Pid > ${PIDFILE} \
    && exit 0
done