]> git.immae.eu Git - perso/Immae/Config/Nix.git/commitdiff
Postfix common aliases
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Sun, 9 Apr 2023 09:50:49 +0000 (11:50 +0200)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Sun, 9 Apr 2023 15:18:10 +0000 (17:18 +0200)
modules/private/environment.nix
modules/private/mail/postfix.nix
modules/private/mail/relay.nix

index 1cc3b6cc315752657b603321337245786c7c0ef1..47eafaba0b892ac274e1d410c9f1f4fac68124c4 100644 (file)
@@ -684,6 +684,24 @@ in
                 mysql = mkMysqlOptions "Postfix" {
                   password_encrypt = mkOption { type = str; description = "Key to encrypt relay password in database"; };
                 };
+                admins = mkOption {
+                  description = ''
+                    List of admins meant to receive common aliases
+                  '';
+                  type = listOf str;
+                };
+                common_aliases = mkOption {
+                  description = ''
+                    List of aliases common to all hosts, to forward to admins
+                  '';
+                  type = listOf str;
+                };
+                other_aliases = mkOption {
+                  description = ''
+                    Other list of aliases, to forward to admins
+                  '';
+                  type = listOf str;
+                };
                 backup_domains = mkOption {
                   description = ''
                     Domains that are accepted for relay as backup domain
index 0e7264112cf49e03fced94b3ed9c56613f26b348..7e06c452c9ca2f6e87e2832cb78ede804cfc8a56 100644 (file)
@@ -1,4 +1,16 @@
 { lib, pkgs, config, nodes, ... }:
+let all_domains = config.myEnv.mail.postfix.additional_mailbox_domains
+      ++ lib.remove null (lib.flatten (map
+      (zone: map
+        (e: if e.receive
+        then "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}"
+        else null
+        )
+        (zone.withEmail or [])
+      )
+      config.myEnv.dns.masterZones
+    ));
+in
 {
   config = lib.mkIf config.myServices.mail.enable {
     myServices.chatonsProperties.hostings.mx-backup = {
           virtual = let
             cfg = config.myEnv.monitoring.email_check.eldiron;
             address = "${cfg.mail_address}@${cfg.mail_domain}";
+            aliases = config.myEnv.mail.postfix.common_aliases;
+            admins = builtins.concatStringsSep "," config.myEnv.mail.postfix.admins;
           in pkgs.writeText "postfix-virtual" (
             builtins.concatStringsSep "\n" (
-              ["${address} testmail@localhost"] ++
+              [ "${address} testmail@localhost"
+              ] ++
+              map (a: "${a} ${admins}") config.myEnv.mail.postfix.other_aliases ++
               lib.attrsets.mapAttrsToList (
                 n: v: lib.optionalString v.external ''
                   script_${n}@mail.immae.eu ${n}@localhost, scripts@mail.immae.eu
                 ''
               ) config.myEnv.mail.scripts
-            )
-          );
+              ++ lib.lists.flatten (
+                map (domain:
+                  map (alias: "${alias}@${domain} ${admins}") aliases
+                ) all_domains
+                )
+          ));
         };
         sasl_access = {
           host_sender_login = with lib.attrsets; let
             addresses = zipAttrs (lib.flatten (mapAttrsToList
               (n: v: (map (e: { "${e}" = "${n}@immae.eu"; }) v.emails)) config.myEnv.servers));
+            aliases = config.myEnv.mail.postfix.common_aliases;
             joined = builtins.concatStringsSep ",";
+            admins = joined config.myEnv.mail.postfix.admins;
           in pkgs.writeText "host-sender-login"
-            (builtins.concatStringsSep "\n" (mapAttrsToList (n: v: "${n} ${joined v}") addresses));
+            (builtins.concatStringsSep "\n" (
+              mapAttrsToList (n: v: "${n} ${joined v}") addresses
+              ++ lib.lists.flatten (
+                map (domain:
+                  map (alias: "${alias}@${domain} ${admins}") aliases
+                ) all_domains
+                )
+              ++ map (a: "${a} ${admins}") config.myEnv.mail.postfix.other_aliases
+          ));
         };
       in
         recipient_maps // relay_restrictions // virtual_map // sasl_access;
           "mysql:${config.secrets.fullPaths."postfix/mysql_alias_maps"}"
           "ldap:${config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"}"
         ];
-        virtual_mailbox_domains = config.myEnv.mail.postfix.additional_mailbox_domains
-        ++ lib.remove null (lib.flatten (map
-            (zone: map
-              (e: if e.receive
-              then "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}"
-              else null
-              )
-              (zone.withEmail or [])
-            )
-            config.myEnv.dns.masterZones
-          ));
+        virtual_mailbox_domains = all_domains;
         virtual_mailbox_maps = [
           "ldap:${config.secrets.fullPaths."postfix/ldap_mailboxes"}"
         ];
index fe16123dd4da7077dd8586e1c36a5c06d71bcda1..add9c8ca8417aaacf21100aca9a7ff801b2cc4b3 100644 (file)
@@ -1,4 +1,16 @@
 { lib, pkgs, config, nodes, name, ... }:
+let all_domains = config.myEnv.mail.postfix.additional_mailbox_domains
+      ++ lib.remove null (lib.flatten (map
+      (zone: map
+        (e: if e.receive
+        then "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}"
+        else null
+        )
+        (zone.withEmail or [])
+      )
+      config.myEnv.dns.masterZones
+    ));
+in
 {
   config = lib.mkIf config.myServices.mailBackup.enable {
     security.acme.certs."mail" = config.myServices.certificates.certConfig // {
           virtual = let
             cfg = config.myEnv.monitoring.email_check.eldiron;
             address = "${cfg.mail_address}@${cfg.mail_domain}";
+            aliases = config.myEnv.mail.postfix.common_aliases;
           in pkgs.writeText "postfix-virtual" (
             builtins.concatStringsSep "\n" (
-              ["${address} 1"] ++
+              [ "${address} 1"
+              ] ++
+              map (a: "${a} 1") config.myEnv.mail.postfix.other_aliases ++
               lib.attrsets.mapAttrsToList (
                 n: v: lib.optionalString v.external ''
                   script_${n}@mail.immae.eu 1
                 ''
               ) config.myEnv.mail.scripts
+              ++ lib.lists.flatten (map (domain: map (alias: "${alias}@${domain} 1") aliases) all_domains)
             )
           );
         };