diff --git a/nixos/doc/manual/release-notes/rl-1803.xml b/nixos/doc/manual/release-notes/rl-1803.xml
index beda33f601b..a67d6939790 100644
--- a/nixos/doc/manual/release-notes/rl-1803.xml
+++ b/nixos/doc/manual/release-notes/rl-1803.xml
@@ -149,6 +149,17 @@ following incompatible changes:
The hardware.amdHybridGraphics.disable option was removed for lack of a maintainer. If you still need this module, you may wish to include a copy of it from an older version of nixos in your imports.
+
+
+ The merging of config options for services.postfix.config
+ was buggy. Previously, if other options in the Postfix module like
+ services.postfix.useSrs were set and the user set config
+ options that were also set by such options, the resulting config wouldn't
+ include all options that were needed. They are now merged correctly. If
+ config options need to be overridden, lib.mkForce or
+ lib.mkOverride can be used.
+
+
diff --git a/nixos/modules/services/mail/postfix.nix b/nixos/modules/services/mail/postfix.nix
index 867c0ea6761..22af7e876af 100644
--- a/nixos/modules/services/mail/postfix.nix
+++ b/nixos/modules/services/mail/postfix.nix
@@ -15,20 +15,18 @@ let
haveVirtual = cfg.virtual != "";
clientAccess =
- if (cfg.dnsBlacklistOverrides != "")
- then [ "check_client_access hash:/etc/postfix/client_access" ]
- else [];
+ optional (cfg.dnsBlacklistOverrides != "")
+ "check_client_access hash:/etc/postfix/client_access";
dnsBl =
- if (cfg.dnsBlacklists != [])
- then [ (concatStringsSep ", " (map (s: "reject_rbl_client " + s) cfg.dnsBlacklists)) ]
- else [];
+ optionals (cfg.dnsBlacklists != [])
+ (map (s: "reject_rbl_client " + s) cfg.dnsBlacklists);
clientRestrictions = concatStringsSep ", " (clientAccess ++ dnsBl);
mainCf = let
escape = replaceStrings ["$"] ["$$"];
- mkList = items: "\n " + concatStringsSep "\n " items;
+ mkList = items: "\n " + concatStringsSep ",\n " items;
mkVal = value:
if isList value then mkList value
else " " + (if value == true then "yes"
@@ -36,72 +34,9 @@ let
else toString value);
mkEntry = name: value: "${escape name} =${mkVal value}";
in
- concatStringsSep "\n" (mapAttrsToList mkEntry (recursiveUpdate defaultConf cfg.config))
+ concatStringsSep "\n" (mapAttrsToList mkEntry cfg.config)
+ "\n" + cfg.extraConfig;
- defaultConf = {
- compatibility_level = "9999";
- mail_owner = user;
- default_privs = "nobody";
-
- # NixOS specific locations
- data_directory = "/var/lib/postfix/data";
- queue_directory = "/var/lib/postfix/queue";
-
- # Default location of everything in package
- meta_directory = "${pkgs.postfix}/etc/postfix";
- command_directory = "${pkgs.postfix}/bin";
- sample_directory = "/etc/postfix";
- newaliases_path = "${pkgs.postfix}/bin/newaliases";
- mailq_path = "${pkgs.postfix}/bin/mailq";
- readme_directory = false;
- sendmail_path = "${pkgs.postfix}/bin/sendmail";
- daemon_directory = "${pkgs.postfix}/libexec/postfix";
- manpage_directory = "${pkgs.postfix}/share/man";
- html_directory = "${pkgs.postfix}/share/postfix/doc/html";
- shlib_directory = false;
- relayhost = if cfg.relayHost == "" then "" else
- if cfg.lookupMX
- then "${cfg.relayHost}:${toString cfg.relayPort}"
- else "[${cfg.relayHost}]:${toString cfg.relayPort}";
-
- mail_spool_directory = "/var/spool/mail/";
- setgid_group = setgidGroup;
- }
- // optionalAttrs config.networking.enableIPv6 { inet_protocols = "all"; }
- // optionalAttrs (cfg.networks != null) { mynetworks = cfg.networks; }
- // optionalAttrs (cfg.networksStyle != "") { mynetworks_style = cfg.networksStyle; }
- // optionalAttrs (cfg.hostname != "") { myhostname = cfg.hostname; }
- // optionalAttrs (cfg.domain != "") { mydomain = cfg.domain; }
- // optionalAttrs (cfg.origin != "") { myorigin = cfg.origin; }
- // optionalAttrs (cfg.destination != null) { mydestination = cfg.destination; }
- // optionalAttrs (cfg.relayDomains != null) { relay_domains = cfg.relayDomains; }
- // optionalAttrs (cfg.recipientDelimiter != "") { recipient_delimiter = cfg.recipientDelimiter; }
- // optionalAttrs haveAliases { alias_maps = "${cfg.aliasMapType}:/etc/postfix/aliases"; }
- // optionalAttrs haveTransport { transport_maps = "hash:/etc/postfix/transport"; }
- // optionalAttrs haveVirtual { virtual_alias_maps = "${cfg.virtualMapType}:/etc/postfix/virtual"; }
- // optionalAttrs (cfg.dnsBlacklists != []) { smtpd_client_restrictions = clientRestrictions; }
- // optionalAttrs cfg.useSrs {
- sender_canonical_maps = "tcp:127.0.0.1:10001";
- sender_canonical_classes = "envelope_sender";
- recipient_canonical_maps = "tcp:127.0.0.1:10002";
- recipient_canonical_classes= "envelope_recipient";
- }
- // optionalAttrs cfg.enableHeaderChecks { header_checks = "regexp:/etc/postfix/header_checks"; }
- // optionalAttrs (cfg.sslCert != "") {
- smtp_tls_CAfile = cfg.sslCACert;
- smtp_tls_cert_file = cfg.sslCert;
- smtp_tls_key_file = cfg.sslKey;
-
- smtp_use_tls = true;
-
- smtpd_tls_CAfile = cfg.sslCACert;
- smtpd_tls_cert_file = cfg.sslCert;
- smtpd_tls_key_file = cfg.sslKey;
-
- smtpd_use_tls = true;
- };
-
masterCfOptions = { options, config, name, ... }: {
options = {
name = mkOption {
@@ -507,7 +442,6 @@ in
config = mkOption {
type = with types; attrsOf (either bool (either str (listOf str)));
- default = defaultConf;
description = ''
The main.cf configuration file as key value set.
'';
@@ -749,6 +683,67 @@ in
'';
};
+ services.postfix.config = (mapAttrs (_: v: mkDefault v) {
+ compatibility_level = "9999";
+ mail_owner = cfg.user;
+ default_privs = "nobody";
+
+ # NixOS specific locations
+ data_directory = "/var/lib/postfix/data";
+ queue_directory = "/var/lib/postfix/queue";
+
+ # Default location of everything in package
+ meta_directory = "${pkgs.postfix}/etc/postfix";
+ command_directory = "${pkgs.postfix}/bin";
+ sample_directory = "/etc/postfix";
+ newaliases_path = "${pkgs.postfix}/bin/newaliases";
+ mailq_path = "${pkgs.postfix}/bin/mailq";
+ readme_directory = false;
+ sendmail_path = "${pkgs.postfix}/bin/sendmail";
+ daemon_directory = "${pkgs.postfix}/libexec/postfix";
+ manpage_directory = "${pkgs.postfix}/share/man";
+ html_directory = "${pkgs.postfix}/share/postfix/doc/html";
+ shlib_directory = false;
+ mail_spool_directory = "/var/spool/mail/";
+ setgid_group = cfg.setgidGroup;
+ })
+ // optionalAttrs (cfg.relayHost != "") { relayhost = if cfg.lookupMX
+ then "${cfg.relayHost}:${toString cfg.relayPort}"
+ else "[${cfg.relayHost}]:${toString cfg.relayPort}"; }
+ // optionalAttrs config.networking.enableIPv6 { inet_protocols = mkDefault "all"; }
+ // optionalAttrs (cfg.networks != null) { mynetworks = cfg.networks; }
+ // optionalAttrs (cfg.networksStyle != "") { mynetworks_style = cfg.networksStyle; }
+ // optionalAttrs (cfg.hostname != "") { myhostname = cfg.hostname; }
+ // optionalAttrs (cfg.domain != "") { mydomain = cfg.domain; }
+ // optionalAttrs (cfg.origin != "") { myorigin = cfg.origin; }
+ // optionalAttrs (cfg.destination != null) { mydestination = cfg.destination; }
+ // optionalAttrs (cfg.relayDomains != null) { relay_domains = cfg.relayDomains; }
+ // optionalAttrs (cfg.recipientDelimiter != "") { recipient_delimiter = cfg.recipientDelimiter; }
+ // optionalAttrs haveAliases { alias_maps = [ "${cfg.aliasMapType}:/etc/postfix/aliases" ]; }
+ // optionalAttrs haveTransport { transport_maps = [ "hash:/etc/postfix/transport" ]; }
+ // optionalAttrs haveVirtual { virtual_alias_maps = [ "${cfg.virtualMapType}:/etc/postfix/virtual" ]; }
+ // optionalAttrs (cfg.dnsBlacklists != []) { smtpd_client_restrictions = clientRestrictions; }
+ // optionalAttrs cfg.useSrs {
+ sender_canonical_maps = [ "tcp:127.0.0.1:10001" ];
+ sender_canonical_classes = [ "envelope_sender" ];
+ recipient_canonical_maps = [ "tcp:127.0.0.1:10002" ];
+ recipient_canonical_classes = [ "envelope_recipient" ];
+ }
+ // optionalAttrs cfg.enableHeaderChecks { header_checks = [ "regexp:/etc/postfix/header_checks" ]; }
+ // optionalAttrs (cfg.sslCert != "") {
+ smtp_tls_CAfile = cfg.sslCACert;
+ smtp_tls_cert_file = cfg.sslCert;
+ smtp_tls_key_file = cfg.sslKey;
+
+ smtp_use_tls = true;
+
+ smtpd_tls_CAfile = cfg.sslCACert;
+ smtpd_tls_cert_file = cfg.sslCert;
+ smtpd_tls_key_file = cfg.sslKey;
+
+ smtpd_use_tls = true;
+ };
+
services.postfix.masterConfig = {
smtp_inet = {
name = "smtp";