diff options
Diffstat (limited to 'nixos/modules/services/network-filesystems/openafs/client.nix')
-rw-r--r-- | nixos/modules/services/network-filesystems/openafs/client.nix | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/nixos/modules/services/network-filesystems/openafs/client.nix b/nixos/modules/services/network-filesystems/openafs/client.nix new file mode 100644 index 00000000000..e5f89a9a0d2 --- /dev/null +++ b/nixos/modules/services/network-filesystems/openafs/client.nix @@ -0,0 +1,99 @@ +{ config, pkgs, lib, ... }: + +let + inherit (lib) mkOption mkIf; + + cfg = config.services.openafsClient; + + cellServDB = pkgs.fetchurl { + url = http://dl.central.org/dl/cellservdb/CellServDB.2017-03-14; + sha256 = "1197z6c5xrijgf66rhaymnm5cvyg2yiy1i20y4ah4mrzmjx0m7sc"; + }; + + afsConfig = pkgs.runCommand "afsconfig" {} '' + mkdir -p $out + echo ${cfg.cellName} > $out/ThisCell + cp ${cellServDB} $out/CellServDB + echo "/afs:${cfg.cacheDirectory}:${cfg.cacheSize}" > $out/cacheinfo + ''; + + openafsPkgs = config.boot.kernelPackages.openafs; +in +{ + ###### interface + + options = { + + services.openafsClient = { + + enable = mkOption { + default = false; + description = "Whether to enable the OpenAFS client."; + }; + + cellName = mkOption { + default = "grand.central.org"; + description = "Cell name."; + }; + + cacheSize = mkOption { + default = "100000"; + description = "Cache size."; + }; + + cacheDirectory = mkOption { + default = "/var/cache/openafs"; + description = "Cache directory."; + }; + + crypt = mkOption { + default = false; + description = "Whether to enable (weak) protocol encryption."; + }; + + sparse = mkOption { + default = false; + description = "Minimal cell list in /afs."; + }; + + }; + }; + + + ###### implementation + + config = mkIf cfg.enable { + + environment.systemPackages = [ openafsPkgs ]; + + environment.etc = [ + { source = afsConfig; + target = "openafs"; + } + ]; + + systemd.services.afsd = { + description = "AFS client"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + serviceConfig = { RemainAfterExit = true; }; + + preStart = '' + mkdir -p -m 0755 /afs + mkdir -m 0700 -p ${cfg.cacheDirectory} + ${pkgs.kmod}/bin/insmod ${openafsPkgs}/lib/openafs/libafs-*.ko || true + ${openafsPkgs}/sbin/afsd -confdir ${afsConfig} -cachedir ${cfg.cacheDirectory} ${if cfg.sparse then "-dynroot-sparse" else "-dynroot"} -fakestat -afsdb + ${openafsPkgs}/bin/fs setcrypt ${if cfg.crypt then "on" else "off"} + ''; + + # Doing this in preStop, because after these commands AFS is basically + # stopped, so systemd has nothing to do, just noticing it. If done in + # postStop, then we get a hang + kernel oops, because AFS can't be + # stopped simply by sending signals to processes. + preStop = '' + ${pkgs.utillinux}/bin/umount /afs + ${openafsPkgs}/sbin/afsd -shutdown + ''; + }; + }; +} |