From e8077fde966e051fc449fffcfa061c7f7edc47b0 Mon Sep 17 00:00:00 2001 From: Caroline Larimore Date: Mon, 14 Apr 2025 19:01:38 -0700 Subject: migration: finalize --- modules/nixos/apps/i3/default.nix | 50 +++++++++++++ modules/nixos/apps/playerctl/default.nix | 18 +++++ modules/nixos/apps/steam/default.nix | 18 +++++ modules/nixos/hardware/audio/default.nix | 25 +++++++ modules/nixos/hardware/keyboard/default.nix | 43 +++++++++++ modules/nixos/services/minecraft/default.nix | 25 +++++++ .../services/minecraft/stargazers/default.nix | 83 +++++++++++++++++++++ .../nixos/services/minecraft/zenith/default.nix | 21 ++++++ modules/nixos/services/ssh/default.nix | 28 ++++++++ modules/nixos/services/web/default.nix | 23 ++++++ modules/nixos/services/web/images/default.nix | 34 +++++++++ modules/nixos/services/web/landing/default.nix | 34 +++++++++ modules/nixos/services/web/personal/default.nix | 63 ++++++++++++++++ modules/nixos/services/web/stargazers/default.nix | 34 +++++++++ modules/nixos/suites/common/default.nix | 25 +++++++ modules/nixos/suites/desktop/default.nix | 27 +++++++ modules/nixos/suites/gaming/default.nix | 17 +++++ modules/nixos/system/default.nix | 30 ++++++++ modules/nixos/system/fonts/default.nix | 38 ++++++++++ modules/nixos/system/impermanence/default.nix | 49 +++++++++++++ modules/nixos/tools/bash/default.nix | 29 ++++++++ modules/nixos/tools/bash/prompt.sh | 84 ++++++++++++++++++++++ modules/nixos/tools/git/default.nix | 16 +++++ modules/nixos/tools/misc/default.nix | 19 +++++ modules/nixos/tools/rebuild/default.nix | 16 +++++ modules/nixos/tools/vim/default.nix | 19 +++++ 26 files changed, 868 insertions(+) create mode 100644 modules/nixos/apps/i3/default.nix create mode 100644 modules/nixos/apps/playerctl/default.nix create mode 100644 modules/nixos/apps/steam/default.nix create mode 100644 modules/nixos/hardware/audio/default.nix create mode 100644 modules/nixos/hardware/keyboard/default.nix create mode 100644 modules/nixos/services/minecraft/default.nix create mode 100644 modules/nixos/services/minecraft/stargazers/default.nix create mode 100644 modules/nixos/services/minecraft/zenith/default.nix create mode 100644 modules/nixos/services/ssh/default.nix create mode 100644 modules/nixos/services/web/default.nix create mode 100644 modules/nixos/services/web/images/default.nix create mode 100644 modules/nixos/services/web/landing/default.nix create mode 100644 modules/nixos/services/web/personal/default.nix create mode 100644 modules/nixos/services/web/stargazers/default.nix create mode 100644 modules/nixos/suites/common/default.nix create mode 100644 modules/nixos/suites/desktop/default.nix create mode 100644 modules/nixos/suites/gaming/default.nix create mode 100644 modules/nixos/system/default.nix create mode 100644 modules/nixos/system/fonts/default.nix create mode 100644 modules/nixos/system/impermanence/default.nix create mode 100644 modules/nixos/tools/bash/default.nix create mode 100644 modules/nixos/tools/bash/prompt.sh create mode 100644 modules/nixos/tools/git/default.nix create mode 100644 modules/nixos/tools/misc/default.nix create mode 100644 modules/nixos/tools/rebuild/default.nix create mode 100644 modules/nixos/tools/vim/default.nix (limited to 'modules/nixos') diff --git a/modules/nixos/apps/i3/default.nix b/modules/nixos/apps/i3/default.nix new file mode 100644 index 0000000..e01c6c2 --- /dev/null +++ b/modules/nixos/apps/i3/default.nix @@ -0,0 +1,50 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.apps.i3; +in { + options.${namespace}.apps.i3 = with types; { + enable = mkEnableOption "i3"; + + videoDrivers = mkOption { + type = types.listOf types.str; + default = [ "modesetting" "fbdev" ]; + }; + + setupCommands = mkOption { + type = types.lines; + default = ""; + description = '' + Shell commands executed just after the X server has started. + ''; + }; + }; + + config = mkIf cfg.enable { + services = { + displayManager = { + enable = true; + defaultSession = "none+i3"; + }; + + xserver = { + enable = true; + windowManager.i3.enable = true; + + displayManager = { + lightdm.enable = true; + setupCommands = cfg.setupCommands; + }; + + videoDrivers = cfg.videoDrivers; + xkb.layout = "us"; + }; + + libinput = { + enable = true; + mouse.accelProfile = "flat"; + touchpad.naturalScrolling = true; + }; + }; + }; +} diff --git a/modules/nixos/apps/playerctl/default.nix b/modules/nixos/apps/playerctl/default.nix new file mode 100644 index 0000000..9bf95d7 --- /dev/null +++ b/modules/nixos/apps/playerctl/default.nix @@ -0,0 +1,18 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.apps.playerctl; +in { + options.${namespace}.apps.playerctl = with types; { + enable = mkEnableOption "playerctl"; + }; + + config = mkIf cfg.enable { + environment.systemPackages = with pkgs; [ + playerctl + ]; + + #TODO: enable, eventually + services.playerctld.enable = false; + }; +} diff --git a/modules/nixos/apps/steam/default.nix b/modules/nixos/apps/steam/default.nix new file mode 100644 index 0000000..b9baebf --- /dev/null +++ b/modules/nixos/apps/steam/default.nix @@ -0,0 +1,18 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.apps.steam; +in { + options.${namespace}.apps.steam = with types; { + enable = mkEnableOption "steam"; + }; + + config = mkIf cfg.enable { + nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ + "steam" + "steam-unwrapped" + ]; + + programs.steam.enable = true; + }; +} diff --git a/modules/nixos/hardware/audio/default.nix b/modules/nixos/hardware/audio/default.nix new file mode 100644 index 0000000..d2bfa96 --- /dev/null +++ b/modules/nixos/hardware/audio/default.nix @@ -0,0 +1,25 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.hardware.audio; +in { + options.${namespace}.hardware.audio = with types; { + enable = mkEnableOption "audio support"; + }; + + config = mkIf cfg.enable { + environment.systemPackages = with pkgs; [ + pulseaudio + ]; + + security.rtkit.enable = true; + services.pipewire = { + enable = true; + + pulse.enable = true; + alsa.enable = true; + alsa.support32Bit = true; + #jack.enable = true; + }; + }; +} diff --git a/modules/nixos/hardware/keyboard/default.nix b/modules/nixos/hardware/keyboard/default.nix new file mode 100644 index 0000000..0ea2aa6 --- /dev/null +++ b/modules/nixos/hardware/keyboard/default.nix @@ -0,0 +1,43 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.hardware.keyboard; +in { + options.${namespace}.hardware.keyboard = with types; { + enable = mkEnableOption "keyboard hardware tweaks"; + jp.enable = mkEnableOption "japanese ime support"; + }; + + config = mkIf cfg.enable { + services.keyd = { + enable = true; + + keyboards."*".settings = { + main = { + # Swap alt and meta keys. + # I prefer (physical) alt as my WM modifier key because it + # is easier to reach. This can collide with some programs + # shortcuts if they inlcude alt. Swapping alt and meta fixes + # this by making my WM mod key (software) meta, freeing up alt. + + leftalt = "leftmeta"; + leftmeta = "leftalt"; + + rightalt = "rightmeta"; + rightmeta = "rightalt"; + }; + }; + }; + + i18n.inputMethod = mkIf cfg.jp.enable { + enable = true; + type = "fcitx5"; + fcitx5.addons = with pkgs; [ fcitx5-mozc ]; + }; + + environment.variables = mkIf cfg.jp.enable { + # Required for fcitx5 support in kitty + GLFW_IM_MODULE = "ibus"; + }; + }; +} diff --git a/modules/nixos/services/minecraft/default.nix b/modules/nixos/services/minecraft/default.nix new file mode 100644 index 0000000..7705c1c --- /dev/null +++ b/modules/nixos/services/minecraft/default.nix @@ -0,0 +1,25 @@ +{ options, config, lib, namespace, inputs, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.services.minecraft; + impermanence = config.${namespace}.system.impermanence; +in { + options.${namespace}.services.minecraft = with types; { + enable = mkEnableOption "minecraft server support"; + }; + + config = mkIf cfg.enable { + nixpkgs = { + overlays = [ inputs.nix-minecraft.overlay ]; + config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ + "minecraft-server" + ]; + }; + + services.minecraft-servers = { + enable = true; + eula = true; + openFirewall = true; + }; + }; +} diff --git a/modules/nixos/services/minecraft/stargazers/default.nix b/modules/nixos/services/minecraft/stargazers/default.nix new file mode 100644 index 0000000..cb934f8 --- /dev/null +++ b/modules/nixos/services/minecraft/stargazers/default.nix @@ -0,0 +1,83 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.services.minecraft.stargazers; + impermanence = config.${namespace}.system.impermanence; +in { + options.${namespace}.services.minecraft.stargazers = with types; { + enable = mkEnableOption "stargazers minecraft server"; + + port = mkOption { + type = types.port; + default = 25565; + description = "server port"; + }; + + start = mkOption { + type = types.bool; + default = true; + description = "autostart"; + }; + }; + + config = mkIf cfg.enable { + cxl.services.minecraft.enable = true; + + #TODO: enable tmux + #cxl.tools.tmux.enable = true; + + environment.persistence.${impermanence.location} = { + directories = [ + "/srv/minecraft/stargazers" + ]; + }; + + services.minecraft-servers.servers.stargazers = { + enable = true; + openFirewall = true; + autoStart = cfg.start; + + package = pkgs.fabricServers.fabric-1_21; + + operators = { + "grippysockjail" = "9448c89d-34eb-4e2c-a231-8112eb1a9e4a"; + "antonymph" = "6b1f7a3c-a1c3-491a-8514-12b6b90d9152"; + }; + + serverProperties = { + white-list = true; + enforce-whitelist = true; + + gamemode = "survival"; + difficulty = "hard"; + level-seed = "4167799982467607063"; + spawn-protection = 0; + + max-players = 69; + motd = "\\u00a7r \\u00a75\\u00a7lstrge gazrer\\u00a7r\\n join or i will rip your bones out and eat them"; + + server-port = cfg.port; + query-port = cfg.port; + }; + + symlinks.mods = pkgs.linkFarmFromDrvs "mods" (builtins.attrValues { + fabric = pkgs.fetchurl { + url = "https://cdn.modrinth.com/data/P7dR8mSH/versions/vMQdA5QJ/fabric-api-0.100.7%2B1.21.jar"; + sha256 = "sha256-grNmYgSekBaTztR1SLbqZCOC6+QNUDLe4hp105qfibA="; + }; + lithium = pkgs.fetchurl { + url = "https://cdn.modrinth.com/data/gvQqBUqZ/versions/my7uONjU/lithium-fabric-mc1.21-0.12.7.jar"; + sha256 = "sha256-Qku6c545jVgrdxDSNe3BULVQlMtgGuXebNqirRcmsh0="; + }; + noChatReports = pkgs.fetchurl { + url = "https://cdn.modrinth.com/data/qQyHxfxd/versions/riMhCAII/NoChatReports-FABRIC-1.21-v2.8.0.jar"; + sha256 = "sha256-jskscOeK3ri2dt3mvWLPVmzddwPqBHJ8Ps+VfZ6l9os="; + }; + appleskin = pkgs.fetchurl { + url = "https://cdn.modrinth.com/data/EsAfCjCV/versions/YxFxnyd4/appleskin-fabric-mc1.21-3.0.2.jar"; + sha256 = "sha256-8XaZREWzA5Mi2/LTs/a6ACvDKmHWYIy8JcOfQaq4yiE="; + }; + }); + }; + }; +} diff --git a/modules/nixos/services/minecraft/zenith/default.nix b/modules/nixos/services/minecraft/zenith/default.nix new file mode 100644 index 0000000..0bc19f7 --- /dev/null +++ b/modules/nixos/services/minecraft/zenith/default.nix @@ -0,0 +1,21 @@ +{ options, config, lib, pkgs, namespace, ... }: + +#TODO: nix-ify zenithproxy +with lib; with lib.${namespace}; let + cfg = config.${namespace}.services.minecraft.zenith; + impermanence = config.${namespace}.system.impermanence; +in { + options.${namespace}.services.minecraft.zenith = with types; { + enable = mkEnableOption "zenithproxy server"; + + port = mkOption { + type = types.port; + default = 25565; + description = "server port"; + }; + }; + + config = mkIf cfg.enable { + networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [ cfg.port ]; + }; +} diff --git a/modules/nixos/services/ssh/default.nix b/modules/nixos/services/ssh/default.nix new file mode 100644 index 0000000..6856897 --- /dev/null +++ b/modules/nixos/services/ssh/default.nix @@ -0,0 +1,28 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.services.ssh; + impermanence = config.${namespace}.system.impermanence; +in { + options.${namespace}.services.ssh = with types; { + enable = mkEnableOption "ssh server"; + + port = mkOption { + type = types.port; + default = 22; + description = "ssh server port"; + }; + }; + + config = mkIf cfg.enable { + openssh = { + enable = true; + ports = [ cfg.port ]; + + settings = { + PermitRootLogin = "no"; + PasswordAuthentication = false; + }; + }; + }; +} diff --git a/modules/nixos/services/web/default.nix b/modules/nixos/services/web/default.nix new file mode 100644 index 0000000..1e1e854 --- /dev/null +++ b/modules/nixos/services/web/default.nix @@ -0,0 +1,23 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.services.web; + impermanence = config.${namespace}.system.impermanence; +in { + options.${namespace}.services.web = with types; { + enable = mkEnableOption "web"; + }; + + config = mkIf cfg.enable { + environment.persistence.${impermanence.location} = { + directories = [ + "/var/lib/acme" + ]; + }; + + security.acme = { + acceptTerms = true; + defaults.email = "caroline@larimo.re"; + }; + }; +} diff --git a/modules/nixos/services/web/images/default.nix b/modules/nixos/services/web/images/default.nix new file mode 100644 index 0000000..b1c44e6 --- /dev/null +++ b/modules/nixos/services/web/images/default.nix @@ -0,0 +1,34 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.services.web.images; + impermanence = config.${namespace}.system.impermanence; +in { + options.${namespace}.services.web.images = with types; { + enable = mkEnableOption "image webserver"; + }; + + config = mkIf cfg.enable { + cxl.services.web.enable = true; + + environment.persistence.${impermanence.location} = { + directories = [ + "/srv/web/images" + ]; + }; + + networking.firewall.allowedTCPPorts = [ 80 443 ]; + + services.nginx = { + enable = true; + virtualHosts = { + "i.cxl.sh" = { + addSSL = true; + enableACME = true; + + root = "/srv/web/images"; + }; + }; + }; + }; +} diff --git a/modules/nixos/services/web/landing/default.nix b/modules/nixos/services/web/landing/default.nix new file mode 100644 index 0000000..fe9e92b --- /dev/null +++ b/modules/nixos/services/web/landing/default.nix @@ -0,0 +1,34 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.services.web.landing; + impermanence = config.${namespace}.system.impermanence; +in { + options.${namespace}.services.web.landing = with types; { + enable = mkEnableOption "cxl.sh landing page webserver"; + }; + + config = mkIf cfg.enable { + cxl.services.web.enable = true; + + environment.persistence.${impermanence.location} = { + directories = [ + "/srv/web/landing" + ]; + }; + + networking.firewall.allowedTCPPorts = [ 80 443 ]; + + services.nginx = { + enable = true; + virtualHosts = { + "cxl.sh" = { + addSSL = true; + enableACME = true; + + root = "/srv/web/landing"; + }; + }; + }; + }; +} diff --git a/modules/nixos/services/web/personal/default.nix b/modules/nixos/services/web/personal/default.nix new file mode 100644 index 0000000..daf94c1 --- /dev/null +++ b/modules/nixos/services/web/personal/default.nix @@ -0,0 +1,63 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.services.web.personal; + impermanence = config.${namespace}.system.impermanence; + + package = (pkgs.buildGoModule rec { + pname = "site"; + version = "6612d84c63a7bbc2a5b70607f2ec32ea070c4659"; + + src = pkgs.fetchFromGitHub { + owner = "CartConnoisseur"; + repo = "site"; + rev = "${version}"; + hash = "sha256-n54+LdtMyjoLfaFqd7tcDQqBiYCdUW/Rs67Vc4QwEJ0="; + }; + + # kinda a hack, but whatever + postBuild = '' + mkdir -p $out/share/site + cp -r $src/* $out/share/site/ + ''; + + vendorHash = "sha256-2/4Wv7nsaT0wnUzkRgHKpSswigDj9nOvlmYXK29rvLU="; + }); +in { + options.${namespace}.services.personal.images = with types; { + enable = mkEnableOption "personal site webserver"; + }; + + config = mkIf cfg.enable { + cxl.services.web.enable = true; + + networking.firewall.allowedTCPPorts = [ 80 443 ]; + + services.nginx = { + enable = true; + virtualHosts = { + "caroline.larimo.re" = { + # serverAliases = [ "cxl.sh" ]; + + addSSL = true; + enableACME = true; + + locations."/" = { + recommendedProxySettings = true; + proxyPass = "http://127.0.0.1:8080/"; + }; + }; + }; + }; + + systemd.services."cxl.web.personal" = { + enable = true; + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + WorkingDirectory = "${package}/share/site"; + ExecStart = "${package}/bin/site"; + }; + }; + }; +} diff --git a/modules/nixos/services/web/stargazers/default.nix b/modules/nixos/services/web/stargazers/default.nix new file mode 100644 index 0000000..3e9b46e --- /dev/null +++ b/modules/nixos/services/web/stargazers/default.nix @@ -0,0 +1,34 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.services.web.stargazers; + impermanence = config.${namespace}.system.impermanence; +in { + options.${namespace}.services.web.stargazers = with types; { + enable = mkEnableOption "stargazers webserver"; + }; + + config = mkIf cfg.enable { + cxl.services.web.enable = true; + + environment.persistence.${impermanence.location} = { + directories = [ + "/srv/web/stargazers" + ]; + }; + + networking.firewall.allowedTCPPorts = [ 80 443 ]; + + services.nginx = { + enable = true; + virtualHosts = { + "stargazers.xn--6frz82g" = { + addSSL = true; + enableACME = true; + + root = "/srv/web/stargazers"; + }; + }; + }; + }; +} diff --git a/modules/nixos/suites/common/default.nix b/modules/nixos/suites/common/default.nix new file mode 100644 index 0000000..1e7a053 --- /dev/null +++ b/modules/nixos/suites/common/default.nix @@ -0,0 +1,25 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.suites.common; +in { + options.${namespace}.suites.common = with types; { + enable = mkEnableOption "common"; + }; + + config = mkIf cfg.enable { + cxl = { + hardware = { + keyboard.enable = true; + }; + + tools = { + bash.enable = true; + vim.enable = true; + git.enable = true; + misc.enable = true; + rebuild.enable = true; + }; + }; + }; +} diff --git a/modules/nixos/suites/desktop/default.nix b/modules/nixos/suites/desktop/default.nix new file mode 100644 index 0000000..246f38c --- /dev/null +++ b/modules/nixos/suites/desktop/default.nix @@ -0,0 +1,27 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.suites.desktop; +in { + options.${namespace}.suites.desktop = with types; { + enable = mkEnableOption "desktop"; + }; + + config = mkIf cfg.enable { + cxl = { + hardware = { + audio.enable = true; + keyboard.jp.enable = true; + }; + + apps = { + i3.enable = true; + playerctl.enable = true; + }; + + system.fonts.enable = true; + }; + + programs.dconf.enable = true; + }; +} diff --git a/modules/nixos/suites/gaming/default.nix b/modules/nixos/suites/gaming/default.nix new file mode 100644 index 0000000..e95e1cd --- /dev/null +++ b/modules/nixos/suites/gaming/default.nix @@ -0,0 +1,17 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.suites.gaming; +in { + options.${namespace}.suites.gaming = with types; { + enable = mkEnableOption "gaming"; + }; + + config = mkIf cfg.enable { + cxl = { + apps = { + steam.enable = true; + }; + }; + }; +} diff --git a/modules/nixos/system/default.nix b/modules/nixos/system/default.nix new file mode 100644 index 0000000..96c5654 --- /dev/null +++ b/modules/nixos/system/default.nix @@ -0,0 +1,30 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.system; +in { + options.${namespace}.system = with types; { + hostname = mkOption { + type = strMatching "^$|^[[:alnum:]]([[:alnum:]_-]{0,61}[[:alnum:]])?$"; + }; + + id = mkOption { + default = null; + type = nullOr str; + }; + + timezone = mkOption { + default = "America/Los_Angeles"; + type = nullOr str; + }; + }; + + config = { + nix.settings.experimental-features = [ "nix-command" "flakes" ]; + + networking.hostName = cfg.hostname; + networking.hostId = cfg.id; + + time.timeZone = cfg.timezone; + }; +} diff --git a/modules/nixos/system/fonts/default.nix b/modules/nixos/system/fonts/default.nix new file mode 100644 index 0000000..c510679 --- /dev/null +++ b/modules/nixos/system/fonts/default.nix @@ -0,0 +1,38 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.system.fonts; +in { + options.${namespace}.system.fonts = with types; { + enable = mkEnableOption "fonts"; + nerdfonts = mkEnableOption "nerdfonts"; + extra = mkOption { + type = listOf package; + default = []; + description = '' + additional fonts to install + ''; + }; + }; + + config = mkIf cfg.enable { + fonts = { + packages = with pkgs; [ + noto-fonts + noto-fonts-cjk-sans + noto-fonts-cjk-serif + noto-fonts-emoji + ] ++ ( + optionals cfg.nerdfonts ( + builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts) + ) + ) ++ cfg.extra; + + fontconfig.defaultFonts = { + monospace = [ "CaskaydiaMono Nerd Font" ]; + sansSerif = [ "DejaVu Sans" "Noto Sans CJK JP" "Noto Sans" ]; + serif = [ "DejaVu Serif" "Noto Serif CJK JP" "Noto Serif" ]; + }; + }; + }; +} diff --git a/modules/nixos/system/impermanence/default.nix b/modules/nixos/system/impermanence/default.nix new file mode 100644 index 0000000..b82579b --- /dev/null +++ b/modules/nixos/system/impermanence/default.nix @@ -0,0 +1,49 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.system.impermanence; +in { + options.${namespace}.system.impermanence = with types; { + enable = mkEnableOption "root impermanence"; + + location = mkOption { + type = str; + default = "/persist/system"; + }; + + #TODO: multi-user support + home = { + enable = mkEnableOption "home impermanence"; + + location = mkOption { + type = str; + default = "/persist/home"; + }; + + secure.location = mkOption { + type = str; + default = "/persist/secure/home"; + }; + }; + }; + + config = mkIf cfg.enable { + programs.fuse.userAllowOther = true; + + environment.persistence.${cfg.location} = { + hideMounts = true; + + directories = [ + "/etc/nixos" + "/var/log" + "/var/lib/nixos" + "/var/lib/systemd/coredump" + # "/var/lib/bluetooth" + ]; + + files = [ + "/etc/machine-id" + ]; + }; + }; +} diff --git a/modules/nixos/tools/bash/default.nix b/modules/nixos/tools/bash/default.nix new file mode 100644 index 0000000..180db1f --- /dev/null +++ b/modules/nixos/tools/bash/default.nix @@ -0,0 +1,29 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.tools.bash; +in { + options.${namespace}.tools.bash = with types; { + enable = mkEnableOption "tools"; + }; + + config = mkIf cfg.enable { + environment.localBinInPath = true; + + programs.bash = { + shellAliases = { + lsa = "ls -lAsh"; + p = "nix-shell -p"; + }; + + interactiveShellInit = '' + source "${./prompt.sh}" + + mkcd() { + mkdir -p "$1" + cd "$1" + } + ''; + }; + }; +} diff --git a/modules/nixos/tools/bash/prompt.sh b/modules/nixos/tools/bash/prompt.sh new file mode 100644 index 0000000..d4d7c69 --- /dev/null +++ b/modules/nixos/tools/bash/prompt.sh @@ -0,0 +1,84 @@ +PROMPT_CHAR='❯' + +if [[ "$TERM" == "xterm-kitty" ]]; then + function prompt.bubble { + printf '\[\e[49m\e[38;5;237m\]◖\[\e[48;5;237m\e[39m\]%s\[\e[0m\e[49m\e[38;5;237m\]◗\[\e[0m\]' "$@"; + } +elif [[ "$TERM" == "xterm-256color" ]]; then + function prompt.bubble { + printf '\[\e[38;5;237m\](\[\e[0m\]%s\[\e[0m\e[38;5;237m\])\[\e[0m\]' "$@"; + } +else + PROMPT_CHAR='>' + function prompt.bubble { + printf '\[\e[2;39m\](\[\e[0m\]%s\[\e[0m\e[2;39m\])\[\e[0m\]' "$@"; + } +fi + +function prompt.git { + GIT_PS1_STATESEPARATOR=';' + GIT_PS1_SHOWDIRTYSTATE=1 + GIT_PS1_SHOWUNTRACKEDFILES= + GIT_PS1_SHOWUPSTREAM= + + GIT_PS1_HIDE_IF_PWD_IGNORED=1 + + local git_ps1="$(__git_ps1)" + git_ps1="${git_ps1##' ('}" + git_ps1="${git_ps1%')'}" + + IFS=';' read -r branch state _ <<< "$git_ps1" + + if [[ -n "$branch" ]]; then + printf ' ' + + if [[ "$state" == '*' ]]; then + prompt.bubble "$(printf '\[\e[4;32m\]%s' "$branch")" + else + prompt.bubble "$(printf '\[\e[32m\]%s' "$branch")" + fi + fi +} + +function prompt.prepare { + local err=$? + PS1="\\[\e[0m\\]\n" + + local subshell='' + local base_shlvl=1 + local shlvl=$((SHLVL-base_shlvl)) + + if [[ -n "$IN_NIX_SHELL" ]]; then + subshell="\\[\e[33m\\]nix" + fi + if [[ $shlvl != 0 && ! ($shlvl == 1 && -n "$IN_NIX_SHELL") ]]; then + if [[ -n "$subshell" ]]; then subshell+="\\[\e[39m\\] "; fi + subshell+="\\[\e[2;37m\\]$shlvl" + fi + if [[ -n "$subshell" ]]; then + PS1+="$(prompt.bubble "$subshell") " + fi + + if [[ $EUID == 0 ]]; then + PS1+="$(prompt.bubble "\\[\e[4m\\]\u@\H")" + else + PS1+="$(prompt.bubble "\u@\H")" + fi + + PS1+=" $(prompt.bubble "\\[\e[34m\\]\w")" + PS1+="$(prompt.git)" + if [[ $err != 0 ]]; then + PS1+=" $(prompt.bubble "\\[\e[31m\\]$err")" + fi + PS1+=" $(prompt.bubble "$PROMPT_CHAR") " + + if [[ $err != 0 ]]; then + (exit "$err") + fi +} + +PROMPT_COMMAND='prompt.prepare' + +function baller { + printf '🮲🮳⚽︎ \n' +} diff --git a/modules/nixos/tools/git/default.nix b/modules/nixos/tools/git/default.nix new file mode 100644 index 0000000..f58ed62 --- /dev/null +++ b/modules/nixos/tools/git/default.nix @@ -0,0 +1,16 @@ +{ options, config, lib, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.tools.git; +in { + options.${namespace}.tools.git = with types; { + enable = mkEnableOption "git"; + }; + + config = mkIf cfg.enable { + programs.git = { + enable = true; + prompt.enable = true; + }; + }; +} diff --git a/modules/nixos/tools/misc/default.nix b/modules/nixos/tools/misc/default.nix new file mode 100644 index 0000000..a06a141 --- /dev/null +++ b/modules/nixos/tools/misc/default.nix @@ -0,0 +1,19 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.tools.misc; +in { + options.${namespace}.tools.misc = with types; { + enable = mkEnableOption "misc tools"; + }; + + config = mkIf cfg.enable { + environment.systemPackages = with pkgs; [ + jq + killall + moreutils + unzip + wget + ]; + }; +} diff --git a/modules/nixos/tools/rebuild/default.nix b/modules/nixos/tools/rebuild/default.nix new file mode 100644 index 0000000..368f29f --- /dev/null +++ b/modules/nixos/tools/rebuild/default.nix @@ -0,0 +1,16 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.tools.rebuild; +in { + options.${namespace}.tools.rebuild = with types; { + enable = mkEnableOption "rebuild scripts"; + }; + + config = mkIf cfg.enable { + environment.systemPackages = with pkgs; [ + (writeShellScriptBin "rb" "sudo nixos-rebuild switch --flake /etc/nixos") + (writeShellScriptBin "rbf" "sudo nixos-rebuild switch --flake path:/etc/nixos") + ]; + }; +} diff --git a/modules/nixos/tools/vim/default.nix b/modules/nixos/tools/vim/default.nix new file mode 100644 index 0000000..9aa0a2c --- /dev/null +++ b/modules/nixos/tools/vim/default.nix @@ -0,0 +1,19 @@ +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.tools.vim; +in { + options.${namespace}.tools.vim = with types; { + enable = mkEnableOption "vim"; + }; + + config = mkIf cfg.enable { + environment.systemPackages = with pkgs; [ + vim + ]; + + environment.variables = { + EDITOR = "${pkgs.vim}/bin/vim"; + }; + }; +} -- cgit v1.2.3