Files
Slavi PantaleevandClaude Fable 5 74e50df931 Add request timeouts to matrix-bot-meowlnir helper scripts
Without a timeout, a request against an API which accepts connections
but never answers (e.g. Meowlnir stuck retrying against a homeserver
that rejects its appservice token) hangs the playbook forever instead
of failing with a usable error.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 08:57:56 +03:00

57 lines
1.8 KiB
Django/Jinja
Executable File

#!/bin/sh
# Talks to Meowlnir's management API.
#
# The API is not published outside the container network, so requests are made from inside the container, which ships with curl.
# The management secret is read out of the live configuration file, so that it lives in exactly one place.
#
# Usage: meowlnir-api <METHOD> <PATH> [JSON_BODY]
# Example: meowlnir-api GET /_meowlnir/v1/bots
#
# Prints the response body, followed by the HTTP status code on its own final line.
set -eu
CONFIG_FILE='{{ matrix_bot_meowlnir_config_path }}/config.yaml'
CONTAINER_NAME='matrix-bot-meowlnir'
API_BASE='http://localhost:{{ matrix_bot_meowlnir_config_meowlnir_port }}'
REQUEST_TIMEOUT='{{ matrix_bot_meowlnir_api_request_timeout_seconds }}'
if [ $# -lt 2 ]; then
echo "Usage: $(basename "$0") <METHOD> <PATH> [JSON_BODY]" >&2
echo "Example: $(basename "$0") GET /_meowlnir/v1/bots" >&2
exit 2
fi
method="$1"
api_path="$2"
body="${3:-}"
# The configuration file is generated by Ansible, so its layout is predictable.
secret="$(awk '$1 == "management_secret:" { print $2; exit }' "$CONFIG_FILE" | sed 's/^"//; s/"$//')"
if [ -z "$secret" ]; then
echo "Could not read management_secret from $CONFIG_FILE" >&2
exit 1
fi
if [ "$secret" = 'disable' ]; then
echo "Meowlnir's management API is disabled (management_secret is set to 'disable')" >&2
exit 1
fi
if [ -n "$body" ]; then
exec {{ devture_systemd_docker_base_host_command_docker }} exec "$CONTAINER_NAME" \
curl -sS --max-time "$REQUEST_TIMEOUT" -X "$method" \
-H "Authorization: Bearer $secret" \
-H 'Content-Type: application/json' \
-d "$body" \
-w '\n%{http_code}' \
"$API_BASE$api_path"
fi
exec {{ devture_systemd_docker_base_host_command_docker }} exec "$CONTAINER_NAME" \
curl -sS --max-time "$REQUEST_TIMEOUT" -X "$method" \
-H "Authorization: Bearer $secret" \
-w '\n%{http_code}' \
"$API_BASE$api_path"