about summary refs log tree commit diff
path: root/modules/home
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2019-01-05 17:24:38 +0000
committerAlyssa Ross <hi@alyssa.is>2019-01-27 15:08:16 +0000
commitfa3351f0099096419ef72d4fbc71b32c178396bc (patch)
treeb2200d2a29ebe7806f6a2fe218caf52010ca519d /modules/home
parentf0a202366786b44ffd486c588d9150d1fb5ecea3 (diff)
downloadnixlib-fa3351f0099096419ef72d4fbc71b32c178396bc.tar
nixlib-fa3351f0099096419ef72d4fbc71b32c178396bc.tar.gz
nixlib-fa3351f0099096419ef72d4fbc71b32c178396bc.tar.bz2
nixlib-fa3351f0099096419ef72d4fbc71b32c178396bc.tar.lz
nixlib-fa3351f0099096419ef72d4fbc71b32c178396bc.tar.xz
nixlib-fa3351f0099096419ef72d4fbc71b32c178396bc.tar.zst
nixlib-fa3351f0099096419ef72d4fbc71b32c178396bc.zip
Add config
Diffstat (limited to 'modules/home')
-rw-r--r--modules/home/default.nix87
1 files changed, 87 insertions, 0 deletions
diff --git a/modules/home/default.nix b/modules/home/default.nix
new file mode 100644
index 000000000000..0ad1cb85b255
--- /dev/null
+++ b/modules/home/default.nix
@@ -0,0 +1,87 @@
+{ lib, config, ... }:
+
+let
+  inherit (lib) attrValues concatStringsSep mapAttrsToList mkOption
+                optionalString recursiveUpdate;
+  inherit (lib.types) bool loaOf nullOr str submodule;
+
+  dirOpts = { ... }: {
+    options = {
+      owner = mkOption {
+        default = null;
+        type = nullOr str;
+      };
+      group = mkOption {
+        default = "users";
+        type = str;
+      };
+      permissions = mkOption {
+        default = "0700";
+        type = str;
+      };
+      activationScripts = mkOption {
+        default = {};
+        type = loaOf str;
+      };
+    };
+  };
+
+  applyDirConfig = user: dir:
+    let
+      owner = if dir.owner == null
+              then user
+              else config.users.users.${dir.owner};
+    in
+      ''
+        chmod ${dir.permissions} .
+        chown ${owner.name}:${dir.group} .
+        ${concatStringsSep "\n" (attrValues dir.activationScripts)}
+      '';
+
+in
+  {
+    options = {
+      home = mkOption {
+        default = {};
+        type = loaOf (submodule (args: recursiveUpdate (dirOpts args) {
+          options = {
+            imperativeNix = mkOption {
+              default = false;
+              type = bool;
+            };
+            dirs = mkOption {
+              default = {};
+              type = loaOf (submodule dirOpts);
+            };
+          };
+        }));
+      };
+    };
+
+    config = {
+      system.activationScripts.home = {
+        deps = [];
+        text = concatStringsSep "\n" (mapAttrsToList
+          (key: home:
+            let
+              user = config.users.users.${key};
+
+            in ''
+              ${optionalString (!home.imperativeNix) ''
+                rm -rf ${user.home}/.nix-{defexpr,profile}
+              ''}
+
+              pushd ${user.home} >/dev/null
+              ${applyDirConfig user home}
+              ${concatStringsSep "\n" (mapAttrsToList (name: dir: ''
+                mkdir -p ${name}
+                pushd ${name} >/dev/null
+                ${applyDirConfig user dir}
+                popd >/dev/null
+              '') home.dirs)}
+              popd >/dev/null
+            ''
+        ) config.home);
+      };
+    };
+  }