Move lib to subdirectory
This commit is contained in:
		
							
								
								
									
										219
									
								
								lib/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								lib/default.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,219 @@
 | 
			
		||||
{ lib }:
 | 
			
		||||
let
 | 
			
		||||
  inherit (builtins) length match replaceStrings elemAt mapAttrs head split filter;
 | 
			
		||||
  inherit (lib)
 | 
			
		||||
    genAttrs mapAttrs' mapAttrsToList filterAttrsRecursive nameValuePair types
 | 
			
		||||
    mkOption mkOverride mkForce mkIf mergeEqualOption optional hasPrefix
 | 
			
		||||
    showWarnings concatStringsSep flatten unique;
 | 
			
		||||
  inherit (lib.flake) defaultSystems;
 | 
			
		||||
in
 | 
			
		||||
rec {
 | 
			
		||||
  # Yoinked from nixpkgs/nixos/modules/services/networking/nat.nix
 | 
			
		||||
  isIPv6 = ip: length (lib.splitString ":" ip) > 2;
 | 
			
		||||
  parseIPPort = ipp:
 | 
			
		||||
    let
 | 
			
		||||
      v6 = isIPv6 ipp;
 | 
			
		||||
      matchIP = if v6 then "[[]([0-9a-fA-F:]+)[]]" else "([0-9.]+)";
 | 
			
		||||
      m = match "${matchIP}:(.+)" ipp;
 | 
			
		||||
      checked = v: if m == null then throw "bad ip:ports `${ipp}'" else v;
 | 
			
		||||
    in
 | 
			
		||||
    {
 | 
			
		||||
      inherit v6;
 | 
			
		||||
      ip = checked (elemAt m 0);
 | 
			
		||||
      ports = checked (elemAt m 1);
 | 
			
		||||
    };
 | 
			
		||||
  naiveIPv4Gateway = ip: "${head (elemAt (split ''([0-9]+\.[0-9]+\.[0-9]+)\.[0-9]+'' ip) 1)}.1";
 | 
			
		||||
  attrsToNVList = mapAttrsToList nameValuePair;
 | 
			
		||||
 | 
			
		||||
  mkDefaultSystemsPkgs = path: args': genAttrs defaultSystems (system: import path ((args' system) // { inherit system; }));
 | 
			
		||||
  mkApp = program: { type = "app"; inherit program; };
 | 
			
		||||
  mkShellApp = pkgs: name: text: mkApp (pkgs.writeShellScript name text).outPath;
 | 
			
		||||
  mkShellApp' = pkgs: args:
 | 
			
		||||
    let
 | 
			
		||||
      app = pkgs.writeShellApplication args;
 | 
			
		||||
    in mkApp "${app}/bin/${app.meta.mainProgram}";
 | 
			
		||||
  flakePackageOverlay' = flake: pkg: system: (final: prev:
 | 
			
		||||
    let
 | 
			
		||||
      pkg' = if pkg != null then flake.packages.${system}.${pkg} else flake.defaultPackage.${system};
 | 
			
		||||
      name = if pkg != null then pkg else pkg'.name;
 | 
			
		||||
    in
 | 
			
		||||
    {
 | 
			
		||||
      ${name} = pkg';
 | 
			
		||||
    });
 | 
			
		||||
  flakePackageOverlay = flake: flakePackageOverlay' flake null;
 | 
			
		||||
 | 
			
		||||
  inlineModule' = path: module: {
 | 
			
		||||
    _file = path;
 | 
			
		||||
    imports = [ module ];
 | 
			
		||||
  };
 | 
			
		||||
  inlineModule = path: inlineModule' path (import path);
 | 
			
		||||
 | 
			
		||||
  # Merge together modules which are defined as functions with others that aren't
 | 
			
		||||
  naiveModule = with types; (coercedTo (attrsOf anything) (conf: { ... }: conf) (functionTo (attrsOf anything)));
 | 
			
		||||
 | 
			
		||||
  mkOpt = type: default: mkOption { inherit type default; };
 | 
			
		||||
  mkOpt' = type: default: description: mkOption { inherit type default description; };
 | 
			
		||||
  mkBoolOpt = default: mkOption {
 | 
			
		||||
    inherit default;
 | 
			
		||||
    type = types.bool;
 | 
			
		||||
    example = true;
 | 
			
		||||
  };
 | 
			
		||||
  mkBoolOpt' = default: description: mkOption {
 | 
			
		||||
    inherit default description;
 | 
			
		||||
    type = types.bool;
 | 
			
		||||
    example = true;
 | 
			
		||||
  };
 | 
			
		||||
  nullOrOpt' = type: description: mkOpt' (types.nullOr type) null description;
 | 
			
		||||
  dummyOption = mkOption { };
 | 
			
		||||
 | 
			
		||||
  # Slightly higher precedence than mkDefault
 | 
			
		||||
  mkDefault' = mkOverride 900;
 | 
			
		||||
  mkVMOverride' = mkOverride 9;
 | 
			
		||||
 | 
			
		||||
  # This is shocking...
 | 
			
		||||
  duplicates = l:
 | 
			
		||||
    flatten
 | 
			
		||||
      (map
 | 
			
		||||
        (e:
 | 
			
		||||
          optional
 | 
			
		||||
            ((length (filter (e2: e2 == e) l)) > 1)
 | 
			
		||||
            e)
 | 
			
		||||
        (unique l));
 | 
			
		||||
 | 
			
		||||
  applyAssertions = config: res:
 | 
			
		||||
  let
 | 
			
		||||
    failedAssertions = map (x: x.message) (filter (x: !x.assertion) config.assertions);
 | 
			
		||||
  in
 | 
			
		||||
  if failedAssertions != []
 | 
			
		||||
    then throw "\nFailed assertions:\n${concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}"
 | 
			
		||||
    else showWarnings config.warnings res;
 | 
			
		||||
 | 
			
		||||
  homeStateVersion = hmBranch: {
 | 
			
		||||
    # The flake passes a default setting, but we don't care about that
 | 
			
		||||
    # Currently don't need any logic here, but we might need to use a newer version later
 | 
			
		||||
    #home.stateVersion = mkForce (if (hmBranch == "stable" || hmBranch == "mine-stable") then "22.05" else "22.11");
 | 
			
		||||
    home.stateVersion = mkForce "22.05";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  commonOpts = with types; {
 | 
			
		||||
    moduleType = mkOptionType {
 | 
			
		||||
      name = "Inline flake-exportable module";
 | 
			
		||||
      merge = loc: defs: inlineModule (mergeEqualOption loc defs);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    system = mkOpt' (enum defaultSystems) null "Nix-style system string.";
 | 
			
		||||
    nixpkgs = mkOpt' (enum [ "unstable" "stable" "mine" "mine-stable" ]) "unstable" "Branch of nixpkgs to use.";
 | 
			
		||||
    home-manager = mkOpt' (enum [ "unstable" "stable" "mine" "mine-stable" ]) "unstable" "Branch of home-manager to use.";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  networkdAssignment = iface: a: {
 | 
			
		||||
    matchConfig.Name = iface;
 | 
			
		||||
    address =
 | 
			
		||||
      [ "${a.ipv4.address}/${toString a.ipv4.mask}" ] ++
 | 
			
		||||
      (optional (a.ipv6.iid == null) "${a.ipv6.address}/${toString a.ipv6.mask}");
 | 
			
		||||
    gateway =
 | 
			
		||||
      (optional (a.ipv4.gateway != null) a.ipv4.gateway) ++
 | 
			
		||||
      (optional (a.ipv6.gateway != null) a.ipv6.gateway);
 | 
			
		||||
    networkConfig = {
 | 
			
		||||
      IPv6AcceptRA = a.ipv6.gateway == null || a.ipv6.iid != null;
 | 
			
		||||
      # NOTE: LLDP emission / reception is ignored on bridge interfaces
 | 
			
		||||
      LLDP = true;
 | 
			
		||||
      EmitLLDP = "customer-bridge";
 | 
			
		||||
    };
 | 
			
		||||
    ipv6AcceptRAConfig = {
 | 
			
		||||
      Token = mkIf (a.ipv6.iid != null) "static:${a.ipv6.iid}";
 | 
			
		||||
      UseDNS = true;
 | 
			
		||||
      UseDomains = true;
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  deploy-rs =
 | 
			
		||||
  with types;
 | 
			
		||||
  let
 | 
			
		||||
    globalOpts = {
 | 
			
		||||
      sshUser = nullOrOpt' str "Username deploy-rs will deploy with.";
 | 
			
		||||
      user = nullOrOpt' str "Username deploy-rs will deploy with.";
 | 
			
		||||
      sudo = nullOrOpt' str "Command to elevate privileges with (used if the deployment user != profile user).";
 | 
			
		||||
      sshOpts = mkOpt' (listOf str) [ ]
 | 
			
		||||
        "Options deploy-rs will pass to ssh. Note: overriding at a lower level _merges_ options.";
 | 
			
		||||
      fastConnection = nullOrOpt' bool "Whether to copy the whole closure instead of using substitution.";
 | 
			
		||||
      autoRollback = nullOrOpt' bool "Whether to roll back the profile if activation fails.";
 | 
			
		||||
      magicRollback = nullOrOpt' bool "Whether to roll back the profile if connectivity to the deployer is lost.";
 | 
			
		||||
      confirmTimeout = nullOrOpt' ints.u16 "Timeout for confirming activation succeeded.";
 | 
			
		||||
      tempPath = nullOrOpt' str "Path that deploy-rs will use for temporary files.";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    profileOpts = {
 | 
			
		||||
      path = mkOpt' package "" "Derivation to build (should include activation script).";
 | 
			
		||||
      profilePath = nullOrOpt' str "Path to profile location";
 | 
			
		||||
    } // globalOpts;
 | 
			
		||||
    profileType = submodule { options = profileOpts; };
 | 
			
		||||
 | 
			
		||||
    nodeOpts = {
 | 
			
		||||
      hostname = mkOpt' str "" "Hostname deploy-rs will connect to.";
 | 
			
		||||
      profilesOrder = nullOrOpt' (listOf str)
 | 
			
		||||
        "Order to deploy profiles in (remainder will be deployed in arbitrary order).";
 | 
			
		||||
      profiles = mkOpt' (attrsOf profileType) { } "Profiles to deploy.";
 | 
			
		||||
    } // globalOpts;
 | 
			
		||||
    nodeType = submodule { options = nodeOpts; };
 | 
			
		||||
 | 
			
		||||
    deployOpts = {
 | 
			
		||||
      nodes = mkOption {
 | 
			
		||||
        type = attrsOf nodeType;
 | 
			
		||||
        default = { };
 | 
			
		||||
        internal = true;
 | 
			
		||||
        description = "deploy-rs node configurations.";
 | 
			
		||||
      };
 | 
			
		||||
    } // globalOpts;
 | 
			
		||||
    deployType = submodule { options = deployOpts; };
 | 
			
		||||
  in
 | 
			
		||||
  {
 | 
			
		||||
    inherit globalOpts;
 | 
			
		||||
    node = mkOpt' nodeType { } "deploy-rs node configuration.";
 | 
			
		||||
    deploy = mkOpt' deployType { } "deploy-rs configuration.";
 | 
			
		||||
 | 
			
		||||
    filterOpts = filterAttrsRecursive (_: v: v != null);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  pubDomain = "nul.ie";
 | 
			
		||||
  colony = rec {
 | 
			
		||||
    domain = "test.int.nul.ie";
 | 
			
		||||
    start = {
 | 
			
		||||
      all = {
 | 
			
		||||
        v4 = "10.100.";
 | 
			
		||||
        v6 = "2a0e:97c0:4d0:bbb";
 | 
			
		||||
      };
 | 
			
		||||
      base = {
 | 
			
		||||
        v4 = "${start.all.v4}0.";
 | 
			
		||||
        v6 = "${start.all.v6}0::";
 | 
			
		||||
      };
 | 
			
		||||
      vms = {
 | 
			
		||||
        v4 = "${start.all.v4}1.";
 | 
			
		||||
        v6 = "${start.all.v6}1::";
 | 
			
		||||
      };
 | 
			
		||||
      ctrs = {
 | 
			
		||||
        v4 = "${start.all.v4}2.";
 | 
			
		||||
        v6 = "${start.all.v6}2::";
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
    prefixes = {
 | 
			
		||||
      all = {
 | 
			
		||||
        v4 = "${start.base.v4}0/16";
 | 
			
		||||
        v6 = "${start.base.v6}/60";
 | 
			
		||||
      };
 | 
			
		||||
      base.v6 = "${start.base.v6}/64";
 | 
			
		||||
      vms = {
 | 
			
		||||
        v4 = "${start.vms.v4}0/24";
 | 
			
		||||
        v6 = "${start.vms.v6}/64";
 | 
			
		||||
      };
 | 
			
		||||
      ctrs = {
 | 
			
		||||
        v4 = "${start.ctrs.v4}0/24";
 | 
			
		||||
        v6 = "${start.ctrs.v6}/64";
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
  sshKeyFiles = {
 | 
			
		||||
    me = ../.keys/me.pub;
 | 
			
		||||
    deploy = ../.keys/deploy.pub;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user