Skip to content
Snippets Groups Projects
100tb.nix 2.5 KiB
Newer Older
# A NixOS module which configures a system that is hosted by 100TB.
{ pkgs, lib, config, ... }:
let
  cfg = config."100tb".config;
  options = {
    interface = lib.mkOption
    { type = lib.types.str;
      example = lib.literalExample "eno0";
      description = "The name of the network interface on which to configure a static address.";

    };
    publicIPv4 = lib.mkOption
    { type = lib.types.str;
      example = lib.literalExample "192.0.2.0";
      description = "The IPv4 address to statically assign to `interface`.";
    };
    prefixLength = lib.mkOption
    { type = lib.types.int;
      example = lib.literalExample 24;
      description = "The statically configured network's prefix length.";
    };
    gateway = lib.mkOption
    { type = lib.types.str;
      example = lib.literalExample "192.0.2.1";
      description = "The statically configured address of the network gateway.";
    };
    gatewayInterface = lib.mkOption
    { type = lib.types.str;
      example = lib.literalExample "eno0";
      description = "The name of the network interface for the default route.";
      default = cfg.interface;
    };
    grubDeviceID = lib.mkOption
    { type = lib.types.str;
      example = lib.literalExample "wwn-0x5000c500936410b9";
      description = "The ID of the disk on which to install grub.";
    };
    rootPublicKey = lib.mkOption
    { type = lib.types.str;
      example = lib.literalExample "ssh-ed25519 AAAA... username@host";
      description = "The public key to install for the root user.";
    };
  };
in {
  options =
  { "100tb".config = lib.mkOption
    { type = lib.types.submodule { inherit options; };
      description = "Host-specific configuration relevant to a 100TB system.";
    };
  };

  config =
  { boot.loader.timeout = 1;
    boot.loader.grub.enable = true;
    boot.loader.grub.version = 2;
    boot.loader.grub.device = "/dev/disk/by-id/${cfg.grubDeviceID}";

    # Let me in to do subsequent configuration.
    networking.firewall.enable = false;
    services.openssh.enable = true;

    users.users.root.openssh.authorizedKeys.keys = [
      cfg.rootPublicKey
    ];

    # Provide the static network configuration.
    networking.dhcpcd.enable = false;
    networking.interfaces = {
      "${cfg.interface}".ipv4.addresses = [
        { address = cfg.publicIPv4; inherit (cfg) prefixLength; }
      ];
    };
    networking.defaultGateway = {
      address = cfg.gateway;
      interface = cfg.gatewayInterface;
    };
    networking.nameservers = [
      "4.2.2.1"
      "8.8.8.8"
    ];
  };
}