From 9ba5f8fdf042ee1917a097301eb759f5f296fdb4 Mon Sep 17 00:00:00 2001 From: Chris Kruining Date: Sun, 21 Jul 2024 14:03:57 +0200 Subject: [PATCH] Working on modularizing stuff, again --- config/shell-abbr/default.nix | 3 + hosts/chris/laptop/default.nix | 2 + hosts/chris/pc/default.nix | 50 +++++++ hosts/chris/pc/default.nix.back | 94 +++++++++++++ hosts/chris/pc/hardware-configuration.nix | 40 ++++++ hosts/chris/server/default.nix | 2 + lib/options.nix | 8 ++ modules/develop/default.nix | 16 +++ modules/develop/rust.nix | 36 +++++ modules/home-manager/terminals/default.nix | 8 -- modules/networking/default.nix | 33 +++++ modules/networking/samba.nix | 71 ++++++++++ modules/options.nix | 34 +++++ modules/programs/communication.nix | 23 ++-- modules/programs/default.nix | 15 +++ modules/programs/gaming.nix | 45 ------- modules/programs/media.nix | 12 +- modules/services/auth.nix | 19 +++ modules/services/default.nix | 11 ++ modules/services/media.nix | 140 +++++++++++++++++++ modules/shell/default.nix | 48 +++++++ modules/shell/toolset/btop.nix | 146 ++++++++++++++++++++ modules/shell/toolset/fzf.nix | 53 ++++++++ modules/shell/toolset/git.nix | 117 ++++++++++++++++ modules/shell/toolset/gnupg.nix | 31 +++++ modules/shell/toolset/starship.nix | 85 ++++++++++++ modules/shell/toolset/tmux.nix | 126 +++++++++++++++++ modules/shell/zsh.nix | 149 +++++++++++++++++++++ modules/system/audio.nix | 75 +++++++++-- modules/system/graphics.nix | 39 ++++++ modules/virtualization/default.nix | 12 ++ modules/virtualization/podman.nix | 26 ++++ 32 files changed, 1481 insertions(+), 88 deletions(-) create mode 100644 config/shell-abbr/default.nix create mode 100644 hosts/chris/laptop/default.nix create mode 100644 hosts/chris/pc/default.nix create mode 100644 hosts/chris/pc/default.nix.back create mode 100644 hosts/chris/pc/hardware-configuration.nix create mode 100644 hosts/chris/server/default.nix create mode 100644 lib/options.nix create mode 100644 modules/develop/default.nix create mode 100644 modules/develop/rust.nix create mode 100644 modules/networking/default.nix create mode 100644 modules/networking/samba.nix create mode 100644 modules/options.nix create mode 100644 modules/programs/default.nix create mode 100644 modules/services/auth.nix create mode 100644 modules/services/default.nix create mode 100644 modules/services/media.nix create mode 100644 modules/shell/default.nix create mode 100644 modules/shell/toolset/btop.nix create mode 100644 modules/shell/toolset/fzf.nix create mode 100644 modules/shell/toolset/git.nix create mode 100644 modules/shell/toolset/gnupg.nix create mode 100644 modules/shell/toolset/starship.nix create mode 100644 modules/shell/toolset/tmux.nix create mode 100644 modules/shell/zsh.nix create mode 100644 modules/system/graphics.nix create mode 100644 modules/virtualization/default.nix create mode 100644 modules/virtualization/podman.nix diff --git a/config/shell-abbr/default.nix b/config/shell-abbr/default.nix new file mode 100644 index 0000000..accda22 --- /dev/null +++ b/config/shell-abbr/default.nix @@ -0,0 +1,3 @@ +{ + ls = "eza -al"; +}; diff --git a/hosts/chris/laptop/default.nix b/hosts/chris/laptop/default.nix new file mode 100644 index 0000000..6416a04 --- /dev/null +++ b/hosts/chris/laptop/default.nix @@ -0,0 +1,2 @@ +{}: +{} diff --git a/hosts/chris/pc/default.nix b/hosts/chris/pc/default.nix new file mode 100644 index 0000000..b5d287c --- /dev/null +++ b/hosts/chris/pc/default.nix @@ -0,0 +1,50 @@ +{ config, lib, pkgs, ... }: +{ + imports = [ ./hardware-configuration.nix ]; + + modules = { + themes.active = "everforrest"; + + networking.networkManager.enable = true; + + develop = { + rust.enable = true; + js.enable = true; + dotnet.enable = true; + }; + + desktop = { + plasma.enable = true; + + terminal = { + default = "alacritty"; + allacrity.enable = true; + }; + + editors = { + default = "nano"; + nano.enable = true; + }; + + browsers = { + default = "firefox"; + firefox.enable = true; + firefox.privacy.enable = true; + }; + }; + + shell = { + default = "zsh"; + toolset = { + git.enable = true; + gnupg.enable = true; + }; + }; + }; + + programs.kdeconnect = { + enable = true; + package = pkgs.valent; + }; +} + diff --git a/hosts/chris/pc/default.nix.back b/hosts/chris/pc/default.nix.back new file mode 100644 index 0000000..2b3a830 --- /dev/null +++ b/hosts/chris/pc/default.nix.back @@ -0,0 +1,94 @@ +{ config, lib, pkgs, inputs, ... }: +{ + imports = [ + ./hardware-configuration.nix + ../../modules/system/boot.nix + ../../modules/system/networking.nix + ../../modules/system/audio.nix + ../../modules/system/zsa_voyager.nix + + ../../modules/desktop/plasma.nix + + + + + ../../modules/programs/security.nix + ../../modules/programs/theme.nix + ../../modules/programs/shell.nix + ../../modules/programs/gaming.nix + ../../modules/programs/harden.nix + ../../modules/programs/communication.nix + ../../modules/programs/office.nix + inputs.home-manager.nixosModules.default + ]; + + nixpkgs.config = { + allowUnfree = true; + }; + + nix.settings.experimental-features = [ "nix-command" "flakes" ]; + + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.chris = { + isNormalUser = true; + extraGroups = [ "wheel" "audio" ]; # Enable ‘sudo’ for the user. + packages = with pkgs; []; + }; + + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + extraSpecialArgs = { inherit inputs; }; + backupFileExtension = "backup"; + users = { + chris.imports = [ ../../users/chris.nix ]; +# root.imports = [ ../../users/root.nix ]; + }; + }; + + environment.systemPackages = with pkgs; [ + neovim + wget +# chromium + thunderbird + zoxide + atuin + btop + dust + bat + tldr + eza + nextcloud-client + ]; + + systemd.services.numLockOnTty = { + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + ExecStart = lib.mkForce (pkgs.writeShellScript "numLockOnTty" '' + for tty in /dev/tty{1..6}; do + ${pkgs.kbd}/bin/setleds -D +num < "$tty"; + done + ''); + }; + }; + + # This option defines the first version of NixOS you have installed on this particular machine, + # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. + # + # Most users should NEVER change this value after the initial install, for any reason, + # even if you've upgraded your system to a new NixOS release. + # + # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, + # so changing it will NOT upgrade your system. + # + # This value being lower than the current NixOS release does NOT mean your system is + # out of date, out of support, or vulnerable. + # + # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, + # and migrated your data accordingly. + # + # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . + system.stateVersion = "23.11"; # Did you read the comment? + +} + diff --git a/hosts/chris/pc/hardware-configuration.nix b/hosts/chris/pc/hardware-configuration.nix new file mode 100644 index 0000000..656bb4c --- /dev/null +++ b/hosts/chris/pc/hardware-configuration.nix @@ -0,0 +1,40 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/8c4eaf57-fdb2-4c4c-bcc0-74e85a1c7985"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/C842-316A"; + fsType = "vfat"; + options = [ "fmask=0022" "dmask=0022" ]; + }; + + swapDevices = + [ { device = "/dev/disk/by-uuid/0ddf001a-5679-482e-b254-04a1b9094794"; } + ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/chris/server/default.nix b/hosts/chris/server/default.nix new file mode 100644 index 0000000..6416a04 --- /dev/null +++ b/hosts/chris/server/default.nix @@ -0,0 +1,2 @@ +{}: +{} diff --git a/lib/options.nix b/lib/options.nix new file mode 100644 index 0000000..ca175d6 --- /dev/null +++ b/lib/options.nix @@ -0,0 +1,8 @@ +{lib, ...}: let + inherit (lib.options) mkOption; +in { + mkOpt = type: default: mkOption {inherit type default;}; + + mkOpt' = type: default: description: + mkOption {inherit type default description;}; +} diff --git a/modules/develop/default.nix b/modules/develop/default.nix new file mode 100644 index 0000000..1383502 --- /dev/null +++ b/modules/develop/default.nix @@ -0,0 +1,16 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (lib.modules) mkIf; +in +{ + options.modules.develop = let + inherit (lib.options) mkEnableOption; + in + { + xdg.enable = mkEnableOption "XDG-related conf" // { default = true; }; + }; + + config = mkIf conf.modules.develop.xdg.enable { + + }; +} diff --git a/modules/develop/rust.nix b/modules/develop/rust.nix new file mode 100644 index 0000000..15ba508 --- /dev/null +++ b/modules/develop/rust.nix @@ -0,0 +1,36 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (lib.attrsets) attrValues; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.meta) getExe; +in +{ + options.modules.develop.rust = let + inherit (lib.options) mkEnableOption; + in { + enable = mkEnableOption "Rust developmnt"; + }; + + config = mkMerge [ + (mkIf config.modules.develop.rust.enable ( + nixpkgs.overlays = [ inputs.rust.overlays.default ]; + + user.packages = attrValues { + rust-package = pkgs.rust-bin.nightly.latest.default; + inherit (pkgs) rust-analyser rust-script; + }; + + environment.shellAlliases = { + rs = "rustc"; + ca = "cargo"; + }; + )) + + (mkIf config.modules.develop.cdg.enable { + env = { + CARGO_HOME = "$XDG_DATA_HOME/cargo"; + PATH = [ "$CARGO_HOME/bin" ]; + }; + }) + ]; +} diff --git a/modules/home-manager/terminals/default.nix b/modules/home-manager/terminals/default.nix index aa08a17..9d0fda2 100644 --- a/modules/home-manager/terminals/default.nix +++ b/modules/home-manager/terminals/default.nix @@ -30,18 +30,10 @@ enableCompletion = true; syntaxHighlighting.enable = true; - shellAliases = { - rebuild = "nixos-rebuild switch --flake /etc/nixos#default"; - }; - history = { size = 10000; path = "${config.xdg.dataHome}/zsh/history"; }; - - envExtra = '' - export SOME_ZSH_VARIABLE="something" - ''; oh-my-zsh = { enable = true; diff --git a/modules/networking/default.nix b/modules/networking/default.nix new file mode 100644 index 0000000..e1f3c9b --- /dev/null +++ b/modules/networking/default.nix @@ -0,0 +1,33 @@ +{ + config, + options, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkDefault mkIf mkMerge; + + cfg = config.modules.networking; +in { + options.modules.networking = let + inherit (lib.options) mkEnableOption; + in { + enable = mkEnableOption "network manager"; + }; + + config =mkIf cfg.networkManager.enable { + systemd.services.NetworkManager-wait-online.enable = false; + + networking = { + firewall.enable = true; + + networkmanager = { + enable = mkDefault true; + wifi.backend = "wpa_supplicant"; + }; + }; + + hm.services.network-manager-applet.enable = true; + }; +} diff --git a/modules/networking/samba.nix b/modules/networking/samba.nix new file mode 100644 index 0000000..88d7aff --- /dev/null +++ b/modules/networking/samba.nix @@ -0,0 +1,71 @@ +{ pkgs, options, config, lib, ... }: +let + inherit (builtins) getEnv; + inherit (lib.modules) mkIf mkMerge; +in +{ + options.modules.networking.samba = let + inherit (lib.options) mkEnableOption; + in { + sharing.enable = mkEnableOption "Samba: enable NixOs -> external file-transfer"; + receicing.enable = mkEnableOption "Samba: enable external -> NixOs file-transfer"; + }; + + config = mkMerge [ + (mkIf config.modules.networking.samba.sharing.enable { + users = { + group.samba-guest = {}; + users.samba-guest = { + isSystemUser = true; + description = "Residence of our Samba guest users"; + group = "samba-guest"; + home = "/var/empty"; + createHome = false; + shell = pkgs.shadow; + }; + }; + user.extraGroups = [ "samba-guest" ]; + + networking.firewall = { + allowPing = true; + allowedTCPPorts = [ 5327 ]; + allowedUDPPorts = [ 3702 ]; + }; + + services.samba-wsdd.enable = true; + + services.samba = { + enable = true; + openFirewall = true; + extraConfig = '' + server string = ${config.networking.hostName} + netbios name = ${config.networking.hostName} + workgroup = WORKGROUP + security = user + + create mask 0664 + force create mode 0664 + directory mask 0775 + force directory mode 0775 + follow symlink = yes + + hosts allow = 192.168.1.0/24 localhost + hosts deny = 0.0.0.0/0 + guest account = nobody + map to guest = bad user + ''; + shares = { + Public = { + path = (getEnv "HOME") + "/Public"; + browseable = "yes"; + "read only" = "yes"; + "guest ok" = "yes"; + "forse user" = "${config.user.name}"; + "force group" = "samba-guest"; + "write list" = "${config.user.name}"; + }; + }; + }; + }) + ]; +} diff --git a/modules/options.nix b/modules/options.nix new file mode 100644 index 0000000..0d9b634 --- /dev/null +++ b/modules/options.nix @@ -0,0 +1,34 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (builtins) elem isList pathExists toString; + inherit (lib.attrsets) mapAttrs mapAttrsToList; + inherit (lib.lists) findFirst; + inherit (lib.modules) mkAliasDefinitions; + inherit (lib.strings) concatMapStringsSep concatStringsSep; + inherit (lib.my) mkOpt mkOpt'; +in +{ + options = let + inherit (lib.options) mkOption; + inherit (lib.types) attrs attrsOf either listOf oneOf path str; + in + { + user = mkOpt attrs {}; + + kaas = { + dir = mkOpt path (findFirst pathExists (toString ../.) [ + "${config.user.home}/Workspace/public/kaas" + "/etc/kaas" + ]); + hostDir = mkOpt path "${config.kaas.dir}/hosts/${config.networking.hostName}"; + binDir = mkOpt path "${config.kaas.dir}/bin"; + configDir = mkOpt path "${config.kaas.dir}/config"; + modulesDir = mkOpt path "${config.kaas.dir}/modules"; + themesDir = mkOpt path "${config.kaas.modulesDir}/themes"; + }; + + home = { + # HIER BEN IK GEBLEVEN!!! + }; + }; +} diff --git a/modules/programs/communication.nix b/modules/programs/communication.nix index e7943cd..7b8bc30 100644 --- a/modules/programs/communication.nix +++ b/modules/programs/communication.nix @@ -1,19 +1,16 @@ { pkgs, config, ... }: -{ +let + inherit (lib.modules) mkIf; +in +{ + options.modules.programs.communication = let + inherit (lib.options) mkEnableOption; + in { + enable = mkEnableOption "Discord and Teamspeak"; + }; + environment.systemPackages = with pkgs; [ - discord webcord teamspeak_client ]; - -# config.xdg.desktopEntries.discord = { -# name = "Discord"; -# genericName = "All-in-one cross-platform voice and text chat for gamers"; -# exec = "Discord --in-process-gpu --use-gl=desktop"; -# icon = "Discord"; -# categories = [ "Network" "InstantMessaging" ]; -# settings = { -# version = "1.4"; -# }; -# }; } diff --git a/modules/programs/default.nix b/modules/programs/default.nix new file mode 100644 index 0000000..f8ce47f --- /dev/null +++ b/modules/programs/default.nix @@ -0,0 +1,15 @@ +{ pkgs, config, ... }: +let + inherit (lib.modules) mkIf; +in +{ + options.modules.programs = let + inherit (lib.options) mkEnableOption; + in { + enable = mkEnableOption "Rust developmnt"; + }; + + config = mkIf conf.modules.programs.enable { + + }; +} diff --git a/modules/programs/gaming.nix b/modules/programs/gaming.nix index 0cc6164..54d6b88 100644 --- a/modules/programs/gaming.nix +++ b/modules/programs/gaming.nix @@ -1,50 +1,5 @@ { config, pkgs, ... }: { - hardware.opengl = { - enable = true; - driSupport = true; - driSupport32Bit = true; - }; - - # Nvidia - services.xserver.videoDrivers = [ "nvidia" ]; - hardware.nvidia = { - modesetting.enable = true; - open = false; - nvidiaSettings = true; - - powerManagement = { - enable = true; - finegrained = false; - }; - - package = let - rcu_patch = pkgs.fetchpatch { - url = "https://github.com/gentoo/gentoo/raw/c64caf53/x11-drivers/nvidia-drivers/files/nvidia-drivers-470.223.02-gpl-pfn_valid.patch"; - hash = "sha256-eZiQQp2S/asE7MfGvfe6dA/kdCvek9SYa/FFGp24dVg="; - }; - in config.boot.kernelPackages.nvidiaPackages.mkDriver { - version = "535.154.05"; - sha256_64bit = "sha256-fpUGXKprgt6SYRDxSCemGXLrEsIA6GOinp+0eGbqqJg="; - sha256_aarch64 = "sha256-G0/GiObf/BZMkzzET8HQjdIcvCSqB1uhsinro2HLK9k="; - openSha256 = "sha256-wvRdHguGLxS0mR06P5Qi++pDJBCF8pJ8hr4T8O6TJIo="; - settingsSha256 = "sha256-9wqoDEWY4I7weWW05F4igj1Gj9wjHsREFMztfEmqm10="; - persistencedSha256 = "sha256-d0Q3Lk80JqkS1B54Mahu2yY/WocOqFFbZVBh+ToGhaE="; - - patches = [ rcu_patch ]; - }; - - #prime = { - # sync.enable = true; - - # Integrated - # interBusId = "PCI:0:0:0"; - - # Dedicated - # nvidiaBusId = "PCI:2:0:0"; - #}; - }; - # Steam programs.steam = { enable = true; diff --git a/modules/programs/media.nix b/modules/programs/media.nix index 91f8719..326e89e 100644 --- a/modules/programs/media.nix +++ b/modules/programs/media.nix @@ -21,15 +21,11 @@ in ]; users = { - groups = { - ${group} = {}; - }; - users = { - ${user} = { - isSystemUser = true; - group = group; - } + users."${user}" = { + isSystemUser = true; + group = group; }; + groups."${group}" = {}; }; system.activationScripts.var = mkForce '' diff --git a/modules/services/auth.nix b/modules/services/auth.nix new file mode 100644 index 0000000..023496a --- /dev/null +++ b/modules/services/auth.nix @@ -0,0 +1,19 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (lib.modules) mkIf; +in +{ + options.modules.services.auth = let + inherit (lib.options) mkEnableOption; + in { + enable = mkEnableOption "Media auth"; + }; + + config = mkMerge [ + (mkIf config.modules.services.auth.enable ( + environment.systemPackages = with pkgs; [ + authelia + ]; + )) + ]; +} diff --git a/modules/services/default.nix b/modules/services/default.nix new file mode 100644 index 0000000..516778a --- /dev/null +++ b/modules/services/default.nix @@ -0,0 +1,11 @@ +{ pkgs, config, ... }: +let + inherit (lib.modules) mkIf; +in +{ + options.modules.services = let + inherit (lib.options) mkEnableOption; + in { + enable = mkEnableOption "Enable all services"; + }; +} diff --git a/modules/services/media.nix b/modules/services/media.nix new file mode 100644 index 0000000..048de7a --- /dev/null +++ b/modules/services/media.nix @@ -0,0 +1,140 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (lib.attrsets) attrValues; + inherit (lib.modules) mkIf mkMerge mkForce; + inherit (lib.meta) getExe; + + user = "media"; + group = "media"; + directory = "/var/media"; +in +{ + options.modules.services.media = let + inherit (lib.options) mkEnableOption; + in { + enable = mkEnableOption "Media tools"; + }; + + config = mkIf config.modules.services.media.enable { + environment.systemPackages = with pkgs; [ + podman-tui + jellyfin + jellyseerr + mediainfo + ]; + + users = { + users."${user}" = { + isSystemUser = true; + group = group; + }; + groups."${group}" = {}; + }; + + system.activationScripts.var = mkForce '' + install -d -m 0755 -o ${user} -g ${group} ${directory}/series + install -d -m 0755 -o ${user} -g ${group} ${directory}/movies + install -d -m 0755 -o ${user} -g ${group} ${directory}/qbittorrent + install -d -m 0755 -o ${user} -g ${group} ${directory}/sabnzbd + install -d -m 0755 -o ${user} -g ${group} ${directory}/reiverr/config + install -d -m 0755 -o ${user} -g ${group} ${directory}/downloads/incomplete + install -d -m 0755 -o ${user} -g ${group} ${directory}/downloads/done + ''; + + services = let + serviceConf = { + enable = true; + openFirewall = true; + user = user; + group = group; + }; + in { + jellyfin = serviceConf; + radarr = serviceConf; + sonarr = serviceConf; + bazarr = serviceConf; + lidarr = serviceConf; + + jellyseerr = { + enable = true; + openFirewall = true; + }; + + prowlarr = { + enable = true; + openFirewall = true; + }; + + qbittorrent = { + enable = true; + openFirewall = true; + dataDir = "${directory}/qbittorrent"; + port = 5000; + + user = user; + group = group; + }; + + sabnzbd = { + enable = true; + openFirewall = true; + configFile = "${directory}/sabnzbd/config.ini"; + port = 5001; + + user = user; + group = group; + }; + + caddy = { + enable = true; + virtualHosts = { + "media.kruining.eu".extraConfig = '' + reverse_proxy http://127.0.0.1:9494 + ''; + "series.kruining.eu".extraConfig = '' + reverse_proxy http://127.0.0.1:8989 + ''; + "movies.kruining.eu".extraConfig = '' + reverse_proxy http://127.0.0.1:7878 + ''; + "jellyfin.kruining.eu".extraConfig = '' + reverse_proxy http://127.0.0.1:8096 + ''; + "cloud.kruining.eu".extraConfig = '' + php_fastcgi unix//run/phpfpm/nextcloud.sock { + env front_controller_active true + } + ''; + }; + }; + }; + + modules.virtualisation = { + enable = true; + podman.enable = true; + }; + + virtualisation = { + oci-containers = { + backend = "podman"; + + containers = { + flaresolverr = { + image = "flaresolverr/flaresolverr"; + autoStart = true; + ports = [ "127.0.0.1:8191:8191" ]; + }; + + reiverr = { + image = "ghcr.io/aleksilassila/reiverr:v2.0.0-alpha.6"; + autoStart = true; + ports = [ "127.0.0.1:9494:9494" ]; + volumes = [ "${directory}/reiverr/config:/config" ]; + }; + }; + }; + }; + + systemd.services.jellyfin.serviceConfig.killSignal = lib.mkForce "SIGKILL"; + }; +} diff --git a/modules/shell/default.nix b/modules/shell/default.nix new file mode 100644 index 0000000..f858282 --- /dev/null +++ b/modules/shell/default.nix @@ -0,0 +1,48 @@ +{ options, config, lib, pkgs, ... }: +let + inherit (lib.attrsets) attrValues; + inherit (lib.modules) mkIf mkMerge; + + cfg = config.modules.shell; +in +{ + options.modules.shell = let + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.types) nullOr enum; + in { + default = mkOption { + type = nullOr (enum ["fish" "zsh" "xonsh"]); + default = null; + description = "Default system shell"; + }; + corePkgs.enable = mkEnableOption "core shell packages"; + }; + + config = mkMerge [ + (mkIf (cfg.default != null) { + users.defaultUserShell = pkgs."${cfg.default}"; + }) + + (mkIf cfg.corePkgs.enable { + modules.shell.toolset = { + btop.enable = true; + fzf.enable = true; + starship.enable = true; + tmux.enable = true; + }; + + hm.programs.direnv = { + enable = true; + nix-direnv.enable = true; + config.whitelist.prefix = ["/home"]; + }; + + user.packages = attrValues { + inherit (pkgs) any-nix-shell pwgen yt-dlp ripdrag yazi; + inherit (pkgs) bat fd zoxide; + + rgFull = pkgs.ripgrep.override {withPCRE2 = true;}; + }; + }) + ]; +} diff --git a/modules/shell/toolset/btop.nix b/modules/shell/toolset/btop.nix new file mode 100644 index 0000000..43b745e --- /dev/null +++ b/modules/shell/toolset/btop.nix @@ -0,0 +1,146 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (lib.modules) mkIf; + inherit (lib.strings) concatStringsSep; +in +{ + options.modules.shell.toolset.btop = let + inherit (lib.options) mkEnableOption; + in { enable = mkEnableOption "system-monitor"; }; + + config = mkIf config.modules.shell.toolset.btop.enable { + hm.programs.btop = let + inherit (config.modules.themes) active; + in + { + enable = true; + settings = { + force_tty = false; + vim_keys = true; # Directional keys: "h,j,k,l,g,G" + update_ms = 1500; # ms (s^{-3}) + temp_scale = "celsius"; + base_10_sizes = false; + show_cpu_freq = true; + clock_format = "%H:%M"; + background_update = true; + disks_filter = "exclude=/boot"; + + color_theme = "${active}"; + rounded_corners = true; + theme_background = false; + truecolor = true; + presets = concatStringsSep "," [ + "cpu:1:default" + "proc:0:default cpu:0:default" + "mem:0:default" + "net:0:default cpu:0:block" + "net:0:tty" + ]; + graph_symbol = "braille"; + graph_symbol_cpu = "default"; + graph_symbol_mem = "default"; + graph_symbol_net = "default"; + graph_symbol_proc = "default"; + shown_boxes = "proc cpu mem net"; + + proc_sorting = "cpu lazy"; + proc_reversed = false; + proc_tree = false; + proc_colors = true; + proc_gradient = true; + proc_per_core = true; + proc_mem_bytes = true; + proc_info_smaps = false; + proc_left = false; + + cpu_graph_upper = "total"; + cpu_graph_lower = "total"; + cpu_single_graph = false; + cpu_bottom = false; + show_uptime = true; + check_temp = true; + cpu_sensor = "Auto"; + show_coretemp = true; + cpu_core_map = ""; + custom_cpu_name = ""; + + mem_graphs = true; + mem_below_net = false; + + show_swap = true; + swap_disk = true; + show_disks = true; + only_physical = true; + use_fstab = false; # Enable -> disables `only_physical` + disk_free_priv = false; + show_io_stat = true; + + io_mode = false; + io_graph_combined = false; + io_graph_speeds = ""; + + net_download = 100; + net_upload = 100; + net_auto = true; + net_sync = false; + net_iface = "br0"; + show_battery = true; + selected_battery = "Auto"; + log_level = "DEBUG"; + }; + }; + + home.configFile.btop-theme = let + inherit (config.modules.themes) active; + in + mkIf (active != null) { + target = "btop/themes/${active}.theme"; + text = let + inherit (config.modules.themes.colors.main) bright types; + in '' + theme[main_bg]="${types.bg}" + theme[main_fg]="${types.fg}" + theme[title]="${types.fg}" + theme[hi_fg]="${types.highlight}" + theme[selected_bg]="${types.border}" + theme[selected_fg]="${types.bg}" + theme[inactive_fg]="${bright.black}" + theme[graph_text]="${bright.yellow}" + theme[meter_bg]="${bright.black}" + theme[proc_misc]="${bright.yellow}" + theme[cpu_box]="${bright.cyan}" + theme[mem_box]="${bright.green}" + theme[net_box]="${bright.magenta}" + theme[proc_box]="${bright.yellow}" + theme[div_line]="${bright.black}" + theme[temp_start]="${bright.yellow}" + theme[temp_mid]="${types.panelbg}" + theme[temp_end]="${bright.red}" + theme[cpu_start]="${bright.cyan}" + theme[cpu_mid]="${types.border}" + theme[cpu_end]="${bright.green}" + theme[free_start]="${bright.green}" + theme[free_mid]="${bright.green}" + theme[free_end]="${bright.green}" + theme[cached_start]="${bright.yellow}" + theme[cached_mid]="${bright.yellow}" + theme[cached_end]="${bright.magenta}" + theme[available_start]="${bright.yellow}" + theme[available_mid]="${bright.yellow}" + theme[available_end]="${bright.yellow}" + theme[used_start]="${types.panelbg}" + theme[used_mid]="${types.panelbg}" + theme[used_end]="${bright.red}" + theme[download_start]="${bright.blue}" + theme[download_mid]="${bright.blue}" + theme[download_end]="${bright.magenta}" + theme[upload_start]="${bright.blue}" + theme[upload_mid]="${bright.blue}" + theme[upload_end]="${bright.magenta}" + theme[process_start]="${bright.cyan}" + theme[process_mid]="${types.border}" + theme[process_end]="${bright.green}" + ''; + }; + }; +} diff --git a/modules/shell/toolset/fzf.nix b/modules/shell/toolset/fzf.nix new file mode 100644 index 0000000..060c84e --- /dev/null +++ b/modules/shell/toolset/fzf.nix @@ -0,0 +1,53 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (lib.attrsets) optionalAttrs; + inherit (lib.modules) mkIf; +in +{ + options.modules.shell.toolset.fzf = let + inherit (lib.options) mkEnableOption; + in { enable = mkEnableOption "TUI Fuzzy Finder."; }; + + config = mkIf config.modules.shell.toolset.fzf.enable { + hm.programs.fzf = let + defShell = config.modules.shell.default; + in { + enable = true; + enableBashIntegration = true; + enableZshIntegration = defShell == "zsh"; + enableFishIntegration = defShell == "fish"; + + tmux.enableShellIntegration = true; + tmux.shellIntegrationOptions = ["-d 40%"]; + + defaultCommand = "fd --type f"; + defaultOptions = ["--height 40%" "--border"]; + + changeDirWidgetCommand = "fd --type d"; + changeDirWidgetOptions = ["--preview 'tree -C {} | head -200'"]; + + fileWidgetCommand = "fd --type f"; + fileWidgetOptions = ["--preview 'head {}'"]; + historyWidgetOptions = ["--sort" "--exact"]; + + colors = let + inherit (config.modules.themes) active; + inherit (config.modules.themes.colors.main) normal types; + in + mkIf (active != null) { + bg = "${types.bg}"; + "bg+" = "${types.bg}"; + fg = "${types.border}"; + "fg+" = "${types.border}"; + hl = "${normal.red}"; + "hl+" = "${normal.red}"; + header = "${normal.red}"; + marker = "${normal.magenta}"; + info = "${normal.magenta}"; + prompt = "${types.border}"; + spinner = "${types.panelbg}"; + pointer = "${types.border}"; + }; + }; + }; +} diff --git a/modules/shell/toolset/git.nix b/modules/shell/toolset/git.nix new file mode 100644 index 0000000..b6e5aa0 --- /dev/null +++ b/modules/shell/toolset/git.nix @@ -0,0 +1,117 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (builtins) readFile; + inherit (lib.attrsets) attrValues optionalAttrs; + inherit (lib.modules) mkIf; +in +{ + options.modules.shell.toolset.git = let + inherit (lib.options) mkEnableOption; + in { enable = mkEnableOption "version-control system"; }; + + config = mkIf config.modules.shell.toolset.git.enable { + user.packages = attrValues ({ + inherit (pkgs) act dura lazygit; + inherit (pkgs.gitAndTools) gh git-open; + } + // optionalAttrs config.modules.shell.toolset.gnupg.enable { + inherit (pkgs.gitAndTools) git-crypt; + }); + + # Prevent x11 askPass prompt on git push: + programs.ssh.askPassword = ""; + + hm.programs.zsh.initExtra = '' + # -------===[ Helpful Git Fn's ]===------- # + gitignore() { + curl -s -o .gitignore https://gitignore.io/api/$1 + } + ''; + + hm.programs.fish.functions = { + gitignore = "curl -sL https://www.gitignore.io/api/$argv"; + }; + + env = {GITHUB_TOKEN = "$(cat /run/agenix/tokenGH)";}; + + hm.programs.git = { + enable = true; + package = pkgs.gitFull; + difftastic = { + enable = true; + background = "dark"; + color = "always"; + display = "inline"; + }; + + ignores = [ + # General: + "*.bloop" + "*.bsp" + "*.metals" + "*.metals.sbt" + "*metals.sbt" + "*.direnv" + "*.envrc" + "*hie.yaml" + "*.mill-version" + "*.jvmopts" + + # OS-related: + ".DS_Store?" + ".DS_Store" + ".CFUserTextEncoding" + ".Trash" + ".Xauthority" + "thumbs.db" + "Thumbs.db" + "Icon?" + + # Compiled residues: + "*.class" + "*.exe" + "*.o" + "*.pyc" + "*.elc" + ]; + + extraConfig = { + init.defaultBranch = "main"; + core = { + editor = "nvim"; + whitespace = "trailing-space,space-before-tab"; + }; + credential.helper = "${pkgs.gitFull}/bin/git-credential-libsecret"; + + user = { + name = "Chris Kruining"; + email = "chris@kruining.eu"; + signingKey = readFile "${config.user.home}/.ssh/id_ed25519.pub"; + }; + + gpg.format = "ssh"; + commit.gpgSign = true; + tag.gpgSign = true; + + push = { + default = "current"; + gpgSign = "if-asked"; + autoSquash = true; + }; + pull.rebase = true; + + filter = { + required = true; + smudge = "git-lfs smudge -- %f"; + process = "git-lfs filter-process"; + clean = "git-lfs clean -- %f"; + }; + + url = { + "https://github.com/".insteadOf = "gh:"; + "git@github.com:".insteadOf = "ssh+gh:"; + }; + }; + }; + }; +} diff --git a/modules/shell/toolset/gnupg.nix b/modules/shell/toolset/gnupg.nix new file mode 100644 index 0000000..008666b --- /dev/null +++ b/modules/shell/toolset/gnupg.nix @@ -0,0 +1,31 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (builtins) getEnv; + inherit (lib.modules) mkIf; + + cfg = config.modules.shell.toolset.gnupg; +in +{ + options.modules.shell.toolset.gnupg = let + inherit (lib.options) mkEnableOption; + in { enable = mkEnableOption "cryptographic suite"; }; + + config = mkIf config.modules.shell.toolset.gnupg.enable { + environment.variables.GNUPGHOME = "$XDG_CONFIG_HOME/gnupg"; + + programs.gnupg.agent = { + enable = true; + enableSSHSupport = true; + pinentryPackage = pkgs.pinentry-gnome3; + + settings = let + cacheTTL = 86400; + in { + default-cache-ttl = cacheTTL; + default-cache-ttl-ssh = cacheTTL; + max-cache-ttl = cacheTTL; + max-cache-ttl-ssh = cacheTTL; + }; + }; + }; +} diff --git a/modules/shell/toolset/starship.nix b/modules/shell/toolset/starship.nix new file mode 100644 index 0000000..0215256 --- /dev/null +++ b/modules/shell/toolset/starship.nix @@ -0,0 +1,85 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (lib.modules) mkIf; +in +{ + options.modules.shell.toolset.starship = let + inherit (lib.options) mkEnableOption; + in { enable = mkEnableOption "minimal shell ricing"; }; + + config = mkIf config.modules.shell.toolset.starship.enable { + hm.programs.starship = { + enable = true; + settings = let + inherit (config.modules.themes.colors.main) normal types; + in { + scan_timeout = 10; + add_newline = true; + line_break.disabled = true; + + format = "$username$hostname$nix_shell$git_branch$git_commit$git_state$git_status$directory$jobs$cmd_duration$character"; + username = { + style_user = "${normal.blue} bold"; + style_root = "${normal.red} bold"; + format = "[$user]($style) "; + disabled = false; + show_always = true; + }; + + hostname = { + ssh_only = false; + ssh_symbol = "🌐 "; + format = "on [$hostname](bold ${normal.red}) "; + trim_at = ".local"; + disabled = false; + }; + + nix_shell = { + symbol = " "; + format = "[$symbol$name]($style) "; + style = "${normal.purple} bold"; + }; + + git_branch = { + only_attached = true; + format = "[$symbol$branch]($style) "; + symbol = "שׂ"; + style = "${normal.yellow} bold"; + }; + + git_commit = { + only_detached = true; + format = "[ﰖ$hash]($style) "; + style = "${normal.yellow} bold"; + }; + + git_state = { + style = "${normal.purple} bold"; + }; + + git_status = { + style = "${normal.green} bold"; + }; + + directory = { + read_only = " "; + truncation_length = 0; + }; + + cmd_duration = { + format = "[$duration]($style) "; + style = "${normal.blue}"; + }; + + jobs = { + style = "${normal.green} bold"; + }; + + character = { + success_symbol = "[\\$](${normal.green} bold)"; + error_symbol = "[\\$](${normal.red} bold)"; + }; + }; + }; + }; +} diff --git a/modules/shell/toolset/tmux.nix b/modules/shell/toolset/tmux.nix new file mode 100644 index 0000000..ce6ef5d --- /dev/null +++ b/modules/shell/toolset/tmux.nix @@ -0,0 +1,126 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (lib.modules) mkIf; +in +{ + options.modules.shell.toolset.tmux = let + inherit (lib.options) mkEnableOption; + in { enable = mkEnableOption "terminal multiplexer"; }; + + config = mkIf config.modules.shell.toolset.tmux.enable { + hm.programs.tmux = { + enable = true; + secureSocket = true; + keyMode = "vi"; + prefix = "C-a"; + terminal = "tmux-256color"; + + baseIndex = 1; + clock24 = true; + disableConfirmationPrompt = true; + escapeTime = 0; + + aggressiveResize = false; + resizeAmount = 2; + reverseSplit = false; + historyLimit = 5000; + newSession = true; + + plugins = let + inherit (pkgs.tmuxPlugins) resurrect continuum; + in [ + { + plugin = resurrect; + extraConfig = "set -g @resurrect-strategy-nvim 'session'"; + } + { + plugin = continuum; + extraConfig = '' + set -g @continuum-restore 'on' + set -g @continuum-save-interval '60' # minutes + ''; + } + ]; + + extraConfig = let + inherit (config.modules.themes.colors.main) normal types; + in '' + # -------===[ Color Correction ]===------- # + set-option -ga terminal-overrides ",*256col*:Tc" + set-option -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q' + set-environment -g COLORTERM "truecolor" + + # -------===[ General-Configurations ]===------- # + set-option -g renumber-windows on + set-window-option -g automatic-rename on + set-window-option -g word-separators ' @"=()[]' + + set-option -g mouse on + set-option -s focus-events on + set-option -g renumber-windows on + set-option -g allow-rename off + + # -------===[ Activity/Sound ]===------- # + set-option -g bell-action none + set-option -g visual-bell off + set-option -g visual-silence off + set-option -g visual-activity off + set-window-option -g monitor-activity off + + # -------===[ Status-Bar ]===------- # + set-option -g status on + set-option -g status-interval 1 + set-option -g status-style bg=default,bold,italics + + set-option -g status-position top + set-option -g status-justify left + + set-option -g status-left-length "40" + set-option -g status-right-length "80" + + # Messages: + set-option -g message-style fg="${types.bg}",bg="${types.highlight}",align="centre" + set-option -g message-command-style fg="${types.bg}",bg="${types.highlight}",align="centre" + + # Panes: + set-option -g pane-border-style fg="${types.fg}" + set-option -g pane-active-border-style fg="${types.border}" + + # Windows: + set-option -g window-status-format "#[fg=${types.fg}] #W/#{window_panes} " + set-option -g window-status-current-format "#{?client_prefix,#[fg=${types.bg}]#[bg=${normal.red}] #I:#W #[fg=${normal.red}]#[bg=default],#[fg=${types.bg}]#[bg=${normal.magenta}] #I:#W #[fg=${normal.magenta}]#[bg=default]}" + + # -------===[ Statusline ]===------- # + set-option -g status-left "#[fg=${types.bg}]#[bg=${normal.blue}]#[bold]  #[fg=${normal.blue}]#[bg=default]" + set-option -g status-bg default + set-option -g status-right "#[italics]∡ #H | %b %d, %H:%M #[fg=${types.bg},bg=${types.highlight},bold,italics] base-#S " + + # -------===[ Clock & Selection ]===------- # + set-window-option -g clock-mode-colour "${types.border}" + set-window-option -g mode-style "fg=${types.bg} bg=${types.highlight} bold" + + # -------===[ Keybindings ]===------- # + bind-key c clock-mode + + # Window Control(s): + bind-key q kill-session + bind-key Q kill-server + bind-key t new-window -c '#{pane_current_path}' + + # Buffers: + bind-key b list-buffers + bind-key p paste-buffer + bind-key P choose-buffer + + # Split bindings: + bind-key - split-window -v -c '#{pane_current_path}' + bind-key / split-window -h -c '#{pane_current_path}' + + # Copy/Paste bindings: + bind-key -T copy-mode-vi v send-keys -X begin-selection -N "Start visual mode for selection" + bind-key -T copy-mode-vi y send-keys -X copy-selection -N "Yank text into buffer" + bind-key -T copy-mode-vi r send-keys -X rectangle-toggle -N "Yank region into buffer" + ''; + }; + }; +} diff --git a/modules/shell/zsh.nix b/modules/shell/zsh.nix new file mode 100644 index 0000000..b2694f7 --- /dev/null +++ b/modules/shell/zsh.nix @@ -0,0 +1,149 @@ +{ config, options, pkgs, lib, ... }: +let + inherit (lib.attrsets) mapAttrsToList; + inherit (lib.modules) mkIf; + inherit (lib.strings) concatStrings escapeNixString; + + cfg = config.modules.shell; +in +{ + config = mkIf (cfg.default == "zsh") { + modules.shell = { + corePkgs.enable = true; + toolset = { + macchina.enable = true; + starship.enable = true; + }; + }; + + hm.programs.starship.enableZshIntegration = true; + + # Enable completion for sys-packages: + environment.pathsToLink = ["/share/zsh"]; + + programs.zsh.enable = true; + + hm.programs.zsh = { + enable = true; + enableCompletion = true; + autosuggestion.enable = true; + syntaxHighlighting.enable = true; + + history = { + size = 10000; + path = "${config.xdg.dataHome}/zsh/history"; + }; + + oh-my-zsh = { + enable = true; + plugins = ["git" "docker-compose" "zoxide"]; + }; + + plugins = let + mkZshPlugin = { + pkg, + file ? "${pkg.pname}.plugin.zsh", + }: { + name = pkg.pname; + src = pkg.src; + inherit file; + }; + in + with pkgs; [ + (mkZshPlugin {pkg = zsh-abbr;}) + (mkZshPlugin {pkg = zsh-autopair;}) + (mkZshPlugin {pkg = zsh-you-should-use;}) + (mkZshPlugin { + pkg = zsh-nix-shell; + file = "nix-shell.plugin.zsh"; + }) + ]; + + syntaxHighlighting = let + inherit (config.modules.themes) active; + inherit (config.modules.themes.colors.main) normal bright types; + in + mkIf (active != null) { + enable = true; + highlighters = ["main" "brackets" "pattern" "cursor" "regexp" "root" "line"]; + patterns = { + "sudo " = "fg=${normal.red},bold"; + "rm -rf *" = "fg=${normal.red},bold"; + }; + styles = { + # -------===[ Comments ]===------- # + comment = "fg=${normal.black}"; + + # -------===[ Functions/Methods ]===------- # + alias = "fg=${normal.magenta}"; + "suffix-alias" = "fg=${normal.magenta}"; + "global-alias" = "fg=${normal.magenta}"; + function = "fg=${normal.blue}"; + command = "fg=${normal.green}"; + precommand = "fg=${normal.green},italic"; + autodirectory = "fg=${normal.yellow},italic"; + "single-hyphen-option" = "fg=${normal.yellow}"; + "double-hyphen-option" = "fg=${normal.yellow}"; + "back-quoted-argument" = "fg=${normal.magenta}"; + + # -------===[ Built-ins ]===------- # + builtin = "fg=${normal.blue}"; + "reserved-word" = "fg=${normal.green}"; + "hashed-command" = "fg=${normal.green}"; + + # -------===[ Punctuation ]===------- # + commandseparator = "fg=${bright.red}"; + "command-substitution-delimiter" = "fg=${types.border}"; + "command-substitution-delimiter-unquoted" = "fg=${types.border}"; + "process-substitution-delimiter" = "fg=${types.border}"; + "back-quoted-argument-delimiter" = "fg=${bright.red}"; + "back-double-quoted-argument" = "fg=${bright.red}"; + "back-dollar-quoted-argument" = "fg=${bright.red}"; + + # -------===[ Strings ]===------- # + "command-substitution-quoted" = "fg=${bright.yellow}"; + "command-substitution-delimiter-quoted" = "fg=${bright.yellow}"; + "single-quoted-argument" = "fg=${bright.yellow}"; + "single-quoted-argument-unclosed" = "fg=${normal.red}"; + "double-quoted-argument" = "fg=${bright.yellow}"; + "double-quoted-argument-unclosed" = "fg=${normal.red}"; + "rc-quote" = "fg=${bright.yellow}"; + + # -------===[ Variables ]===------- # + "dollar-quoted-argument" = "fg=${types.highlight}"; + "dollar-quoted-argument-unclosed" = "fg=${bright.red}"; + "dollar-double-quoted-argument" = "fg=${types.highlight}"; + assign = "fg=${types.highlight}"; + "named-fd" = "fg=${types.highlight}"; + "numeric-fd" = "fg=${types.highlight}"; + + # -------===[ Non-Exclusive ]===------- # + "unknown-token" = "fg=${normal.red}"; + path = "fg=${types.highlight},underline"; + path_pathseparator = "fg=${bright.red},underline"; + path_prefix = "fg=${types.highlight},underline"; + path_prefix_pathseparator = "fg=${bright.red},underline"; + globbing = "fg=${types.highlight}"; + "history-expansion" = "fg=${normal.magenta}"; + "back-quoted-argument-unclosed" = "fg=${normal.red}"; + redirection = "fg=${types.highlight}"; + arg0 = "fg=${types.highlight}"; + default = "fg=${types.highlight}"; + cursor = "fg=${types.highlight}"; + }; + }; + }; + + home.configFile.zsh-abbreviations = { + target = "zsh/abbreviations"; + text = let + abbrevs = import "${config.snowflake.configDir}/shell-abbr"; + in '' + ${concatStrings (mapAttrsToList + (k: v: "abbr ${k}=${escapeNixString v}") + abbrevs + )} + ''; + }; + }; +} diff --git a/modules/system/audio.nix b/modules/system/audio.nix index c4c5fb4..4c5446c 100644 --- a/modules/system/audio.nix +++ b/modules/system/audio.nix @@ -1,19 +1,66 @@ -{ pkgs, ... }: +{ config, options, lib, pkgs, ... }: +let + inherit (lib.attrsets) attrValues; + inherit (lib.modules) mkIf; + + cfg = config.modules.hardware.pipewire; +in { - sound.enable = false; - hardware.pulseaudio.enable = false; + options.modules.hardware.pipewire = let + inherit (lib.options) mkEnableOption; + in + { + enable = mkEnableOption "modern audio support"; + }; - users.extraGroups.audio.members = [ "chris" ]; - - security.rtkit.enable = true; - - services.pipewire = { - enable = true; - alsa = { - enable = true; - support32Bit = true; + config = mkIf cfg.enable { + user.packages = attrValues { + inherit (pkgs) easyeffects + }; + + security.rtkit.enable = true; + + services.pipewire = { + enable = true; + wireplumber.enable = true; + pulse.enable = true; +# jack.enable = true; + + alsa = { + enable = true; + support32Bit = true; + }; + }; + + home.configFile = mkIf config.module.hardware.bluetooth.enable { + wireplumber-bluetooth = { + target = "wireplumber/bluetooth.lua.d/51-bluez-config.lua"; + text = '' + bluez_monitor.properties = { + ["bluez5.enable-sbc-xq"] = true, + ["bluez5.enable-msbc"] = true, + ["bluez5.enable-hw-volume"] = true, + ["bluez5.headset-roles"] = "[ hsp_hs hsp_ag hfp_hf hfp_ag ]" + } + ''; + }; + + wireplumber-disable-suspension = { + target = "wireplumber/main.lua.d/51-disable-suspension.lua"; + text = '' + table.insert(alsa_monitor.rules, { + matches = { + { -- Matches all sources. + { "node.name", "matches", "alsa_input.*" }, + }, + { -- Matches all sinks. + { "node.name", "matches", "alsa_output.*" }, + }, + }, + apply_properties = { ["session.suspend-timeout-seconds"] = 0 }, + }) + ''; + }; }; - pulse.enable = true; - jack.enable = true; }; } diff --git a/modules/system/graphics.nix b/modules/system/graphics.nix new file mode 100644 index 0000000..0dd9504 --- /dev/null +++ b/modules/system/graphics.nix @@ -0,0 +1,39 @@ +{ config, pkgs, ... }: +{ + services.xserver.videoDrivers = [ "nvidia" ]; + + hardware = { + opengl = { + enable = true; + driSupport = true; + driSupport32Bit = true; + }; + + nvidia = { + modesetting.enable = true; + open = false; + nvidiaSettings = true; + + powerManagement = { + enable = true; + finegrained = false; + }; + + package = let + rcu_patch = pkgs.fetchpatch { + url = "https://github.com/gentoo/gentoo/raw/c64caf53/x11-drivers/nvidia-drivers/files/nvidia-drivers-470.223.02-gpl-pfn_valid.patch"; + hash = "sha256-eZiQQp2S/asE7MfGvfe6dA/kdCvek9SYa/FFGp24dVg="; + }; + in config.boot.kernelPackages.nvidiaPackages.mkDriver { + version = "535.154.05"; + sha256_64bit = "sha256-fpUGXKprgt6SYRDxSCemGXLrEsIA6GOinp+0eGbqqJg="; + sha256_aarch64 = "sha256-G0/GiObf/BZMkzzET8HQjdIcvCSqB1uhsinro2HLK9k="; + openSha256 = "sha256-wvRdHguGLxS0mR06P5Qi++pDJBCF8pJ8hr4T8O6TJIo="; + settingsSha256 = "sha256-9wqoDEWY4I7weWW05F4igj1Gj9wjHsREFMztfEmqm10="; + persistencedSha256 = "sha256-d0Q3Lk80JqkS1B54Mahu2yY/WocOqFFbZVBh+ToGhaE="; + + patches = [ rcu_patch ]; + }; + }; + }; +} diff --git a/modules/virtualization/default.nix b/modules/virtualization/default.nix new file mode 100644 index 0000000..5a75009 --- /dev/null +++ b/modules/virtualization/default.nix @@ -0,0 +1,12 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (lib.modules) mkIf; +in +{ + options.modules.virtualization = let + inherit (lib.options) mkEnableOption; + in + { + enable = mkEnableOption "enable virtualization"; + }; +} diff --git a/modules/virtualization/podman.nix b/modules/virtualization/podman.nix new file mode 100644 index 0000000..268d67e --- /dev/null +++ b/modules/virtualization/podman.nix @@ -0,0 +1,26 @@ +{ config, options, lib, pkgs, ... }: +let + inherit (lib.modules) mkIf; + + cfg = config.modules.virtualization.podman; +in +{ + options.modules.virtualization.podman = let + inherit (lib.options) mkEnableOption; + in + { + enable = mkEnableOption "enable podman"; + }; + + config = mkIf options.modules.virtualization.podman.enable { + virtualisation = { + containers.enable = true; + + podman = { + enable = true; + dockerCompat = true; + defaultNetwork.settings.dns_enabled = true; + }; + }; + }; +}