prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Postfix no longer starts correctly in kubernetes
  ## Environment & Versions
  ### Environment
   - [ ] docker-compose
   - [X] kubernetes
   - [ ] docker swarm
  
  ### Versions
  1.8
  
  ## Description
  After installing mailu 1.8 via helm on Kubernetes, the `mailu-postfix` container runs but never reaches a healthy state and smtp functionality is impaired.
  
  After digging into it I believe the container is failing to become healthy because the following change to the postfix container's startup script (https://github.com/Mailu/Mailu/commit/1d65529c94f54de3cb49ed9584ed95f7860c26fa) and a known issue with the musl resolver the alpine base image uses (https://github.com/kubernetes/kubernetes/issues/64924).
  
  Resolving the mailu installation hostname never succeeds because of the aforementioned bug, and `socrates.system.resolve_hostname` simply retries until the pod's failure threshold is exceeded and is restarted.
  
  There's a couple different ways I believe this could be resolved:
  
  1. Pass a FQDN to `system.resolve_hostname()`, which avoids the resolver bug with search lists, i.e. `domain.com.` with a trailing dot.
  
  2. Update the deployment manifest in the mailu helm chart to use `dnsConfig.options` on the pod spec to set a more agreeable `ndots` value for `/etc/resolv.conf`
  
  3. Use a different base image for mailu containers that is not affected by this issue.
  
  I would be happy to investigate further and file a PR with the appropriate changes based on feedback. Thanks!
  
  </issue>
  <code>
  [start of core/postfix/start.py]
  1 #!/usr/bin/python3
  2 
  3 import os
  4 import glob
  5 import shutil
  6 import multiprocessing
  7 import logging as log
  8 import sys
  9 
  10 from podop   import run_server
  11 from socrate import system, conf
  12 
  13 log.basicConfig(stream=sys.stderr, level=os.environ.get("LOG_LEVEL", "WARNING"))
  14 
  15 def start_podop():
  16     os.setuid(100)
  17     url = "http://" + os.environ["ADMIN_ADDRESS"] + "/internal/postfix/"
  18     # TODO: Remove verbosity setting from Podop?
  19     run_server(0, "postfix", "/tmp/podop.socket", [
  20 		("transport", "url", url + "transport/§"),
  21 		("alias", "url", url + "alias/§"),
  22 		("domain", "url", url + "domain/§"),
  23         ("mailbox", "url", url + "mailbox/§"),
  24         ("recipientmap", "url", url + "recipient/map/§"),
  25         ("sendermap", "url", url + "sender/map/§"),
  26         ("senderaccess", "url", url + "sender/access/§"),
  27         ("senderlogin", "url", url + "sender/login/§")
  28     ])
  29 
  30 def is_valid_postconf_line(line):
  31     return not line.startswith("#") \
  32             and not line == ''
  33 
  34 # Actual startup script
  35 os.environ["FRONT_ADDRESS"] = system.get_host_address_from_environment("FRONT", "front")
  36 os.environ["ADMIN_ADDRESS"] = system.get_host_address_from_environment("ADMIN", "admin")
  37 os.environ["ANTISPAM_MILTER_ADDRESS"] = system.get_host_address_from_environment("ANTISPAM_MILTER", "antispam:11332")
  38 os.environ["LMTP_ADDRESS"] = system.get_host_address_from_environment("LMTP", "imap:2525")
  39 os.environ["OUTCLEAN"] = os.environ["HOSTNAMES"].split(",")[0]
  40 try:
  41     os.environ["OUTCLEAN_ADDRESS"] = system.resolve_hostname(os.environ["OUTCLEAN"])
  42 except:
  43     os.environ["OUTCLEAN_ADDRESS"] = "10.10.10.10"
  44 
  45 for postfix_file in glob.glob("/conf/*.cf"):
  46     conf.jinja(postfix_file, os.environ, os.path.join("/etc/postfix", os.path.basename(postfix_file)))
  47 
  48 if os.path.exists("/overrides/postfix.cf"):
  49     for line in open("/overrides/postfix.cf").read().strip().split("\n"):
  50         if is_valid_postconf_line(line):
  51             os.system('postconf -e "{}"'.format(line))
  52 
  53 if os.path.exists("/overrides/postfix.master"):
  54     for line in open("/overrides/postfix.master").read().strip().split("\n"):
  55         if is_valid_postconf_line(line):
  56             os.system('postconf -Me "{}"'.format(line))
  57 
  58 for map_file in glob.glob("/overrides/*.map"):
  59     destination = os.path.join("/etc/postfix", os.path.basename(map_file))
  60     shutil.copyfile(map_file, destination)
  61     os.system("postmap {}".format(destination))
  62     os.remove(destination)
  63 
  64 if "RELAYUSER" in os.environ:
  65     path = "/etc/postfix/sasl_passwd"
  66     conf.jinja("/conf/sasl_passwd", os.environ, path)
  67     os.system("postmap {}".format(path))
  68 
  69 # Run Podop and Postfix
  70 multiprocessing.Process(target=start_podop).start()
  71 os.system("/usr/libexec/postfix/post-install meta_directory=/etc/postfix create-missing")
  72 # Before starting postfix, we need to check permissions on /queue
  73 # in the event that postfix,postdrop id have changed
  74 os.system("postfix set-permissions")
  75 os.system("postfix start-fg")
  76
  [end of core/postfix/start.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/core/postfix/start.py b/core/postfix/start.py
  --- a/core/postfix/start.py
  +++ b/core/postfix/start.py
  @@ -38,7 +38,11 @@
   os.environ["LMTP_ADDRESS"] = system.get_host_address_from_environment("LMTP", "imap:2525")
   os.environ["OUTCLEAN"] = os.environ["HOSTNAMES"].split(",")[0]
   try:
  -    os.environ["OUTCLEAN_ADDRESS"] = system.resolve_hostname(os.environ["OUTCLEAN"])
  +    _to_lookup = os.environ["OUTCLEAN"]
  +    # Ensure we lookup a FQDN: @see #1884
  +    if not _to_lookup.endswith('.'):
  +        _to_lookup += '.'
  +    os.environ["OUTCLEAN_ADDRESS"] = system.resolve_hostname(_to_lookup)
   except:
       os.environ["OUTCLEAN_ADDRESS"] = "10.10.10.10"
  
verification_info: {"golden_diff": "diff --git a/core/postfix/start.py b/core/postfix/start.py\n--- a/core/postfix/start.py\n+++ b/core/postfix/start.py\n@@ -38,7 +38,11 @@\n os.environ[\"LMTP_ADDRESS\"] = system.get_host_address_from_environment(\"LMTP\", \"imap:2525\")\n os.environ[\"OUTCLEAN\"] = os.environ[\"HOSTNAMES\"].split(\",\")[0]\n try:\n-    os.environ[\"OUTCLEAN_ADDRESS\"] = system.resolve_hostname(os.environ[\"OUTCLEAN\"])\n+    _to_lookup = os.environ[\"OUTCLEAN\"]\n+    # Ensure we lookup a FQDN: @see #1884\n+    if not _to_lookup.endswith('.'):\n+        _to_lookup += '.'\n+    os.environ[\"OUTCLEAN_ADDRESS\"] = system.resolve_hostname(_to_lookup)\n except:\n     os.environ[\"OUTCLEAN_ADDRESS\"] = \"10.10.10.10\"\n", "issue": "Postfix no longer starts correctly in kubernetes\n## Environment & Versions\r\n### Environment\r\n - [ ] docker-compose\r\n - [X] kubernetes\r\n - [ ] docker swarm\r\n\r\n### Versions\r\n1.8\r\n\r\n## Description\r\nAfter installing mailu 1.8 via helm on Kubernetes, the `mailu-postfix` container runs but never reaches a healthy state and smtp functionality is impaired.\r\n\r\nAfter digging into it I believe the container is failing to become healthy because the following change to the postfix container's startup script (https://github.com/Mailu/Mailu/commit/1d65529c94f54de3cb49ed9584ed95f7860c26fa) and a known issue with the musl resolver the alpine base image uses (https://github.com/kubernetes/kubernetes/issues/64924).\r\n\r\nResolving the mailu installation hostname never succeeds because of the aforementioned bug, and `socrates.system.resolve_hostname` simply retries until the pod's failure threshold is exceeded and is restarted.\r\n\r\nThere's a couple different ways I believe this could be resolved:\r\n\r\n1. Pass a FQDN to `system.resolve_hostname()`, which avoids the resolver bug with search lists, i.e. `domain.com.` with a trailing dot.\r\n\r\n2. Update the deployment manifest in the mailu helm chart to use `dnsConfig.options` on the pod spec to set a more agreeable `ndots` value for `/etc/resolv.conf`\r\n\r\n3. Use a different base image for mailu containers that is not affected by this issue.\r\n\r\nI would be happy to investigate further and file a PR with the appropriate changes based on feedback. Thanks!\n", "before_files": [{"content": "#!/usr/bin/python3\n\nimport os\nimport glob\nimport shutil\nimport multiprocessing\nimport logging as log\nimport sys\n\nfrom podop   import run_server\nfrom socrate import system, conf\n\nlog.basicConfig(stream=sys.stderr, level=os.environ.get(\"LOG_LEVEL\", \"WARNING\"))\n\ndef start_podop():\n    os.setuid(100)\n    url = \"http://\" + os.environ[\"ADMIN_ADDRESS\"] + \"/internal/postfix/\"\n    # TODO: Remove verbosity setting from Podop?\n    run_server(0, \"postfix\", \"/tmp/podop.socket\", [\n\t\t(\"transport\", \"url\", url + \"transport/\u00a7\"),\n\t\t(\"alias\", \"url\", url + \"alias/\u00a7\"),\n\t\t(\"domain\", \"url\", url + \"domain/\u00a7\"),\n        (\"mailbox\", \"url\", url + \"mailbox/\u00a7\"),\n        (\"recipientmap\", \"url\", url + \"recipient/map/\u00a7\"),\n        (\"sendermap\", \"url\", url + \"sender/map/\u00a7\"),\n        (\"senderaccess\", \"url\", url + \"sender/access/\u00a7\"),\n        (\"senderlogin\", \"url\", url + \"sender/login/\u00a7\")\n    ])\n\ndef is_valid_postconf_line(line):\n    return not line.startswith(\"#\") \\\n            and not line == ''\n\n# Actual startup script\nos.environ[\"FRONT_ADDRESS\"] = system.get_host_address_from_environment(\"FRONT\", \"front\")\nos.environ[\"ADMIN_ADDRESS\"] = system.get_host_address_from_environment(\"ADMIN\", \"admin\")\nos.environ[\"ANTISPAM_MILTER_ADDRESS\"] = system.get_host_address_from_environment(\"ANTISPAM_MILTER\", \"antispam:11332\")\nos.environ[\"LMTP_ADDRESS\"] = system.get_host_address_from_environment(\"LMTP\", \"imap:2525\")\nos.environ[\"OUTCLEAN\"] = os.environ[\"HOSTNAMES\"].split(\",\")[0]\ntry:\n    os.environ[\"OUTCLEAN_ADDRESS\"] = system.resolve_hostname(os.environ[\"OUTCLEAN\"])\nexcept:\n    os.environ[\"OUTCLEAN_ADDRESS\"] = \"10.10.10.10\"\n\nfor postfix_file in glob.glob(\"/conf/*.cf\"):\n    conf.jinja(postfix_file, os.environ, os.path.join(\"/etc/postfix\", os.path.basename(postfix_file)))\n\nif os.path.exists(\"/overrides/postfix.cf\"):\n    for line in open(\"/overrides/postfix.cf\").read().strip().split(\"\\n\"):\n        if is_valid_postconf_line(line):\n            os.system('postconf -e \"{}\"'.format(line))\n\nif os.path.exists(\"/overrides/postfix.master\"):\n    for line in open(\"/overrides/postfix.master\").read().strip().split(\"\\n\"):\n        if is_valid_postconf_line(line):\n            os.system('postconf -Me \"{}\"'.format(line))\n\nfor map_file in glob.glob(\"/overrides/*.map\"):\n    destination = os.path.join(\"/etc/postfix\", os.path.basename(map_file))\n    shutil.copyfile(map_file, destination)\n    os.system(\"postmap {}\".format(destination))\n    os.remove(destination)\n\nif \"RELAYUSER\" in os.environ:\n    path = \"/etc/postfix/sasl_passwd\"\n    conf.jinja(\"/conf/sasl_passwd\", os.environ, path)\n    os.system(\"postmap {}\".format(path))\n\n# Run Podop and Postfix\nmultiprocessing.Process(target=start_podop).start()\nos.system(\"/usr/libexec/postfix/post-install meta_directory=/etc/postfix create-missing\")\n# Before starting postfix, we need to check permissions on /queue\n# in the event that postfix,postdrop id have changed\nos.system(\"postfix set-permissions\")\nos.system(\"postfix start-fg\")\n", "path": "core/postfix/start.py"}]}