From cc8e15748bebd090f8abcc6ca06147843236864d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Wed, 8 Aug 2018 17:54:15 +0300 Subject: [PATCH 1/6] Retry 10 times when resolving fails in start.py scripts --- core/dovecot/start.py | 20 ++++++++++++++++---- core/postfix/start.py | 16 ++++++++++++++-- services/rspamd/start.py | 14 +++++++++++++- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/core/dovecot/start.py b/core/dovecot/start.py index 83f91fab..2de114fd 100755 --- a/core/dovecot/start.py +++ b/core/dovecot/start.py @@ -4,14 +4,26 @@ import jinja2 import os import socket import glob +import time convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ)) # Actual startup script -os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) -os.environ["REDIS_ADDRESS"] = socket.gethostbyname(os.environ.get("REDIS_ADDRESS", "redis")) -if os.environ["WEBMAIL"] != "none": - os.environ["WEBMAIL_ADDRESS"] = socket.gethostbyname(os.environ.get("WEBMAIL_ADDRESS", "webmail")) +i = 0 +t = 10 +while True: + i += 1 + try: + os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) + os.environ["REDIS_ADDRESS"] = socket.gethostbyname(os.environ.get("REDIS_ADDRESS", "redis")) + if os.environ["WEBMAIL"] != "none": + os.environ["WEBMAIL_ADDRESS"] = socket.gethostbyname(os.environ.get("WEBMAIL_ADDRESS", "webmail")) + except socket.gaierror as err: + if i >= t: + raise + time.sleep(10) + continue + break for dovecot_file in glob.glob("/conf/*"): convert(dovecot_file, os.path.join("/etc/dovecot", os.path.basename(dovecot_file))) diff --git a/core/postfix/start.py b/core/postfix/start.py index 4dbf2206..f3c6aaca 100755 --- a/core/postfix/start.py +++ b/core/postfix/start.py @@ -5,11 +5,23 @@ import os import socket import glob import shutil - +import time + convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ)) # Actual startup script -os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) +i = 0 +t = 10 +while True: + i += 1 + try: + os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) + except socket.gaierror as err: + if i >= t: + raise + time.sleep(10) + continue + break os.environ["HOST_ANTISPAM"] = os.environ.get("HOST_ANTISPAM", "antispam:11332") os.environ["HOST_LMTP"] = os.environ.get("HOST_LMTP", "imap:2525") diff --git a/services/rspamd/start.py b/services/rspamd/start.py index 87309cee..08301a0d 100755 --- a/services/rspamd/start.py +++ b/services/rspamd/start.py @@ -4,11 +4,23 @@ import jinja2 import os import socket import glob +import time convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ)) # Actual startup script -os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) +i = 0 +t = 10 +while True: + i += 1 + try: + os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) + except socket.gaierror as err: + if i >= t: + raise + time.sleep(10) + continue + break if "HOST_REDIS" not in os.environ: os.environ["HOST_REDIS"] = "redis" for rspamd_file in glob.glob("/conf/*"): From c457ccfa6060229faf39cfa5aceedd0fd047d1d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Sun, 7 Oct 2018 00:32:05 +0300 Subject: [PATCH 2/6] Use tenacity for resolver retries --- core/dovecot/Dockerfile | 3 ++- core/dovecot/start.py | 26 +++++++++----------------- core/postfix/Dockerfile | 3 ++- core/postfix/start.py | 19 ++++++------------- services/rspamd/Dockerfile | 3 ++- services/rspamd/start.py | 19 ++++++------------- 6 files changed, 27 insertions(+), 46 deletions(-) diff --git a/core/dovecot/Dockerfile b/core/dovecot/Dockerfile index 363a7244..3bfd67fc 100644 --- a/core/dovecot/Dockerfile +++ b/core/dovecot/Dockerfile @@ -3,7 +3,8 @@ FROM alpine:3.7 RUN echo "@testing http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \ && apk add --no-cache \ dovecot dovecot-sqlite dovecot-pigeonhole-plugin dovecot-pigeonhole-plugin-extdata \ - dovecot-fts-lucene rspamd-client@testing python py-jinja2 + dovecot-fts-lucene rspamd-client@testing python py-jinja2 py-pip \ + && pip install tenacity COPY conf /conf COPY sieve /var/lib/dovecot diff --git a/core/dovecot/start.py b/core/dovecot/start.py index 2de114fd..bab5f1ee 100755 --- a/core/dovecot/start.py +++ b/core/dovecot/start.py @@ -4,27 +4,19 @@ import jinja2 import os import socket import glob -import time +from tenacity import retry convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ)) -# Actual startup script -i = 0 -t = 10 -while True: - i += 1 - try: - os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) - os.environ["REDIS_ADDRESS"] = socket.gethostbyname(os.environ.get("REDIS_ADDRESS", "redis")) - if os.environ["WEBMAIL"] != "none": - os.environ["WEBMAIL_ADDRESS"] = socket.gethostbyname(os.environ.get("WEBMAIL_ADDRESS", "webmail")) - except socket.gaierror as err: - if i >= t: - raise - time.sleep(10) - continue - break +@retry(stop=stop_after_attempt(10), wait=wait_random(min=2, max=5)) +def resolve(): + os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) + os.environ["REDIS_ADDRESS"] = socket.gethostbyname(os.environ.get("REDIS_ADDRESS", "redis")) + if os.environ["WEBMAIL"] != "none": + os.environ["WEBMAIL_ADDRESS"] = socket.gethostbyname(os.environ.get("WEBMAIL_ADDRESS", "webmail")) +# Actual startup script +resolve() for dovecot_file in glob.glob("/conf/*"): convert(dovecot_file, os.path.join("/etc/dovecot", os.path.basename(dovecot_file))) diff --git a/core/postfix/Dockerfile b/core/postfix/Dockerfile index d853c9f9..61b8f1ea 100644 --- a/core/postfix/Dockerfile +++ b/core/postfix/Dockerfile @@ -1,6 +1,7 @@ FROM alpine:3.7 -RUN apk add --no-cache postfix postfix-sqlite postfix-pcre rsyslog python py-jinja2 +RUN apk add --no-cache postfix postfix-sqlite postfix-pcre rsyslog python py-jinja2 py-pip \ + && pip install tenacity COPY conf /conf COPY start.py /start.py diff --git a/core/postfix/start.py b/core/postfix/start.py index f3c6aaca..30167da5 100755 --- a/core/postfix/start.py +++ b/core/postfix/start.py @@ -5,23 +5,16 @@ import os import socket import glob import shutil -import time +from tenacity import retry convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ)) +@retry(stop=stop_after_attempt(10), wait=wait_random(min=2, max=5)) +def resolve(): + os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) + # Actual startup script -i = 0 -t = 10 -while True: - i += 1 - try: - os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) - except socket.gaierror as err: - if i >= t: - raise - time.sleep(10) - continue - break +resolve() os.environ["HOST_ANTISPAM"] = os.environ.get("HOST_ANTISPAM", "antispam:11332") os.environ["HOST_LMTP"] = os.environ.get("HOST_LMTP", "imap:2525") diff --git a/services/rspamd/Dockerfile b/services/rspamd/Dockerfile index d5e93db7..e8eb49f9 100644 --- a/services/rspamd/Dockerfile +++ b/services/rspamd/Dockerfile @@ -1,6 +1,7 @@ FROM alpine:edge -RUN apk add --no-cache python py-jinja2 rspamd rspamd-controller rspamd-proxy ca-certificates +RUN apk add --no-cache python py-jinja2 rspamd rspamd-controller rspamd-proxy ca-certificates py-pip \ + && pip install tenacity RUN mkdir /run/rspamd diff --git a/services/rspamd/start.py b/services/rspamd/start.py index 08301a0d..cb9a1788 100755 --- a/services/rspamd/start.py +++ b/services/rspamd/start.py @@ -4,23 +4,16 @@ import jinja2 import os import socket import glob -import time +from tenacity import retry convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ)) +@retry(stop=stop_after_attempt(10), wait=wait_random(min=2, max=5)) +def resolve(): + os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) + # Actual startup script -i = 0 -t = 10 -while True: - i += 1 - try: - os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) - except socket.gaierror as err: - if i >= t: - raise - time.sleep(10) - continue - break +resolve() if "HOST_REDIS" not in os.environ: os.environ["HOST_REDIS"] = "redis" for rspamd_file in glob.glob("/conf/*"): From 1bae5968ade8a945873c63c5e5f7bbe92564fcf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Sun, 7 Oct 2018 01:39:02 +0300 Subject: [PATCH 3/6] Import tenacy and fix syntax errors --- core/dovecot/start.py | 3 ++- core/postfix/start.py | 3 ++- services/rspamd/start.py | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/dovecot/start.py b/core/dovecot/start.py index bab5f1ee..40e1edf0 100755 --- a/core/dovecot/start.py +++ b/core/dovecot/start.py @@ -4,11 +4,12 @@ import jinja2 import os import socket import glob +import tenacity from tenacity import retry convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ)) -@retry(stop=stop_after_attempt(10), wait=wait_random(min=2, max=5)) +@retry(stop=tenacity.stop_after_attempt(10), wait=tenacity.wait_random(min=2, max=5)) def resolve(): os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) os.environ["REDIS_ADDRESS"] = socket.gethostbyname(os.environ.get("REDIS_ADDRESS", "redis")) diff --git a/core/postfix/start.py b/core/postfix/start.py index 30167da5..bfa13da2 100755 --- a/core/postfix/start.py +++ b/core/postfix/start.py @@ -5,11 +5,12 @@ import os import socket import glob import shutil +import tenacity from tenacity import retry convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ)) -@retry(stop=stop_after_attempt(10), wait=wait_random(min=2, max=5)) +@retry(stop=tenacity.stop_after_attempt(10), wait=tenacity.wait_random(min=2, max=5)) def resolve(): os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) diff --git a/services/rspamd/start.py b/services/rspamd/start.py index cb9a1788..3ef309b2 100755 --- a/services/rspamd/start.py +++ b/services/rspamd/start.py @@ -4,11 +4,12 @@ import jinja2 import os import socket import glob +import tenacity from tenacity import retry convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ)) -@retry(stop=stop_after_attempt(10), wait=wait_random(min=2, max=5)) +@retry(stop=tenacity.stop_after_attempt(10), wait=tenacity.wait_random(min=2, max=5)) def resolve(): os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) From 16469d72823c36718a30691cb210cb74fcd2fc70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Sun, 7 Oct 2018 01:40:22 +0300 Subject: [PATCH 4/6] Upgrade to newer pip version --- core/dovecot/Dockerfile | 1 + core/postfix/Dockerfile | 1 + services/rspamd/Dockerfile | 1 + 3 files changed, 3 insertions(+) diff --git a/core/dovecot/Dockerfile b/core/dovecot/Dockerfile index 3bfd67fc..a9a3f854 100644 --- a/core/dovecot/Dockerfile +++ b/core/dovecot/Dockerfile @@ -4,6 +4,7 @@ RUN echo "@testing http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/re && apk add --no-cache \ dovecot dovecot-sqlite dovecot-pigeonhole-plugin dovecot-pigeonhole-plugin-extdata \ dovecot-fts-lucene rspamd-client@testing python py-jinja2 py-pip \ + && pip install --upgrade pip && pip install tenacity COPY conf /conf diff --git a/core/postfix/Dockerfile b/core/postfix/Dockerfile index 61b8f1ea..bb7acb9b 100644 --- a/core/postfix/Dockerfile +++ b/core/postfix/Dockerfile @@ -1,6 +1,7 @@ FROM alpine:3.7 RUN apk add --no-cache postfix postfix-sqlite postfix-pcre rsyslog python py-jinja2 py-pip \ + && pip install --upgrade pip \ && pip install tenacity COPY conf /conf diff --git a/services/rspamd/Dockerfile b/services/rspamd/Dockerfile index e8eb49f9..987e5ab0 100644 --- a/services/rspamd/Dockerfile +++ b/services/rspamd/Dockerfile @@ -1,6 +1,7 @@ FROM alpine:edge RUN apk add --no-cache python py-jinja2 rspamd rspamd-controller rspamd-proxy ca-certificates py-pip \ + && pip install --upgrade pip \ && pip install tenacity RUN mkdir /run/rspamd From 716ed16f34056e717fd92a851c047bc5b3f77e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Sun, 7 Oct 2018 01:52:52 +0300 Subject: [PATCH 5/6] Fix typo --- core/dovecot/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/dovecot/Dockerfile b/core/dovecot/Dockerfile index a9a3f854..36effc6a 100644 --- a/core/dovecot/Dockerfile +++ b/core/dovecot/Dockerfile @@ -4,7 +4,7 @@ RUN echo "@testing http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/re && apk add --no-cache \ dovecot dovecot-sqlite dovecot-pigeonhole-plugin dovecot-pigeonhole-plugin-extdata \ dovecot-fts-lucene rspamd-client@testing python py-jinja2 py-pip \ - && pip install --upgrade pip + && pip install --upgrade pip \ && pip install tenacity COPY conf /conf From 081762986990bd26ddf7d2cd891e60c57e6ec50b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Sun, 7 Oct 2018 02:10:13 +0300 Subject: [PATCH 6/6] Increase attempts as it failed on fresh Swarm host --- core/dovecot/start.py | 2 +- core/postfix/start.py | 2 +- services/rspamd/start.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/dovecot/start.py b/core/dovecot/start.py index 40e1edf0..0aa7a365 100755 --- a/core/dovecot/start.py +++ b/core/dovecot/start.py @@ -9,7 +9,7 @@ from tenacity import retry convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ)) -@retry(stop=tenacity.stop_after_attempt(10), wait=tenacity.wait_random(min=2, max=5)) +@retry(stop=tenacity.stop_after_attempt(100), wait=tenacity.wait_random(min=2, max=5)) def resolve(): os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) os.environ["REDIS_ADDRESS"] = socket.gethostbyname(os.environ.get("REDIS_ADDRESS", "redis")) diff --git a/core/postfix/start.py b/core/postfix/start.py index bfa13da2..e3c13110 100755 --- a/core/postfix/start.py +++ b/core/postfix/start.py @@ -10,7 +10,7 @@ from tenacity import retry convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ)) -@retry(stop=tenacity.stop_after_attempt(10), wait=tenacity.wait_random(min=2, max=5)) +@retry(stop=tenacity.stop_after_attempt(100), wait=tenacity.wait_random(min=2, max=5)) def resolve(): os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front")) diff --git a/services/rspamd/start.py b/services/rspamd/start.py index 3ef309b2..b979517e 100755 --- a/services/rspamd/start.py +++ b/services/rspamd/start.py @@ -9,7 +9,7 @@ from tenacity import retry convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ)) -@retry(stop=tenacity.stop_after_attempt(10), wait=tenacity.wait_random(min=2, max=5)) +@retry(stop=tenacity.stop_after_attempt(100), wait=tenacity.wait_random(min=2, max=5)) def resolve(): os.environ["FRONT_ADDRESS"] = socket.gethostbyname(os.environ.get("FRONT_ADDRESS", "front"))