From a72caaa01cbe33052de55f3faa03ca6a7c91f731 Mon Sep 17 00:00:00 2001 From: Quentin Smith Date: Sat, 12 Jul 2025 01:14:49 -0400 Subject: [PATCH] nixos/openafs: Extend CellServDB options Previously, servers could only be supplied for ThisCell. This meant that if a server and client have different ThisCell values, the client's CellServDB couldn't be configured for its own server. The previous list values are still accepted, but now a CellServDB option can also be specified as an attrset of cell names to servers. --- .../network-filesystems/openafs/client.nix | 34 +++++++------- .../network-filesystems/openafs/lib.nix | 43 +++++++++++------- .../network-filesystems/openafs/server.nix | 45 ++++++++++++++----- 3 files changed, 75 insertions(+), 47 deletions(-) diff --git a/nixos/modules/services/network-filesystems/openafs/client.nix b/nixos/modules/services/network-filesystems/openafs/client.nix index 15c59e8db81f..c1bf6bf627b4 100644 --- a/nixos/modules/services/network-filesystems/openafs/client.nix +++ b/nixos/modules/services/network-filesystems/openafs/client.nix @@ -26,9 +26,7 @@ let sha256 = "1wmjn6mmyy2r8p10nlbdzs4nrqxy8a9pjyrdciy5nmppg4053rk2"; }; - clientServDB = pkgs.writeText "client-cellServDB-${cfg.cellName}" ( - mkCellServDB cfg.cellName cfg.cellServDB - ); + clientServDB = pkgs.writeText "client-cellServDB-${cfg.cellName}" (mkCellServDB cfg.cellServDB); afsConfig = pkgs.runCommand "afsconfig" { preferLocalBuild = true; } '' mkdir -p $out @@ -65,27 +63,25 @@ in }; cellServDB = mkOption { - default = [ ]; - type = - with types; - listOf (submodule { - options = cellServDBConfig; - }); + default = { }; + type = cellServDBType cfg.cellName; description = '' This cell's database server records, added to the global CellServDB. See {manpage}`CellServDB(5)` man page for syntax. Ignored when `afsdb` is set to `true`. ''; - example = [ - { - ip = "1.2.3.4"; - dnsname = "first.afsdb.server.dns.fqdn.org"; - } - { - ip = "2.3.4.5"; - dnsname = "second.afsdb.server.dns.fqdn.org"; - } - ]; + example = { + "dns.fqdn.org" = [ + { + ip = "1.2.3.4"; + dnsname = "first.afsdb.server.dns.fqdn.org"; + } + { + ip = "2.3.4.5"; + dnsname = "second.afsdb.server.dns.fqdn.org"; + } + ]; + }; }; cache = { diff --git a/nixos/modules/services/network-filesystems/openafs/lib.nix b/nixos/modules/services/network-filesystems/openafs/lib.nix index abf59226abfe..a071f920c70e 100644 --- a/nixos/modules/services/network-filesystems/openafs/lib.nix +++ b/nixos/modules/services/network-filesystems/openafs/lib.nix @@ -3,15 +3,32 @@ let inherit (lib) concatStringsSep + concatMapAttrsStringSep mkOption types optionalString ; - + cellServDBMemberType = types.submodule { + options = { + ip = mkOption { + type = types.str; + default = ""; + example = "1.2.3.4"; + description = "IP Address of a database server"; + }; + dnsname = mkOption { + type = types.str; + default = ""; + example = "afs.example.org"; + description = "DNS full-qualified domain name of a database server"; + }; + }; + }; + cellServDBCellType = types.listOf cellServDBMemberType; in { - mkCellServDB = + mkCellServDB = concatMapAttrsStringSep "" ( cellName: db: '' >${cellName} @@ -19,23 +36,15 @@ in + (concatStringsSep "\n" ( map (dbm: optionalString (dbm.ip != "" && dbm.dnsname != "") "${dbm.ip} #${dbm.dnsname}") db )) - + "\n"; + + "\n" + ); # CellServDB configuration type - cellServDBConfig = { - ip = mkOption { - type = types.str; - default = ""; - example = "1.2.3.4"; - description = "IP Address of a database server"; - }; - dnsname = mkOption { - type = types.str; - default = ""; - example = "afs.example.org"; - description = "DNS full-qualified domain name of a database server"; - }; - }; + cellServDBType = + thisCell: + types.coercedTo (types.listOf types.anything) (m: { "${thisCell}" = m; }) ( + types.attrsOf cellServDBCellType + ); openafsMod = config.services.openafsClient.packages.module; openafsBin = config.services.openafsClient.packages.programs; diff --git a/nixos/modules/services/network-filesystems/openafs/server.nix b/nixos/modules/services/network-filesystems/openafs/server.nix index c3b71cb2b2ba..a9656bafb26d 100644 --- a/nixos/modules/services/network-filesystems/openafs/server.nix +++ b/nixos/modules/services/network-filesystems/openafs/server.nix @@ -67,10 +67,10 @@ let null; buCellServDB = pkgs.writeText "backup-cellServDB-${cfg.cellName}" ( - mkCellServDB cfg.cellName cfg.roles.backup.cellServDB + mkCellServDB cfg.roles.backup.cellServDB ); - useBuCellServDB = (cfg.roles.backup.cellServDB != [ ]) && (!cfg.roles.backup.enableFabs); + useBuCellServDB = (cfg.roles.backup.cellServDB != { }) && (!cfg.roles.backup.enableFabs); cfg = config.services.openafsServer; @@ -128,9 +128,22 @@ in }; cellServDB = mkOption { - default = [ ]; - type = with types; listOf (submodule [ { options = cellServDBConfig; } ]); - description = "Definition of all cell-local database server machines."; + default = { }; + type = cellServDBType cfg.cellName; + description = '' + Definition of all cell-local database server machines. If a single + list is provided, it will be used as the servers for `cellName`. + ''; + example = [ + { + ip = "1.2.3.4"; + dnsname = "first.afsdb.server.dns.fqdn.org"; + } + { + ip = "2.3.4.5"; + dnsname = "second.afsdb.server.dns.fqdn.org"; + } + ]; }; package = mkPackageOption pkgs "openafs" { }; @@ -226,8 +239,8 @@ in }; cellServDB = mkOption { - default = [ ]; - type = with types; listOf (submodule [ { options = cellServDBConfig; } ]); + default = { }; + type = cellServDBType cfg.cellName; description = '' Definition of all cell-local backup database server machines. Use this when your cell uses less backup database servers than @@ -288,9 +301,19 @@ in config = mkIf cfg.enable { + warnings = + lib.optional ((builtins.attrNames cfg.cellServDB) != [ cfg.cellName ]) '' + config.services.openafsServer.cellServDB should normally only contain servers for one cell. It currently contains servers for ${builtins.toString (builtins.attrNames cfg.cellServDB)}. + '' + ++ + lib.optional (useBuCellServDB && (builtins.attrNames cfg.backup.cellServDB) != [ cfg.cellName ]) + '' + config.services.openafsServer.backup.cellServDB should normally only contain servers for one cell. It currently contains servers for ${builtins.toString (builtins.attrNames cfg.cellServDB)}. + ''; + assertions = [ { - assertion = cfg.cellServDB != [ ]; + assertion = cfg.cellServDB != { } && (cfg.cellServDB."${cfg.cellName}" or [ ]) != [ ]; message = "You must specify all cell-local database servers in config.services.openafsServer.cellServDB."; } { @@ -308,7 +331,7 @@ in mode = "0644"; }; cellServDB = { - text = mkCellServDB cfg.cellName cfg.cellServDB; + text = mkCellServDB cfg.cellServDB; target = "openafs/server/CellServDB"; mode = "0644"; }; @@ -319,8 +342,9 @@ in }; buCellServDB = { enable = useBuCellServDB; - text = mkCellServDB cfg.cellName cfg.roles.backup.cellServDB; + text = mkCellServDB cfg.roles.backup.cellServDB; target = "openafs/backup/CellServDB"; + mode = "0644"; }; }; @@ -336,7 +360,6 @@ in preStart = '' mkdir -m 0755 -p /var/openafs ${optionalString (netInfo != null) "cp ${netInfo} /var/openafs/netInfo"} - ${optionalString useBuCellServDB "cp ${buCellServDB}"} ''; serviceConfig = { ExecStart = "${openafsBin}/bin/bosserver -nofork";