From 5b18b90c22428071227454d0d6b6271b66da3361 Mon Sep 17 00:00:00 2001
From: David Beniamine <david.beniamine@tetras-libre.fr>
Date: Tue, 23 Aug 2022 16:24:59 +0200
Subject: [PATCH] Stop properly sympa container on program failure

---
 docker/sympa/Dockerfile             |  4 ++++
 docker/sympa/exit-event-listener.py | 19 +++++++++++++++++++
 docker/sympa/supervisord.conf       |  4 ++++
 3 files changed, 27 insertions(+)
 create mode 100644 docker/sympa/exit-event-listener.py

diff --git a/docker/sympa/Dockerfile b/docker/sympa/Dockerfile
index d379f75..7b38405 100644
--- a/docker/sympa/Dockerfile
+++ b/docker/sympa/Dockerfile
@@ -49,4 +49,8 @@ ENV LANGUAGE en_US:en
 
 ENV LC_ALL en_US.UTF-8   
 
+COPY exit-event-listener.py /usr/local/bin
+
+RUN chmod +x /usr/local/bin/exit-event-listener.py
+
 ENTRYPOINT /entrypoint
diff --git a/docker/sympa/exit-event-listener.py b/docker/sympa/exit-event-listener.py
new file mode 100644
index 0000000..b91e7a5
--- /dev/null
+++ b/docker/sympa/exit-event-listener.py
@@ -0,0 +1,19 @@
+#!/usr/bin/env python3
+# From https://stackoverflow.com/a/37527488
+import os
+import signal
+
+from supervisor import childutils
+
+
+def main():
+    while True:
+        headers, payload = childutils.listener.wait()
+        childutils.listener.ok()
+        if headers['eventname'] != 'PROCESS_STATE_FATAL':
+            continue
+        os.kill(os.getppid(), signal.SIGTERM)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/docker/sympa/supervisord.conf b/docker/sympa/supervisord.conf
index 1118963..7eb5603 100644
--- a/docker/sympa/supervisord.conf
+++ b/docker/sympa/supervisord.conf
@@ -126,3 +126,7 @@ stdout_logfile_maxbytes=0
 stderr_logfile_maxbytes=0
 stdout_logfile=/dev/stdout
 stderr_logfile=/dev/stderr
+
+[eventlistener:exit_on_any_fatal]
+events=PROCESS_STATE_FATAL
+command=exit-event-listener.py
-- 
GitLab