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.
This commit is contained in:
Quentin Smith
2026-01-06 15:37:41 -05:00
parent 5df78ea33f
commit a72caaa01c
3 changed files with 75 additions and 47 deletions
@@ -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 = {
@@ -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;
@@ -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";