From 6c2c01b5cbf0a6b6a4db46ad4f0623772a5b7c15 Mon Sep 17 00:00:00 2001
From: tv <tv@shackspace.de>
Date: Thu, 13 Aug 2015 11:46:09 +0200
Subject: [PATCH] {tv 2 => krebs 3}/exim-retiolum

---
 krebs/3modules/default.nix       |   1 +
 krebs/3modules/exim-retiolum.nix | 143 +++++++++++++++++++++++++++++++
 tv/1systems/nomic.nix            |   4 +-
 tv/1systems/wu.nix               |   4 +-
 tv/2configs/exim-retiolum.nix    | 126 ---------------------------
 5 files changed, 150 insertions(+), 128 deletions(-)
 create mode 100644 krebs/3modules/exim-retiolum.nix
 delete mode 100644 tv/2configs/exim-retiolum.nix

diff --git a/krebs/3modules/default.nix b/krebs/3modules/default.nix
index e677ba5ea..fd795a036 100644
--- a/krebs/3modules/default.nix
+++ b/krebs/3modules/default.nix
@@ -6,6 +6,7 @@ let
 
   out = {
     imports = [
+      ./exim-retiolum.nix
       ./github-hosts-sync.nix
       ./git.nix
       ./nginx.nix
diff --git a/krebs/3modules/exim-retiolum.nix b/krebs/3modules/exim-retiolum.nix
new file mode 100644
index 000000000..71c091917
--- /dev/null
+++ b/krebs/3modules/exim-retiolum.nix
@@ -0,0 +1,143 @@
+{ config, pkgs, lib, ... }:
+
+with builtins;
+with lib;
+let
+  cfg = config.krebs.exim-retiolum;
+
+  out = {
+    options.krebs.exim-retiolum = api;
+    config =
+      # This configuration makes only sense for retiolum-enabled hosts.
+      # TODO modular configuration
+      mkIf cfg.enable (
+        #assert config.krebs.retiolum.enable;
+        imp);
+  };
+
+  api = {
+    enable = mkEnableOption "krebs.exim-retiolum";
+  };
+
+  imp = {
+    services.exim = {
+      enable = true;
+      config = ''
+        primary_hostname = ${retiolumHostname}
+        domainlist local_domains    = @ : localhost
+        domainlist relay_to_domains = *.retiolum
+        hostlist   relay_from_hosts = <; 127.0.0.1 ; ::1
+
+        acl_smtp_rcpt = acl_check_rcpt
+        acl_smtp_data = acl_check_data
+
+        host_lookup = *
+        rfc1413_hosts = *
+        rfc1413_query_timeout = 5s
+
+        log_file_path = syslog
+        syslog_timestamp = false
+        syslog_duplication = false
+
+        begin acl
+
+        acl_check_rcpt:
+          accept  hosts = :
+                  control = dkim_disable_verify
+
+          deny    message       = Restricted characters in address
+                  domains       = +local_domains
+                  local_parts   = ^[.] : ^.*[@%!/|]
+
+          deny    message       = Restricted characters in address
+                  domains       = !+local_domains
+                  local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
+
+          accept  local_parts   = postmaster
+                  domains       = +local_domains
+
+          #accept
+          #  hosts = *.retiolum
+          #  domains = *.retiolum
+          #  control = dkim_disable_verify
+
+          #require verify        = sender
+
+          accept  hosts         = +relay_from_hosts
+                  control       = submission
+                  control       = dkim_disable_verify
+
+          accept  authenticated = *
+                  control       = submission
+                  control       = dkim_disable_verify
+
+          require message = relay not permitted
+                  domains = +local_domains : +relay_to_domains
+
+          require verify = recipient
+
+          accept
+
+
+        acl_check_data:
+          accept
+
+
+        begin routers
+
+        retiolum:
+          driver = manualroute
+          domains = ! ${retiolumHostname} : *.retiolum
+          transport = remote_smtp
+          route_list = ^.* $0 byname
+          no_more
+
+        nonlocal:
+          debug_print = "R: nonlocal for $local_part@$domain"
+          driver = redirect
+          domains = ! +local_domains
+          allow_fail
+          data = :fail: Mailing to remote domains not supported
+          no_more
+
+        local_user:
+          # debug_print = "R: local_user for $local_part@$domain"
+          driver = accept
+          check_local_user
+        # local_part_suffix = +* : -*
+        # local_part_suffix_optional
+          transport = home_maildir
+          cannot_route_message = Unknown user
+
+
+        begin transports
+
+        remote_smtp:
+          driver = smtp
+
+        home_maildir:
+          driver = appendfile
+          maildir_format
+          directory = $home/Maildir
+          directory_mode = 0700
+          delivery_date_add
+          envelope_to_add
+          return_path_add
+        # group = mail
+        # mode = 0660
+
+        begin retry
+        *.retiolum             *           F,42d,1m
+        *                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h
+
+        begin rewrite
+
+        begin authenticators
+      '';
+    };
+  };
+
+  # TODO get the hostname from somewhere else.
+  retiolumHostname = "${config.networking.hostName}.retiolum";
+in
+out
diff --git a/tv/1systems/nomic.nix b/tv/1systems/nomic.nix
index b9a10cb4f..896c1ad29 100644
--- a/tv/1systems/nomic.nix
+++ b/tv/1systems/nomic.nix
@@ -25,7 +25,6 @@ with lib;
     ../2configs/AO753.nix
     ../2configs/base.nix
     ../2configs/consul-server.nix
-    ../2configs/exim-retiolum.nix
     ../2configs/git.nix
     {
       tv.iptables = {
@@ -38,6 +37,9 @@ with lib;
         ];
       };
     }
+    {
+      krebs.exim-retiolum = true;
+    }
     {
       krebs.nginx = {
         enable = true;
diff --git a/tv/1systems/wu.nix b/tv/1systems/wu.nix
index ae6ef1327..a5cbde3ec 100644
--- a/tv/1systems/wu.nix
+++ b/tv/1systems/wu.nix
@@ -29,7 +29,6 @@ in
     ../2configs/w110er.nix
     ../2configs/base.nix
     ../2configs/consul-client.nix
-    ../2configs/exim-retiolum.nix
     ../2configs/git.nix
     ../2configs/mail-client.nix
     ../2configs/xserver.nix
@@ -165,6 +164,9 @@ in
         ];
       };
     }
