diff --git a/flake.nix b/flake.nix index f0eb8ab..404cc42 100644 --- a/flake.nix +++ b/flake.nix @@ -46,7 +46,7 @@ outputs = { self, nixpkgs, nixos-hardware, flake-utils, home-manager, nur , neovim, obelisk, photoprism-flake, pre-commit-hooks, nvim-ts-autotag - , nvim-ts-context-commentstring }: + , nvim-ts-context-commentstring }@inputs: let overlays = { neovim = self: super: @@ -78,43 +78,58 @@ photoprism = photoprism-flake.defaultPackage.${self.system}; }; }; - systemModule = { hostName, hardwareConfig, config }: - ({ pkgs, ... }: { - networking.hostName = hostName; + nixosModules = { flakeDefaults = import ./modules/flakeDefaults.nix; }; + homeManagerModules = { git = import ./home/modules/git.nix; }; + systemDefaults = { + modules = [ nixosModules.flakeDefaults ]; + overlays = [ + nur.overlay + overlays.wayland + overlays.neovim + overlays.deconz + overlays.photoprism + overlays.obelisk + ]; + }; + lib = rec { + createSystem = hostName: + { hardwareConfig, config }: + ({ pkgs, lib, ... }: { + networking.hostName = hostName; - # Let 'nixos-version --json' know about the Git revision - # of this flake. - system.configurationRevision = nixpkgs.lib.mkIf (self ? rev) self.rev; + nixpkgs.overlays = systemDefaults.overlays; - nix.registry.nixpkgs.flake = nixpkgs; - - nixpkgs.overlays = [ - nur.overlay - overlays.neovim - overlays.deconz - overlays.photoprism - overlays.obelisk - ]; - - imports = - [ hardwareConfig home-manager.nixosModules.home-manager config ]; - }); + imports = systemDefaults.modules ++ [ + hardwareConfig + config + { + # make arguments available to modules + _module.args = { inherit self inputs; }; + } + ]; + }); + createUser' = import ./lib/createUser.nix; + createUser = name: args: + ({ pkgs, ... }@args2: + (createUser' name args) ({ inherit home-manager; } // args2)); + }; in rec { - inherit overlays; - - homeManagerModules.git = import ./home/modules/git.nix; + inherit lib overlays nixosModules homeManagerModules; nixosConfigurations.felix-nixos = nixpkgs.lib.nixosSystem { system = "x86_64-linux"; modules = [ nixpkgs.nixosModules.notDetected - { home-manager.users.felschr.imports = [ homeManagerModules.git ]; } - (systemModule { - hostName = "felix-nixos"; + (lib.createSystem "felix-nixos" { hardwareConfig = ./hardware/felix-nixos.nix; config = ./home-pc.nix; }) + (lib.createUser "felschr" { + user.extraGroups = [ "wheel" "audio" "docker" "disk" ]; + modules = [ homeManagerModules.git ]; + config = ./home/felschr.nix; + }) ]; }; @@ -122,12 +137,15 @@ system = "x86_64-linux"; modules = [ nixpkgs.nixosModules.notDetected - { home-manager.users.felschr.imports = [ homeManagerModules.git ]; } - (systemModule { - hostName = "pilot1"; + (lib.createSystem "pilot1" { hardwareConfig = ./hardware-configuration.nix; # TODO config = ./work-pc.nix; }) + (lib.createUser "felschr" { + user.extraGroups = [ "wheel" "audio" "docker" "disk" ]; + modules = [ homeManagerModules.git ]; + config = ./home/felschr-work.nix; + }) ]; }; @@ -136,15 +154,19 @@ modules = [ nixpkgs.nixosModules.notDetected nixos-hardware.nixosModules.raspberry-pi-4 - { - home-manager.users.felschr.imports = [ homeManagerModules.git ]; - } # photoprism-flake.nixosModules.photoprism - (systemModule { - hostName = "felix-rpi4"; + (lib.createSystem "felix-rpi4" { hardwareConfig = ./hardware/rpi4.nix; config = ./rpi4.nix; }) + (lib.createUser "felschr" { + user = { + extraGroups = [ "wheel" "audio" "disk" "media" ]; + openssh.authorizedKeys.keyFiles = [ ./key ]; + }; + modules = [ homeManagerModules.git ]; + config = ./home/felschr-rpi4.nix; + }) ]; }; diff --git a/home-pc.nix b/home-pc.nix index c12bad3..c716d85 100644 --- a/home-pc.nix +++ b/home-pc.nix @@ -44,19 +44,6 @@ services.printing.drivers = with pkgs; [ epson-escpr ]; - users.users.felschr = { - isNormalUser = true; - extraGroups = [ "wheel" "audio" "docker" "disk" ]; - shell = pkgs.zsh; - }; - - home-manager = { - useUserPackages = true; - useGlobalPkgs = true; - backupFileExtension = "backup"; - users.felschr = import ./home/felschr.nix; - }; - # only change this when specified in release notes system.stateVersion = "21.05"; } diff --git a/lib/createUser.nix b/lib/createUser.nix new file mode 100644 index 0000000..dfecec0 --- /dev/null +++ b/lib/createUser.nix @@ -0,0 +1,18 @@ +name: +{ user ? { }, hm ? { }, modules ? [ ], config, ... }: + +{ pkgs, lib, home-manager, ... }: { + imports = [ home-manager.nixosModules.home-manager ]; + + users.users."${name}" = { + isNormalUser = true; + shell = pkgs.zsh; + } // user; + + home-manager = { + useUserPackages = true; + useGlobalPkgs = true; + backupFileExtension = "backup"; + users."${name}" = lib.mkMerge [ { imports = modules; } (import config) ]; + } // hm; +} diff --git a/modules/flakeDefaults.nix b/modules/flakeDefaults.nix new file mode 100644 index 0000000..fd78913 --- /dev/null +++ b/modules/flakeDefaults.nix @@ -0,0 +1,17 @@ +{ pkgs, lib, self, inputs, ... }: + +let + flakes = lib.filterAttrs (name: value: value ? outputs) inputs; + nixRegistry = builtins.mapAttrs (name: v: { flake = v; }) flakes; +in { + # Let 'nixos-version --json' know about the Git revision + # of this flake. + system.configurationRevision = lib.mkIf (self ? rev) self.rev; + + nix = { + extraOptions = "experimental-features = nix-command flakes"; + nixPath = lib.mapAttrsToList (n: v: "${n}=${v}") flakes; + registry = nixRegistry; + package = pkgs.nixUnstable; + }; +} diff --git a/rpi4.nix b/rpi4.nix index ffbfa8e..ccc2ea3 100644 --- a/rpi4.nix +++ b/rpi4.nix @@ -85,20 +85,6 @@ with builtins; { authorizedKeys = [ (readFile "./key") ]; }; - users.users.felschr = { - isNormalUser = true; - extraGroups = [ "wheel" "audio" "disk" "media" ]; - shell = pkgs.zsh; - openssh.authorizedKeys.keyFiles = [ ./key ]; - }; - - home-manager = { - useUserPackages = true; - useGlobalPkgs = true; - backupFileExtension = "backup"; - users.felschr = import ./home/felschr-rpi4.nix; - }; - # only change this when specified in release notes system.stateVersion = "21.05"; } diff --git a/work-pc.nix b/work-pc.nix index 44fc5d9..9c7d23b 100644 --- a/work-pc.nix +++ b/work-pc.nix @@ -32,19 +32,6 @@ services.printing.drivers = with pkgs; [ epson-escpr ]; - users.users.felschr = { - isNormalUser = true; - extraGroups = [ "wheel" "audio" "docker" "disk" ]; - shell = pkgs.zsh; - }; - - home-manager = { - useUserPackages = true; - useGlobalPkgs = true; - backupFileExtension = "backup"; - users.felschr = import ./home/felschr-work.nix; - }; - # only change this when specified in release notes system.stateVersion = "21.05"; }