From c0c3fa6a7883e53d80e257e300116c0a5d478ef5 Mon Sep 17 00:00:00 2001 From: Kamillaova Date: Wed, 11 Dec 2024 00:04:40 +0300 Subject: [PATCH 1/4] nixos/postfixadmin: format with nixfmt-rfc-style --- nixos/modules/services/mail/postfixadmin.nix | 87 +++++++++++--------- 1 file changed, 50 insertions(+), 37 deletions(-) diff --git a/nixos/modules/services/mail/postfixadmin.nix b/nixos/modules/services/mail/postfixadmin.nix index 7523fa4930ab..34c22b4f7b71 100644 --- a/nixos/modules/services/mail/postfixadmin.nix +++ b/nixos/modules/services/mail/postfixadmin.nix @@ -1,4 +1,9 @@ -{ lib, config, pkgs, ... }: +{ + lib, + config, + pkgs, + ... +}: let cfg = config.services.postfixadmin; fpm = config.services.phpfpm.pools.postfixadmin; @@ -89,7 +94,9 @@ in $CONF['database_type'] = 'pgsql'; $CONF['database_host'] = ${if localDB then "null" else "'${cfg.database.host}'"}; ${lib.optionalString localDB "$CONF['database_user'] = '${cfg.database.username}';"} - $CONF['database_password'] = ${if localDB then "'dummy'" else "file_get_contents('${cfg.database.passwordFile}')"}; + $CONF['database_password'] = ${ + if localDB then "'dummy'" else "file_get_contents('${cfg.database.passwordFile}')" + }; $CONF['database_name'] = '${cfg.database.dbname}'; $CONF['configured'] = true; @@ -126,55 +133,61 @@ in services.postgresql = lib.mkIf localDB { enable = true; - ensureUsers = [ { - name = cfg.database.username; - } ]; + ensureUsers = [ + { + name = cfg.database.username; + } + ]; }; # The postgresql module doesn't currently support concepts like # objects owners and extensions; for now we tack on what's needed # here. - systemd.services.postfixadmin-postgres = let pgsql = config.services.postgresql; in lib.mkIf localDB { - after = [ "postgresql.service" ]; - bindsTo = [ "postgresql.service" ]; - wantedBy = [ "multi-user.target" ]; - path = [ - pgsql.package - pkgs.util-linux - ]; - script = '' - set -eu + systemd.services.postfixadmin-postgres = + let + pgsql = config.services.postgresql; + in + lib.mkIf localDB { + after = [ "postgresql.service" ]; + bindsTo = [ "postgresql.service" ]; + wantedBy = [ "multi-user.target" ]; + path = [ + pgsql.package + pkgs.util-linux + ]; + script = '' + set -eu - PSQL() { - psql --port=${toString pgsql.port} "$@" - } + PSQL() { + psql --port=${toString pgsql.port} "$@" + } - PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = '${cfg.database.dbname}'" | grep -q 1 || PSQL -tAc 'CREATE DATABASE "${cfg.database.dbname}" OWNER "${cfg.database.username}"' - current_owner=$(PSQL -tAc "SELECT pg_catalog.pg_get_userbyid(datdba) FROM pg_catalog.pg_database WHERE datname = '${cfg.database.dbname}'") - if [[ "$current_owner" != "${cfg.database.username}" ]]; then - PSQL -tAc 'ALTER DATABASE "${cfg.database.dbname}" OWNER TO "${cfg.database.username}"' - if [[ -e "${config.services.postgresql.dataDir}/.reassigning_${cfg.database.dbname}" ]]; then - echo "Reassigning ownership of database ${cfg.database.dbname} to user ${cfg.database.username} failed on last boot. Failing..." - exit 1 - fi - touch "${config.services.postgresql.dataDir}/.reassigning_${cfg.database.dbname}" - PSQL "${cfg.database.dbname}" -tAc "REASSIGN OWNED BY \"$current_owner\" TO \"${cfg.database.username}\"" - rm "${config.services.postgresql.dataDir}/.reassigning_${cfg.database.dbname}" - fi - ''; + PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = '${cfg.database.dbname}'" | grep -q 1 || PSQL -tAc 'CREATE DATABASE "${cfg.database.dbname}" OWNER "${cfg.database.username}"' + current_owner=$(PSQL -tAc "SELECT pg_catalog.pg_get_userbyid(datdba) FROM pg_catalog.pg_database WHERE datname = '${cfg.database.dbname}'") + if [[ "$current_owner" != "${cfg.database.username}" ]]; then + PSQL -tAc 'ALTER DATABASE "${cfg.database.dbname}" OWNER TO "${cfg.database.username}"' + if [[ -e "${config.services.postgresql.dataDir}/.reassigning_${cfg.database.dbname}" ]]; then + echo "Reassigning ownership of database ${cfg.database.dbname} to user ${cfg.database.username} failed on last boot. Failing..." + exit 1 + fi + touch "${config.services.postgresql.dataDir}/.reassigning_${cfg.database.dbname}" + PSQL "${cfg.database.dbname}" -tAc "REASSIGN OWNED BY \"$current_owner\" TO \"${cfg.database.username}\"" + rm "${config.services.postgresql.dataDir}/.reassigning_${cfg.database.dbname}" + fi + ''; - serviceConfig = { - User = pgsql.superUser; - Type = "oneshot"; - RemainAfterExit = true; + serviceConfig = { + User = pgsql.superUser; + Type = "oneshot"; + RemainAfterExit = true; + }; }; - }; users.users.${user} = lib.mkIf localDB { group = user; isSystemUser = true; createHome = false; }; - users.groups.${user} = lib.mkIf localDB {}; + users.groups.${user} = lib.mkIf localDB { }; services.phpfpm.pools.postfixadmin = { user = user; From 2de264f2091a6e6d1a99336601c972df5f7d05e8 Mon Sep 17 00:00:00 2001 From: Kamillaova Date: Wed, 11 Dec 2024 00:04:42 +0300 Subject: [PATCH 2/4] nixos/postfixadmin: refactor --- nixos/modules/services/mail/postfixadmin.nix | 74 ++++++++++---------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/nixos/modules/services/mail/postfixadmin.nix b/nixos/modules/services/mail/postfixadmin.nix index 34c22b4f7b71..ba7c279d5386 100644 --- a/nixos/modules/services/mail/postfixadmin.nix +++ b/nixos/modules/services/mail/postfixadmin.nix @@ -8,6 +8,7 @@ let cfg = config.services.postfixadmin; fpm = config.services.phpfpm.pools.postfixadmin; localDB = cfg.database.host == "localhost"; + pgsql = config.services.postgresql; user = if localDB then cfg.database.username else "nginx"; in { @@ -57,6 +58,7 @@ in If `database.host` is set to `localhost`, a unix user and group of the same name will be created as well. ''; }; + host = lib.mkOption { type = lib.types.str; default = "localhost"; @@ -67,10 +69,12 @@ in permissions. ''; }; + passwordFile = lib.mkOption { type = lib.types.path; description = "Password file for the postgresql connection. Must be readable by user `nginx`."; }; + dbname = lib.mkOption { type = lib.types.str; default = "postfixadmin"; @@ -139,54 +143,52 @@ in } ]; }; + # The postgresql module doesn't currently support concepts like # objects owners and extensions; for now we tack on what's needed # here. - systemd.services.postfixadmin-postgres = - let - pgsql = config.services.postgresql; - in - lib.mkIf localDB { - after = [ "postgresql.service" ]; - bindsTo = [ "postgresql.service" ]; - wantedBy = [ "multi-user.target" ]; - path = [ - pgsql.package - pkgs.util-linux - ]; - script = '' - set -eu + systemd.services.postfixadmin-postgres = lib.mkIf localDB { + after = [ "postgresql.service" ]; + bindsTo = [ "postgresql.service" ]; + wantedBy = [ "multi-user.target" ]; + path = [ + pgsql.package + pkgs.util-linux + ]; + script = '' + set -eu - PSQL() { - psql --port=${toString pgsql.port} "$@" - } + PSQL() { + psql --port=${toString pgsql.port} "$@" + } - PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = '${cfg.database.dbname}'" | grep -q 1 || PSQL -tAc 'CREATE DATABASE "${cfg.database.dbname}" OWNER "${cfg.database.username}"' - current_owner=$(PSQL -tAc "SELECT pg_catalog.pg_get_userbyid(datdba) FROM pg_catalog.pg_database WHERE datname = '${cfg.database.dbname}'") - if [[ "$current_owner" != "${cfg.database.username}" ]]; then - PSQL -tAc 'ALTER DATABASE "${cfg.database.dbname}" OWNER TO "${cfg.database.username}"' - if [[ -e "${config.services.postgresql.dataDir}/.reassigning_${cfg.database.dbname}" ]]; then - echo "Reassigning ownership of database ${cfg.database.dbname} to user ${cfg.database.username} failed on last boot. Failing..." - exit 1 - fi - touch "${config.services.postgresql.dataDir}/.reassigning_${cfg.database.dbname}" - PSQL "${cfg.database.dbname}" -tAc "REASSIGN OWNED BY \"$current_owner\" TO \"${cfg.database.username}\"" - rm "${config.services.postgresql.dataDir}/.reassigning_${cfg.database.dbname}" - fi - ''; + PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = '${cfg.database.dbname}'" | grep -q 1 || PSQL -tAc 'CREATE DATABASE "${cfg.database.dbname}" OWNER "${cfg.database.username}"' + current_owner=$(PSQL -tAc "SELECT pg_catalog.pg_get_userbyid(datdba) FROM pg_catalog.pg_database WHERE datname = '${cfg.database.dbname}'") + if [[ "$current_owner" != "${cfg.database.username}" ]]; then + PSQL -tAc 'ALTER DATABASE "${cfg.database.dbname}" OWNER TO "${cfg.database.username}"' + if [[ -e "${pgsql.dataDir}/.reassigning_${cfg.database.dbname}" ]]; then + echo "Reassigning ownership of database ${cfg.database.dbname} to user ${cfg.database.username} failed on last boot. Failing..." + exit 1 + fi + touch "${pgsql.dataDir}/.reassigning_${cfg.database.dbname}" + PSQL "${cfg.database.dbname}" -tAc "REASSIGN OWNED BY \"$current_owner\" TO \"${cfg.database.username}\"" + rm "${pgsql.dataDir}/.reassigning_${cfg.database.dbname}" + fi + ''; - serviceConfig = { - User = pgsql.superUser; - Type = "oneshot"; - RemainAfterExit = true; - }; + serviceConfig = { + User = pgsql.superUser; + Type = "oneshot"; + RemainAfterExit = true; }; + }; users.users.${user} = lib.mkIf localDB { group = user; isSystemUser = true; createHome = false; }; + users.groups.${user} = lib.mkIf localDB { }; services.phpfpm.pools.postfixadmin = { @@ -196,7 +198,7 @@ in error_log = 'stderr' log_errors = on ''; - settings = lib.mapAttrs (name: lib.mkDefault) { + settings = lib.mapAttrs (_: lib.mkDefault) { "listen.owner" = "nginx"; "listen.group" = "nginx"; "listen.mode" = "0660"; From bab7f1e99e98a993cbaacf4b3fd65dd7ff41bc13 Mon Sep 17 00:00:00 2001 From: Kamillaova Date: Wed, 11 Dec 2024 00:04:45 +0300 Subject: [PATCH 3/4] nixos/postfixadmin: add `set -o pipefail` for `postfixadmin-postgres` script --- nixos/modules/services/mail/postfixadmin.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nixos/modules/services/mail/postfixadmin.nix b/nixos/modules/services/mail/postfixadmin.nix index ba7c279d5386..739141f614ce 100644 --- a/nixos/modules/services/mail/postfixadmin.nix +++ b/nixos/modules/services/mail/postfixadmin.nix @@ -156,7 +156,7 @@ in pkgs.util-linux ]; script = '' - set -eu + set -euo pipefail PSQL() { psql --port=${toString pgsql.port} "$@" From a1226737a4634f66faef991678cd2a99eb3f220f Mon Sep 17 00:00:00 2001 From: Kamillaova Date: Wed, 11 Dec 2024 00:04:46 +0300 Subject: [PATCH 4/4] nixos/postfixadmin: use `config.services.postgresql.settings.port` instead of old ...`postgresql.port` --- nixos/modules/services/mail/postfixadmin.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nixos/modules/services/mail/postfixadmin.nix b/nixos/modules/services/mail/postfixadmin.nix index 739141f614ce..0f453d24e52f 100644 --- a/nixos/modules/services/mail/postfixadmin.nix +++ b/nixos/modules/services/mail/postfixadmin.nix @@ -159,7 +159,7 @@ in set -euo pipefail PSQL() { - psql --port=${toString pgsql.port} "$@" + psql --port=${toString pgsql.settings.port} "$@" } PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = '${cfg.database.dbname}'" | grep -q 1 || PSQL -tAc 'CREATE DATABASE "${cfg.database.dbname}" OWNER "${cfg.database.username}"'