+    {
+      krebs.exim-retiolum = true;
+    }
     {
       krebs.nginx = {
         enable = true;
diff --git a/tv/2configs/exim-retiolum.nix b/tv/2configs/exim-retiolum.nix
deleted file mode 100644
index 851a0c625..000000000
--- a/tv/2configs/exim-retiolum.nix
+++ /dev/null
@@ -1,126 +0,0 @@
-{ config, pkgs, ... }:
-
-{
-  services.exim =
-    # This configuration makes only sense for retiolum-enabled hosts.
-    # TODO modular configuration
-    assert config.krebs.retiolum.enable;
-    let
-      # TODO get the hostname from config.krebs.retiolum.
-      retiolumHostname = "${config.networking.hostName}.retiolum";
-    in
-      { enable = true;
-        config = ''
-          primary_hostname = ${retiolumHostname}
-          domainlist local_domains    = @ : localhost
-          domainlist relay_to_domains = *.retiolum
-          hostlist   relay_from_hosts = <; 127.0.0.1 ; ::1
-
-          acl_smtp_rcpt = acl_check_rcpt
-          acl_smtp_data = acl_check_data
-
-          host_lookup = *
-          rfc1413_hosts = *
-          rfc1413_query_timeout = 5s
-
-          log_file_path = syslog
-          syslog_timestamp = false
-          syslog_duplication = false
-
-          begin acl
-
-          acl_check_rcpt:
-            accept  hosts = :
-                    control = dkim_disable_verify
-
-            deny    message       = Restricted characters in address
-                    domains       = +local_domains
-                    local_parts   = ^[.] : ^.*[@%!/|]
-
-            deny    message       = Restricted characters in address
-                    domains       = !+local_domains
-                    local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
-
-            accept  local_parts   = postmaster
-                    domains       = +local_domains
-
-            #accept
-            #  hosts = *.retiolum
-            #  domains = *.retiolum
-            #  control = dkim_disable_verify
-
-            #require verify        = sender
-
-            accept  hosts         = +relay_from_hosts
-                    control       = submission
-                    control       = dkim_disable_verify
-
-            accept  authenticated = *
-                    control       = submission
-                    control       = dkim_disable_verify
-
-            require message = relay not permitted
-                    domains = +local_domains : +relay_to_domains
-
-            require verify = recipient
-
-            accept
-
-
-          acl_check_data:
-            accept
-
-
-          begin routers
-
-          retiolum:
-            driver = manualroute
-            domains = ! ${retiolumHostname} : *.retiolum
-            transport = remote_smtp
-            route_list = ^.* $0 byname
-            no_more
-
-          nonlocal:
-            debug_print = "R: nonlocal for $local_part@$domain"
-            driver = redirect
-            domains = ! +local_domains
-            allow_fail
-            data = :fail: Mailing to remote domains not supported
-            no_more
-
-          local_user:
-            # debug_print = "R: local_user for $local_part@$domain"
-            driver = accept
-            check_local_user
-          # local_part_suffix = +* : -*
-          # local_part_suffix_optional
-            transport = home_maildir
-            cannot_route_message = Unknown user
-
-
-          begin transports
-
-          remote_smtp:
-            driver = smtp
-
-          home_maildir:
-            driver = appendfile
-            maildir_format
-            directory = $home/Maildir
-            directory_mode = 0700
-            delivery_date_add
-            envelope_to_add
-            return_path_add
-          # group = mail
-          # mode = 0660
-
-          begin retry
-          *.retiolum             *           F,42d,1m
-          *                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h
-
-          begin rewrite
-
-          begin authenticators
-        '';
-      };
-}