···
1
+
{ config, pkgs, lib, ... }:
3
+
with import ./lib.nix { inherit lib; };
6
+
inherit (lib) concatStringsSep intersperse mapAttrsToList mkForce mkIf mkMerge mkOption optionalString types;
8
+
bosConfig = pkgs.writeText "BosConfig" (''
10
+
restarttime 16 0 0 0 0
11
+
checkbintime 3 0 5 0 0
12
+
'' + (optionalString cfg.roles.database.enable ''
13
+
bnode simple vlserver 1
14
+
parm ${openafsBin}/libexec/openafs/vlserver ${optionalString cfg.dottedPrincipals "-allow-dotted-principals"} ${cfg.roles.database.vlserverArgs}
16
+
bnode simple ptserver 1
17
+
parm ${openafsBin}/libexec/openafs/ptserver ${optionalString cfg.dottedPrincipals "-allow-dotted-principals"} ${cfg.roles.database.ptserverArgs}
19
+
'') + (optionalString cfg.roles.fileserver.enable ''
21
+
parm ${openafsBin}/libexec/openafs/dafileserver ${optionalString cfg.dottedPrincipals "-allow-dotted-principals"} -udpsize ${udpSizeStr} ${cfg.roles.fileserver.fileserverArgs}
22
+
parm ${openafsBin}/libexec/openafs/davolserver ${optionalString cfg.dottedPrincipals "-allow-dotted-principals"} -udpsize ${udpSizeStr} ${cfg.roles.fileserver.volserverArgs}
23
+
parm ${openafsBin}/libexec/openafs/salvageserver ${cfg.roles.fileserver.salvageserverArgs}
24
+
parm ${openafsBin}/libexec/openafs/dasalvager ${cfg.roles.fileserver.salvagerArgs}
26
+
'') + (optionalString (cfg.roles.database.enable && cfg.roles.backup.enable) ''
27
+
bnode simple buserver 1
28
+
parm ${openafsBin}/libexec/openafs/buserver ${cfg.roles.backup.buserverArgs} ${optionalString (cfg.roles.backup.cellServDB != []) "-cellservdb /etc/openafs/backup/"}
32
+
netInfo = if (cfg.advertisedAddresses != []) then
33
+
pkgs.writeText "NetInfo" ((concatStringsSep "\nf " cfg.advertisedAddresses) + "\n")
36
+
buCellServDB = pkgs.writeText "backup-cellServDB-${cfg.cellName}" (mkCellServDB cfg.cellName cfg.roles.backup.cellServDB);
38
+
cfg = config.services.openafsServer;
40
+
udpSizeStr = toString cfg.udpPacketSize;
42
+
openafsBin = lib.getBin pkgs.openafs;
48
+
services.openafsServer = {
54
+
Whether to enable the OpenAFS server. An OpenAFS server needs a
55
+
complex setup. So, be aware that enabling this service and setting
56
+
some options does not give you a turn-key-ready solution. You need
57
+
at least a running Kerberos 5 setup, as OpenAFS relies on it for
58
+
authentication. See the Guide "QuickStartUnix" coming with
59
+
<literal>pkgs.openafs.doc</literal> for complete setup
64
+
advertisedAddresses = mkOption {
66
+
description = "List of IP addresses this server is advertised under. See NetInfo(5)";
69
+
cellName = mkOption {
72
+
description = "Cell name, this server will serve.";
73
+
example = "grand.central.org";
76
+
cellServDB = mkOption {
78
+
type = with types; listOf (submodule [ { options = cellServDBConfig;} ]);
79
+
description = "Definition of all cell-local database server machines.";
87
+
description = "Fileserver role, serves files and volumes from its local storage.";
90
+
fileserverArgs = mkOption {
91
+
default = "-vattachpar 128 -vhashsize 11 -L -rxpck 400 -cb 1000000";
93
+
description = "Arguments to the dafileserver process. See its man page.";
96
+
volserverArgs = mkOption {
99
+
description = "Arguments to the davolserver process. See its man page.";
100
+
example = "-sync never";
103
+
salvageserverArgs = mkOption {
106
+
description = "Arguments to the salvageserver process. See its man page.";
107
+
example = "-showlog";
110
+
salvagerArgs = mkOption {
113
+
description = "Arguments to the dasalvager process. See its man page.";
114
+
example = "-showlog -showmounts";
119
+
enable = mkOption {
123
+
Database server role, maintains the Volume Location Database,
124
+
Protection Database (and Backup Database, see
125
+
<literal>backup</literal> role). There can be multiple
126
+
servers in the database role for replication, which then need
127
+
reliable network connection to each other.
129
+
Servers in this role appear in AFSDB DNS records or the
134
+
vlserverArgs = mkOption {
137
+
description = "Arguments to the vlserver process. See its man page.";
138
+
example = "-rxbind";
141
+
ptserverArgs = mkOption {
144
+
description = "Arguments to the ptserver process. See its man page.";
145
+
example = "-restricted -default_access S---- S-M---";
150
+
enable = mkOption {
154
+
Backup server role. Use in conjunction with the
155
+
<literal>database</literal> role to maintain the Backup
156
+
Database. Normally only used in conjunction with tape storage
157
+
or IBM's Tivoli Storage Manager.
161
+
buserverArgs = mkOption {
164
+
description = "Arguments to the buserver process. See its man page.";
168
+
cellServDB = mkOption {
170
+
type = with types; listOf (submodule [ { options = cellServDBConfig;} ]);
172
+
Definition of all cell-local backup database server machines.
173
+
Use this when your cell uses less backup database servers than
174
+
other database server machines.
180
+
dottedPrincipals= mkOption {
184
+
If enabled, allow principal names containing (.) dots. Enabling
185
+
this has security implications!
189
+
udpPacketSize = mkOption {
193
+
UDP packet size to use in Bytes. Higher values can speed up
194
+
communications. The default of 1 MB is a sufficient in most
195
+
cases. Make sure to increase the kernel's UDP buffer size
196
+
accordingly via <literal>net.core(w|r|opt)mem_max</literal>
205
+
config = mkIf cfg.enable {
208
+
{ assertion = cfg.cellServDB != [];
209
+
message = "You must specify all cell-local database servers in config.services.openafsServer.cellServDB.";
211
+
{ assertion = cfg.cellName != "";
212
+
message = "You must specify the local cell name in config.services.openafsServer.cellName.";
216
+
environment.systemPackages = [ pkgs.openafs ];
218
+
environment.etc = {
220
+
source = bosConfig;
221
+
target = "openafs/BosConfig";
225
+
text = mkCellServDB cfg.cellName cfg.cellServDB;
226
+
target = "openafs/server/CellServDB";
230
+
text = cfg.cellName;
231
+
target = "openafs/server/ThisCell";
235
+
enable = (cfg.roles.backup.cellServDB != []);
236
+
text = mkCellServDB cfg.cellName cfg.roles.backup.cellServDB;
237
+
target = "openafs/backup/CellServDB";
241
+
systemd.services = {
243
+
description = "OpenAFS server";
244
+
after = [ "syslog.target" "network.target" ];
245
+
wantedBy = [ "multi-user.target" ];
246
+
restartIfChanged = false;
247
+
unitConfig.ConditionPathExists = [ "/etc/openafs/server/rxkad.keytab" ];
249
+
mkdir -m 0755 -p /var/openafs
250
+
${optionalString (netInfo != null) "cp ${netInfo} /var/openafs/netInfo"}
251
+
${optionalString (cfg.roles.backup.cellServDB != []) "cp ${buCellServDB}"}
254
+
ExecStart = "${openafsBin}/bin/bosserver -nofork";
255
+
ExecStop = "${openafsBin}/bin/bos shutdown localhost -wait -localauth";