diff --git a/flake.lock b/flake.lock index 3a70180..db2f914 100644 --- a/flake.lock +++ b/flake.lock @@ -69,7 +69,7 @@ "type": "github" } }, - "devos": { + "devlib": { "inputs": { "deploy": "deploy", "devshell": "devshell", @@ -79,13 +79,17 @@ "utils": "utils_2" }, "locked": { - "narHash": "sha256-/htTDxf3/n8lcL7Gnoi3+uamuY/KnlSMWDQ76dzQpac=", - "path": "./lib", - "type": "path" + "lastModified": 1620188794, + "narHash": "sha256-BDwtrbUkrSnBQJBXuaJg9QBu3MYL0iuJPE8P30o0x7I=", + "owner": "divnix", + "repo": "devlib", + "rev": "ffda6add9eb984d986cf5b6a838a52334317302f", + "type": "github" }, "original": { - "path": "./lib", - "type": "path" + "owner": "divnix", + "repo": "devlib", + "type": "github" } }, "devshell": { @@ -321,7 +325,7 @@ "inputs": { "ci-agent": "ci-agent", "darwin": "darwin", - "devos": "devos", + "devlib": "devlib", "home": "home", "latest": "latest", "naersk": "naersk_2", diff --git a/flake.nix b/flake.nix index a781199..8dc8e7e 100644 --- a/flake.nix +++ b/flake.nix @@ -5,14 +5,9 @@ { nixos.url = "nixpkgs/nixos-unstable"; latest.url = "nixpkgs"; - devos.url = "path:./lib"; # TODO: outfactor into separate repo - devos.inputs = { + devlib.url = "github:divnix/devlib"; + devlib.inputs = { nixpkgs.follows = "nixos"; - # deploy.inputs = { - # flake-compat.follows = "flake-compat"; - # naersk.follows = "naersk"; - # nixpkgs.follows = "nixos"; - # }; }; ci-agent = { @@ -31,8 +26,8 @@ pkgs.inputs.nixpkgs.follows = "nixos"; }; - outputs = inputs@{ self, pkgs, devos, nixos, ci-agent, home, nixos-hardware, nur, ... }: - devos.lib.mkFlake { + outputs = inputs@{ self, pkgs, devlib, nixos, ci-agent, home, nixos-hardware, nur, ... }: + devlib.lib.mkFlake { inherit self inputs; channelsConfig = { allowUnfree = true; }; @@ -40,7 +35,7 @@ channels = { nixos = { overlays = [ - (devos.lib.pathsIn ./overlays) + (devlib.lib.pathsIn ./overlays) ./pkgs/default.nix pkgs.overlay # for `srcs` nur.overlay @@ -49,6 +44,12 @@ latest = { }; }; + sharedOverlays = [ + (final: prev: { + ourlib = prev.devlib.extend (import ./lib); + }) + ]; + nixos = { hostDefaults = { system = "x86_64-linux"; @@ -61,7 +62,7 @@ ]; }; hosts = nixos.lib.mkMerge [ - (devos.lib.importHosts ./hosts) + (devlib.lib.importHosts ./hosts) { /* set host specific properties here */ } ]; profiles = [ ./profiles ./users ]; @@ -79,9 +80,9 @@ }; }; - homeConfigurations = devos.lib.mkHomeConfigurations self.nixosConfigurations; + homeConfigurations = devlib.lib.mkHomeConfigurations self.nixosConfigurations; - deploy.nodes = devos.lib.mkDeployNodes self.nixosConfigurations { }; + deploy.nodes = devlib.lib.mkDeployNodes self.nixosConfigurations { }; #defaultTemplate = self.templates.flk; templates.flk.path = ./.; diff --git a/lib/attrs.nix b/lib/attrs.nix deleted file mode 100644 index 1061c0e..0000000 --- a/lib/attrs.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ lib }: -rec { - # mapFilterAttrs :: - # (name -> value -> bool ) - # (name -> value -> { name = any; value = any; }) - # attrs - mapFilterAttrs = seive: f: attrs: - lib.filterAttrs - seive - (lib.mapAttrs' f attrs); - - # Generate an attribute set by mapping a function over a list of values. - genAttrs' = values: f: lib.listToAttrs (map f values); - - concatAttrs = lib.fold (attr: sum: lib.recursiveUpdate sum attr) { }; - - safeReadDir = path: - lib.optionalAttrs (builtins.pathExists (toString path)) (builtins.readDir (toString path)); -} diff --git a/lib/default.nix b/lib/default.nix new file mode 100644 index 0000000..c4da46c --- /dev/null +++ b/lib/default.nix @@ -0,0 +1,2 @@ +lfinal: lprev: { +} diff --git a/lib/devos/mkHomeConfigurations.nix b/lib/devos/mkHomeConfigurations.nix deleted file mode 100644 index 95affc2..0000000 --- a/lib/devos/mkHomeConfigurations.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ lib }: - -nixosConfigurations: - -with lib; -let - mkHomes = hostName: host: - mapAttrs' (user: v: nameValuePair "${user}@${hostName}" v.home) - # So this function is useful for non-devos hosts - (host.config.system.build.homes or host.config.home-manager.users); - - hmConfigs = mapAttrs mkHomes nixosConfigurations; - -in -foldl recursiveUpdate { } (attrValues hmConfigs) diff --git a/lib/flake.lock b/lib/flake.lock deleted file mode 100644 index 8156254..0000000 --- a/lib/flake.lock +++ /dev/null @@ -1,166 +0,0 @@ -{ - "nodes": { - "deploy": { - "inputs": { - "flake-compat": "flake-compat", - "naersk": "naersk", - "nixpkgs": "nixpkgs", - "utils": "utils" - }, - "locked": { - "lastModified": 1616406726, - "narHash": "sha256-n9zmgxR03QNrvs9/fHewqE0j3SjL7Y+cglBCFu3U3rg=", - "owner": "serokell", - "repo": "deploy-rs", - "rev": "9e405fbc5ab5bacbd271fd78c6b6b6877c4d9f8d", - "type": "github" - }, - "original": { - "owner": "serokell", - "repo": "deploy-rs", - "type": "github" - } - }, - "devshell": { - "locked": { - "lastModified": 1618523768, - "narHash": "sha256-Gev9da35pHUey3kGz/zrJFc/9ICs++vPCho7qB1mqd8=", - "owner": "numtide", - "repo": "devshell", - "rev": "709fe4d04a9101c9d224ad83f73416dce71baf21", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "devshell", - "type": "github" - } - }, - "flake-compat": { - "flake": false, - "locked": { - "lastModified": 1606424373, - "narHash": "sha256-oq8d4//CJOrVj+EcOaSXvMebvuTkmBJuT5tzlfewUnQ=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "99f1c2157fba4bfe6211a321fd0ee43199025dbf", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-utils": { - "locked": { - "lastModified": 1619345332, - "narHash": "sha256-qHnQkEp1uklKTpx3MvKtY6xzgcqXDsz5nLilbbuL+3A=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "2ebf2558e5bf978c7fb8ea927dfaed8fefab2e28", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "naersk": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1610392286, - "narHash": "sha256-3wFl5y+4YZO4SgRYK8WE7JIS3p0sxbgrGaQ6RMw+d98=", - "owner": "nmattia", - "repo": "naersk", - "rev": "d7bfbad3304fd768c0f93a4c3b50976275e6d4be", - "type": "github" - }, - "original": { - "owner": "nmattia", - "ref": "master", - "repo": "naersk", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1610942247, - "narHash": "sha256-PKo1ATAlC6BmfYSRmX0TVmNoFbrec+A5OKcabGEu2yU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "7d71001b796340b219d1bfa8552c81995017544a", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { - "locked": { - "lastModified": 1619244632, - "narHash": "sha256-IDcbMRnyKO9WlQ5xzIlM3HfWAUKTy+3xSd+CvDGiLgE=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "5cecebfb2f76da7b93f19967e99b3ff4fb4d2850", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "root": { - "inputs": { - "deploy": "deploy", - "devshell": "devshell", - "nixpkgs": "nixpkgs_2", - "utils": "utils_2" - } - }, - "utils": { - "locked": { - "lastModified": 1610051610, - "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "utils_2": { - "inputs": { - "flake-utils": "flake-utils" - }, - "locked": { - "lastModified": 1619714004, - "narHash": "sha256-xoP81rWAM2cVpEFrQv9sUEIvNxGXAg4UH9kBt83a5u4=", - "owner": "gytis-ivaskevicius", - "repo": "flake-utils-plus", - "rev": "0642ac572a87a0beb78a7c6ddce1267aa5817d05", - "type": "github" - }, - "original": { - "owner": "gytis-ivaskevicius", - "ref": "staging", - "repo": "flake-utils-plus", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/lib/flake.nix b/lib/flake.nix deleted file mode 100644 index 5fd7936..0000000 --- a/lib/flake.nix +++ /dev/null @@ -1,84 +0,0 @@ -{ - description = "DevOS environment configuriguration library."; - - inputs = - { - deploy.url = "github:serokell/deploy-rs"; - devshell.url = "github:numtide/devshell"; - utils.url = "github:gytis-ivaskevicius/flake-utils-plus/staging"; - }; - - outputs = inputs@{ self, nixpkgs, deploy, devshell, utils, ... }: - let - lib = nixpkgs.lib.makeExtensible (self: - let combinedLib = nixpkgs.lib // self; in - with self; - utils.lib // { - attrs = import ./attrs.nix { lib = combinedLib; }; - lists = import ./lists.nix { lib = combinedLib; }; - strings = import ./strings.nix { lib = combinedLib; }; - modules = import ./modules.nix { lib = combinedLib; }; - importers = import ./importers.nix { lib = combinedLib; }; - - generators = import ./generators.nix { - lib = combinedLib; - inherit deploy; - }; - - mkFlake = { - __functor = import ./mkFlake { lib = combinedLib; }; - evalArgs = import ./mkFlake/evalArgs.nix { lib = combinedLib; }; - }; - - pkgs-lib = import ./pkgs-lib { - lib = combinedLib; - inherit deploy devshell; - }; - - inherit (attrs) mapFilterAttrs genAttrs' safeReadDir concatAttrs; - inherit (lists) profileMap collectProfiles unifyOverlays; - inherit (strings) rgxToString; - inherit (importers) mkProfileAttrs pathsIn importHosts; - inherit (generators) mkSuites mkDeployNodes mkHomeConfigurations; - } - ); - - in - - { - lib = with lib; utils.lib // { - inherit attrs lists modules importers generators; - inherit (lib) - mkFlake - pathsIn - importHosts - mkDeployNodes - mkHomeConfigurations; - }; - } - - // - - utils.lib.eachDefaultSystem (system: - let - pkgs = import nixpkgs { inherit system; }; - in - { - checks = { - tests = import ./tests { - inherit pkgs; - lib = nixpkgs.lib // lib; - }; - }; - packages = { - mkFlakeDoc = pkgs.writeText "mkFlakeOptions.md" - ( - pkgs.nixosOptionsDoc { - inherit (lib.mkFlake.evalArgs { args = { }; }) options; - } - ).optionsMDDoc; - }; - } - ); - -} diff --git a/lib/generators.nix b/lib/generators.nix deleted file mode 100644 index f403fbc..0000000 --- a/lib/generators.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ lib, deploy }: -{ - mkHomeConfigurations = nixosConfigurations: - with lib; - let - mkHomes = host: config: - mapAttrs' (user: v: nameValuePair "${user}@${host}" v.home) - config.config.system.build.homes; - - hmConfigs = mapAttrs mkHomes nixosConfigurations; - - in - foldl recursiveUpdate { } (attrValues hmConfigs); - - mkDeployNodes = hosts: extraConfig: - /** - Synopsis: mkNodes _nixosConfigurations_ - - Generate the `nodes` attribute expected by deploy-rs - where _nixosConfigurations_ are `nodes`. - **/ - - lib.mapAttrs - (_: config: lib.recursiveUpdate - { - hostname = config.config.networking.hostName; - - profiles.system = { - user = "root"; - path = deploy.lib.x86_64-linux.activate.nixos config; - }; - } - extraConfig) - hosts; - - mkSuites = { suites, profiles }: - let - profileSet = lib.genAttrs' profiles (path: { - name = baseNameOf path; - value = lib.mkProfileAttrs (toString path); - }); - - definedSuites = suites profileSet; - - allProfiles = lib.collectProfiles profileSet; - in - lib.mapAttrs (_: v: lib.profileMap v) definedSuites // { - inherit allProfiles; - }; -} diff --git a/lib/importers.nix b/lib/importers.nix deleted file mode 100644 index ea07373..0000000 --- a/lib/importers.nix +++ /dev/null @@ -1,64 +0,0 @@ -{ lib }: -let - recImport = { dir, _import ? base: import "${dir}/${base}.nix" }: - lib.mapFilterAttrs - (_: v: v != null) - (n: v: - if n != "default.nix" && lib.hasSuffix ".nix" n && v == "regular" - then - let name = lib.removeSuffix ".nix" n; in lib.nameValuePair (name) (_import name) - else - lib.nameValuePair ("") (null)) - (lib.safeReadDir dir); - - mkProfileAttrs = - /** - Synopsis: mkProfileAttrs _path_ - - Recursively collect the subdirs of _path_ containing a default.nix into attrs. - This sets a contract, eliminating ambiguity for _default.nix_ living under the - profile directory. - - Example: - let profiles = mkProfileAttrs ./profiles; in - assert profiles ? core.default; 0 - **/ - dir: - let - imports = - let - files = lib.safeReadDir dir; - - p = n: v: - v == "directory" - && n != "profiles"; - in - lib.filterAttrs p files; - - f = n: _: - lib.optionalAttrs - (lib.pathExists "${dir}/${n}/default.nix") - { default = "${dir}/${n}"; } - // mkProfileAttrs "${dir}/${n}"; - in - lib.mapAttrs f imports; - -in -{ - inherit recImport mkProfileAttrs; - - pathsIn = dir: - let - fullPath = name: "${toString dir}/${name}"; - in - map fullPath (lib.attrNames (lib.safeReadDir dir)); - - importHosts = dir: - recImport { - inherit dir; - _import = base: { - modules = import "${toString dir}/${base}.nix"; - }; - }; -} - diff --git a/lib/lists.nix b/lib/lists.nix deleted file mode 100644 index 4bef865..0000000 --- a/lib/lists.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ lib }: -{ - collectProfiles = set: - let - collectNestedProfiles = set: - lib.mapAttrsToList - (n: v: - if builtins.isAttrs v then - [ v.default or null ] ++ collectNestedProfiles v - else null - ) - set; - in - builtins.filter (x: x != null) (lib.flatten (collectNestedProfiles set)); - - profileMap = list: map (profile: profile.default) (lib.flatten list); - - unifyOverlays = channels: map (o: if builtins.isFunction (o null null) then o channels else o); -} diff --git a/lib/mkFlake/default.nix b/lib/mkFlake/default.nix deleted file mode 100644 index e2d0b73..0000000 --- a/lib/mkFlake/default.nix +++ /dev/null @@ -1,99 +0,0 @@ -{ lib }: -let - inherit (builtins) mapAttrs attrNames attrValues head isFunction; -in - -_: { self, inputs, ... } @ args: -let - - config = lib.mkFlake.evalArgs { - inherit args; - }; - - cfg = config.config; - - otherArguments = removeAttrs args (attrNames config.options); - - defaultModules = with lib.modules; [ - (hmDefaults { - inherit (cfg.home) suites; - modules = cfg.home.modules ++ cfg.home.externalModules; - }) - (globalDefaults { - inherit self inputs; - }) - ]; - - stripChannel = channel: removeAttrs channel [ - # arguments in our channels api that shouldn't be passed to fup - "overlays" - ]; - getDefaultChannel = channels: channels.${cfg.nixos.hostDefaults.channelName}; - - # evalArgs sets channelName and system to null by default - # but for proper default handling in fup, null args have to be removed - stripHost = args: removeAttrs (lib.filterAttrs (_: arg: arg != null) args) [ - # arguments in our hosts/hostDefaults api that shouldn't be passed to fup - "externalModules" - ]; - hosts = lib.mapAttrs (_: stripHost) cfg.nixos.hosts; - hostDefaults = stripHost cfg.nixos.hostDefaults; -in -lib.systemFlake (lib.mergeAny - { - inherit self inputs hosts; - inherit (cfg) channelsConfig supportedSystems; - - channels = mapAttrs - (name: channel: - stripChannel (channel // { - # pass channels if "overlay" has three arguments - overlaysBuilder = channels: lib.unifyOverlays channels channel.overlays; - }) - ) - cfg.channels; - - sharedOverlays = [ - (final: prev: { - __dontExport = true; - devlib = lib; - }) - ]; - hostDefaults = lib.mergeAny hostDefaults { - specialArgs.suites = cfg.nixos.suites; - modules = cfg.nixos.hostDefaults.externalModules ++ defaultModules; - builder = args: args.specialArgs.channel.input.lib.nixosSystem (lib.mergeAny args { - # So modules and functions can create their own version of the build - modules = [{ lib.builderArgs = args; }]; - }); - }; - - nixosModules = lib.exporter.modulesFromList cfg.nixos.hostDefaults.modules; - - homeModules = lib.exporter.modulesFromList cfg.home.modules; - - overlays = lib.exporter.overlaysFromChannelsExporter { - # since we can't detect overlays owned by self - # we have to filter out ones exported by the inputs - # optimally we would want a solution for NixOS/nix#4740 - inherit inputs; - inherit (self) pkgs; - }; - - packagesBuilder = lib.builder.packagesFromOverlaysBuilderConstructor self.overlays; - - checksBuilder = channels: - lib.pkgs-lib.tests.mkChecks { - pkgs = getDefaultChannel channels; - inherit (self.deploy) nodes; - hosts = self.nixosConfigurations; - homes = self.homeConfigurations; - }; - - devShellBuilder = channels: - lib.pkgs-lib.shell { - pkgs = getDefaultChannel channels; - }; - } - otherArguments # for overlays list order -) diff --git a/lib/mkFlake/evalArgs.nix b/lib/mkFlake/evalArgs.nix deleted file mode 100644 index bf36627..0000000 --- a/lib/mkFlake/evalArgs.nix +++ /dev/null @@ -1,262 +0,0 @@ -{ lib }: - -{ args }: -let - argOpts = with lib; { config, ... }: - let - cfg = config; - inherit (config) self; - - maybeImport = obj: - if (builtins.typeOf obj == "path") || (builtins.typeOf obj == "string") then - import obj - else - obj; - - /* Custom types needed for arguments */ - - moduleType = with types; pathTo (anything // { - inherit (submodule { }) check; - description = "valid module"; - }); - - # to export modules we need paths to get the name - exportModuleType = with types; - (addCheck path (x: moduleType.check (import x))) // { - description = "path to a module"; - }; - overlayType = pathTo (types.anything // { - check = builtins.isFunction; - description = "valid Nixpkgs overlay"; - }); - systemType = types.enum config.supportedSystems; - flakeType = with types; (addCheck attrs lib.isStorePath) // { - description = "nix flake"; - }; - - # Apply maybeImport during merge and before check - # To simplify apply keys and improve type checking - pathTo = elemType: with types; coercedTo path maybeImport elemType; - - pathToListOf = elemType: with types; pathTo (listOf elemType); - - coercedListOf = elemType: with types; - coercedTo anything (x: flatten (singleton x)) (listOf elemType); - - /* Submodules needed for API containers */ - - channelsModule = { name, ... }: { - options = with types; { - input = mkOption { - type = flakeType; - default = cfg.inputs.${name}; - defaultText = "inputs."; - description = '' - nixpkgs flake input to use for this channel - ''; - }; - overlays = mkOption { - type = coercedListOf overlayType; - default = [ ]; - description = escape [ "<" ">" ] '' - overlays to apply to this channel - these will get exported under the 'overlays' flake output - as / and any overlay pulled from ''\${inputs} - will be filtered out - ''; - }; - config = mkOption { - type = pathTo attrs; - default = { }; - apply = lib.recursiveUpdate cfg.channelsConfig; - description = '' - nixpkgs config for this channel - ''; - }; - }; - }; - - hostModule = { - options = with types; { - # anything null in hosts gets filtered out by mkFlake - system = mkOption { - type = (nullOr systemType) // { - description = "system defined in `supportedSystems`"; - }; - default = null; - description = '' - system for this host - ''; - }; - channelName = mkOption { - type = (nullOr (types.enum (builtins.attrNames config.channels))) // { - description = "a channel defined in `channels`"; - }; - default = null; - description = '' - Channel this host should follow - ''; - }; - }; - }; - - # This is only needed for hostDefaults - # modules in each host don't get exported - externalModulesModule = { - options = { - externalModules = mkOption { - type = with types; listOf moduleType; - default = [ ]; - description = '' - modules to include that won't be exported - meant importing modules from external flakes - ''; - }; - }; - }; - - modulesModule = { - options = { - modules = mkOption { - type = with types; coercedListOf moduleType; - default = [ ]; - description = '' - modules to include - ''; - }; - }; - }; - - exportModulesModule = name: { - options = { - modules = mkOption { - type = with types; pathTo (coercedListOf exportModuleType); - default = [ ]; - description = '' - modules to include in all hosts and export to ${name}Modules output - ''; - }; - }; - }; - - - - # Home-manager's configs get exported automatically from nixos.hosts - # So there is no need for a host options in the home namespace - # This is only needed for nixos - includeHostsModule = name: { - options = with types; { - hostDefaults = mkOption { - type = submodule [ - hostModule - externalModulesModule - (exportModulesModule name) - ]; - default = { }; - description = '' - Defaults for all hosts. - the modules passed under hostDefaults will be exported - to the '${name}Modules' flake output. - They will also be added to all hosts. - ''; - }; - hosts = mkOption { - type = attrsOf (submodule [ hostModule modulesModule ]); - default = { }; - description = '' - configurations to include in the ${name}Configurations output - ''; - }; - }; - }; - - # profiles and suites - which are profile collections - profilesModule = { config, ... }: { - options = with types; { - profiles = mkOption { - type = listOf path; - default = [ ]; - description = '' - profile folders that can be collected into suites - the name of the argument passed to suites is based - on the folder name. - [ ./profiles ] => { profiles }: - ''; - }; - suites = mkOption { - type = pathTo (functionTo attrs); - default = _: { }; - apply = suites: lib.mkSuites { - inherit suites; - inherit (config) profiles; - }; - description = '' - Function that takes profiles and returns suites for this config system - These can be accessed through the 'suites' special argument. - ''; - }; - }; - }; - in - { - # this does not get propagated to submodules - # to allow passing flake outputs directly to mkFlake - config._module.check = false; - - options = with types; { - self = mkOption { - type = flakeType; - description = "The flake to create the devos outputs for"; - }; - inputs = mkOption { - type = attrsOf flakeType; - description = '' - inputs for this flake - used to set channel defaults and create registry - ''; - }; - supportedSystems = mkOption { - type = listOf str; - default = lib.defaultSystems; - description = '' - The systems supported by this flake - ''; - }; - channelsConfig = mkOption { - type = pathTo attrs; - default = { }; - description = '' - nixpkgs config for all channels - ''; - }; - channels = mkOption { - type = attrsOf (submodule channelsModule); - default = { }; - description = '' - nixpkgs channels to create - ''; - }; - nixos = mkOption { - type = submodule [ (includeHostsModule "nixos") profilesModule ]; - default = { }; - description = '' - hosts, modules, suites, and profiles for nixos - ''; - }; - home = mkOption { - type = submodule [ - profilesModule - (exportModulesModule "home") - externalModulesModule - ]; - default = { }; - description = '' - hosts, modules, suites, and profiles for home-manager - ''; - }; - }; - }; -in -lib.evalModules { - modules = [ argOpts args ]; -} diff --git a/lib/modules.nix b/lib/modules.nix deleted file mode 100644 index d564196..0000000 --- a/lib/modules.nix +++ /dev/null @@ -1,119 +0,0 @@ -{ lib }: -{ - hmDefaults = { suites, modules }: - { options, ... }: { - config = lib.optionalAttrs (options ? home-manager) { - home-manager = { - useGlobalPkgs = true; - useUserPackages = true; - - extraSpecialArgs = { inherit suites; }; - sharedModules = modules; - }; - }; - }; - - globalDefaults = { self, inputs }: - let - experimentalFeatures = [ - "flakes" - "nix-command" - "ca-references" - "ca-derivations" - ]; - in - { channel, config, pkgs, ... }: { - users.mutableUsers = lib.mkDefault false; - - hardware.enableRedistributableFirmware = lib.mkDefault true; - - nix.nixPath = [ - "nixpkgs=${channel.input}" - "nixos-config=${self}/lib/compat/nixos" - "home-manager=${inputs.home}" - ]; - - nix.registry = { - devos.flake = self; - nixos.flake = channel.input; - }; - - nix.extraOptions = '' - experimental-features = ${lib.concatStringsSep " " - experimentalFeatures - } - ''; - - _module.args = { - inherit self; - devlib = pkgs.devlib; - hosts = builtins.mapAttrs (_: host: host.config) - (removeAttrs self.nixosConfigurations [ config.networking.hostName ]); - }; - - system.configurationRevision = lib.mkIf (self ? rev) self.rev; - }; - - isoConfig = { self, inputs, fullHostConfig }: - { config, modulesPath, suites, ... }: { - - imports = [ "${modulesPath}/installer/cd-dvd/installation-cd-minimal-new-kernel.nix" ]; - # avoid unwanted systemd service startups - # all strings in disabledModules get appended to modulesPath - # so convert each to list which can be coerced to string - disabledModules = map lib.singleton suites.allProfiles; - - nix.registry = lib.mapAttrs (n: v: { flake = v; }) inputs; - - isoImage.isoBaseName = "nixos-" + config.networking.hostName; - isoImage.contents = [{ - source = self; - target = "/devos/"; - }]; - isoImage.storeContents = [ - self.devShell.${config.nixpkgs.system} - # include also closures that are "switched off" by the - # above profile filter on the local config attribute - fullHostConfig.system.build.toplevel - ]; - # still pull in tools of deactivated profiles - environment.systemPackages = fullHostConfig.environment.systemPackages; - - # confilcts with networking.wireless which might be slightly - # more useful on a stick - networking.networkmanager.enable = lib.mkForce false; - # confilcts with networking.wireless - networking.wireless.iwd.enable = lib.mkForce false; - - # Set up a link-local boostrap network - # See also: https://github.com/NixOS/nixpkgs/issues/75515#issuecomment-571661659 - networking.usePredictableInterfaceNames = lib.mkForce true; # so prefix matching works - networking.useNetworkd = lib.mkForce true; - networking.useDHCP = lib.mkForce false; - networking.dhcpcd.enable = lib.mkForce false; - systemd.network = { - # https://www.freedesktop.org/software/systemd/man/systemd.network.html - networks."boostrap-link-local" = { - matchConfig = { - Name = "en* wl* ww*"; - }; - networkConfig = { - Description = "Link-local host bootstrap network"; - MulticastDNS = true; - LinkLocalAddressing = "ipv6"; - DHCP = "yes"; - }; - address = [ - # fall back well-known link-local for situations where MulticastDNS is not available - "fe80::47" # 47: n=14 i=9 x=24; n+i+x - ]; - extraConfig = '' - # Unique, yet stable. Based off the MAC address. - IPv6LinkLocalAddressGenerationMode = "eui64" - ''; - }; - }; - }; - -} - diff --git a/lib/pkgs-lib/default.nix b/lib/pkgs-lib/default.nix deleted file mode 100644 index bcaee77..0000000 --- a/lib/pkgs-lib/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ lib, deploy, devshell }: -{ - tests = import ./tests { inherit lib deploy; }; - shell = import ./shell { inherit lib devshell deploy; }; -} - diff --git a/lib/pkgs-lib/shell/default.nix b/lib/pkgs-lib/shell/default.nix deleted file mode 100644 index 5b73b54..0000000 --- a/lib/pkgs-lib/shell/default.nix +++ /dev/null @@ -1,55 +0,0 @@ -{ lib, devshell, deploy }: - -{ pkgs }: -let - overlays = [ - devshell.overlay - - (final: prev: { - deploy-rs = - deploy.packages.${prev.system}.deploy-rs; - }) - ]; - - pkgs' = import pkgs.path { - inherit (pkgs) system; - inherit overlays; - }; - - flk = pkgs'.callPackage ./flk.nix { }; - - installPkgs = (lib.nixosSystem { - inherit (pkgs') system; - modules = [ ]; - }).config.system.build; -in -pkgs'.devshell.mkShell { - imports = [ (pkgs'.devshell.importTOML ./devshell.toml) ]; - - packages = with installPkgs; [ - nixos-install - nixos-generate-config - nixos-enter - ]; - - git.hooks = { - pre-commit.text = lib.fileContents ./pre-commit.sh; - }; - - commands = with pkgs'; [ - { package = flk; } - { - name = "nix"; - help = pkgs'.nixFlakes.meta.description; - command = '' - ${pkgs'.nixFlakes}/bin/nix --experimental-features "nix-command flakes ca-references" "${"\${@}"}" - ''; - } - ] - ++ lib.optional (system != "i686-linux") { package = cachix; } - ++ lib.optional (system == "x86_64-linux") { - name = "deploy"; - package = deploy-rs; - help = "A simple multi-profile Nix-flake deploy tool."; - }; -} diff --git a/lib/pkgs-lib/shell/devshell.toml b/lib/pkgs-lib/shell/devshell.toml deleted file mode 100644 index f261fdc..0000000 --- a/lib/pkgs-lib/shell/devshell.toml +++ /dev/null @@ -1,29 +0,0 @@ -imports = [ "git.hooks" ] - -[devshell] -packages = [ - "git-crypt" -] - -[[commands]] -package = "git" -category = "vcs" - -[[commands]] -package = "nixpkgs-fmt" -category = "linters" - -[[commands]] -package = "editorconfig-checker" -category = "linters" - -[[commands]] -package = "python3Packages.grip" -category = "documentation" - -[[commands]] -package = "mdbook" -category = "documentation" - -[git.hooks] -enable = true diff --git a/lib/pkgs-lib/shell/flk.nix b/lib/pkgs-lib/shell/flk.nix deleted file mode 100644 index ff9c59e..0000000 --- a/lib/pkgs-lib/shell/flk.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ stdenv }: -let - name = "flk"; -in -stdenv.mkDerivation { - inherit name; - - src = ./flk.sh; - - dontUnpack = true; - dontBuild = true; - - installPhase = '' - mkdir -p $out/bin - install $src $out/bin/${name} - ''; - - checkPhase = '' - ${stdenv.shell} -n -O extglob $out/bin/${name} - ''; - - meta.description = "Build, deploy, and install NixOS"; -} diff --git a/lib/pkgs-lib/shell/flk.sh b/lib/pkgs-lib/shell/flk.sh deleted file mode 100755 index 2d46045..0000000 --- a/lib/pkgs-lib/shell/flk.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env bash - -[[ -d "$DEVSHELL_ROOT" ]] || - { - echo "This script must be run from devos's devshell" >&2 - exit 1 - } - -shopt -s extglob - -HOSTNAME="$(hostname)" - -usage () { - printf "%b\n" \ - "\e[4mUsage\e[0m: $(basename $0) COMMAND [ARGS]\n" \ - "\e[4mCommands\e[0m:" - - printf " %-30s %s\n\n" \ - "up" "Generate $DEVSHELL_ROOT/hosts/up-$HOSTNAME.nix" \ - "update [INPUT]" "Update and commit the lock file, or specific input" \ - "get (core|community) [DEST]" "Copy the desired template to DEST" \ - "iso HOST" "Generate an ISO image of HOST" \ - "install HOST [ARGS]" "Shortcut for nixos-install" \ - "home HOST USER [switch]" "Home-manager config of USER from HOST" \ - "HOST (switch|boot|test)" "Shortcut for nixos-rebuild" -} - -case "$1" in - ""|"-h"|"help"|*(-)"help") - usage - ;; - - "up") - mkdir -p "$DEVSHELL_ROOT/up" - - nixos-generate-config --dir "$DEVSHELL_ROOT/up/$HOSTNAME" - - printf "%s\n" \ - "{ suites, ... }:" \ - "{" \ - " imports = [" \ - " ../up/$HOSTNAME/configuration.nix" \ - " ] ++ suites.core;" \ - "}" > "$DEVSHELL_ROOT/hosts/up-$HOSTNAME.nix" - - git add -f \ - "$DEVSHELL_ROOT/up/$HOSTNAME" \ - "$DEVSHELL_ROOT/hosts/up-$HOSTNAME.nix" - ;; - - "update") - if [[ -n "$2" ]]; then - if [[ -n "$3" ]]; then - (cd $2; nix flake list-inputs --update-input "$3") - else - (cd $2; nix flake update) - fi - nix flake list-inputs --update-input "$2" "$DEVSHELL_ROOT" - else - nix flake update "$DEVSHELL_ROOT" - fi - ;; - - "get") - if [[ "$2" == "core" || "$2" == "community" ]]; then - nix flake new -t "github:divnix/devos/$2" "${3:-flk}" - else - echo "flk get (core|community) [DEST]" - exit 1 - fi - ;; - - "iso") - nix build \ - "$DEVSHELL_ROOT#nixosConfigurations.$2.config.system.build.iso" \ - "${@:3}" - ;; - - "install") - sudo nixos-install --flake "$DEVSHELL_ROOT#$2" "${@:3}" - ;; - - "home") - ref="$DEVSHELL_ROOT/#homeConfigurations.$3@$2.activationPackage" - - if [[ "$4" == "switch" ]]; then - nix build "$ref" && result/activate && - unlink result - - else - nix build "$ref" "${@:4}" - fi - ;; - - *) - sudo nixos-rebuild --flake "$DEVSHELL_ROOT#$1" "${@:2}" - ;; -esac diff --git a/lib/pkgs-lib/shell/pre-commit.sh b/lib/pkgs-lib/shell/pre-commit.sh deleted file mode 100755 index 985d3b4..0000000 --- a/lib/pkgs-lib/shell/pre-commit.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash - -if git rev-parse --verify HEAD >/dev/null 2>&1 -then - against=HEAD -else - # Initial commit: diff against an empty tree object - against=$(${git}/bin/git hash-object -t tree /dev/null) -fi - -diff="git diff-index --name-only --cached $against --diff-filter d" - -nix_files=($($diff -- '*.nix')) -all_files=($($diff)) - -# Format staged nix files. -if [[ -n "${nix_files[@]}" ]]; then - nixpkgs-fmt "${nix_files[@]}" \ - && git add "${nix_files[@]}" -fi - -# check editorconfig -editorconfig-checker -- "${all_files[@]}" -if [[ $? != '0' ]]; then - printf "%b\n" \ - "\nCode is not aligned with .editorconfig" \ - "Review the output and commit your fixes" >&2 - exit 1 -fi diff --git a/lib/pkgs-lib/tests/default.nix b/lib/pkgs-lib/tests/default.nix deleted file mode 100644 index e08702a..0000000 --- a/lib/pkgs-lib/tests/default.nix +++ /dev/null @@ -1,56 +0,0 @@ -{ lib, deploy }: -let - mkChecks = { pkgs, hosts, nodes, homes ? { } }: - let - deployHosts = lib.filterAttrs - (n: _: hosts.${n}.config.nixpkgs.system == pkgs.system) - nodes; - deployChecks = deploy.lib.${pkgs.system}.deployChecks { nodes = deployHosts; }; - tests = - lib.optionalAttrs (deployHosts != { }) - { - profilesTest = profilesTest { - inherit pkgs; - host = hosts.${(builtins.head (builtins.attrNames deployHosts))}; - }; - } // lib.mapAttrs (n: v: v.activationPackage) homes; - - in - lib.recursiveUpdate tests deployChecks; - - mkTest = { pkgs, host }: - let - nixosTesting = - (import "${toString pkgs.path}/nixos/lib/testing-python.nix" { - inherit (pkgs) system; - inherit (host.config.lib.builderArgs) specialArgs; - inherit pkgs; - extraConfigurations = host._module.args.modules; - }); - in - test: - let - loadedTest = - if builtins.typeOf test == "path" - then import test - else test; - calledTest = - if pkgs.lib.isFunction loadedTest - then pkgs.callPackage loadedTest { } - else loadedTest; - in - nixosTesting.makeTest calledTest; - - profilesTest = args@{ host, ... }: mkTest args { - name = "profiles"; - - machine = { suites, ... }: { - imports = suites.allProfiles; - }; - - testScript = '' - ${host.config.networking.hostName}.systemctl("is-system-running --wait") - ''; - }; -in -{ inherit mkTest profilesTest mkChecks; } diff --git a/lib/pkgs-lib/tests/lib.nix b/lib/pkgs-lib/tests/lib.nix deleted file mode 100644 index 586eac3..0000000 --- a/lib/pkgs-lib/tests/lib.nix +++ /dev/null @@ -1,93 +0,0 @@ -{ pkgs, lib, ... }: -with lib; -lib.runTests { - testConcatAttrs = { - expr = concatAttrs [{ foo = 1; } { bar = 2; } { baz = 3; }]; - - expected = { foo = 1; bar = 2; baz = 3; }; - }; - - testGenAttrs' = { - expr = genAttrs' - [ "/foo/bar" "/baz/buzz" ] - (path: { - name = baseNameOf path; - value = "${path}/fizz"; - }); - - expected = { bar = "/foo/bar/fizz"; buzz = "/baz/buzz/fizz"; }; - }; - - testMapFilterAttrs = { - expr = mapFilterAttrs - (n: v: n == "foobar" && v == 1) - (n: v: lib.nameValuePair ("${n}bar") (v + 1)) - { foo = 0; bar = 2; }; - - expected = { foobar = 1; }; - }; - - testPathsIn = { - expr = pathsIn (toString ./testPathsIn); - - expected = map toString [ - ./testPathsIn/bar - ./testPathsIn/baz - ./testPathsIn/foo - ]; - }; - - testPathsToImportedAttrs = { - expr = - pathsToImportedAttrs [ - (toString ./testPathsToImportedAttrs/dir) - ./testPathsToImportedAttrs/foo.nix - ./testPathsToImportedAttrs/bar.nix - ./testPathsToImportedAttrs/t.nix - ./testPathsToImportedAttrs/f.nix - ]; - - expected = { - dir = { a = 5; }; - foo = { bar = 1; }; - bar = { foo = 2; }; - t = true; - f = false; - }; - }; - - testRgxToString = lib.testAllTrue [ - (rgxToString ".+x" "vxk" == "vx") - (rgxToString "^fo" "foo" == "fo") - (rgxToString "a?" "a" == "a") - (rgxToString "hat" "foohatbar" == "hat") - ]; - - testSafeReadDir = { - expr = safeReadDir ./profiles // safeReadDir ./nonexistentdir; - expected = { - foo = "directory"; - t = "directory"; - }; - }; - - testSuites = - let - profiles = os.mkProfileAttrs (toString ./profiles); - users = ""; - userProfiles = ""; - suites = { profiles, ... }: { - system.bar = [ profiles.foo ]; - }; - in - { - expr = os.mkSuites { inherit profiles users userProfiles suites; }; - expected = { - system = { - bar = [ profiles.foo.default ]; - allProfiles = [ profiles.foo.default profiles.t.default ]; - allUsers = [ ]; - }; - }; - }; -} diff --git a/lib/strings.nix b/lib/strings.nix deleted file mode 100644 index d411bab..0000000 --- a/lib/strings.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ lib }: -{ - # returns matching part of _regex_ _string_; null indicates failure. - rgxToString = regex: string: - let - match = - let - head = lib.substring 0 1 regex; - sec = lib.substring 1 2 regex; - in - if head == "^" - || head == "." - || (sec == "*" || sec == "+" || sec == "?") - then builtins.match "(${regex}).*" string - else builtins.match ".*(${regex}).*" string; - in - if lib.isList match - then lib.head match - else null; -} diff --git a/lib/tests/default.nix b/lib/tests/default.nix deleted file mode 100644 index ab4d516..0000000 --- a/lib/tests/default.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ pkgs, lib }: - -pkgs.runCommandNoCC "devos-lib-tests" -{ - buildInputs = [ - pkgs.nix - ( - let tests = import ./lib.nix { inherit pkgs lib; }; in - if tests == [ ] then null - else throw (builtins.toJSON tests) - ) - ]; -} '' - datadir="${pkgs.nix}/share" - export TEST_ROOT=$(pwd)/test-tmp - export NIX_BUILD_HOOK= - export NIX_CONF_DIR=$TEST_ROOT/etc - export NIX_LOCALSTATE_DIR=$TEST_ROOT/var - export NIX_LOG_DIR=$TEST_ROOT/var/log/nix - export NIX_STATE_DIR=$TEST_ROOT/var/nix - export NIX_STORE_DIR=$TEST_ROOT/store - export PAGER=cat - cacheDir=$TEST_ROOT/binary-cache - nix-store --init - - touch $out -'' diff --git a/lib/tests/lib.nix b/lib/tests/lib.nix deleted file mode 100644 index 78536e7..0000000 --- a/lib/tests/lib.nix +++ /dev/null @@ -1,70 +0,0 @@ -{ pkgs, lib }: -with lib; -lib.runTests { - testConcatAttrs = { - expr = concatAttrs [{ foo = 1; } { bar = 2; } { baz = 3; }]; - - expected = { foo = 1; bar = 2; baz = 3; }; - }; - - testGenAttrs' = { - expr = genAttrs' - [ "/foo/bar" "/baz/buzz" ] - (path: { - name = baseNameOf path; - value = "${path}/fizz"; - }); - - expected = { bar = "/foo/bar/fizz"; buzz = "/baz/buzz/fizz"; }; - }; - - testMapFilterAttrs = { - expr = mapFilterAttrs - (n: v: n == "foobar" && v == 1) - (n: v: lib.nameValuePair ("${n}bar") (v + 1)) - { foo = 0; bar = 2; }; - - expected = { foobar = 1; }; - }; - - testPathsIn = { - expr = pathsIn (toString ./testPathsIn); - - expected = map toString [ - ./testPathsIn/bar - ./testPathsIn/baz - ./testPathsIn/foo - ]; - }; - - testRgxToString = lib.testAllTrue [ - (rgxToString ".+x" "vxk" == "vx") - (rgxToString "^fo" "foo" == "fo") - (rgxToString "a?" "a" == "a") - (rgxToString "hat" "foohatbar" == "hat") - ]; - - testSafeReadDir = { - expr = safeReadDir ./profiles // safeReadDir ./nonexistentdir; - expected = { - foo = "directory"; - t = "directory"; - }; - }; - - testSuites = { - expr = mkSuites { - suites = { profiles, ... }: with profiles; { - bar = [ foo ]; - }; - profiles = [ (./profiles) ]; - }; - expected = { - bar = [ (toString ./profiles/foo) ]; - allProfiles = [ - (toString ./profiles/foo) - (toString ./profiles/t) - ]; - }; - }; -} diff --git a/lib/tests/profiles/foo/default.nix b/lib/tests/profiles/foo/default.nix deleted file mode 100644 index 2181e56..0000000 --- a/lib/tests/profiles/foo/default.nix +++ /dev/null @@ -1,3 +0,0 @@ -{ - bar = 5; -} diff --git a/lib/tests/profiles/t/default.nix b/lib/tests/profiles/t/default.nix deleted file mode 100644 index 8b13789..0000000 --- a/lib/tests/profiles/t/default.nix +++ /dev/null @@ -1 +0,0 @@ - diff --git a/lib/tests/testPathsIn/bar b/lib/tests/testPathsIn/bar deleted file mode 100644 index e69de29..0000000 diff --git a/lib/tests/testPathsIn/baz b/lib/tests/testPathsIn/baz deleted file mode 100644 index e69de29..0000000 diff --git a/lib/tests/testPathsIn/foo b/lib/tests/testPathsIn/foo deleted file mode 100644 index e69de29..0000000 diff --git a/lib/tests/testPathsToImportedAttrs/bar.nix b/lib/tests/testPathsToImportedAttrs/bar.nix deleted file mode 100644 index 0e5233d..0000000 --- a/lib/tests/testPathsToImportedAttrs/bar.nix +++ /dev/null @@ -1 +0,0 @@ -{ foo = 2; } diff --git a/lib/tests/testPathsToImportedAttrs/dir/default.nix b/lib/tests/testPathsToImportedAttrs/dir/default.nix deleted file mode 100644 index 01cb926..0000000 --- a/lib/tests/testPathsToImportedAttrs/dir/default.nix +++ /dev/null @@ -1 +0,0 @@ -{ a = 5; } diff --git a/lib/tests/testPathsToImportedAttrs/f.nix b/lib/tests/testPathsToImportedAttrs/f.nix deleted file mode 100644 index c4d456a..0000000 --- a/lib/tests/testPathsToImportedAttrs/f.nix +++ /dev/null @@ -1 +0,0 @@ -true && false diff --git a/lib/tests/testPathsToImportedAttrs/foo.nix b/lib/tests/testPathsToImportedAttrs/foo.nix deleted file mode 100644 index 2f11bd3..0000000 --- a/lib/tests/testPathsToImportedAttrs/foo.nix +++ /dev/null @@ -1 +0,0 @@ -{ bar = 1; } diff --git a/lib/tests/testPathsToImportedAttrs/t.nix b/lib/tests/testPathsToImportedAttrs/t.nix deleted file mode 100644 index 3be59dc..0000000 --- a/lib/tests/testPathsToImportedAttrs/t.nix +++ /dev/null @@ -1 +0,0 @@ -true || false