From ea83c79fb32e72ee4f8dd7adb16adef5544afcb0 Mon Sep 17 00:00:00 2001 From: Victor Date: Mon, 25 Sep 2023 11:56:02 +0200 Subject: [PATCH] fixed linting --- flake.nix | 31 +- nixos/common/default.nix | 18 +- nixos/common/desktop/default.nix | 70 +- nixos/common/desktop/home.nix | 76 +- nixos/common/hm-modules/catppuccin.nix | 56 +- nixos/common/hm-modules/nvim.nix | 14 +- nixos/common/modules/dns.nix | 5 +- nixos/common/modules/gnome/default.nix | 34 +- nixos/common/modules/gnome/hm.nix | 17 +- nixos/common/modules/meta.nix | 6 +- nixos/common/modules/nginx.nix | 40 +- nixos/common/modules/unpackerr.nix | 104 +- nixos/common/modules/vault.nix | 17 +- nixos/common/users/victor.nix | 28 +- nixos/hosts/hades/immich/configuration.nix | 3 +- nixos/hosts/hades/lucy/configuration.nix | 11 +- .../hades/lucy/hardware-configuration.nix | 26 +- nixos/hosts/hades/mastodon/configuration.nix | 8 +- nixos/hosts/hades/nginx/configuration.nix | 223 +- nixos/hosts/hades/pmm/configuration.nix | 3 +- nixos/hosts/hades/rtorrent/configuration.nix | 44 +- nixos/hosts/hades/rtorrent/rtorrent.nix | 165 +- nixos/hosts/hades/unifi/configuration.nix | 2 +- nixos/hosts/olympus/bastion/configuration.nix | 3 +- .../bastion/hardware-configuration.nix | 12 +- nixos/hosts/olympus/dex/configuration.nix | 3 +- nixos/hosts/olympus/dhcp/configuration.nix | 5 +- .../olympus/eevee/hardware-configuration.nix | 12 +- nixos/hosts/olympus/eevee/hardware.nix | 62 +- nixos/hosts/olympus/gitea/configuration.nix | 127 +- .../hosts/olympus/hedgedoc/configuration.nix | 30 +- .../olympus/mailserver/configuration.nix | 78 +- nixos/hosts/olympus/minio/configuration.nix | 3 +- nixos/hosts/olympus/nginx/configuration.nix | 201 +- nixos/hosts/olympus/ntfy/configuration.nix | 27 +- nixos/hosts/olympus/outline/configuration.nix | 3 +- nixos/hosts/olympus/synapse/configuration.nix | 109 +- .../olympus/vaultwarden/configuration.nix | 3 +- .../olympus/victoriametrics/configuration.nix | 191 +- .../hosts/olympus/wireguard/configuration.nix | 96 +- .../thalassa/aoife/hardware-configuration.nix | 12 +- nixos/hosts/thalassa/aoife/hardware.nix | 70 +- nixos/hosts/thalassa/aoife/home/default.nix | 2 +- nixos/hosts/thalassa/null/configuration.nix | 259 +- .../thalassa/null/hardware-configuration.nix | 50 +- nixos/hosts/thalassa/null/home/default.nix | 373 +-- .../hosts/thalassa/null/home/eww/default.nix | 62 +- nixos/hosts/thalassa/null/home/hyprland.nix | 226 +- nixos/hosts/thalassa/null/home/neovim.nix | 8 +- nixos/hosts/thalassa/null/home/theme.nix | 79 +- nixos/hosts/thalassa/null/rescue-boot.nix | 3 +- nixos/pkgs/glitch-soc/default.nix | 41 +- nixos/pkgs/glitch-soc/gemset.nix | 2246 ++++++++--------- nixos/pkgs/glitch-soc/source.nix | 8 +- nixos/pkgs/glitch-soc/update.nix | 17 +- nixos/pkgs/plex-pass/raw.nix | 6 +- nixos/pkgs/roundcube-swipe/default.nix | 3 +- nixos/util.nix | 47 +- repl.nix | 3 +- 59 files changed, 2843 insertions(+), 2638 deletions(-) diff --git a/flake.nix b/flake.nix index d5ce38e..96f4d3b 100644 --- a/flake.nix +++ b/flake.nix @@ -46,8 +46,17 @@ attic.url = "github:zhaofengli/attic"; }; - outputs = { self, nixpkgs, nixpkgs_stable, vault-secrets, colmena - , nixos-generators, nur, attic, ... }@inputs: + outputs = + { self + , nixpkgs + , nixpkgs_stable + , vault-secrets + , colmena + , nixos-generators + , nur + , attic + , ... + }@inputs: let inherit (nixpkgs) lib; @@ -81,7 +90,8 @@ source /etc/set-environment nix repl --file "${./.}/repl.nix" $@ ''; - in { + in + { # Make the nixosConfigurations for compat reasons (e.g. vault) nixosConfigurations = (import (inputs.colmena + "/src/nix/hive/eval.nix") { @@ -93,12 +103,14 @@ }).nodes; # Make the colmena configuration - colmena = lib.foldr (el: acc: acc // util.mkColmenaHost el) { - meta = { - inherit specialArgs; - nixpkgs = pkgs; - }; - } nixHosts; + colmena = lib.foldr (el: acc: acc // util.mkColmenaHost el) + { + meta = { + inherit specialArgs; + nixpkgs = pkgs; + }; + } + nixHosts; packages.${system} = { inherit apply-local; @@ -137,6 +149,7 @@ statix terraform nixfmt + nixpkgs-fmt nixUnstable nil vault diff --git a/nixos/common/default.nix b/nixos/common/default.nix index 3f3782f..317d57d 100644 --- a/nixos/common/default.nix +++ b/nixos/common/default.nix @@ -2,14 +2,16 @@ imports = [ ./users ./modules inputs.vault-secrets.nixosModules.vault-secrets ]; - vault-secrets = let - inherit (config.networking) domain hostName; - server = if domain == "olympus" then "vault" else "vault-0"; - in lib.mkIf (domain == "olympus" || domain == "hades") { - vaultPrefix = "${domain}_secrets/nixos"; - vaultAddress = "http://${server}.${domain}:8200/"; - approlePrefix = "${domain}-${hostName}"; - }; + vault-secrets = + let + inherit (config.networking) domain hostName; + server = if domain == "olympus" then "vault" else "vault-0"; + in + lib.mkIf (domain == "olympus" || domain == "hades") { + vaultPrefix = "${domain}_secrets/nixos"; + vaultAddress = "http://${server}.${domain}:8200/"; + approlePrefix = "${domain}-${hostName}"; + }; home-manager = { useGlobalPkgs = true; diff --git a/nixos/common/desktop/default.nix b/nixos/common/desktop/default.nix index f4e4c90..4e02b9a 100644 --- a/nixos/common/desktop/default.nix +++ b/nixos/common/desktop/default.nix @@ -21,9 +21,26 @@ users.victor = import ./home.nix; extraSpecialArgs = { inherit inputs; }; }; + services = { - # Enable my config for the gnome desktop environment - services.v.gnome.enable = true; + # Enable my config for the gnome desktop environment + v.gnome.enable = true; + + # Enable CUPS to print documents. + printing.enable = true; + pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + # If you want to use JACK applications, uncomment this + #jack.enable = true; + + # use the example session manager (no others are packaged yet so this is enabled by default, + # no need to redefine it in your config for now) + #media-session.enable = true; + }; + }; # Set your time zone. time.timeZone = "Europe/Amsterdam"; @@ -42,9 +59,6 @@ LC_TIME = "nl_NL.UTF-8"; }; - # Enable CUPS to print documents. - services.printing.enable = true; - # Global Packages environment = { systemPackages = with pkgs; [ wireguard-tools sbctl ]; }; @@ -52,18 +66,6 @@ sound.enable = true; hardware.pulseaudio.enable = false; security.rtkit.enable = true; - services.pipewire = { - enable = true; - alsa.enable = true; - alsa.support32Bit = true; - pulse.enable = true; - # If you want to use JACK applications, uncomment this - #jack.enable = true; - - # use the example session manager (no others are packaged yet so this is enabled by default, - # no need to redefine it in your config for now) - #media-session.enable = true; - }; virtualisation = { podman.enable = true; @@ -84,21 +86,27 @@ [ "DejaVuSansMono" "Ubuntu" "DroidSansMono" "NerdFontsSymbolsOnly" ]; }) ]; + programs = { + steam = { - programs.steam = { - enable = true; - # Open ports in the firewall for Steam Remote Play - remotePlay.openFirewall = true; - package = pkgs.steam.override { - extraPkgs = pkgs: with pkgs; [ gamescope mangohud ]; + + enable = true; + # Open ports in the firewall for Steam Remote Play + remotePlay.openFirewall = true; + package = pkgs.steam.override { + extraPkgs = pkgs: with pkgs; [ gamescope mangohud ]; + }; }; + + + gamemode.enable = true; + + adb.enable = true; + }; + networking = { + # Networking + networkmanager.enable = true; + firewall.checkReversePath = false; + firewall.enable = false; }; - - programs.gamemode.enable = true; - - programs.adb.enable = true; - # Networking - networking.networkmanager.enable = true; - networking.firewall.checkReversePath = false; - networking.firewall.enable = false; } diff --git a/nixos/common/desktop/home.nix b/nixos/common/desktop/home.nix index db10fb8..3650e3f 100644 --- a/nixos/common/desktop/home.nix +++ b/nixos/common/desktop/home.nix @@ -5,7 +5,8 @@ let dnd-5e-latex-template = { pkgs = [ pkgs.v.dnd-5e-latex-template ]; }; }; my-python-packages = ps: with ps; [ pandas requests numpy ]; -in { +in +{ home.packages = with pkgs; [ (python3.withPackages my-python-packages) btop @@ -37,50 +38,53 @@ in { # Enable my own hm modules themes.v.catppuccin.enable = true; - programs.v.vscode.enable = true; + programs = { + v.vscode.enable = true; - programs.riff = { - enable = true; - direnv = true; - }; + riff = { + enable = true; + direnv = true; + }; - programs.firefox.enable = true; + firefox.enable = true; - programs.chromium = { - enable = true; - package = pkgs.ungoogled-chromium; - }; + chromium = { + enable = true; + package = pkgs.ungoogled-chromium; + }; - programs.direnv = { - enable = true; - nix-direnv.enable = true; - }; + direnv = { + enable = true; + nix-direnv.enable = true; + }; - programs.zsh = { - enable = true; - sessionVariables = { DIRENV_LOG_FORMAT = ""; }; - }; + zsh = { + enable = true; + sessionVariables = { DIRENV_LOG_FORMAT = ""; }; + }; - programs.thunderbird = { - enable = true; - profiles.default = { - isDefault = true; + thunderbird = { + enable = true; + profiles.default = { + isDefault = true; + }; }; }; # Syncthing services.syncthing.enable = true; - xdg.userDirs = let home = config.home.homeDirectory; - in { - enable = true; - createDirectories = true; - desktop = "${home}/.desktop"; - documents = "${home}/cloud/Documents"; - download = "${home}/dl"; - music = "${home}/cloud/Music"; - pictures = "${home}/cloud/Pictures"; - publicShare = "${home}/.publicShare"; - templates = "${home}/.templates"; - videos = "${home}/cloud/Videos"; - }; + xdg.userDirs = + let home = config.home.homeDirectory; + in { + enable = true; + createDirectories = true; + desktop = "${home}/.desktop"; + documents = "${home}/cloud/Documents"; + download = "${home}/dl"; + music = "${home}/cloud/Music"; + pictures = "${home}/cloud/Pictures"; + publicShare = "${home}/.publicShare"; + templates = "${home}/.templates"; + videos = "${home}/cloud/Videos"; + }; } diff --git a/nixos/common/hm-modules/catppuccin.nix b/nixos/common/hm-modules/catppuccin.nix index 2aceac0..68c7191 100644 --- a/nixos/common/hm-modules/catppuccin.nix +++ b/nixos/common/hm-modules/catppuccin.nix @@ -3,36 +3,38 @@ with lib; let cfg = config.themes.v.catppuccin; in { options.themes.v.catppuccin = { enable = mkEnableOption "catppuccin"; }; - config = let - theme = "Catppuccin-Pink-Dark"; - cursorTheme = config.home.pointerCursor.name; - in mkIf cfg.enable { - home.pointerCursor = { - name = "Bibata_Ghost"; - size = 24; - package = pkgs.bibata-cursors-translucent; - }; + config = + let + theme = "Catppuccin-Pink-Dark"; + cursorTheme = config.home.pointerCursor.name; + in + mkIf cfg.enable { + home.pointerCursor = { + name = "Bibata_Ghost"; + size = 24; + package = pkgs.bibata-cursors-translucent; + }; - gtk = { - enable = true; - theme = { - name = theme; - package = pkgs.catppuccin-gtk; + gtk = { + enable = true; + theme = { + name = theme; + package = pkgs.catppuccin-gtk; + }; + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme.override { color = "violet"; }; + }; + cursorTheme = { + name = cursorTheme; + inherit (config.home.pointerCursor) package size; + }; }; - iconTheme = { - name = "Papirus-Dark"; - package = pkgs.papirus-icon-theme.override { color = "violet"; }; - }; - cursorTheme = { - name = cursorTheme; - inherit (config.home.pointerCursor) package size; - }; - }; - programs.vscode = { - userSettings."workbench.colorTheme" = "Catppuccin Frappé"; - extensions = [ pkgs.vscode-extensions.catppuccin.catppuccin-vsc ]; + programs.vscode = { + userSettings."workbench.colorTheme" = "Catppuccin Frappé"; + extensions = [ pkgs.vscode-extensions.catppuccin.catppuccin-vsc ]; + }; }; - }; } diff --git a/nixos/common/hm-modules/nvim.nix b/nixos/common/hm-modules/nvim.nix index 46c5fbf..8d9e306 100644 --- a/nixos/common/hm-modules/nvim.nix +++ b/nixos/common/hm-modules/nvim.nix @@ -65,12 +65,14 @@ in { comment-nvim = { enable = true; }; lsp = { enable = true; - servers.nil_ls.enable = true; - servers.rust-analyzer.enable = true; - servers.pyright.enable = true; - servers.elixirls.enable = true; - servers.clangd.enable = true; - servers.yamlls.enable = true; + servers = { + nil_ls.enable = true; + rust-analyzer.enable = true; + pyright.enable = true; + elixirls.enable = true; + clangd.enable = true; + yamlls.enable = true; + }; }; trouble.enable = true; lspkind.enable = true; diff --git a/nixos/common/modules/dns.nix b/nixos/common/modules/dns.nix index e90e1c7..0b9ed85 100644 --- a/nixos/common/modules/dns.nix +++ b/nixos/common/modules/dns.nix @@ -15,7 +15,8 @@ let ptr6Data = { hostname, realm, ip6, ... }: ''"${ip6} ${hostname}.${realm}"''; cfg = config.services.v.dns; -in { +in +{ options.services.v.dns = { enable = mkEnableOption "v.dns"; @@ -47,7 +48,7 @@ in { config = mkIf cfg.enable { networking.firewall = mkIf cfg.openFirewall { - allowedTCPPorts = [ 53 ] ; + allowedTCPPorts = [ 53 ]; allowedUDPPorts = [ 53 ]; }; services.prometheus.exporters.unbound = mkIf cfg.enableMetrics { diff --git a/nixos/common/modules/gnome/default.nix b/nixos/common/modules/gnome/default.nix index 90b95a5..eb2d4f0 100644 --- a/nixos/common/modules/gnome/default.nix +++ b/nixos/common/modules/gnome/default.nix @@ -14,22 +14,28 @@ in { }; config = mkIf cfg.enable { - services.xserver.enable = true; - services.xserver.excludePackages = [ pkgs.xterm ]; + services = { + xserver = { + enable = true; + excludePackages = [ pkgs.xterm ]; + + # Configure keymap in X11 + + layout = "us"; + xkbVariant = "altgr-intl"; + + + # Enable the GNOME Desktop Environment. + displayManager.gdm.enable = true; + desktopManager.gnome.enable = true; + }; + udev.packages = with pkgs; [ gnome.gnome-settings-daemon ]; + dbus.enable = true; + udisks2.enable = true; + }; # Add Home-manager dconf stuff home-manager.sharedModules = mkIf cfg.hm [ ./hm.nix ]; - - # Configure keymap in X11 - services.xserver = { - layout = "us"; - xkbVariant = "altgr-intl"; - }; - - # Enable the GNOME Desktop Environment. - services.xserver.displayManager.gdm.enable = true; - services.xserver.desktopManager.gnome.enable = true; - services.udev.packages = with pkgs; [ gnome.gnome-settings-daemon ]; environment.gnome.excludePackages = (with pkgs; [ gnome-photos gnome-tour gnome-connections ]) ++ (with pkgs.gnome; [ @@ -54,8 +60,6 @@ in { # Services required for gnome programs.dconf.enable = true; - services.dbus.enable = true; - services.udisks2.enable = true; # Extra gnome packages environment.systemPackages = with pkgs; [ diff --git a/nixos/common/modules/gnome/hm.nix b/nixos/common/modules/gnome/hm.nix index d852a9a..07cc96a 100644 --- a/nixos/common/modules/gnome/hm.nix +++ b/nixos/common/modules/gnome/hm.nix @@ -7,15 +7,18 @@ let generate_custom_keybindings = binds: { "org/gnome/settings-daemon/plugins/media-keys" = { - custom-keybindings = map (name: - "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/${name}/") + custom-keybindings = map + (name: + "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/${name}/") (attrNames binds); }; - } // mapAttrs' (name: - nameValuePair - "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/${name}") - binds; -in { + } // mapAttrs' + (name: + nameValuePair + "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/${name}") + binds; +in +{ xdg.mimeApps.enable = true; xdg.mimeApps.defaultApplications = { "text/plain" = "org.gnome.TextEditor.desktop"; diff --git a/nixos/common/modules/meta.nix b/nixos/common/modules/meta.nix index 562d21f..639d212 100644 --- a/nixos/common/modules/meta.nix +++ b/nixos/common/modules/meta.nix @@ -20,7 +20,8 @@ let }; }; }; -in { +in +{ options.meta = { exposes = mkOption { @@ -38,6 +39,5 @@ in { }; }; - config = { - }; + config = { }; } diff --git a/nixos/common/modules/nginx.nix b/nixos/common/modules/nginx.nix index a6ff28a..1159e21 100644 --- a/nixos/common/modules/nginx.nix +++ b/nixos/common/modules/nginx.nix @@ -1,30 +1,32 @@ { lib, hosts, config, ... }: with lib; let cfg = config.services.v.nginx; -in { +in { options.services.v.nginx.autoExpose = mkEnableOption "generate vhosts"; - config = let + config = + let - proxy = url: { - enableACME = true; - forceSSL = true; - locations."/" = { - proxyPass = url; - proxyWebsockets = true; + proxy = url: { + enableACME = true; + forceSSL = true; + locations."/" = { + proxyPass = url; + proxyWebsockets = true; + }; }; - }; - hosts' = - filter (hasAttr "exposes") (attrValues hosts.${config.networking.domain}); - exposes = { ip, exposes, ... }: - map ({ domain, port ? 80}: { inherit ip domain port; }) (attrValues exposes); - mkVhost = { ip, domain, port}: { - "${domain}" = proxy "http://${ip}:${toString port}"; + hosts' = + filter (hasAttr "exposes") (attrValues hosts.${config.networking.domain}); + exposes = { ip, exposes, ... }: + map ({ domain, port ? 80 }: { inherit ip domain port; }) (attrValues exposes); + mkVhost = { ip, domain, port }: { + "${domain}" = proxy "http://${ip}:${toString port}"; + }; + vhosts = foldr (el: acc: acc // mkVhost el) { } (concatMap exposes hosts'); + in + mkIf cfg.autoExpose { + services.nginx.virtualHosts = vhosts; }; - vhosts = foldr (el: acc: acc // mkVhost el) { } (concatMap exposes hosts'); - in mkIf cfg.autoExpose { - services.nginx.virtualHosts = vhosts; - }; } diff --git a/nixos/common/modules/unpackerr.nix b/nixos/common/modules/unpackerr.nix index 5490ec6..4a8043b 100644 --- a/nixos/common/modules/unpackerr.nix +++ b/nixos/common/modules/unpackerr.nix @@ -57,7 +57,8 @@ let ''; }; }; -in { +in +{ options.services.unpackerr = { enable = mkEnableOption "unpackerr"; @@ -257,61 +258,62 @@ in { after = [ "network.target" ]; description = "unpackerr system service"; # Filter out all unset variables else unpackerr complains - environment = filterAttrs (_n: v: stringLength v > 0) { - # General options - UN_DEBUG = "${toString cfg.debug}"; - UN_INTERVAL = "${cfg.interval}"; - UN_START_DELAY = "${cfg.startDelay}"; - UN_RETRY_DELAY = "${cfg.retryDelay}"; - UN_MAX_RETRIES = "${toString cfg.maxRetries}"; - UN_PARALLEL = "${toString cfg.parallel}"; - UN_FILE_MODE = "${cfg.fileMode}"; - UN_DIR_MODE = "${cfg.dirMode}"; + environment = filterAttrs (_n: v: stringLength v > 0) + { + # General options + UN_DEBUG = "${toString cfg.debug}"; + UN_INTERVAL = "${cfg.interval}"; + UN_START_DELAY = "${cfg.startDelay}"; + UN_RETRY_DELAY = "${cfg.retryDelay}"; + UN_MAX_RETRIES = "${toString cfg.maxRetries}"; + UN_PARALLEL = "${toString cfg.parallel}"; + UN_FILE_MODE = "${cfg.fileMode}"; + UN_DIR_MODE = "${cfg.dirMode}"; - # Sonarr - UN_SONARR_0_URL = "${cfg.sonarr.url}"; - UN_SONARR_0_API_KEY = "${cfg.sonarr.apiKey}"; - UN_SONARR_0_PATHS_0 = "${cfg.sonarr.paths}"; - UN_SONARR_0_PROTOCOLS = "${cfg.sonarr.protocols}"; - UN_SONARR_0_TIMEOUT = "${cfg.sonarr.timeout}"; - UN_SONARR_0_DELETE_ORIG = "${toString cfg.sonarr.deleteOrginal}"; - UN_SONARR_0_DELETE_DELAY = "${cfg.sonarr.deleteDelay}"; + # Sonarr + UN_SONARR_0_URL = "${cfg.sonarr.url}"; + UN_SONARR_0_API_KEY = "${cfg.sonarr.apiKey}"; + UN_SONARR_0_PATHS_0 = "${cfg.sonarr.paths}"; + UN_SONARR_0_PROTOCOLS = "${cfg.sonarr.protocols}"; + UN_SONARR_0_TIMEOUT = "${cfg.sonarr.timeout}"; + UN_SONARR_0_DELETE_ORIG = "${toString cfg.sonarr.deleteOrginal}"; + UN_SONARR_0_DELETE_DELAY = "${cfg.sonarr.deleteDelay}"; - # Radarr - UN_RADARR_0_URL = "${cfg.radarr.url}"; - UN_RADARR_0_API_KEY = "${cfg.radarr.apiKey}"; - UN_RADARR_0_PATHS_0 = "${cfg.radarr.paths}"; - UN_RADARR_0_PROTOCOLS = "${cfg.radarr.protocols}"; - UN_RADARR_0_TIMEOUT = "${cfg.radarr.timeout}"; - UN_RADARR_0_DELETE_ORIG = "${toString cfg.radarr.deleteOrginal}"; - UN_RADARR_0_DELETE_DELAY = "${cfg.radarr.deleteDelay}"; + # Radarr + UN_RADARR_0_URL = "${cfg.radarr.url}"; + UN_RADARR_0_API_KEY = "${cfg.radarr.apiKey}"; + UN_RADARR_0_PATHS_0 = "${cfg.radarr.paths}"; + UN_RADARR_0_PROTOCOLS = "${cfg.radarr.protocols}"; + UN_RADARR_0_TIMEOUT = "${cfg.radarr.timeout}"; + UN_RADARR_0_DELETE_ORIG = "${toString cfg.radarr.deleteOrginal}"; + UN_RADARR_0_DELETE_DELAY = "${cfg.radarr.deleteDelay}"; - # Lidarr - UN_LIDARR_0_URL = "${cfg.lidarr.url}"; - UN_LIDARR_0_API_KEY = "${cfg.lidarr.apiKey}"; - UN_LIDARR_0_PATHS_0 = "${cfg.lidarr.paths}"; - UN_LIDARR_0_PROTOCOLS = "${cfg.lidarr.protocols}"; - UN_LIDARR_0_TIMEOUT = "${cfg.lidarr.timeout}"; - UN_LIDARR_0_DELETE_ORIG = "${toString cfg.lidarr.deleteOrginal}"; - UN_LIDARR_0_DELETE_DELAY = "${cfg.lidarr.deleteDelay}"; + # Lidarr + UN_LIDARR_0_URL = "${cfg.lidarr.url}"; + UN_LIDARR_0_API_KEY = "${cfg.lidarr.apiKey}"; + UN_LIDARR_0_PATHS_0 = "${cfg.lidarr.paths}"; + UN_LIDARR_0_PROTOCOLS = "${cfg.lidarr.protocols}"; + UN_LIDARR_0_TIMEOUT = "${cfg.lidarr.timeout}"; + UN_LIDARR_0_DELETE_ORIG = "${toString cfg.lidarr.deleteOrginal}"; + UN_LIDARR_0_DELETE_DELAY = "${cfg.lidarr.deleteDelay}"; - # Readarr - UN_READARR_0_URL = "${cfg.readarr.url}"; - UN_READARR_0_API_KEY = "${cfg.readarr.apiKey}"; - UN_READARR_0_PATHS_0 = "${cfg.readarr.paths}"; - UN_READARR_0_PROTOCOLS = "${cfg.readarr.protocols}"; - UN_READARR_0_TIMEOUT = "${cfg.readarr.timeout}"; - UN_READARR_0_DELETE_ORIG = "${toString cfg.readarr.deleteOrginal}"; - UN_READARR_0_DELETE_DELAY = "${cfg.readarr.deleteDelay}"; + # Readarr + UN_READARR_0_URL = "${cfg.readarr.url}"; + UN_READARR_0_API_KEY = "${cfg.readarr.apiKey}"; + UN_READARR_0_PATHS_0 = "${cfg.readarr.paths}"; + UN_READARR_0_PROTOCOLS = "${cfg.readarr.protocols}"; + UN_READARR_0_TIMEOUT = "${cfg.readarr.timeout}"; + UN_READARR_0_DELETE_ORIG = "${toString cfg.readarr.deleteOrginal}"; + UN_READARR_0_DELETE_DELAY = "${cfg.readarr.deleteDelay}"; - # Folder - UN_FOLDER_0_PATH = "${cfg.folder.path}"; - UN_FOLDER_0_EXTRACT_PATH = "${cfg.folder.extractPath}"; - UN_FOLDER_0_DELETE_AFTER = "${cfg.folder.deleteAfter}"; - UN_FOLDER_0_DELETE_ORIGINAL = "${toString cfg.folder.deleteOrginal}"; - UN_FOLDER_0_DELETE_FILES = "${toString cfg.folder.deleteFiles}"; - UN_FOLDER_0_MOVE_BACK = "${toString cfg.folder.moveBack}"; - } // cfg.extraConfig; + # Folder + UN_FOLDER_0_PATH = "${cfg.folder.path}"; + UN_FOLDER_0_EXTRACT_PATH = "${cfg.folder.extractPath}"; + UN_FOLDER_0_DELETE_AFTER = "${cfg.folder.deleteAfter}"; + UN_FOLDER_0_DELETE_ORIGINAL = "${toString cfg.folder.deleteOrginal}"; + UN_FOLDER_0_DELETE_FILES = "${toString cfg.folder.deleteFiles}"; + UN_FOLDER_0_MOVE_BACK = "${toString cfg.folder.moveBack}"; + } // cfg.extraConfig; serviceConfig = { User = cfg.user; Group = cfg.group; diff --git a/nixos/common/modules/vault.nix b/nixos/common/modules/vault.nix index 90b86c8..4460ee7 100644 --- a/nixos/common/modules/vault.nix +++ b/nixos/common/modules/vault.nix @@ -7,13 +7,16 @@ let # Find all vault hosts that do not have the same IP as the current host vault_hosts = filter ({ tags ? [ ], ip ? "", ... }: (elem "vault" tags) && (ip != hostIP)) - flat_hosts; - cluster_config = concatStrings (map ({ ip, ... }: '' - retry_join { - leader_api_addr = "http://${ip}:${toString cfg.port}" - } - '') vault_hosts); -in { + flat_hosts; + cluster_config = concatStrings (map + ({ ip, ... }: '' + retry_join { + leader_api_addr = "http://${ip}:${toString cfg.port}" + } + '') + vault_hosts); +in +{ options.services.v.vault = { enable = mkEnableOption "v's vault"; diff --git a/nixos/common/users/victor.nix b/nixos/common/users/victor.nix index 18a57ad..46ff5fe 100644 --- a/nixos/common/users/victor.nix +++ b/nixos/common/users/victor.nix @@ -23,23 +23,27 @@ }; home-manager.users.victor = { - programs.home-manager.enable = true; + programs = { + home-manager.enable = true; - home.username = "victor"; - home.homeDirectory = "/home/victor"; - home.stateVersion = "23.05"; + v.nvim.enable = true; + v.git.enable = true; - programs.v.nvim.enable = true; - programs.v.git.enable = true; + tmux = { + enable = true; + shortcut = "b"; + terminal = "screen-256color"; + clock24 = true; + }; - programs.tmux = { - enable = true; - shortcut = "b"; - terminal = "screen-256color"; - clock24 = true; + bat.enable = true; }; + home = { - programs.bat.enable = true; + username = "victor"; + homeDirectory = "/home/victor"; + stateVersion = "23.05"; + }; }; } diff --git a/nixos/hosts/hades/immich/configuration.nix b/nixos/hosts/hades/immich/configuration.nix index 938bb2d..c338ea3 100644 --- a/nixos/hosts/hades/immich/configuration.nix +++ b/nixos/hosts/hades/immich/configuration.nix @@ -7,7 +7,8 @@ let # https://github.com/immich-app/immich/releases # version = "1.55.1"; dataDir = "/var/lib/immich"; -in { +in +{ imports = [ ]; # This value determines the NixOS release from which the default diff --git a/nixos/hosts/hades/lucy/configuration.nix b/nixos/hosts/hades/lucy/configuration.nix index 19f9c70..3568268 100644 --- a/nixos/hosts/hades/lucy/configuration.nix +++ b/nixos/hosts/hades/lucy/configuration.nix @@ -24,7 +24,8 @@ let doCheck = false; }; -in { +in +{ imports = [ ./hardware-configuration.nix ]; # This value determines the NixOS release from which the default @@ -46,10 +47,12 @@ in { trivy wapiti ]; + boot.loader = { - boot.loader.systemd-boot.enable = true; - boot.loader.efi.canTouchEfiVariables = true; - boot.loader.efi.efiSysMountPoint = "/boot"; + systemd-boot.enable = true; + efi.canTouchEfiVariables = true; + efi.efiSysMountPoint = "/boot"; + }; virtualisation.docker.enable = true; diff --git a/nixos/hosts/hades/lucy/hardware-configuration.nix b/nixos/hosts/hades/lucy/hardware-configuration.nix index f89cdb5..ba51cd1 100644 --- a/nixos/hosts/hades/lucy/hardware-configuration.nix +++ b/nixos/hosts/hades/lucy/hardware-configuration.nix @@ -5,19 +5,21 @@ { imports = [ (modulesPath + "/profiles/qemu-guest.nix") ]; + boot = { - boot.initrd.availableKernelModules = [ - "uhci_hcd" - "ehci_pci" - "ahci" - "virtio_pci" - "virtio_scsi" - "sd_mod" - "sr_mod" - ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ ]; - boot.extraModulePackages = [ ]; + initrd.availableKernelModules = [ + "uhci_hcd" + "ehci_pci" + "ahci" + "virtio_pci" + "virtio_scsi" + "sd_mod" + "sr_mod" + ]; + initrd.kernelModules = [ ]; + kernelModules = [ ]; + extraModulePackages = [ ]; + }; fileSystems."/" = { device = "/dev/disk/by-uuid/749c02fd-209d-4974-917e-38b749d10ec2"; diff --git a/nixos/hosts/hades/mastodon/configuration.nix b/nixos/hosts/hades/mastodon/configuration.nix index 34ab313..eee7fde 100644 --- a/nixos/hosts/hades/mastodon/configuration.nix +++ b/nixos/hosts/hades/mastodon/configuration.nix @@ -2,7 +2,8 @@ let vs = config.vault-secrets.secrets; cfg = config.services.mastodon; -in { +in +{ system.stateVersion = "21.05"; # Use DHCP with static leases networking.interfaces.eth0.useDHCP = true; @@ -100,6 +101,7 @@ in { }; }; - networking.firewall = let cfg = config.services.mastodon; - in { allowedTCPPorts = [ cfg.streamingPort cfg.webPort ]; }; + networking.firewall = + let cfg = config.services.mastodon; + in { allowedTCPPorts = [ cfg.streamingPort cfg.webPort ]; }; } diff --git a/nixos/hosts/hades/nginx/configuration.nix b/nixos/hosts/hades/nginx/configuration.nix index 71b0a24..566dcdf 100644 --- a/nixos/hosts/hades/nginx/configuration.nix +++ b/nixos/hosts/hades/nginx/configuration.nix @@ -12,7 +12,8 @@ let proxyWebsockets = true; }; }; -in { +in +{ imports = [ ]; nixpkgs.config.permittedInsecurePackages = [ "openssl-1.1.1t" ]; @@ -25,10 +26,12 @@ in { # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). system.stateVersion = "23.05"; # Did you read the comment? networking.firewall.allowedTCPPorts = [ 80 443 ]; + security.acme = { - security.acme.defaults.email = "victorheld12@gmail.com"; - security.acme.acceptTerms = true; - security.acme.preliminarySelfsigned = true; + defaults.email = "victorheld12@gmail.com"; + acceptTerms = true; + preliminarySelfsigned = true; + }; services.nginx = { enable = true; @@ -39,38 +42,39 @@ in { clientMaxBodySize = "1024m"; package = pkgs.nginxMainline; + virtualHosts = { - virtualHosts."cshub.nl" = proxy "http://192.168.0.113"; - virtualHosts."api.cshub.nl" = proxy "http://192.168.0.113"; + "cshub.nl" = proxy "http://192.168.0.113"; + "api.cshub.nl" = proxy "http://192.168.0.113"; - virtualHosts."ha.xirion.net" = proxy "http://192.168.0.129:8123"; - virtualHosts."xirion.net" = { - enableACME = true; - forceSSL = true; - locations."/".extraConfig = '' - add_header Content-Type 'text/html; charset=UTF-8'; - return 200 'Hello, World!'; - ''; - locations."= /.well-known/host-meta".extraConfig = '' - return 301 https://fedi.xirion.net$request_uri; - ''; - }; - # virtualHosts."blog.xirion.net" = proxy "http://10.10.10.12"; - virtualHosts."git.xirion.net" = proxy "http://10.10.10.12"; - # virtualHosts."mail.xirion.net" = proxy "http://192.168.0.118"; - virtualHosts."o.xirion.net" = proxy "http://192.168.0.112:9000"; - virtualHosts."g.xirion.net" = proxy "http://garage.hades:3900"; - virtualHosts."requests.xirion.net" = proxy "http://overseerr.hades:5055"; - virtualHosts."pass.xirion.net" = proxy "http://bitwarden_rs"; - virtualHosts."repo.xirion.net" = proxy "http://archlinux"; - virtualHosts."thelounge.xirion.net" = proxy "http://thelounge:9000"; - virtualHosts."attic.xirion.net" = proxy "http://attic.hades:8080"; + "ha.xirion.net" = proxy "http://192.168.0.129:8123"; + "xirion.net" = { + enableACME = true; + forceSSL = true; + locations."/".extraConfig = '' + add_header Content-Type 'text/html; charset=UTF-8'; + return 200 'Hello, World!'; + ''; + locations."= /.well-known/host-meta".extraConfig = '' + return 301 https://fedi.xirion.net$request_uri; + ''; + }; + # virtualHosts."blog.xirion.net" = proxy "http://10.10.10.12"; + "git.xirion.net" = proxy "http://10.10.10.12"; + # virtualHosts."mail.xirion.net" = proxy "http://192.168.0.118"; + "o.xirion.net" = proxy "http://192.168.0.112:9000"; + "g.xirion.net" = proxy "http://garage.hades:3900"; + "requests.xirion.net" = proxy "http://overseerr.hades:5055"; + "pass.xirion.net" = proxy "http://bitwarden_rs"; + "repo.xirion.net" = proxy "http://archlinux"; + "thelounge.xirion.net" = proxy "http://thelounge:9000"; + "attic.xirion.net" = proxy "http://attic.hades:8080"; - virtualHosts."tautulli.xirion.net" = proxy "http://tautulli.hades:8080"; - virtualHosts."peepeepoopoo.xirion.net" = proxy "http://tautulli.hades:8080"; # Deprecated but Ricardo has it bookmarked already! + "tautulli.xirion.net" = proxy "http://tautulli.hades:8080"; + "peepeepoopoo.xirion.net" = proxy "http://tautulli.hades:8080"; # Deprecated but Ricardo has it bookmarked already! - virtualHosts."registry.xirion.net" = proxy "http://docker-registry:5000" - // { + "registry.xirion.net" = proxy "http://docker-registry:5000" + // { locations."/".extraConfig = '' allow 127.0.0.1; allow 10.42.42.0/23; @@ -83,91 +87,94 @@ in { ''; }; - virtualHosts."plex.xirion.net" = { - # Since we want a secure connection, we force SSL - forceSSL = true; - enableACME = true; + "plex.xirion.net" = { + # Since we want a secure connection, we force SSL + forceSSL = true; + enableACME = true; - extraConfig = '' - #Some players don't reopen a socket and playback stops totally instead of resuming after an extended pause - send_timeout 100m; + extraConfig = '' + #Some players don't reopen a socket and playback stops totally instead of resuming after an extended pause + send_timeout 100m; - # Why this is important: https://blog.cloudflare.com/ocsp-stapling-how-cloudflare-just-made-ssl-30/ - ssl_stapling on; - ssl_stapling_verify on; + # Why this is important: https://blog.cloudflare.com/ocsp-stapling-how-cloudflare-just-made-ssl-30/ + ssl_stapling on; + ssl_stapling_verify on; - ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - ssl_prefer_server_ciphers on; - #Intentionally not hardened for security for player support and encryption video streams has a lot of overhead with something like AES-256-GCM-SHA384. - ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_prefer_server_ciphers on; + #Intentionally not hardened for security for player support and encryption video streams has a lot of overhead with something like AES-256-GCM-SHA384. + ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; - # Forward real ip and host to Plex - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Host $server_addr; - proxy_set_header Referer $server_addr; - proxy_set_header Origin $server_addr; + # Forward real ip and host to Plex + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $server_addr; + proxy_set_header Referer $server_addr; + proxy_set_header Origin $server_addr; - # Nginx default client_max_body_size is 1MB, which breaks Camera Upload feature from the phones. - # Increasing the limit fixes the issue. Anyhow, if 4K videos are expected to be uploaded, the size might need to be increased even more - client_max_body_size 100M; + # Nginx default client_max_body_size is 1MB, which breaks Camera Upload feature from the phones. + # Increasing the limit fixes the issue. Anyhow, if 4K videos are expected to be uploaded, the size might need to be increased even more + client_max_body_size 100M; - # Plex headers - proxy_set_header X-Plex-Client-Identifier $http_x_plex_client_identifier; - proxy_set_header X-Plex-Device $http_x_plex_device; - proxy_set_header X-Plex-Device-Name $http_x_plex_device_name; - proxy_set_header X-Plex-Platform $http_x_plex_platform; - proxy_set_header X-Plex-Platform-Version $http_x_plex_platform_version; - proxy_set_header X-Plex-Product $http_x_plex_product; - proxy_set_header X-Plex-Token $http_x_plex_token; - proxy_set_header X-Plex-Version $http_x_plex_version; - proxy_set_header X-Plex-Nocache $http_x_plex_nocache; - proxy_set_header X-Plex-Provides $http_x_plex_provides; - proxy_set_header X-Plex-Device-Vendor $http_x_plex_device_vendor; - proxy_set_header X-Plex-Model $http_x_plex_model; + # Plex headers + proxy_set_header X-Plex-Client-Identifier $http_x_plex_client_identifier; + proxy_set_header X-Plex-Device $http_x_plex_device; + proxy_set_header X-Plex-Device-Name $http_x_plex_device_name; + proxy_set_header X-Plex-Platform $http_x_plex_platform; + proxy_set_header X-Plex-Platform-Version $http_x_plex_platform_version; + proxy_set_header X-Plex-Product $http_x_plex_product; + proxy_set_header X-Plex-Token $http_x_plex_token; + proxy_set_header X-Plex-Version $http_x_plex_version; + proxy_set_header X-Plex-Nocache $http_x_plex_nocache; + proxy_set_header X-Plex-Provides $http_x_plex_provides; + proxy_set_header X-Plex-Device-Vendor $http_x_plex_device_vendor; + proxy_set_header X-Plex-Model $http_x_plex_model; - # Buffering off send to the client as soon as the data is received from Plex. - proxy_redirect off; - proxy_buffering off; - ''; - locations."/" = { + # Buffering off send to the client as soon as the data is received from Plex. + proxy_redirect off; + proxy_buffering off; + ''; + locations."/" = { - proxyWebsockets = true; - proxyPass = "http://plex2.hades:32400/"; + proxyWebsockets = true; + proxyPass = "http://plex2.hades:32400/"; + }; }; + + "fedi.xirion.net" = { + enableACME = true; + forceSSL = true; + + root = "${pkgs.v.glitch-soc}/public/"; + locations = { + "/".tryFiles = "$uri @proxy"; + + # location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) { + # add_header Cache-Control "public, max-age=31536000, immutable"; + # add_header Strict-Transport-Security "max-age=31536000"; + # try_files $uri @proxy; + # } + + # location /sw.js { + # add_header Cache-Control "public, max-age=0"; + # add_header Strict-Transport-Security "max-age=31536000"; + # try_files $uri @proxy; + # } + + "@proxy" = { + proxyPass = "http://192.168.0.138:55001"; + proxyWebsockets = true; + }; + + "/api/v1/streaming" = { + proxyPass = "http://192.168.0.138:55000"; + proxyWebsockets = true; + }; + }; + }; + + "fedi-media.xirion.net" = proxy "http://garage.hades:3902"; }; - - virtualHosts."fedi.xirion.net" = { - enableACME = true; - forceSSL = true; - - root = "${pkgs.v.glitch-soc}/public/"; - locations."/".tryFiles = "$uri @proxy"; - - # location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) { - # add_header Cache-Control "public, max-age=31536000, immutable"; - # add_header Strict-Transport-Security "max-age=31536000"; - # try_files $uri @proxy; - # } - - # location /sw.js { - # add_header Cache-Control "public, max-age=0"; - # add_header Strict-Transport-Security "max-age=31536000"; - # try_files $uri @proxy; - # } - - locations."@proxy" = { - proxyPass = "http://192.168.0.138:55001"; - proxyWebsockets = true; - }; - - locations."/api/v1/streaming" = { - proxyPass = "http://192.168.0.138:55000"; - proxyWebsockets = true; - }; - }; - - virtualHosts."fedi-media.xirion.net" = proxy "http://garage.hades:3902"; }; } diff --git a/nixos/hosts/hades/pmm/configuration.nix b/nixos/hosts/hades/pmm/configuration.nix index 0e079e8..3d9cc03 100644 --- a/nixos/hosts/hades/pmm/configuration.nix +++ b/nixos/hosts/hades/pmm/configuration.nix @@ -14,7 +14,8 @@ let -v "/etc/pmm/TVShows.yml:/config/TVShows.yml:ro" \ ${container} --run ''; -in { +in +{ imports = [ ]; # This value determines the NixOS release from which the default diff --git a/nixos/hosts/hades/rtorrent/configuration.nix b/nixos/hosts/hades/rtorrent/configuration.nix index 865654d..9161ccd 100644 --- a/nixos/hosts/hades/rtorrent/configuration.nix +++ b/nixos/hosts/hades/rtorrent/configuration.nix @@ -21,27 +21,29 @@ in { vault-secrets.secrets.rtorrent = { services = [ "wg-quick-wg0" ]; }; # Mullvad VPN - networking.wg-quick.interfaces = let - postUpScript = pkgs.writeScriptBin "post_up" '' - #!${pkgs.stdenv.shell} - ${pkgs.iproute2}/bin/ip route add 10.42.42.0/23 via 192.168.0.1 - ${pkgs.iproute2}/bin/ip route add 10.100.0.0/24 via 192.168.0.1 - ''; - in { - wg0 = { - address = [ "10.66.153.191/32" "fc00:bbbb:bbbb:bb01::3:99be/128" ]; - dns = [ "10.64.0.1" ]; - privateKeyFile = "${vs.rtorrent}/wireguardKey"; - postUp = "${postUpScript}/bin/post_up || true"; + networking.wg-quick.interfaces = + let + postUpScript = pkgs.writeScriptBin "post_up" '' + #!${pkgs.stdenv.shell} + ${pkgs.iproute2}/bin/ip route add 10.42.42.0/23 via 192.168.0.1 + ${pkgs.iproute2}/bin/ip route add 10.100.0.0/24 via 192.168.0.1 + ''; + in + { + wg0 = { + address = [ "10.66.153.191/32" "fc00:bbbb:bbbb:bb01::3:99be/128" ]; + dns = [ "10.64.0.1" ]; + privateKeyFile = "${vs.rtorrent}/wireguardKey"; + postUp = "${postUpScript}/bin/post_up || true"; - peers = [ - { - publicKey = "HQHCrq4J6bSpdW1fI5hR/bvcrYa6HgGgwaa5ZY749ik="; - allowedIPs = [ "0.0.0.0/0" "::/0"]; - endpoint = "185.213.155.73:51820"; - # persistentKeepalive = 25; - } - ]; + peers = [ + { + publicKey = "HQHCrq4J6bSpdW1fI5hR/bvcrYa6HgGgwaa5ZY749ik="; + allowedIPs = [ "0.0.0.0/0" "::/0" ]; + endpoint = "185.213.155.73:51820"; + # persistentKeepalive = 25; + } + ]; + }; }; - }; } diff --git a/nixos/hosts/hades/rtorrent/rtorrent.nix b/nixos/hosts/hades/rtorrent/rtorrent.nix index 2aa3750..4d72160 100644 --- a/nixos/hosts/hades/rtorrent/rtorrent.nix +++ b/nixos/hosts/hades/rtorrent/rtorrent.nix @@ -4,112 +4,113 @@ port = 54945; # Port Forwarded in mullvad downloadDir = "/mnt/storage/torrents/r"; package = pkgs.jesec-rtorrent; - configText = let cfg = config.services.rtorrent; - in pkgs.lib.mkForce '' - # rTorrent runtime directory (cfg.basedir) [default: "$HOME/.local/share/rtorrent"] - method.insert = cfg.basedir, private|const|string, (cat,"${cfg.dataDir}/") + configText = + let cfg = config.services.rtorrent; + in pkgs.lib.mkForce '' + # rTorrent runtime directory (cfg.basedir) [default: "$HOME/.local/share/rtorrent"] + method.insert = cfg.basedir, private|const|string, (cat,"${cfg.dataDir}/") - # Default download directory (cfg.download) [default: "$(cfg.basedir)/download"] - method.insert = cfg.download, private|const|string, (cat,"${cfg.downloadDir}") + # Default download directory (cfg.download) [default: "$(cfg.basedir)/download"] + method.insert = cfg.download, private|const|string, (cat,"${cfg.downloadDir}") - # RPC Socket - method.insert = cfg.rpcsock, private|const|string, (cat,"${cfg.rpcSocket}") + # RPC Socket + method.insert = cfg.rpcsock, private|const|string, (cat,"${cfg.rpcSocket}") - # Log directory (cfg.logs) [default: "$(cfg.basedir)/log"] - method.insert = cfg.logs, private|const|string, (cat,(cfg.basedir),"log/") - method.insert = cfg.logfile, private|const|string, (cat,(cfg.logs),"rtorrent-",(system.time),".log") + # Log directory (cfg.logs) [default: "$(cfg.basedir)/log"] + method.insert = cfg.logs, private|const|string, (cat,(cfg.basedir),"log/") + method.insert = cfg.logfile, private|const|string, (cat,(cfg.logs),"rtorrent-",(system.time),".log") - # Torrent session directory (cfg.session) [default: "$(cfg.basedir)/.session"] - method.insert = cfg.session, private|const|string, (cat,(cfg.basedir),".session/") + # Torrent session directory (cfg.session) [default: "$(cfg.basedir)/.session"] + method.insert = cfg.session, private|const|string, (cat,(cfg.basedir),".session/") - # Watch (drop to add) directories (cfg.watch) [default: "$(cfg.basedir)/watch"] - method.insert = cfg.watch, private|const|string, (cat,(cfg.basedir),"watch/") + # Watch (drop to add) directories (cfg.watch) [default: "$(cfg.basedir)/watch"] + method.insert = cfg.watch, private|const|string, (cat,(cfg.basedir),"watch/") - # Create directories - fs.mkdir.recursive = (cat,(cfg.basedir)) + # Create directories + fs.mkdir.recursive = (cat,(cfg.basedir)) - fs.mkdir = (cat,(cfg.download)) - fs.mkdir = (cat,(cfg.logs)) - fs.mkdir = (cat,(cfg.session)) + fs.mkdir = (cat,(cfg.download)) + fs.mkdir = (cat,(cfg.logs)) + fs.mkdir = (cat,(cfg.session)) - fs.mkdir = (cat,(cfg.watch)) - fs.mkdir = (cat,(cfg.watch),"/load") - fs.mkdir = (cat,(cfg.watch),"/start") + fs.mkdir = (cat,(cfg.watch)) + fs.mkdir = (cat,(cfg.watch),"/load") + fs.mkdir = (cat,(cfg.watch),"/start") - # Drop to "$(cfg.watch)/load" to add torrent - schedule2 = watch_load, 11, 10, ((load.verbose, (cat, (cfg.watch), "load/*.torrent"))) + # Drop to "$(cfg.watch)/load" to add torrent + schedule2 = watch_load, 11, 10, ((load.verbose, (cat, (cfg.watch), "load/*.torrent"))) - # Drop to "$(cfg.watch)/start" to add torrent and start downloading - schedule2 = watch_start, 10, 10, ((load.start_verbose, (cat, (cfg.watch), "start/*.torrent"))) + # Drop to "$(cfg.watch)/start" to add torrent and start downloading + schedule2 = watch_start, 10, 10, ((load.start_verbose, (cat, (cfg.watch), "start/*.torrent"))) - # Listening port for incoming peer traffic - network.port_range.set = ${toString cfg.port}-${toString cfg.port} - network.port_random.set = no + # Listening port for incoming peer traffic + network.port_range.set = ${toString cfg.port}-${toString cfg.port} + network.port_random.set = no - # Distributed Hash Table and Peer EXchange - dht.mode.set = disable - dht.port.set = 6881 - protocol.pex.set = yes + # Distributed Hash Table and Peer EXchange + dht.mode.set = disable + dht.port.set = 6881 + protocol.pex.set = yes - # UDP tracker support - trackers.use_udp.set = yes + # UDP tracker support + trackers.use_udp.set = yes - # Peer settings - throttle.max_uploads.set = 100 - throttle.max_uploads.global.set = 250 - throttle.min_peers.normal.set = 20 - throttle.max_peers.normal.set = 60 - throttle.min_peers.seed.set = 30 - throttle.max_peers.seed.set = 80 - trackers.numwant.set = 80 + # Peer settings + throttle.max_uploads.set = 100 + throttle.max_uploads.global.set = 250 + throttle.min_peers.normal.set = 20 + throttle.max_peers.normal.set = 60 + throttle.min_peers.seed.set = 30 + throttle.max_peers.seed.set = 80 + trackers.numwant.set = 80 - protocol.encryption.set = allow_incoming,try_outgoing,enable_retry + protocol.encryption.set = allow_incoming,try_outgoing,enable_retry - # Limits for file handle resources, this is optimized for - # an `ulimit` of 1024 (a common default). You MUST leave - # a ceiling of handles reserved for rTorrent's internal needs! - network.max_open_files.set = 600 - network.max_open_sockets.set = 300 + # Limits for file handle resources, this is optimized for + # an `ulimit` of 1024 (a common default). You MUST leave + # a ceiling of handles reserved for rTorrent's internal needs! + network.max_open_files.set = 600 + network.max_open_sockets.set = 300 - # Memory resource usage (increase if you have a large number of items loaded, - # and/or the available resources to spend) - pieces.memory.max.set = 1800M - network.xmlrpc.size_limit.set = 32M + # Memory resource usage (increase if you have a large number of items loaded, + # and/or the available resources to spend) + pieces.memory.max.set = 1800M + network.xmlrpc.size_limit.set = 32M - # Basic operational settings - session.path.set = (cat, (cfg.session)) - directory.default.set = (cat, (cfg.download)) - log.execute = (cat, (cfg.logs), "execute.log") + # Basic operational settings + session.path.set = (cat, (cfg.session)) + directory.default.set = (cat, (cfg.download)) + log.execute = (cat, (cfg.logs), "execute.log") - # Other operational settings - encoding.add = utf8 - system.umask.set = 0027 - system.cwd.set = (directory.default) - #schedule2 = low_diskspace, 5, 60, ((close_low_diskspace, 500M)) - #pieces.hash.on_completion.set = no + # Other operational settings + encoding.add = utf8 + system.umask.set = 0027 + system.cwd.set = (directory.default) + #schedule2 = low_diskspace, 5, 60, ((close_low_diskspace, 500M)) + #pieces.hash.on_completion.set = no - # HTTP and SSL - network.http.max_open.set = 50 - network.http.dns_cache_timeout.set = 25 + # HTTP and SSL + network.http.max_open.set = 50 + network.http.dns_cache_timeout.set = 25 - #network.http.ssl_verify_peer.set = 1 - #network.http.ssl_verify_host.set = 1 + #network.http.ssl_verify_peer.set = 1 + #network.http.ssl_verify_host.set = 1 - # Run the rTorrent process as a daemon in the background - system.daemon.set = true + # Run the rTorrent process as a daemon in the background + system.daemon.set = true - # XML-RPC interface - network.scgi.open_local = (cat,(cfg.rpcsock)) - schedule = scgi_group,0,0,"execute.nothrow=chown,\":rtorrent\",(cfg.rpcsock)" - schedule = scgi_permission,0,0,"execute.nothrow=chmod,\"g+w,o=\",(cfg.rpcsock)" + # XML-RPC interface + network.scgi.open_local = (cat,(cfg.rpcsock)) + schedule = scgi_group,0,0,"execute.nothrow=chown,\":rtorrent\",(cfg.rpcsock)" + schedule = scgi_permission,0,0,"execute.nothrow=chmod,\"g+w,o=\",(cfg.rpcsock)" - # Logging: - # Levels = critical error warn notice info debug - # Groups = connection_* dht_* peer_* rpc_* storage_* thread_* tracker_* torrent_* - print = (cat, "Logging to ", (cfg.logfile)) - log.open_file = "log", (cfg.logfile) - log.add_output = "debug", "log" - ''; + # Logging: + # Levels = critical error warn notice info debug + # Groups = connection_* dht_* peer_* rpc_* storage_* thread_* tracker_* torrent_* + print = (cat, "Logging to ", (cfg.logfile)) + log.open_file = "log", (cfg.logfile) + log.add_output = "debug", "log" + ''; }; } diff --git a/nixos/hosts/hades/unifi/configuration.nix b/nixos/hosts/hades/unifi/configuration.nix index 7659d41..ef1aaec 100644 --- a/nixos/hosts/hades/unifi/configuration.nix +++ b/nixos/hosts/hades/unifi/configuration.nix @@ -1,4 +1,4 @@ -{ pkgs, lib, pkgs_stable,... }: { +{ pkgs, lib, pkgs_stable, ... }: { system.stateVersion = "21.05"; networking.interfaces.eth0.useDHCP = true; diff --git a/nixos/hosts/olympus/bastion/configuration.nix b/nixos/hosts/olympus/bastion/configuration.nix index 8127348..e306326 100644 --- a/nixos/hosts/olympus/bastion/configuration.nix +++ b/nixos/hosts/olympus/bastion/configuration.nix @@ -17,7 +17,8 @@ let done fi ''; -in { +in +{ imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix diff --git a/nixos/hosts/olympus/bastion/hardware-configuration.nix b/nixos/hosts/olympus/bastion/hardware-configuration.nix index dec70cc..be7d992 100644 --- a/nixos/hosts/olympus/bastion/hardware-configuration.nix +++ b/nixos/hosts/olympus/bastion/hardware-configuration.nix @@ -5,12 +5,14 @@ { imports = [ (modulesPath + "/profiles/qemu-guest.nix") ]; + boot = { - boot.initrd.availableKernelModules = - [ "ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod" ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ ]; - boot.extraModulePackages = [ ]; + initrd.availableKernelModules = + [ "ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod" ]; + initrd.kernelModules = [ ]; + kernelModules = [ ]; + extraModulePackages = [ ]; + }; fileSystems."/" = { device = "/dev/disk/by-uuid/e8427097-8545-4924-b033-2659fcf9adca"; diff --git a/nixos/hosts/olympus/dex/configuration.nix b/nixos/hosts/olympus/dex/configuration.nix index aa934bb..af043f4 100644 --- a/nixos/hosts/olympus/dex/configuration.nix +++ b/nixos/hosts/olympus/dex/configuration.nix @@ -9,7 +9,8 @@ let db_name = "dex"; inherit (config.meta.exposes.dex) port; metricsPort = 5558; -in { +in +{ imports = [ ]; # This value determines the NixOS release from which the default diff --git a/nixos/hosts/olympus/dhcp/configuration.nix b/nixos/hosts/olympus/dhcp/configuration.nix index daf061a..30aab23 100644 --- a/nixos/hosts/olympus/dhcp/configuration.nix +++ b/nixos/hosts/olympus/dhcp/configuration.nix @@ -9,8 +9,9 @@ let localDomain = config.networking.domain; hosts = filter (h: hasAttr "ip" h && hasAttr "mac" h && h.realm == localDomain) - flat_hosts; -in { + flat_hosts; +in +{ networking = { defaultGateway = "10.42.42.1"; nameservers = [ "10.42.42.15" "10.42.42.16" ]; diff --git a/nixos/hosts/olympus/eevee/hardware-configuration.nix b/nixos/hosts/olympus/eevee/hardware-configuration.nix index 4082fde..efc7707 100644 --- a/nixos/hosts/olympus/eevee/hardware-configuration.nix +++ b/nixos/hosts/olympus/eevee/hardware-configuration.nix @@ -5,12 +5,14 @@ { imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; + boot = { - boot.initrd.availableKernelModules = - [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ "kvm-intel" ]; - boot.extraModulePackages = [ ]; + initrd.availableKernelModules = + [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ]; + initrd.kernelModules = [ ]; + kernelModules = [ "kvm-intel" ]; + extraModulePackages = [ ]; + }; fileSystems."/" = { device = "/dev/disk/by-uuid/947a98af-9a4e-4811-a2ca-9aa00b319e9c"; diff --git a/nixos/hosts/olympus/eevee/hardware.nix b/nixos/hosts/olympus/eevee/hardware.nix index 37c1a85..422c10a 100644 --- a/nixos/hosts/olympus/eevee/hardware.nix +++ b/nixos/hosts/olympus/eevee/hardware.nix @@ -1,42 +1,46 @@ { pkgs, config, ... }: { - hardware.enableAllFirmware = true; + hardware = { + enableAllFirmware = true; + nvidia = { + package = config.boot.kernelPackages.nvidiaPackages.stable; - services.hardware.bolt.enable = true; + # Open drivers cause gdm to crash + # open = true; - services.xserver.videoDrivers = [ "nvidia" ]; - hardware.nvidia = { - package = config.boot.kernelPackages.nvidiaPackages.stable; + # nvidia-drm.modeset=1 + modesetting.enable = true; + }; - # Open drivers cause gdm to crash - # open = true; + # Hardware acceleration + opengl = { + enable = true; - # nvidia-drm.modeset=1 - modesetting.enable = true; + # Vulkan + driSupport = true; + }; + + logitech.wireless = { + enable = true; + enableGraphical = true; + }; }; + services = { - # Hardware acceleration - hardware.opengl = { - enable = true; + hardware.bolt.enable = true; - # Vulkan - driSupport = true; + xserver.videoDrivers = [ "nvidia" ]; + + # udev + udev.packages = with pkgs; [ + android-udev-rules + logitech-udev-rules + wooting-udev-rules + ]; + + # SSD Trim + fstrim.enable = true; }; - hardware.logitech.wireless = { - enable = true; - enableGraphical = true; - }; - - # udev - services.udev.packages = with pkgs; [ - android-udev-rules - logitech-udev-rules - wooting-udev-rules - ]; - # FS fileSystems."/".options = [ "compress=zstd" ]; - - # SSD Trim - services.fstrim.enable = true; } diff --git a/nixos/hosts/olympus/gitea/configuration.nix b/nixos/hosts/olympus/gitea/configuration.nix index 9deb583..fd471d3 100644 --- a/nixos/hosts/olympus/gitea/configuration.nix +++ b/nixos/hosts/olympus/gitea/configuration.nix @@ -6,7 +6,8 @@ let vs = config.vault-secrets.secrets; inherit (config.meta.exposes.git) port; -in { +in +{ imports = [ ]; # This value determines the NixOS release from which the default @@ -23,12 +24,71 @@ in { environment.noXlibs = lib.mkForce false; networking.firewall.allowedTCPPorts = [ port ]; + services = { - services.openssh.startWhenNeeded = false; + openssh.startWhenNeeded = false; - services.fail2ban = { - enable = true; - maxretry = 3; + fail2ban = { + enable = true; + maxretry = 3; + }; + + gitea = { + enable = true; + package = pkgs.forgejo; + lfs.enable = true; + dump.type = "tar.gz"; + database.type = "postgres"; + mailerPasswordFile = "${vs.gitea}/mailPassword"; + + settings = { + default.WORK_PATH = "/var/lib/gitea"; + actions = { "ENABLED" = true; }; + repository = { + "ENABLE_PUSH_CREATE_USER" = true; + "DEFAULT_PUSH_CREATE_PRIVATE" = false; + }; + service = { + "DEFAULT_KEEP_EMAIL_PRIVATE" = true; + "DISABLE_REGISTRATION" = true; + }; + indexer = { + "REPO_INDEXER_ENABLED" = true; + "REPO_INDEXER_PATH" = "indexers/repos.bleve"; + "MAX_FILE_SIZE" = 1048576; + "REPO_INDEXER_EXCLUDE" = "node_modules/**"; + }; + ui = { + "THEMES" = "forgejo-auto,forgejo-light,forgejo-dark,auto,gitea,arc-green,agatheme"; + "DEFAULT_THEME" = "forgejo-auto"; + "USE_SERVICE_WORKER" = true; + }; + server = { + LANDING_PAGE = "explore"; + SSH_PORT = 42; + DOMAIN = "git.0x76.dev"; + ROOT_URL = "https://git.0x76.dev"; + HTTP_PORT = port; + }; + session = { + "PROVIDER" = "db"; + "COOKIE_SECURE" = true; + }; + mailer = { + "ENABLED" = true; + # "IS_TLS_ENABLED" = true; + # "HOST" = "mail.0x76.dev:465"; + "FROM" = "gitea@0x76.dev"; + # "MAILER_TYPE" = "smtp"; + "USER" = "gitea@0x76.dev"; + + # Below is prep for 1.18 + "PROTOCOL" = "smtps"; + "SMTP_ADDR" = "mail.0x76.dev"; + "SMTP_PORT" = 465; + }; + }; + }; }; vault-secrets.secrets.gitea = { @@ -42,61 +102,4 @@ in { mkdir -p ${target_dir} ln -sf ${pkgs.v.gitea-agatheme} "${target_dir}/theme-agatheme.css" ''; - - services.gitea = { - enable = true; - package = pkgs.forgejo; - lfs.enable = true; - dump.type = "tar.gz"; - database.type = "postgres"; - mailerPasswordFile = "${vs.gitea}/mailPassword"; - - settings = { - default.WORK_PATH = "/var/lib/gitea"; - actions = { "ENABLED" = true; }; - repository = { - "ENABLE_PUSH_CREATE_USER" = true; - "DEFAULT_PUSH_CREATE_PRIVATE" = false; - }; - service = { - "DEFAULT_KEEP_EMAIL_PRIVATE" = true; - "DISABLE_REGISTRATION" = true; - }; - indexer = { - "REPO_INDEXER_ENABLED" = true; - "REPO_INDEXER_PATH" = "indexers/repos.bleve"; - "MAX_FILE_SIZE" = 1048576; - "REPO_INDEXER_EXCLUDE" = "node_modules/**"; - }; - ui = { - "THEMES" = "forgejo-auto,forgejo-light,forgejo-dark,auto,gitea,arc-green,agatheme"; - "DEFAULT_THEME" = "forgejo-auto"; - "USE_SERVICE_WORKER" = true; - }; - server = { - LANDING_PAGE = "explore"; - SSH_PORT = 42; - DOMAIN = "git.0x76.dev"; - ROOT_URL = "https://git.0x76.dev"; - HTTP_PORT = port; - }; - session = { - "PROVIDER" = "db"; - "COOKIE_SECURE" = true; - }; - mailer = { - "ENABLED" = true; - # "IS_TLS_ENABLED" = true; - # "HOST" = "mail.0x76.dev:465"; - "FROM" = "gitea@0x76.dev"; - # "MAILER_TYPE" = "smtp"; - "USER" = "gitea@0x76.dev"; - - # Below is prep for 1.18 - "PROTOCOL" = "smtps"; - "SMTP_ADDR" = "mail.0x76.dev"; - "SMTP_PORT" = 465; - }; - }; - }; } diff --git a/nixos/hosts/olympus/hedgedoc/configuration.nix b/nixos/hosts/olympus/hedgedoc/configuration.nix index 1b92dc5..4525e08 100644 --- a/nixos/hosts/olympus/hedgedoc/configuration.nix +++ b/nixos/hosts/olympus/hedgedoc/configuration.nix @@ -8,7 +8,8 @@ let db_user = "hedgedoc"; inherit (config.meta.exposes.md) port; vs = config.vault-secrets.secrets; -in { +in +{ imports = [ ]; # This value determines the NixOS release from which the default @@ -67,19 +68,20 @@ in { secretKey = "$MINIO_SECRET_KEY"; }; email = false; - oauth2 = let url = "https://dex.0x76.dev"; - in { - providerName = "Dex"; - clientID = "hedgedoc"; - clientSecret = "$DEX_CLIENT_SECRET"; - scope = "openid email profile"; - authorizationURL = "${url}/auth"; - tokenURL = "${url}/token"; - userProfileURL = "${url}/userinfo"; - userProfileUsernameAttr = "preferred_username"; - userProfileDisplayNameAttr = "name"; - userProfileEmailAttr = "email"; - }; + oauth2 = + let url = "https://dex.0x76.dev"; + in { + providerName = "Dex"; + clientID = "hedgedoc"; + clientSecret = "$DEX_CLIENT_SECRET"; + scope = "openid email profile"; + authorizationURL = "${url}/auth"; + tokenURL = "${url}/token"; + userProfileURL = "${url}/userinfo"; + userProfileUsernameAttr = "preferred_username"; + userProfileDisplayNameAttr = "name"; + userProfileEmailAttr = "email"; + }; }; }; } diff --git a/nixos/hosts/olympus/mailserver/configuration.nix b/nixos/hosts/olympus/mailserver/configuration.nix index fd6ca36..da3ce19 100644 --- a/nixos/hosts/olympus/mailserver/configuration.nix +++ b/nixos/hosts/olympus/mailserver/configuration.nix @@ -97,48 +97,50 @@ in { autoIndexExclude = [ "\\Junk" ]; }; }; + services = { - services.postfix.relayHost = "smtp.ziggozakelijk.nl"; - services.postfix.relayPort = 587; + postfix.relayHost = "smtp.ziggozakelijk.nl"; + postfix.relayPort = 587; - services.roundcube = { - enable = true; - package = pkgs.roundcube.withPlugins - (plugins: [ plugins.persistent_login pkgs.v.roundcube-swipe ]); - plugins = [ - "archive" - "managesieve" - "swipe" - # "enigma" - # "markasjunk" - "persistent_login" - ]; - # this is the url of the vhost, not necessarily the same as the fqdn of - # the mailserver - hostName = "webmail.0x76.dev"; - extraConfig = '' - # starttls needed for authentication, so the fqdn required to match - # the certificate - $config['smtp_host'] = "tls://${config.mailserver.fqdn}"; - $config['smtp_user'] = "%u"; - $config['smtp_pass'] = "%p"; - - $config['swipe_actions'] = [ - 'messagelist' => [ - 'left' => 'archive', - 'right' => 'archive', - 'down' => 'none' - ], - 'contactlist' => [ - 'left' => 'none', - 'right' => 'none', - 'down' => 'none' - ] + roundcube = { + enable = true; + package = pkgs.roundcube.withPlugins + (plugins: [ plugins.persistent_login pkgs.v.roundcube-swipe ]); + plugins = [ + "archive" + "managesieve" + "swipe" + # "enigma" + # "markasjunk" + "persistent_login" ]; - ''; - }; + # this is the url of the vhost, not necessarily the same as the fqdn of + # the mailserver + hostName = "webmail.0x76.dev"; + extraConfig = '' + # starttls needed for authentication, so the fqdn required to match + # the certificate + $config['smtp_host'] = "tls://${config.mailserver.fqdn}"; + $config['smtp_user'] = "%u"; + $config['smtp_pass'] = "%p"; - services.nginx = { enable = true; }; + $config['swipe_actions'] = [ + 'messagelist' => [ + 'left' => 'archive', + 'right' => 'archive', + 'down' => 'none' + ], + 'contactlist' => [ + 'left' => 'none', + 'right' => 'none', + 'down' => 'none' + ] + ]; + ''; + }; + + nginx = { enable = true; }; + }; security.acme.acceptTerms = true; security.acme.defaults.email = "v@0x76.dev"; diff --git a/nixos/hosts/olympus/minio/configuration.nix b/nixos/hosts/olympus/minio/configuration.nix index 5a05fb7..1e4ffb8 100644 --- a/nixos/hosts/olympus/minio/configuration.nix +++ b/nixos/hosts/olympus/minio/configuration.nix @@ -7,7 +7,8 @@ let vs = config.vault-secrets.secrets; listenPort = config.meta.exposes.minio.port; consolePort = listenPort + 1; -in { +in +{ imports = [ ]; # This value determines the NixOS release from which the default diff --git a/nixos/hosts/olympus/nginx/configuration.nix b/nixos/hosts/olympus/nginx/configuration.nix index 83076ac..fed28fe 100644 --- a/nixos/hosts/olympus/nginx/configuration.nix +++ b/nixos/hosts/olympus/nginx/configuration.nix @@ -13,7 +13,8 @@ let add_header Access-Control-Allow-Origin *; return 200 '${builtins.toJSON data}'; ''; -in { +in +{ # This value determines the NixOS release from which the default # settings for stateful data, like file locations and database versions # on your system were taken. It‘s perfectly fine and recommended to leave @@ -23,115 +24,127 @@ in { system.stateVersion = "21.05"; # Did you read the comment? networking.firewall.allowedTCPPorts = [ 80 443 ]; + services = { - # Generates vhosts for all hosts that have an `exposes` section - services.v.nginx.autoExpose = true; + # Generates vhosts for all hosts that have an `exposes` section + v.nginx.autoExpose = true; - services.nginx = { - enable = true; - statusPage = true; - recommendedProxySettings = true; - recommendedTlsSettings = true; - recommendedOptimisation = true; - recommendedBrotliSettings = true; - clientMaxBodySize = "500m"; + nginx = { + enable = true; + statusPage = true; + recommendedProxySettings = true; + recommendedTlsSettings = true; + recommendedOptimisation = true; + recommendedBrotliSettings = true; + clientMaxBodySize = "500m"; - package = pkgs.nginxMainline; + package = pkgs.nginxMainline; - # Templated - virtualHosts = { - "pass.0x76.dev" = { - enableACME = true; - forceSSL = true; - locations."/" = { - proxyPass = "http://vaultwarden.olympus:8222"; - proxyWebsockets = true; - }; - locations."/notifications/hub/negotiate" = { - proxyPass = "http://vaultwarden.olympus:8222"; - proxyWebsockets = true; - }; - locations."/notifications/hub" = { - proxyPass = "http://vaultwarden.olympus:3012"; - proxyWebsockets = true; - }; - }; + # Templated + virtualHosts = { + "pass.0x76.dev" = { + enableACME = true; + forceSSL = true; + locations = { - # Meow - "meowy.tech" = { - enableACME = true; - forceSSL = true; - locations."/".extraConfig = '' - add_header Content-Type 'text/html; charset=UTF-8'; - return 200 '

meow

'; - ''; - locations."= /.well-known/matrix/client".extraConfig = - mkWellKnown clientConfig; - locations."= /.well-known/matrix/server".extraConfig = - mkWellKnown serverConfig; - }; - "chat.meowy.tech" = { - enableACME = true; - forceSSL = true; - locations."/".extraConfig = '' - return 307 https://element.chat.meowy.tech; - ''; - locations."/_matrix".proxyPass = "http://synapse.olympus:8008"; - locations."/_synapse/client".proxyPass = "http://synapse.olympus:8008"; - locations."/_synapse/admin" = { - # Allow only local and my own IPs - extraConfig = '' - allow 127.0.0.1; - allow 10.42.42.0/23; - allow 192.168.0.0/23; - allow 80.60.83.220; - allow 83.128.154.23; - allow 195.85.167.32/29; - deny all; - ''; - proxyPass = "http://synapse.olympus:8008"; - }; - }; - "element.chat.meowy.tech" = { - enableACME = true; - forceSSL = true; + "/".proxyPass = "http://vaultwarden.olympus:8222"; + "/".proxyWebsockets = true; - root = pkgs.element-web.override { - conf = { - default_server_config = clientConfig; - show_labs_settings = true; - brand = "chat.meowy.tech"; + "/notifications/hub/negotiate" = { + proxyPass = "http://vaultwarden.olympus:8222"; + proxyWebsockets = true; + }; + "/notifications/hub" = { + proxyPass = "http://vaultwarden.olympus:3012"; + proxyWebsockets = true; + }; }; }; - }; - "cinny.chat.meowy.tech" = { - enableACME = true; - forceSSL = true; - root = pkgs.cinny.override { - conf = { - defaultHomeserver = 0; - allowCustomHomeservers = false; - homeserverList = [ "chat.meowy.tech" ]; + # Meow + "meowy.tech" = { + enableACME = true; + forceSSL = true; + locations = { + "/".extraConfig = '' + add_header Content-Type 'text/html; charset=UTF-8'; + return 200 '

meow

'; + ''; + "= /.well-known/matrix/client".extraConfig = + mkWellKnown clientConfig; + "= /.well-known/matrix/server".extraConfig = + mkWellKnown serverConfig; }; }; + "chat.meowy.tech" = { + enableACME = true; + forceSSL = true; + locations = { + "/".extraConfig = '' + return 307 https://element.chat.meowy.tech; + ''; + "/_matrix".proxyPass = "http://synapse.olympus:8008"; + "/_synapse/client".proxyPass = "http://synapse.olympus:8008"; + "/_synapse/admin" = { + # Allow only local and my own IPs + extraConfig = '' + allow 127.0.0.1; + allow 10.42.42.0/23; + allow 192.168.0.0/23; + allow 80.60.83.220; + allow 83.128.154.23; + allow 195.85.167.32/29; + deny all; + ''; + proxyPass = "http://synapse.olympus:8008"; + }; + }; + }; + "element.chat.meowy.tech" = { + enableACME = true; + forceSSL = true; + + root = pkgs.element-web.override { + conf = { + default_server_config = clientConfig; + show_labs_settings = true; + brand = "chat.meowy.tech"; + }; + }; + }; + "cinny.chat.meowy.tech" = { + enableACME = true; + forceSSL = true; + + root = pkgs.cinny.override { + conf = { + defaultHomeserver = 0; + allowCustomHomeservers = false; + homeserverList = [ "chat.meowy.tech" ]; + }; + }; + }; + "admin.chat.meowy.tech" = { + enableACME = true; + forceSSL = true; + root = pkgs.synapse-admin; + }; }; - "admin.chat.meowy.tech" = { - enableACME = true; - forceSSL = true; - root = pkgs.synapse-admin; + }; + + prometheus.exporters = { + nginx = { + enable = true; + openFirewall = true; }; }; }; + security = { + acme = { - security.acme.defaults.email = "victorheld12@gmail.com"; - security.acme.acceptTerms = true; - security.acme.preliminarySelfsigned = true; - - services.prometheus.exporters = { - nginx = { - enable = true; - openFirewall = true; + defaults.email = "victorheld12@gmail.com"; + acceptTerms = true; + preliminarySelfsigned = true; }; }; } diff --git a/nixos/hosts/olympus/ntfy/configuration.nix b/nixos/hosts/olympus/ntfy/configuration.nix index b8ce52e..a20b8d2 100644 --- a/nixos/hosts/olympus/ntfy/configuration.nix +++ b/nixos/hosts/olympus/ntfy/configuration.nix @@ -20,18 +20,19 @@ networking.firewall.allowedTCPPorts = [ 80 9090 ]; - services.ntfy-sh = let datadir = "/var/lib/ntfy-sh"; - in { - enable = true; - settings = { - base-url = "https://ntfy.0x76.dev"; - listen-http = ":80"; - cache-file = "${datadir}/cache.db"; - auth-file = "${datadir}/user.db"; - auth-default-access = "deny-all"; - behind-proxy = true; - attachment-cache-dir = "${datadir}/attachments"; - metrics-listen-http = ":9090"; + services.ntfy-sh = + let datadir = "/var/lib/ntfy-sh"; + in { + enable = true; + settings = { + base-url = "https://ntfy.0x76.dev"; + listen-http = ":80"; + cache-file = "${datadir}/cache.db"; + auth-file = "${datadir}/user.db"; + auth-default-access = "deny-all"; + behind-proxy = true; + attachment-cache-dir = "${datadir}/attachments"; + metrics-listen-http = ":9090"; + }; }; - }; } diff --git a/nixos/hosts/olympus/outline/configuration.nix b/nixos/hosts/olympus/outline/configuration.nix index 43d9e99..7db54e9 100644 --- a/nixos/hosts/olympus/outline/configuration.nix +++ b/nixos/hosts/olympus/outline/configuration.nix @@ -6,7 +6,8 @@ let vs = config.vault-secrets.secrets; inherit (config.meta.exposes.outline) port; -in { +in +{ imports = [ ]; # This value determines the NixOS release from which the default diff --git a/nixos/hosts/olympus/synapse/configuration.nix b/nixos/hosts/olympus/synapse/configuration.nix index 2955960..c2a8708 100644 --- a/nixos/hosts/olympus/synapse/configuration.nix +++ b/nixos/hosts/olympus/synapse/configuration.nix @@ -7,7 +7,8 @@ let vs = config.vault-secrets.secrets; port = 8008; metricsPort = 9000; -in { +in +{ imports = [ ]; # This value determines the NixOS release from which the default @@ -49,60 +50,62 @@ in { "${vs.synapse}/email_password" # Also contains the rest of the email config ]; - settings = let - log_file = pkgs.writeText "log.yml" '' - version: 1 + settings = + let + log_file = pkgs.writeText "log.yml" '' + version: 1 - formatters: - structured: - class: synapse.logging.TerseJsonFormatter + formatters: + structured: + class: synapse.logging.TerseJsonFormatter - handlers: - file: - class: logging.handlers.TimedRotatingFileHandler - formatter: structured - filename: /var/lib/matrix-synapse/synapse.log - when: midnight - backupCount: 3 # Does not include the current log file. - encoding: utf8 + handlers: + file: + class: logging.handlers.TimedRotatingFileHandler + formatter: structured + filename: /var/lib/matrix-synapse/synapse.log + when: midnight + backupCount: 3 # Does not include the current log file. + encoding: utf8 - loggers: - synapse: - level: INFO - handlers: [file] - ''; - in { - server_name = "meowy.tech"; - enable_registration = true; - public_baseurl = "https://chat.meowy.tech"; - enable_metrics = true; - max_upload_size = "100M"; - registration_requires_token = true; - media_retention = { remote_media_lifetime = "90d"; }; - log_config = "${log_file}"; - listeners = [ - { - inherit port; - bind_addresses = [ "0.0.0.0" ]; - type = "http"; - tls = false; - x_forwarded = true; - resources = [{ - names = [ "client" "federation" ]; - compress = true; - }]; - } - { - port = metricsPort; - bind_addresses = [ "0.0.0.0" ]; - type = "metrics"; - tls = false; - resources = [{ - names = [ "metrics" ]; - compress = false; - }]; - } - ]; - }; + loggers: + synapse: + level: INFO + handlers: [file] + ''; + in + { + server_name = "meowy.tech"; + enable_registration = true; + public_baseurl = "https://chat.meowy.tech"; + enable_metrics = true; + max_upload_size = "100M"; + registration_requires_token = true; + media_retention = { remote_media_lifetime = "90d"; }; + log_config = "${log_file}"; + listeners = [ + { + inherit port; + bind_addresses = [ "0.0.0.0" ]; + type = "http"; + tls = false; + x_forwarded = true; + resources = [{ + names = [ "client" "federation" ]; + compress = true; + }]; + } + { + port = metricsPort; + bind_addresses = [ "0.0.0.0" ]; + type = "metrics"; + tls = false; + resources = [{ + names = [ "metrics" ]; + compress = false; + }]; + } + ]; + }; }; } diff --git a/nixos/hosts/olympus/vaultwarden/configuration.nix b/nixos/hosts/olympus/vaultwarden/configuration.nix index f4ae4fd..c3d8997 100644 --- a/nixos/hosts/olympus/vaultwarden/configuration.nix +++ b/nixos/hosts/olympus/vaultwarden/configuration.nix @@ -6,7 +6,8 @@ let vs = config.vault-secrets.secrets; cfg = config.services.vaultwarden.config; -in { +in +{ imports = [ ]; # This value determines the NixOS release from which the default diff --git a/nixos/hosts/olympus/victoriametrics/configuration.nix b/nixos/hosts/olympus/victoriametrics/configuration.nix index 1b88cf5..f565f79 100644 --- a/nixos/hosts/olympus/victoriametrics/configuration.nix +++ b/nixos/hosts/olympus/victoriametrics/configuration.nix @@ -8,7 +8,8 @@ let grafanaDomain = config.meta.exposes.grafana.domain; grafanaPort = config.meta.exposes.grafana.port; vs = config.vault-secrets.secrets; -in { +in +{ imports = [ ]; # This value determines the NixOS release from which the default @@ -20,73 +21,104 @@ in { system.stateVersion = "21.11"; # Did you read the comment? networking.firewall.allowedTCPPorts = [ vmPort grafanaPort ]; networking.firewall.allowedUDPPorts = [ vmPort ]; + services = { - services.victoriametrics = { - enable = true; - listenAddress = ":${toString vmPort}"; - # Data Retention period in months - retentionPeriod = 36; - }; + victoriametrics = { + enable = true; + listenAddress = ":${toString vmPort}"; + # Data Retention period in months + retentionPeriod = 36; + }; + + vmagent = { + enable = true; + openFirewall = true; + prometheusConfig = { + global = { + scrape_interval = "1m"; + scrape_timeout = "30s"; + }; + scrape_configs = [ + { + job_name = "kea"; + static_configs = [{ + targets = [ "dhcp.olympus:9547" ]; + labels.app = "dhcp"; + }]; + } + { + job_name = "nginx"; + static_configs = [{ + targets = [ "nginx.olympus:9113" ]; + labels.app = "nginx"; + }]; + } + { + job_name = "synapse"; + static_configs = [{ + targets = [ "synapse.olympus:9000" ]; + labels.app = "synapse"; + }]; + } + { + job_name = "wireguard"; + static_configs = [{ + targets = [ "wireguard.olympus:9586" ]; + labels.app = "wireguard"; + }]; + } + { + job_name = "ntfy"; + static_configs = [{ + targets = [ "ntfy.olympus:9090" ]; + labels.app = "ntfy"; + }]; + } + { + job_name = "dex"; + static_configs = [{ + targets = [ "dex.olympus:5558" ]; + labels.app = "dex"; + }]; + } + { + job_name = "unbound"; + static_configs = [{ + targets = [ "dns-1.olympus:9167" "dns-2.olympus:9167" ]; + labels.app = "dns"; + }]; + } + ]; + }; + }; + + grafana = { + enable = true; + settings = { + server = { + domain = grafanaDomain; + root_url = "https://${grafanaDomain}"; + http_addr = "0.0.0.0"; + http_port = grafanaPort; + }; + security.admin_password = "$__file{${vs.grafana}/password}"; + + "auth.generic_oauth" = { + name = "Dex"; + icon = "signin"; + enabled = true; + allow_sign_up = true; + client_id = "grafana"; + client_secret = "$__file{${vs.grafana}/dex_client_secret}"; + scopes = toString [ "openid" "profile" "email" "groups" ]; + auth_url = "https://dex.0x76.dev/auth"; + token_url = "https://dex.0x76.dev/token"; + api_url = "https://dex.0x76.dev/userinfo"; + skip_org_role_sync = true; + auto_login = true; + }; - services.vmagent = { - enable = true; - openFirewall = true; - prometheusConfig = { - global = { - scrape_interval = "1m"; - scrape_timeout = "30s"; }; - scrape_configs = [ - { - job_name = "kea"; - static_configs = [{ - targets = [ "dhcp.olympus:9547" ]; - labels.app = "dhcp"; - }]; - } - { - job_name = "nginx"; - static_configs = [{ - targets = [ "nginx.olympus:9113" ]; - labels.app = "nginx"; - }]; - } - { - job_name = "synapse"; - static_configs = [{ - targets = [ "synapse.olympus:9000" ]; - labels.app = "synapse"; - }]; - } - { - job_name = "wireguard"; - static_configs = [{ - targets = [ "wireguard.olympus:9586" ]; - labels.app = "wireguard"; - }]; - } - { - job_name = "ntfy"; - static_configs = [{ - targets = [ "ntfy.olympus:9090"]; - labels.app = "ntfy"; - }]; - } - { - job_name = "dex"; - static_configs = [{ - targets = [ "dex.olympus:5558" ]; - labels.app = "dex"; - }]; - } - { - job_name = "unbound"; - static_configs = [{ - targets = [ "dns-1.olympus:9167" "dns-2.olympus:9167" ]; - labels.app = "dns"; - }]; - } - ]; }; }; @@ -94,33 +126,4 @@ in { user = "grafana"; group = "grafana"; }; - - services.grafana = { - enable = true; - settings = { - server = { - domain = grafanaDomain; - root_url = "https://${grafanaDomain}"; - http_addr = "0.0.0.0"; - http_port = grafanaPort; - }; - security.admin_password = "$__file{${vs.grafana}/password}"; - - "auth.generic_oauth" = { - name = "Dex"; - icon = "signin"; - enabled = true; - allow_sign_up = true; - client_id = "grafana"; - client_secret = "$__file{${vs.grafana}/dex_client_secret}"; - scopes = toString [ "openid" "profile" "email" "groups" ]; - auth_url = "https://dex.0x76.dev/auth"; - token_url = "https://dex.0x76.dev/token"; - api_url = "https://dex.0x76.dev/userinfo"; - skip_org_role_sync = true; - auto_login = true; - }; - - }; - }; } diff --git a/nixos/hosts/olympus/wireguard/configuration.nix b/nixos/hosts/olympus/wireguard/configuration.nix index ee24f55..e032921 100644 --- a/nixos/hosts/olympus/wireguard/configuration.nix +++ b/nixos/hosts/olympus/wireguard/configuration.nix @@ -19,22 +19,62 @@ in { environment.systemPackages = with pkgs; [ wireguard-tools ]; environment.noXlibs = lib.mkForce false; + networking = { - networking.firewall.allowedUDPPorts = - [ config.networking.wireguard.interfaces.wg0.listenPort ]; - networking.firewall.checkReversePath = false; + firewall.allowedUDPPorts = + [ config.networking.wireguard.interfaces.wg0.listenPort ]; + firewall.checkReversePath = false; + + nat = { + enable = true; + internalInterfaces = [ "wg0" "eth0" ]; + externalInterface = "eth0"; + }; + + wireguard.interfaces.wg0 = { + ips = [ "10.100.0.1/24" ]; + listenPort = 51821; + privateKeyFile = "${vs.wireguard}/privateKey"; + + peers = [ + { + # Phone + publicKey = "K+99mvSYs4urcclreQDLA1pekD4xtu/mpS2uVWw8Bws="; + allowedIPs = [ "10.100.0.2/32" ]; + } + { + # Laura's laptop + publicKey = "ZWIaDGrASlTkEK75j10VeGCvrIGfpk4GPobmqcYX2D0="; + allowedIPs = [ "10.100.0.3/32" ]; + } + { + # Old Laptop + publicKey = "L8myt2bcdja7M+i+9eatdQRW8relPUoZZ9lEKSLe+m8="; + allowedIPs = [ "10.100.0.4/32" ]; + } + { + # New Laptop + publicKey = "+Ms3xV6LxNZWTQk11zoz+AUIV2uds6A64Wz15JlR/Ak="; + allowedIPs = [ "10.100.0.6/32" ]; + } + { + # Aerdenhout + # Useful setup video for opnsense: https://www.youtube.com/watch?v=RoXHe5dqCM0 + # https://docs.opnsense.org/manual/how-tos/wireguard-s2s.html + publicKey = "KgqLhmUMX6kyTjRoa/GOCrZOvXNE5HWYuOr/T3v8/VI="; + allowedIPs = [ "10.100.0.5/32" "192.168.0.0/23" "10.10.10.0/24" ]; + endpoint = "83.128.154.23:51820"; + persistentKeepalive = 25; + } + ]; + }; + }; vault-secrets.secrets.wireguard = { services = [ "wireguard-wg0" ]; loginRetries = 25; }; - networking.nat = { - enable = true; - internalInterfaces = [ "wg0" "eth0" ]; - externalInterface = "eth0"; - }; - boot.kernel.sysctl = { "net.ipv4.ip_forward" = 1; "net.ipv6.conf.all.forwarding" = 1; @@ -44,42 +84,4 @@ in { enable = true; openFirewall = true; }; - - networking.wireguard.interfaces.wg0 = { - ips = [ "10.100.0.1/24" ]; - listenPort = 51821; - privateKeyFile = "${vs.wireguard}/privateKey"; - - peers = [ - { - # Phone - publicKey = "K+99mvSYs4urcclreQDLA1pekD4xtu/mpS2uVWw8Bws="; - allowedIPs = [ "10.100.0.2/32" ]; - } - { - # Laura's laptop - publicKey = "ZWIaDGrASlTkEK75j10VeGCvrIGfpk4GPobmqcYX2D0="; - allowedIPs = [ "10.100.0.3/32" ]; - } - { - # Old Laptop - publicKey = "L8myt2bcdja7M+i+9eatdQRW8relPUoZZ9lEKSLe+m8="; - allowedIPs = [ "10.100.0.4/32" ]; - } - { - # New Laptop - publicKey = "+Ms3xV6LxNZWTQk11zoz+AUIV2uds6A64Wz15JlR/Ak="; - allowedIPs = [ "10.100.0.6/32" ]; - } - { - # Aerdenhout - # Useful setup video for opnsense: https://www.youtube.com/watch?v=RoXHe5dqCM0 - # https://docs.opnsense.org/manual/how-tos/wireguard-s2s.html - publicKey = "KgqLhmUMX6kyTjRoa/GOCrZOvXNE5HWYuOr/T3v8/VI="; - allowedIPs = [ "10.100.0.5/32" "192.168.0.0/23" "10.10.10.0/24" ]; - endpoint = "83.128.154.23:51820"; - persistentKeepalive = 25; - } - ]; - }; } diff --git a/nixos/hosts/thalassa/aoife/hardware-configuration.nix b/nixos/hosts/thalassa/aoife/hardware-configuration.nix index 06d9488..c6cd2ce 100644 --- a/nixos/hosts/thalassa/aoife/hardware-configuration.nix +++ b/nixos/hosts/thalassa/aoife/hardware-configuration.nix @@ -5,12 +5,14 @@ { imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; + boot = { - boot.initrd.availableKernelModules = - [ "nvme" "xhci_pci" "thunderbolt" "usb_storage" "sd_mod" "sdhci_pci" ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ "kvm-amd" ]; - boot.extraModulePackages = [ ]; + initrd.availableKernelModules = + [ "nvme" "xhci_pci" "thunderbolt" "usb_storage" "sd_mod" "sdhci_pci" ]; + initrd.kernelModules = [ ]; + kernelModules = [ "kvm-amd" ]; + extraModulePackages = [ ]; + }; fileSystems."/" = { device = "/dev/disk/by-uuid/c184866a-9a53-4a9f-9a1f-493792af7ea9"; diff --git a/nixos/hosts/thalassa/aoife/hardware.nix b/nixos/hosts/thalassa/aoife/hardware.nix index 0345764..6c6e410 100644 --- a/nixos/hosts/thalassa/aoife/hardware.nix +++ b/nixos/hosts/thalassa/aoife/hardware.nix @@ -1,50 +1,58 @@ { pkgs, ... }: { - hardware.enableAllFirmware = true; + hardware = { + enableAllFirmware = true; - hardware.bluetooth.enable = true; + bluetooth.enable = true; - services.hardware.bolt.enable = true; + # Vulkan + opengl.driSupport = true; + opengl.extraPackages = with pkgs; [ + amdvlk + rocm-opencl-icd + rocm-opencl-runtime + ]; + }; + services = { - services.fprintd.enable = true; + hardware.bolt.enable = true; + + fprintd.enable = true; + + # Video Driver + xserver.videoDrivers = [ "amdgpu" ]; + xserver = { + dpi = 280; + xkbOptions = "caps:swapescape"; + }; + + # SSD Trim + fstrim.enable = true; + + # Power Management + upower.enable = true; + thermald.enable = true; + }; # hardware.trackpoint.enable = true; # FS fileSystems."/".options = [ "compress=zstd" ]; - # Video Driver - services.xserver.videoDrivers = [ "amdgpu" ]; - services.xserver = { - dpi = 280; - xkbOptions = "caps:swapescape"; - }; - - # Vulkan - hardware.opengl.driSupport = true; - hardware.opengl.extraPackages = with pkgs; [ - amdvlk - rocm-opencl-icd - rocm-opencl-runtime - ]; - systemd.tmpfiles.rules = [ "L+ /opt/rocm/hip - - - - ${pkgs.hip}" ]; - # SSD Trim - services.fstrim.enable = true; - - # Power Management - services.upower.enable = true; - services.thermald.enable = true; - powerManagement = { enable = true; powertop.enable = true; }; + security = { + tpm2 = { - # tpm - security.tpm2.enable = true; - security.tpm2.pkcs11.enable = true; # expose /run/current-system/sw/lib/libtpm2_pkcs11.so - security.tpm2.tctiEnvironment.enable = true; # TPM2TOOLS_TCTI and TPM2_PKCS11_TCTI env variables - users.users.victor.extraGroups = [ "tss" ]; # tss group has access to TPM devices + # tpm + enable = true; + pkcs11.enable = true; # expose /run/current-system/sw/lib/libtpm2_pkcs11.so + tctiEnvironment.enable = true; + }; + }; # TPM2TOOLS_TCTI and TPM2_PKCS11_TCTI env variables + users.users.victor.extraGroups = [ "tss" ]; # tss group has access to TPM devices } diff --git a/nixos/hosts/thalassa/aoife/home/default.nix b/nixos/hosts/thalassa/aoife/home/default.nix index f4f05f6..5c54319 100644 --- a/nixos/hosts/thalassa/aoife/home/default.nix +++ b/nixos/hosts/thalassa/aoife/home/default.nix @@ -1,4 +1,4 @@ -{pkgs, ...}: { +{ pkgs, ... }: { # Custom dconf settings dconf.settings."org/gnome/desktop/input-sources" = { xkb-options = [ "caps:swapescape" ]; diff --git a/nixos/hosts/thalassa/null/configuration.nix b/nixos/hosts/thalassa/null/configuration.nix index 0353209..e8d0b16 100644 --- a/nixos/hosts/thalassa/null/configuration.nix +++ b/nixos/hosts/thalassa/null/configuration.nix @@ -30,23 +30,39 @@ let exec Hyprland ''; -in { +in +{ imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix ./rescue-boot.nix ./networking.nix ]; + home-manager = { - # home-manager - home-manager.useGlobalPkgs = true; - home-manager.useUserPackages = true; - home-manager.users.victor = import ./home; - home-manager.extraSpecialArgs = { inherit inputs; }; + # home-manager + useGlobalPkgs = true; + useUserPackages = true; + users.victor = import ./home; + extraSpecialArgs = { inherit inputs; }; + }; + security = { - security.pam.services.swaylock = { }; + pam.services.swaylock = { }; - security.sudo.wheelNeedsPassword = true; + sudo.wheelNeedsPassword = true; + rtkit.enable = true; + + # Enables logging in with my Solokey + pam.u2f = { + enable = true; + debug = false; + cue = true; + control = "sufficient"; + authFile = + "/etc/u2f-mappings"; # use `pamu2fcfg` from `pkgs.pam_u2f` to generate this config + }; + }; fonts = { fonts = with pkgs; [ @@ -79,61 +95,116 @@ in { # boot.initrd.systemd.enable = true; # Experimental boot = { kernelPackages = pkgs.linuxPackages_latest; - loader.systemd-boot.editor = false; - loader.systemd-boot.enable = true; - # loader.systemd-boot.configurationLimit = 6; - loader.efi.canTouchEfiVariables = true; - loader.efi.efiSysMountPoint = "/boot/efi"; + loader = { + systemd-boot.editor = false; + systemd-boot.enable = true; + # loader.systemd-boot.configurationLimit = 6; + efi.canTouchEfiVariables = true; + efi.efiSysMountPoint = "/boot/efi"; + }; kernel.sysctl = { "fs.inotify.max_user_watches" = 524288; }; }; + services = { - services.gnome.gnome-keyring.enable = true; + gnome.gnome-keyring.enable = true; - fileSystems."/".options = [ "compress=zstd" ]; - fileSystems."/home".options = [ "compress=zstd" ]; - fileSystems."/nix".options = [ "compress=zstd" "noatime" ]; + udisks2.enable = true; + dbus.enable = true; - # Filesystem dedup - # services.beesd.filesystems = { - # root = { - # spec = "LABEL=nixos"; - # hashTableSizeMB = 256; - # verbosity = "crit"; - # extraOptions = [ "--loadavg-target" "2.0" ]; - # }; - # }; + xserver = { + enable = false; + layout = "us"; + xkbVariant = "altgr-intl"; + xkbOptions = "caps:swapescape"; + videoDrivers = [ "nvidia" ]; + }; + blueman.enable = true; - # Select internationalisation properties. - i18n.defaultLocale = "en_GB.utf8"; + # Enable CUPS to print documents. + printing.enable = true; + pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + # If you want to use JACK applications, uncomment this + #jack.enable = true; - i18n.extraLocaleSettings = { - LC_ADDRESS = "nl_NL.UTF-8"; - LC_IDENTIFICATION = "nl_NL.UTF-8"; - LC_MEASUREMENT = "nl_NL.UTF-8"; - LC_MONETARY = "nl_NL.UTF-8"; - LC_NAME = "nl_NL.UTF-8"; - LC_NUMERIC = "nl_NL.UTF-8"; - LC_PAPER = "nl_NL.UTF-8"; - LC_TELEPHONE = "nl_NL.UTF-8"; - LC_TIME = "en_DK.UTF-8"; + # use the example session manager (no others are packaged yet so this is enabled by default, + # no need to redefine it in your config for now) + #media-session.enable = true; + }; + + fstrim.enable = true; + + # don't shutdown when power button is short-pressed + logind.extraConfig = '' + HandlePowerKey=suspend + ''; + + udev.packages = with pkgs; [ + android-udev-rules + logitech-udev-rules + wooting-udev-rules + ]; }; + fileSystems = { - i18n.supportedLocales = - [ "en_GB.UTF-8/UTF-8" "nl_NL.UTF-8/UTF-8" "en_DK.UTF-8/UTF-8" ]; + "/".options = [ "compress=zstd" ]; + "/home".options = [ "compress=zstd" ]; + "/nix".options = [ "compress=zstd" "noatime" ]; + }; + i18n = { + + # Filesystem dedup + # services.beesd.filesystems = { + # root = { + # spec = "LABEL=nixos"; + # hashTableSizeMB = 256; + # verbosity = "crit"; + # extraOptions = [ "--loadavg-target" "2.0" ]; + # }; + # }; + + # Select internationalisation properties. + defaultLocale = "en_GB.utf8"; + + extraLocaleSettings = { + LC_ADDRESS = "nl_NL.UTF-8"; + LC_IDENTIFICATION = "nl_NL.UTF-8"; + LC_MEASUREMENT = "nl_NL.UTF-8"; + LC_MONETARY = "nl_NL.UTF-8"; + LC_NAME = "nl_NL.UTF-8"; + LC_NUMERIC = "nl_NL.UTF-8"; + LC_PAPER = "nl_NL.UTF-8"; + LC_TELEPHONE = "nl_NL.UTF-8"; + LC_TIME = "en_DK.UTF-8"; + }; + + supportedLocales = + [ "en_GB.UTF-8/UTF-8" "nl_NL.UTF-8/UTF-8" "en_DK.UTF-8/UTF-8" ]; + }; xdg.portal = { enable = true; wlr.enable = true; }; + programs = { - services.udisks2.enable = true; - services.dbus.enable = true; + # Hyprland + hyprland = { + enable = true; + package = null; # Managed by home manager + }; - # Hyprland - programs.hyprland = { - enable = true; - package = null; # Managed by home manager + steam = { + enable = true; + remotePlay.openFirewall = true; + dedicatedServer.openFirewall = true; + }; + + ssh.startAgent = true; }; environment.loginShellInit = '' @@ -141,57 +212,34 @@ in { ${run-hyprland}/bin/run-hyprland fi ''; + hardware = { - services.xserver = { - enable = false; - layout = "us"; - xkbVariant = "altgr-intl"; - xkbOptions = "caps:swapescape"; - videoDrivers = [ "nvidia" ]; + nvidia.prime = { + offload.enable = true; + intelBusId = "PCI:0:2:0"; + nvidiaBusId = "PCI:1:0:0"; + }; + + opengl = { + enable = true; + extraPackages = with pkgs; [ + vaapiVdpau + intel-media-driver # LIBVA_DRIVER_NAME=iHD + vaapiIntel # LIBVA_DRIVER_NAME=i965 (older but works better for Firefox/Chromium) + libvdpau-va-gl + ]; + }; + + bluetooth.enable = true; + + saleae-logic.enable = true; + pulseaudio.enable = false; }; - hardware.nvidia.prime = { - offload.enable = true; - intelBusId = "PCI:0:2:0"; - nvidiaBusId = "PCI:1:0:0"; - }; - - hardware.opengl = { - enable = true; - extraPackages = with pkgs; [ - vaapiVdpau - intel-media-driver # LIBVA_DRIVER_NAME=iHD - vaapiIntel # LIBVA_DRIVER_NAME=i965 (older but works better for Firefox/Chromium) - libvdpau-va-gl - ]; - }; - - hardware.bluetooth.enable = true; - services.blueman.enable = true; - virtualisation.podman.enable = true; - hardware.saleae-logic.enable = true; - - # Enable CUPS to print documents. - services.printing.enable = true; - # Enable sound with pipewire. sound.enable = true; - hardware.pulseaudio.enable = false; - security.rtkit.enable = true; - services.pipewire = { - enable = true; - alsa.enable = true; - alsa.support32Bit = true; - pulse.enable = true; - # If you want to use JACK applications, uncomment this - #jack.enable = true; - - # use the example session manager (no others are packaged yet so this is enabled by default, - # no need to redefine it in your config for now) - #media-session.enable = true; - }; environment.systemPackages = with pkgs; [ pciutils @@ -204,42 +252,11 @@ in { swaylock-effects # Has to be installed globally so that pam module works ]; - programs.steam = { - enable = true; - remotePlay.openFirewall = true; - dedicatedServer.openFirewall = true; - }; - - services.fstrim.enable = true; - nix.extraOptions = '' keep-outputs = true keep-derivations = true ''; - # Enables logging in with my Solokey - security.pam.u2f = { - enable = true; - debug = false; - cue = true; - control = "sufficient"; - authFile = - "/etc/u2f-mappings"; # use `pamu2fcfg` from `pkgs.pam_u2f` to generate this config - }; - - programs.ssh.startAgent = true; - - # don't shutdown when power button is short-pressed - services.logind.extraConfig = '' - HandlePowerKey=suspend - ''; - - services.udev.packages = with pkgs; [ - android-udev-rules - logitech-udev-rules - wooting-udev-rules - ]; - # This value determines the NixOS release from which the default # settings for stateful data, like file locations and database versions # on your system were taken. It‘s perfectly fine and recommended to leave diff --git a/nixos/hosts/thalassa/null/hardware-configuration.nix b/nixos/hosts/thalassa/null/hardware-configuration.nix index a7a6cd2..4c230e9 100644 --- a/nixos/hosts/thalassa/null/hardware-configuration.nix +++ b/nixos/hosts/thalassa/null/hardware-configuration.nix @@ -5,34 +5,38 @@ { imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; + boot = { - boot.initrd.availableKernelModules = - [ "xhci_pci" "ahci" "nvme" "rtsx_pci_sdmmc" ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ "kvm-intel" ]; - boot.extraModulePackages = [ ]; - - fileSystems."/" = { - device = "/dev/disk/by-uuid/d4f56e5b-2509-4e63-8324-65a35c71e90c"; - fsType = "btrfs"; - options = [ "subvol=@" ]; + initrd.availableKernelModules = + [ "xhci_pci" "ahci" "nvme" "rtsx_pci_sdmmc" ]; + initrd.kernelModules = [ ]; + kernelModules = [ "kvm-intel" ]; + extraModulePackages = [ ]; }; + fileSystems = { - fileSystems."/nix" = { - device = "/dev/disk/by-uuid/d4f56e5b-2509-4e63-8324-65a35c71e90c"; - fsType = "btrfs"; - options = [ "subvol=@/nix" ]; - }; + "/" = { + device = "/dev/disk/by-uuid/d4f56e5b-2509-4e63-8324-65a35c71e90c"; + fsType = "btrfs"; + options = [ "subvol=@" ]; + }; - fileSystems."/home" = { - device = "/dev/disk/by-uuid/d4f56e5b-2509-4e63-8324-65a35c71e90c"; - fsType = "btrfs"; - options = [ "subvol=@home" ]; - }; + "/nix" = { + device = "/dev/disk/by-uuid/d4f56e5b-2509-4e63-8324-65a35c71e90c"; + fsType = "btrfs"; + options = [ "subvol=@/nix" ]; + }; - fileSystems."/boot/efi" = { - device = "/dev/disk/by-uuid/D478-6F66"; - fsType = "vfat"; + "/home" = { + device = "/dev/disk/by-uuid/d4f56e5b-2509-4e63-8324-65a35c71e90c"; + fsType = "btrfs"; + options = [ "subvol=@home" ]; + }; + + "/boot/efi" = { + device = "/dev/disk/by-uuid/D478-6F66"; + fsType = "vfat"; + }; }; swapDevices = [ ]; diff --git a/nixos/hosts/thalassa/null/home/default.nix b/nixos/hosts/thalassa/null/home/default.nix index f128590..a83a1ab 100644 --- a/nixos/hosts/thalassa/null/home/default.nix +++ b/nixos/hosts/thalassa/null/home/default.nix @@ -4,198 +4,205 @@ let inherit (pkgs.texlive) scheme-full; dnd-5e-latex-template = { pkgs = [ pkgs.v.dnd-5e-latex-template ]; }; }; -in { - programs.home-manager.enable = true; - home.username = "victor"; - home.homeDirectory = "/home/victor"; - home.stateVersion = "22.05"; +in +{ + programs = { + home-manager.enable = true; + + foot = { enable = true; }; + + nix-index.enable = true; + + exa = { + enable = true; + enableAliases = true; + }; + + bat.enable = true; + + git = { + enable = true; + package = pkgs.gitAndTools.gitFull; + userName = "Victor"; + userEmail = "victor@xirion.net"; + lfs.enable = true; + # delta.enable = true; + extraConfig = { + push.autoSetupRemote = true; + init.defaultBranch = "main"; + }; + }; + + mako = { + enable = true; + extraConfig = '' + [mode=do-not-disturb] + invisible=1 + ''; + }; + + tmux = { + enable = true; + shortcut = "b"; + terminal = "screen-256color"; + clock24 = true; + }; + + firefox = { + enable = true; + package = pkgs.firefox-devedition-bin; + }; + + vscode = { + enable = true; + package = pkgs.vscode; + userSettings = { + "ltex.language" = "en-GB"; + "latex-workshop" = { + "linting.chktex.enabled" = true; + "latex.clean.subfolder.enabled" = true; + "latex.outDir" = "%TMPDIR%/%RELATIVE_DOC%"; + }; + "workbench.colorTheme" = "Catppuccin Frappé"; + "editor.fontFamily" = + "'DejaVuSansMono Nerd Font', 'monospace', monospace"; + "keyboard.dispatch" = "keyCode"; + "rust-analyzer.server.path" = "${pkgs.rust-analyzer}/bin/rust-analyzer"; + "terminal.integrated.defaultProfile.linux" = "zsh"; + "nix.enableLanguageServer" = true; # Enable LSP. + "nix.serverPath" = + "${pkgs.nil}/bin/nil"; # The path to the LSP server executable. + "[nix]" = { "editor.defaultFormatter" = "brettm12345.nixfmt-vscode"; }; + }; + extensions = with pkgs.vscode-extensions; + with pkgs.v.vscode-extensions; [ + # astro-build.astro-vscode + brettm12345.nixfmt-vscode + catppuccin.catppuccin-vsc + codezombiech.gitignore + editorconfig.editorconfig + foxundermoon.shell-format + james-yu.latex-workshop + jnoortheen.nix-ide + matklad.rust-analyzer + mkhl.direnv + ms-vscode-remote.remote-ssh + ms-vscode.cpptools + platformio.platformio-ide + redhat.vscode-yaml + tamasfe.even-better-toml + valentjn.vscode-ltex + vscodevim.vim + xaver.clang-format + ]; + }; + + direnv = { + enable = true; + nix-direnv = { enable = true; }; + }; + + zsh = { + enable = true; + sessionVariables = { DIRENV_LOG_FORMAT = ""; }; + }; + }; + home = { + username = "victor"; + homeDirectory = "/home/victor"; + stateVersion = "22.05"; + + packages = with pkgs; [ + appimage-run + brightnessctl + btop + calibre + cinny-desktop + discord-canary + element-desktop-wayland + fluxcd + fusee-launcher + gcc + gimp + gnome.eog + gnome.file-roller + gnome.gnome-font-viewer + gnome.nautilus + grim # Screenshot tool + inputs.comma.packages.${pkgs.system}.default + inputs.riff.packages.${pkgs.system}.riff + inputs.webcord.packages.${pkgs.system}.default + k9s + kubectl + libnotify + mullvad-vpn + neofetch + nixpkgs-review + nixfmt + ouch + plex-media-player + plexamp + python3 + retroarchFull + ripgrep + rsync + rustup + saleae-logic-2 + solo2-cli + steam-run + tex + thunderbird-wayland + v.deemix-gui + wf-recorder # Screenrecorder + wl-clipboard # Clipboard manager + wofi # Wayland rofi + wpa_supplicant_gui + ]; + }; imports = [ ./hyprland.nix ./neovim.nix ./eww ./theme.nix ]; - home.packages = with pkgs; [ - appimage-run - brightnessctl - btop - calibre - cinny-desktop - discord-canary - element-desktop-wayland - fluxcd - fusee-launcher - gcc - gimp - gnome.eog - gnome.file-roller - gnome.gnome-font-viewer - gnome.nautilus - grim # Screenshot tool - inputs.comma.packages.${pkgs.system}.default - inputs.riff.packages.${pkgs.system}.riff - inputs.webcord.packages.${pkgs.system}.default - k9s - kubectl - libnotify - mullvad-vpn - neofetch - nixpkgs-review - nixfmt - ouch - plex-media-player - plexamp - python3 - retroarchFull - ripgrep - rsync - rustup - saleae-logic-2 - solo2-cli - steam-run - tex - thunderbird-wayland - v.deemix-gui - wf-recorder # Screenrecorder - wl-clipboard # Clipboard manager - wofi # Wayland rofi - wpa_supplicant_gui - ]; - xdg.mimeApps = { enable = true; - defaultApplications = let browser = [ "firefox.desktop" ]; - in { - "image/*" = "org.gnome.eog.desktop"; - "text/html" = browser; - "x-scheme-handler/http" = browser; - "x-scheme-handler/https" = browser; - "x-scheme-handler/ftp" = browser; - "x-scheme-handler/about" = browser; - "x-scheme-handler/unknown" = browser; - "application/x-extension-htm" = browser; - "application/x-extension-html" = browser; - "application/x-extension-shtml" = browser; - "application/xhtml+xml" = browser; - "application/x-extension-xhtml" = browser; - "application/x-extension-xht" = browser; + defaultApplications = + let browser = [ "firefox.desktop" ]; + in { + "image/*" = "org.gnome.eog.desktop"; + "text/html" = browser; + "x-scheme-handler/http" = browser; + "x-scheme-handler/https" = browser; + "x-scheme-handler/ftp" = browser; + "x-scheme-handler/about" = browser; + "x-scheme-handler/unknown" = browser; + "application/x-extension-htm" = browser; + "application/x-extension-html" = browser; + "application/x-extension-shtml" = browser; + "application/xhtml+xml" = browser; + "application/x-extension-xhtml" = browser; + "application/x-extension-xht" = browser; - "application/json" = browser; - "application/pdf" = browser; + "application/json" = browser; + "application/pdf" = browser; - "x-scheme-handler/vscode" = "code-url-handler.desktop"; - "x-scheme-handler/discord" = "webcord.desktop"; - }; - }; - - programs.foot = { enable = true; }; - - programs.nix-index.enable = true; - - programs.exa = { - enable = true; - enableAliases = true; - }; - - programs.bat.enable = true; - - programs.git = { - enable = true; - package = pkgs.gitAndTools.gitFull; - userName = "Victor"; - userEmail = "victor@xirion.net"; - lfs.enable = true; - # delta.enable = true; - extraConfig = { - push.autoSetupRemote = true; - init.defaultBranch = "main"; - }; - }; - - programs.mako = { - enable = true; - extraConfig = '' - [mode=do-not-disturb] - invisible=1 - ''; - }; - - programs.tmux = { - enable = true; - shortcut = "b"; - terminal = "screen-256color"; - clock24 = true; - }; - - programs.firefox = { - enable = true; - package = pkgs.firefox-devedition-bin; - }; - - programs.vscode = { - enable = true; - package = pkgs.vscode; - userSettings = { - "ltex.language" = "en-GB"; - "latex-workshop" = { - "linting.chktex.enabled" = true; - "latex.clean.subfolder.enabled" = true; - "latex.outDir" = "%TMPDIR%/%RELATIVE_DOC%"; + "x-scheme-handler/vscode" = "code-url-handler.desktop"; + "x-scheme-handler/discord" = "webcord.desktop"; }; - "workbench.colorTheme" = "Catppuccin Frappé"; - "editor.fontFamily" = - "'DejaVuSansMono Nerd Font', 'monospace', monospace"; - "keyboard.dispatch" = "keyCode"; - "rust-analyzer.server.path" = "${pkgs.rust-analyzer}/bin/rust-analyzer"; - "terminal.integrated.defaultProfile.linux" = "zsh"; - "nix.enableLanguageServer" = true; # Enable LSP. - "nix.serverPath" = - "${pkgs.nil}/bin/nil"; # The path to the LSP server executable. - "[nix]" = { "editor.defaultFormatter" = "brettm12345.nixfmt-vscode"; }; + }; + + xdg.userDirs = + let home = config.home.homeDirectory; + in { + enable = true; + createDirectories = true; + desktop = "${home}/.desktop"; + documents = "${home}/cloud/Documents"; + download = "${home}/dl"; + music = "${home}/cloud/Music"; + pictures = "${home}/cloud/Pictures"; + publicShare = "${home}/.publicShare"; + templates = "${home}/.templates"; + videos = "${home}/cloud/Videos"; }; - extensions = with pkgs.vscode-extensions; - with pkgs.v.vscode-extensions; [ - # astro-build.astro-vscode - brettm12345.nixfmt-vscode - catppuccin.catppuccin-vsc - codezombiech.gitignore - editorconfig.editorconfig - foxundermoon.shell-format - james-yu.latex-workshop - jnoortheen.nix-ide - matklad.rust-analyzer - mkhl.direnv - ms-vscode-remote.remote-ssh - ms-vscode.cpptools - platformio.platformio-ide - redhat.vscode-yaml - tamasfe.even-better-toml - valentjn.vscode-ltex - vscodevim.vim - xaver.clang-format - ]; - }; - - programs.direnv = { - enable = true; - nix-direnv = { enable = true; }; - }; - - programs.zsh = { - enable = true; - sessionVariables = { DIRENV_LOG_FORMAT = ""; }; - }; - - xdg.userDirs = let home = config.home.homeDirectory; - in { - enable = true; - createDirectories = true; - desktop = "${home}/.desktop"; - documents = "${home}/cloud/Documents"; - download = "${home}/dl"; - music = "${home}/cloud/Music"; - pictures = "${home}/cloud/Pictures"; - publicShare = "${home}/.publicShare"; - templates = "${home}/.templates"; - videos = "${home}/cloud/Videos"; - }; services.syncthing.enable = true; } diff --git a/nixos/hosts/thalassa/null/home/eww/default.nix b/nixos/hosts/thalassa/null/home/eww/default.nix index dadcc75..120b59a 100644 --- a/nixos/hosts/thalassa/null/home/eww/default.nix +++ b/nixos/hosts/thalassa/null/home/eww/default.nix @@ -1,38 +1,42 @@ { pkgs, ... }: { - home.packages = with pkgs; [ - eww-wayland - pamixer - lua - (nerdfonts.override { fonts = [ "JetBrainsMono" ]; }) - ]; + home = { + packages = with pkgs; [ + eww-wayland + pamixer + lua + (nerdfonts.override { fonts = [ "JetBrainsMono" ]; }) + ]; + file = { - home.file.".config/eww/eww.yuck".source = ./eww.yuck; - home.file.".config/eww/eww.scss".text = builtins.readFile ./eww.scss; + ".config/eww/eww.yuck".source = ./eww.yuck; + ".config/eww/eww.scss".text = builtins.readFile ./eww.scss; - # scripts - # TODO: just link all scripts in ./scripts to .config/eww/scripts - home.file.".config/eww/scripts/volume.sh" = { - source = ./scripts/volume.sh; - executable = true; - }; + # scripts + # TODO: just link all scripts in ./scripts to .config/eww/scripts + ".config/eww/scripts/volume.sh" = { + source = ./scripts/volume.sh; + executable = true; + }; - home.file.".config/eww/scripts/wifi.sh" = { - source = ./scripts/wifi.sh; - executable = true; - }; + ".config/eww/scripts/wifi.sh" = { + source = ./scripts/wifi.sh; + executable = true; + }; - home.file.".config/eww/scripts/workspaces.sh" = { - source = ./scripts/workspaces.sh; - executable = true; - }; + ".config/eww/scripts/workspaces.sh" = { + source = ./scripts/workspaces.sh; + executable = true; + }; - home.file.".config/eww/scripts/workspaces.lua" = { - source = ./scripts/workspaces.lua; - executable = true; - }; + ".config/eww/scripts/workspaces.lua" = { + source = ./scripts/workspaces.lua; + executable = true; + }; - home.file.".config/eww/scripts/do-not-disturb.sh" = { - source = ./scripts/do-not-disturb.sh; - executable = true; + ".config/eww/scripts/do-not-disturb.sh" = { + source = ./scripts/do-not-disturb.sh; + executable = true; + }; + }; }; } diff --git a/nixos/hosts/thalassa/null/home/hyprland.nix b/nixos/hosts/thalassa/null/home/hyprland.nix index 6dac363..cdc6efa 100644 --- a/nixos/hosts/thalassa/null/home/hyprland.nix +++ b/nixos/hosts/thalassa/null/home/hyprland.nix @@ -5,131 +5,133 @@ wallpaper = eDP-1,~/cloud/Pictures/Wallpapers-Laptop/wallpaper-nix-pink.png ''; - wayland.windowManager.hyprland = let - startup-script = pkgs.writeScriptBin "startup" '' - #!${pkgs.stdenv.shell} - hyprctl setcursor Catppuccin-Frappe-Pink-Cursors ${ - builtins.toString config.home.pointerCursor.size - } - ${pkgs.hyprpaper}/bin/hyprpaper & - foot --server & - eww daemon & - eww open bar & - firefox-devedition & - webcord & - element-desktop & - ''; - in { - enable = true; - recommendedEnvironment = true; - extraConfig = '' - exec-once=dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP - exec-once=systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP - - monitor=eDP-1,1920x1080@60,0x0,1 - monitor=eDP-1,addreserved,0,0,48,0 - monitor=,preferred,auto,1 - - windowrulev2 = workspace 1 silent,class:^(Electron)$,title:^(.*)(WebCord)(.*)$ - windowrulev2 = workspace 1 silent,title:^(Element)(.*)$ - windowrulev2 = workspace 2 silent,class:^(firefox-aurora)$ - windowrulev2 = float,class:^(firefox-aurora)$,title:^(Picture-in-Picture)$ - - general { - layout = dwindle - col.active_border = 0xfff4b8e4 - } - - input { - kb_options=caps:escape - touchpad { - natural_scroll= true + wayland.windowManager.hyprland = + let + startup-script = pkgs.writeScriptBin "startup" '' + #!${pkgs.stdenv.shell} + hyprctl setcursor Catppuccin-Frappe-Pink-Cursors ${ + builtins.toString config.home.pointerCursor.size } - } + ${pkgs.hyprpaper}/bin/hyprpaper & + foot --server & + eww daemon & + eww open bar & + firefox-devedition & + webcord & + element-desktop & + ''; + in + { + enable = true; + recommendedEnvironment = true; + extraConfig = '' + exec-once=dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP + exec-once=systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP - gestures { - workspace_swipe = true - } + monitor=eDP-1,1920x1080@60,0x0,1 + monitor=eDP-1,addreserved,0,0,48,0 + monitor=,preferred,auto,1 - misc { - no_vfr = false - disable_hyprland_logo = true - disable_splash_rendering = true - } + windowrulev2 = workspace 1 silent,class:^(Electron)$,title:^(.*)(WebCord)(.*)$ + windowrulev2 = workspace 1 silent,title:^(Element)(.*)$ + windowrulev2 = workspace 2 silent,class:^(firefox-aurora)$ + windowrulev2 = float,class:^(firefox-aurora)$,title:^(Picture-in-Picture)$ - dwindle { - pseudotile=true - } + general { + layout = dwindle + col.active_border = 0xfff4b8e4 + } - bind=SUPER,RETURN,exec,footclient - bind=SUPER,f,exec,firefox-devedition - bind=SUPER,d,exec,wofi --show run,drun + input { + kb_options=caps:escape + touchpad { + natural_scroll= true + } + } - bind=,Print,exec,grim -g "$(slurp)" -t png - | wl-copy -t image/png - bind=SUPER,W,killactive, - bind=SUPERSHIFT,Q,exit, - bind=SUPER,S,togglefloating, - bind=SUPER,P,pin, + gestures { + workspace_swipe = true + } - bindm=SUPER,mouse:272,movewindow - bindm=SUPER,mouse:273,resizewindow + misc { + no_vfr = false + disable_hyprland_logo = true + disable_splash_rendering = true + } - bind=SUPER,left,movefocus,l - bind=SUPER,right,movefocus,r - bind=SUPER,up,movefocus,u - bind=SUPER,down,movefocus,d + dwindle { + pseudotile=true + } - bind=SUPER,1,workspace,1 - bind=SUPER,2,workspace,2 - bind=SUPER,3,workspace,3 - bind=SUPER,4,workspace,4 - bind=SUPER,5,workspace,5 - bind=SUPER,6,workspace,6 - bind=SUPER,7,workspace,7 - bind=SUPER,8,workspace,8 - bind=SUPER,9,workspace,9 - bind=SUPER,0,workspace,10 - bind=SUPER,grave,togglespecialworkspace + bind=SUPER,RETURN,exec,footclient + bind=SUPER,f,exec,firefox-devedition + bind=SUPER,d,exec,wofi --show run,drun - bind=ALT,1,movetoworkspace,1 - bind=ALT,2,movetoworkspace,2 - bind=ALT,3,movetoworkspace,3 - bind=ALT,4,movetoworkspace,4 - bind=ALT,5,movetoworkspace,5 - bind=ALT,6,movetoworkspace,6 - bind=ALT,7,movetoworkspace,7 - bind=ALT,8,movetoworkspace,8 - bind=ALT,9,movetoworkspace,9 - bind=ALT,0,movetoworkspace,10 - bind=ALT,grave,movetoworkspace,special + bind=,Print,exec,grim -g "$(slurp)" -t png - | wl-copy -t image/png + bind=SUPER,W,killactive, + bind=SUPERSHIFT,Q,exit, + bind=SUPER,S,togglefloating, + bind=SUPER,P,pin, - bind=SUPERSHIFT,1,movetoworkspacesilent,1 - bind=SUPERSHIFT,2,movetoworkspacesilent,2 - bind=SUPERSHIFT,3,movetoworkspacesilent,3 - bind=SUPERSHIFT,4,movetoworkspacesilent,4 - bind=SUPERSHIFT,5,movetoworkspacesilent,5 - bind=SUPERSHIFT,6,movetoworkspacesilent,6 - bind=SUPERSHIFT,7,movetoworkspacesilent,7 - bind=SUPERSHIFT,8,movetoworkspacesilent,8 - bind=SUPERSHIFT,9,movetoworkspacesilent,9 - bind=SUPERSHIFT,0,movetoworkspacesilent,10 - bind=SUPERSHIFT,grave,movetoworkspacesilent,special + bindm=SUPER,mouse:272,movewindow + bindm=SUPER,mouse:273,resizewindow - bind=SUPER,mouse_down,workspace,e+1 - bind=SUPER,mouse_up,workspace,e-1 + bind=SUPER,left,movefocus,l + bind=SUPER,right,movefocus,r + bind=SUPER,up,movefocus,u + bind=SUPER,down,movefocus,d - bind=SUPER,g,togglegroup - bind=SUPER,tab,changegroupactive - bind=SUPER,m,fullscreen,1 - bind=SUPERSHIFT,m,fullscreen,0 + bind=SUPER,1,workspace,1 + bind=SUPER,2,workspace,2 + bind=SUPER,3,workspace,3 + bind=SUPER,4,workspace,4 + bind=SUPER,5,workspace,5 + bind=SUPER,6,workspace,6 + bind=SUPER,7,workspace,7 + bind=SUPER,8,workspace,8 + bind=SUPER,9,workspace,9 + bind=SUPER,0,workspace,10 + bind=SUPER,grave,togglespecialworkspace - bind=,XF86MonBrightnessUp,exec,brightnessctl -q s +5% - bind=,XF86MonBrightnessDown,exec,brightnessctl -q s 5%- - bind=,XF86MonRaiseVolume,exec,pamixer -i 5 - bind=,XF86MonLowerVolume,exec,pamixer -d 5 - bind=,XF86AudioMute,exec,pamixer -t + bind=ALT,1,movetoworkspace,1 + bind=ALT,2,movetoworkspace,2 + bind=ALT,3,movetoworkspace,3 + bind=ALT,4,movetoworkspace,4 + bind=ALT,5,movetoworkspace,5 + bind=ALT,6,movetoworkspace,6 + bind=ALT,7,movetoworkspace,7 + bind=ALT,8,movetoworkspace,8 + bind=ALT,9,movetoworkspace,9 + bind=ALT,0,movetoworkspace,10 + bind=ALT,grave,movetoworkspace,special - exec-once=${startup-script}/bin/startup - ''; - }; + bind=SUPERSHIFT,1,movetoworkspacesilent,1 + bind=SUPERSHIFT,2,movetoworkspacesilent,2 + bind=SUPERSHIFT,3,movetoworkspacesilent,3 + bind=SUPERSHIFT,4,movetoworkspacesilent,4 + bind=SUPERSHIFT,5,movetoworkspacesilent,5 + bind=SUPERSHIFT,6,movetoworkspacesilent,6 + bind=SUPERSHIFT,7,movetoworkspacesilent,7 + bind=SUPERSHIFT,8,movetoworkspacesilent,8 + bind=SUPERSHIFT,9,movetoworkspacesilent,9 + bind=SUPERSHIFT,0,movetoworkspacesilent,10 + bind=SUPERSHIFT,grave,movetoworkspacesilent,special + + bind=SUPER,mouse_down,workspace,e+1 + bind=SUPER,mouse_up,workspace,e-1 + + bind=SUPER,g,togglegroup + bind=SUPER,tab,changegroupactive + bind=SUPER,m,fullscreen,1 + bind=SUPERSHIFT,m,fullscreen,0 + + bind=,XF86MonBrightnessUp,exec,brightnessctl -q s +5% + bind=,XF86MonBrightnessDown,exec,brightnessctl -q s 5%- + bind=,XF86MonRaiseVolume,exec,pamixer -i 5 + bind=,XF86MonLowerVolume,exec,pamixer -d 5 + bind=,XF86AudioMute,exec,pamixer -t + + exec-once=${startup-script}/bin/startup + ''; + }; } diff --git a/nixos/hosts/thalassa/null/home/neovim.nix b/nixos/hosts/thalassa/null/home/neovim.nix index 983f6a4..a6eb4fa 100644 --- a/nixos/hosts/thalassa/null/home/neovim.nix +++ b/nixos/hosts/thalassa/null/home/neovim.nix @@ -27,9 +27,11 @@ }; lsp = { enable = true; - servers.rust-analyzer.enable = true; - servers.rnix-lsp.enable = true; - servers.pyright.enable = true; + servers = { + rust-analyzer.enable = true; + rnix-lsp.enable = true; + pyright.enable = true; + }; }; nvim-cmp = { enable = true; }; }; diff --git a/nixos/hosts/thalassa/null/home/theme.nix b/nixos/hosts/thalassa/null/home/theme.nix index 128cd75..fecec7a 100644 --- a/nixos/hosts/thalassa/null/home/theme.nix +++ b/nixos/hosts/thalassa/null/home/theme.nix @@ -34,16 +34,48 @@ let hex = mapAttrs (_name: value: "#${value}") colour; }; -in { - home.file.".xsettingsd".text = '' - Net/ThemeName "${theme}" - Gtk/CursorThemeName "${cursorTheme}" - ''; +in +{ + home = { + file.".xsettingsd".text = '' + Net/ThemeName "${theme}" + Gtk/CursorThemeName "${cursorTheme}" + ''; - home.pointerCursor = { - name = "Catppuccin-Frappe-Pink-Cursors"; - size = 32; - package = pkgs.catppuccin-cursors.frappePink; + pointerCursor = { + name = "Catppuccin-Frappe-Pink-Cursors"; + size = 32; + package = pkgs.catppuccin-cursors.frappePink; + }; + + file.".config/eww/eww.scss".text = lib.mkBefore '' + $rosewater: ${colour.hex.rosewater}; + $flamingo: ${colour.hex.flamingo}; + $pink: ${colour.hex.pink}; + $mauve: ${colour.hex.mauve}; + $red: ${colour.hex.red}; + $maroon: ${colour.hex.maroon}; + $peach: ${colour.hex.peach}; + $yellow: ${colour.hex.yellow}; + $green: ${colour.hex.green}; + $teal: ${colour.hex.teal}; + $sky: ${colour.hex.sky}; + $sapphire: ${colour.hex.sapphire}; + $blue: ${colour.hex.blue}; + $lavender: ${colour.hex.lavender}; + $text: ${colour.hex.text}; + $subtext0: ${colour.hex.subtext0}; + $subtext1: ${colour.hex.subtext1}; + $overlay0: ${colour.hex.overlay0}; + $overlay1: ${colour.hex.overlay1}; + $overlay2: ${colour.hex.overlay2}; + $surface0: ${colour.hex.surface0}; + $surface1: ${colour.hex.surface1}; + $surface2: ${colour.hex.surface2}; + $base: ${colour.hex.base}; + $mantle: ${colour.hex.mantle}; + $crust: ${colour.hex.crust}; + ''; }; gtk = { @@ -92,33 +124,4 @@ in { textColor = colour.hex.text; borderRadius = 5; }; - - home.file.".config/eww/eww.scss".text = lib.mkBefore '' - $rosewater: ${colour.hex.rosewater}; - $flamingo: ${colour.hex.flamingo}; - $pink: ${colour.hex.pink}; - $mauve: ${colour.hex.mauve}; - $red: ${colour.hex.red}; - $maroon: ${colour.hex.maroon}; - $peach: ${colour.hex.peach}; - $yellow: ${colour.hex.yellow}; - $green: ${colour.hex.green}; - $teal: ${colour.hex.teal}; - $sky: ${colour.hex.sky}; - $sapphire: ${colour.hex.sapphire}; - $blue: ${colour.hex.blue}; - $lavender: ${colour.hex.lavender}; - $text: ${colour.hex.text}; - $subtext0: ${colour.hex.subtext0}; - $subtext1: ${colour.hex.subtext1}; - $overlay0: ${colour.hex.overlay0}; - $overlay1: ${colour.hex.overlay1}; - $overlay2: ${colour.hex.overlay2}; - $surface0: ${colour.hex.surface0}; - $surface1: ${colour.hex.surface1}; - $surface2: ${colour.hex.surface2}; - $base: ${colour.hex.base}; - $mantle: ${colour.hex.mantle}; - $crust: ${colour.hex.crust}; - ''; } diff --git a/nixos/hosts/thalassa/null/rescue-boot.nix b/nixos/hosts/thalassa/null/rescue-boot.nix index 507b427..a6cf2a2 100644 --- a/nixos/hosts/thalassa/null/rescue-boot.nix +++ b/nixos/hosts/thalassa/null/rescue-boot.nix @@ -13,7 +13,8 @@ let boot.supportedFilesystems = [ "btrfs" "ext4" ]; environment.systemPackages = with pkgs; [ git ]; }; -in { +in +{ boot.loader.systemd-boot = { extraEntries = { "rescue.conf" = '' diff --git a/nixos/pkgs/glitch-soc/default.nix b/nixos/pkgs/glitch-soc/default.nix index 415a9be..28ac565 100644 --- a/nixos/pkgs/glitch-soc/default.nix +++ b/nixos/pkgs/glitch-soc/default.nix @@ -1,9 +1,22 @@ -{ lib, stdenv, nodejs-slim, bundlerEnv, nixosTests, yarn, callPackage -, imagemagick, ffmpeg, file, ruby_3_0, writeShellScript, fetchYarnDeps +{ lib +, stdenv +, nodejs-slim +, bundlerEnv +, nixosTests +, yarn +, callPackage +, imagemagick +, ffmpeg +, file +, ruby_3_0 +, writeShellScript +, fetchYarnDeps , fixup_yarn_lock -# Allow building a fork or custom version of Mastodon: -, pname ? "mastodon", version ? import ./version.nix, srcOverride ? null + # Allow building a fork or custom version of Mastodon: +, pname ? "mastodon" +, version ? import ./version.nix +, srcOverride ? null , dependenciesDir ? ./. # Should contain gemset.nix, yarn.nix and package.json. }: @@ -106,16 +119,18 @@ stdenv.mkDerivation rec { ln -s /tmp tmp ''; - installPhase = let - run-streaming = writeShellScript "run-streaming.sh" '' - # NixOS helper script to consistently use the same NodeJS version the package was built with. - ${nodejs-slim}/bin/node ./streaming + installPhase = + let + run-streaming = writeShellScript "run-streaming.sh" '' + # NixOS helper script to consistently use the same NodeJS version the package was built with. + ${nodejs-slim}/bin/node ./streaming + ''; + in + '' + mkdir -p $out + cp -r * $out/ + ln -s ${run-streaming} $out/run-streaming.sh ''; - in '' - mkdir -p $out - cp -r * $out/ - ln -s ${run-streaming} $out/run-streaming.sh - ''; passthru = { tests.mastodon = nixosTests.mastodon; diff --git a/nixos/pkgs/glitch-soc/gemset.nix b/nixos/pkgs/glitch-soc/gemset.nix index 9c22fd6..0fc8dfa 100644 --- a/nixos/pkgs/glitch-soc/gemset.nix +++ b/nixos/pkgs/glitch-soc/gemset.nix @@ -1,1885 +1,1885 @@ { actioncable = { - dependencies = ["actionpack" "activesupport" "nio4r" "websocket-driver"]; - groups = ["default"]; - platforms = []; + dependencies = [ "actionpack" "activesupport" "nio4r" "websocket-driver" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1i98vjh8l1xrf0ihdpvgq7mz7cfj4aww77swjlwljcgfb45868d9"; type = "gem"; }; version = "7.0.7.2"; }; actionmailbox = { - dependencies = ["actionpack" "activejob" "activerecord" "activestorage" "activesupport" "mail" "net-imap" "net-pop" "net-smtp"]; - groups = ["default"]; - platforms = []; + dependencies = [ "actionpack" "activejob" "activerecord" "activestorage" "activesupport" "mail" "net-imap" "net-pop" "net-smtp" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "093snb186qdvj1isss0k74ym7kkaq7zwfa5dwmrc0xn8kwhaxbik"; type = "gem"; }; version = "7.0.7.2"; }; actionmailer = { - dependencies = ["actionpack" "actionview" "activejob" "activesupport" "mail" "net-imap" "net-pop" "net-smtp" "rails-dom-testing"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "actionpack" "actionview" "activejob" "activesupport" "mail" "net-imap" "net-pop" "net-smtp" "rails-dom-testing" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "180ik1gkwy8lqwg0427k0hlivmz206xa453p5c221hpqk8an340f"; type = "gem"; }; version = "7.0.7.2"; }; actionpack = { - dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"]; - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + dependencies = [ "actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer" ]; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0qamc5ly521wk9i1658h9jv7avmyyp92kffa1da2fn5zk0wgyhf4"; type = "gem"; }; version = "7.0.7.2"; }; actiontext = { - dependencies = ["actionpack" "activerecord" "activestorage" "activesupport" "globalid" "nokogiri"]; - groups = ["default"]; - platforms = []; + dependencies = [ "actionpack" "activerecord" "activestorage" "activesupport" "globalid" "nokogiri" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0cx0zg6y0w5njl721vqx7bn0kqj5c9zbvingvl5ll20gpyzsp7nj"; type = "gem"; }; version = "7.0.7.2"; }; actionview = { - dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"]; - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + dependencies = [ "activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer" ]; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "151zxb61bb6q7g0sn34qz79k8bg02vmb8mmnsn0fr15lxw92dfhm"; type = "gem"; }; version = "7.0.7.2"; }; active_model_serializers = { - dependencies = ["actionpack" "activemodel" "case_transform" "jsonapi-renderer"]; - groups = ["default"]; - platforms = []; + dependencies = [ "actionpack" "activemodel" "case_transform" "jsonapi-renderer" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0xdp7cpj3yj3wl4vj0nqq44kzjavlxi1wq3cf9zp0whkir0ym0gy"; type = "gem"; }; version = "0.10.13"; }; activejob = { - dependencies = ["activesupport" "globalid"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "activesupport" "globalid" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "191320166dxiq9a4lwbi1nmlq7phsfi0yr1hg2smprlwsa0vv3kd"; type = "gem"; }; version = "7.0.7.2"; }; activemodel = { - dependencies = ["activesupport"]; - groups = ["default" "development" "test"]; - platforms = []; + dependencies = [ "activesupport" ]; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1crjq1dznlbsrwd5yijxraz1591xmg4vdcwwnmrw4nh6hrwq5fj5"; type = "gem"; }; version = "7.0.7.2"; }; activerecord = { - dependencies = ["activemodel" "activesupport"]; - groups = ["default" "development" "test"]; - platforms = []; + dependencies = [ "activemodel" "activesupport" ]; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "03vrssdqaqm41w27s21r37skdfxa41midvjy37i2zh3rnbnq8ps2"; type = "gem"; }; version = "7.0.7.2"; }; activestorage = { - dependencies = ["actionpack" "activejob" "activerecord" "activesupport" "marcel" "mini_mime"]; - groups = ["default"]; - platforms = []; + dependencies = [ "actionpack" "activejob" "activerecord" "activesupport" "marcel" "mini_mime" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1w7l2i0n84axr4da7y381k8y0wa1y3rr3k3zrkhp938ldwk7j7cg"; type = "gem"; }; version = "7.0.7.2"; }; activesupport = { - dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo"]; - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + dependencies = [ "concurrent-ruby" "i18n" "minitest" "tzinfo" ]; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1vlzcnyqlbchaq85phmdv73ydlc18xpvxy1cbsk191cwd29i7q32"; type = "gem"; }; version = "7.0.7.2"; }; addressable = { - dependencies = ["public_suffix"]; - groups = ["default" "development" "test"]; - platforms = []; + dependencies = [ "public_suffix" ]; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "05r1fwy487klqkya7vzia8hnklcxy4vr92m9dmni3prfwk6zpw33"; type = "gem"; }; version = "2.8.5"; }; aes_key_wrap = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "19bn0y70qm6mfj4y1m0j3s8ggh6dvxwrwrj5vfamhdrpddsz8ddr"; type = "gem"; }; version = "1.1.0"; }; airbrussh = { - dependencies = ["sshkit"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "sshkit" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0x55y3ynkda76pwnsvrrjlvxfcc7yn1irad8radll9c9cif41jqv"; type = "gem"; }; version = "1.4.1"; }; android_key_attestation = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "02spc1sh7zsljl02v9d5rdb717b628vw2k7jkkplifyjk4db0zj6"; type = "gem"; }; version = "0.3.0"; }; annotate = { - dependencies = ["activerecord" "rake"]; - groups = ["development"]; - platforms = []; + dependencies = [ "activerecord" "rake" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1lw0fxb5mirsdp3bp20gjyvs7clvi19jbxnrm2ihm20kzfhvlqcs"; type = "gem"; }; version = "3.2.0"; }; ast = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "04nc8x27hlzlrr5c2gn7mar4vdr0apw5xg22wp6m8dx3wqr04a0y"; type = "gem"; }; version = "2.4.2"; }; attr_encrypted = { - dependencies = ["encryptor"]; - groups = ["default"]; - platforms = []; + dependencies = [ "encryptor" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "034x6mbrv9apd83v99v9pm8vl3d17w5bbwws26gr4wv95fylmgnc"; type = "gem"; }; version = "4.0.0"; }; attr_required = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1g22axmi2rhhy7w8c3x6gppsawxqavbrnxpnmphh22fk7cwi0kh2"; type = "gem"; }; version = "1.0.1"; }; awrence = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0gj8f8c54r9cabkm41s59sa1ca5wpbipw7gq3sfl87x9296227fx"; type = "gem"; }; version = "1.2.1"; }; aws-eventstream = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1pyis1nvnbjxk12a43xvgj2gv0mvp4cnkc1gzw0v1018r61399gz"; type = "gem"; }; version = "1.2.0"; }; aws-partitions = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0m2kha6ip4ynhvl1l8z4vg0j96ngq4f2v6jl4j2y27m2kzmgcxz5"; type = "gem"; }; version = "1.809.0"; }; aws-sdk-core = { - dependencies = ["aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath"]; - groups = ["default"]; - platforms = []; + dependencies = [ "aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0xjw9cf6ldbw50xi5ric8d63r8kybpsvaqxh2v6n7374hfady73i"; type = "gem"; }; version = "3.181.0"; }; aws-sdk-kms = { - dependencies = ["aws-sdk-core" "aws-sigv4"]; - groups = ["default"]; - platforms = []; + dependencies = [ "aws-sdk-core" "aws-sigv4" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1zr5w2cjd895abyn7y5gifhq37bxcinssvdx2l1qmlkllbdxbwq0"; type = "gem"; }; version = "1.71.0"; }; aws-sdk-s3 = { - dependencies = ["aws-sdk-core" "aws-sdk-kms" "aws-sigv4"]; - groups = ["default"]; - platforms = []; + dependencies = [ "aws-sdk-core" "aws-sdk-kms" "aws-sigv4" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0yymj15nwnvam95lw5fxwxx7b6xm4hkj8z7byzvjmx9aji1x245m"; type = "gem"; }; version = "1.133.0"; }; aws-sigv4 = { - dependencies = ["aws-eventstream"]; - groups = ["default"]; - platforms = []; + dependencies = [ "aws-eventstream" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0z889c4c1w7wsjm3szg64ay5j51kjl4pdf94nlr1yks2rlanm7na"; type = "gem"; }; version = "1.6.0"; }; azure-storage-blob = { - dependencies = ["azure-storage-common" "nokogiri"]; - groups = ["default"]; - platforms = []; + dependencies = [ "azure-storage-common" "nokogiri" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0qq3knsy7nj7a0r8m19spg2bgzns9b3j5vjbs9mpg49whhc63dv1"; type = "gem"; }; version = "2.0.3"; }; azure-storage-common = { - dependencies = ["faraday" "faraday_middleware" "net-http-persistent" "nokogiri"]; - groups = ["default"]; - platforms = []; + dependencies = [ "faraday" "faraday_middleware" "net-http-persistent" "nokogiri" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0swmsvvpmy8cdcl305p3dl2pi7m3dqjd7zywfcxmhsz0n2m4v3v0"; type = "gem"; }; version = "2.0.4"; }; base64 = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0cydk9p2cv25qysm0sn2pb97fcpz1isa7n3c8xm1gd99li8x6x8c"; type = "gem"; }; version = "0.1.1"; }; bcrypt = { - groups = ["default" "pam_authentication"]; - platforms = []; + groups = [ "default" "pam_authentication" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "048z3fvcknqx7ikkhrcrykxlqmf9bzc7l0y5h1cnvrc9n2qf0k8m"; type = "gem"; }; version = "3.1.18"; }; better_errors = { - dependencies = ["erubi" "rack" "rouge"]; - groups = ["development"]; - platforms = []; + dependencies = [ "erubi" "rack" "rouge" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0wqazisnn6hn1wsza412xribpw5wzx6b5z5p4mcpfgizr6xg367p"; type = "gem"; }; version = "2.10.1"; }; better_html = { - dependencies = ["actionview" "activesupport" "ast" "erubi" "parser" "smart_properties"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "actionview" "activesupport" "ast" "erubi" "parser" "smart_properties" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1y090dmgjxr3yzxi3pg5jgirkmyfdrmjhabmzmhg5i8ssiqr2gdz"; type = "gem"; }; version = "2.0.1"; }; bindata = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "04y4zgh4bbcb8wmkxwfqg4saky1d1f3xw8z6yk543q13h8ky8rz5"; type = "gem"; }; version = "2.4.15"; }; binding_of_caller = { - dependencies = ["debug_inspector"]; - groups = ["development"]; - platforms = []; + dependencies = [ "debug_inspector" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "078n2dkpgsivcf0pr50981w95nfc2bsrp3wpf9wnxz1qsp8jbb9s"; type = "gem"; }; version = "1.0.0"; }; blurhash = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "057afgqy73n8vm7k3cr4pbwm1hhqnm58lp4x7bgm5wzbs39m7xf8"; type = "gem"; }; version = "0.1.7"; }; bootsnap = { - dependencies = ["msgpack"]; - groups = ["default"]; - platforms = []; + dependencies = [ "msgpack" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1vcg52gwl64xhhal6kwk1pc01y1klzdlnv1awyk89kb91z010x7q"; type = "gem"; }; version = "1.16.0"; }; brakeman = { - groups = ["development"]; - platforms = []; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1gliwnyma9f1mpr928c79i36q51yl68dwjd3jgwvsyr4piiiqr1r"; type = "gem"; }; version = "6.0.1"; }; browser = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0g4bcpax07kqqr9cp7cjc7i0pcij4nqpn1rdsg2wdwhzf00m6x32"; type = "gem"; }; version = "5.3.1"; }; brpoplpush-redis_script = { - dependencies = ["concurrent-ruby" "redis"]; - groups = ["default"]; - platforms = []; + dependencies = [ "concurrent-ruby" "redis" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1nd5zj5yqmhv9lrsqz8s2dqq28v4ywy95qrw7nzhhf89dl4dq49l"; type = "gem"; }; version = "0.1.3"; }; builder = { - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "045wzckxpwcqzrjr353cxnyaxgf0qg22jh00dcx7z38cys5g1jlr"; type = "gem"; }; version = "3.2.4"; }; bundler-audit = { - dependencies = ["thor"]; - groups = ["development"]; - platforms = []; + dependencies = [ "thor" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0gdx0019vj04n1512shhdx7hwphzqmdpw4vva2k551nd47y1dixx"; type = "gem"; }; version = "0.9.1"; }; capistrano = { - dependencies = ["airbrussh" "i18n" "rake" "sshkit"]; - groups = ["development"]; - platforms = []; + dependencies = [ "airbrussh" "i18n" "rake" "sshkit" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "14pflh85rrs2l8k0m286j4vaab5vad2sfqq9dncqb31z05vy29mn"; type = "gem"; }; version = "3.17.3"; }; capistrano-bundler = { - dependencies = ["capistrano"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "capistrano" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "09rndb1fa9r7mhb2sc6p3k0pcarhg8mv0kfmvd1zdb0ciwwp7514"; type = "gem"; }; version = "2.1.0"; }; capistrano-rails = { - dependencies = ["capistrano" "capistrano-bundler"]; - groups = ["development"]; - platforms = []; + dependencies = [ "capistrano" "capistrano-bundler" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "05lk7y4qyzadzzshjyhgfgx00ggqliq7n561wkx8m331wljv7kx7"; type = "gem"; }; version = "1.6.3"; }; capistrano-rbenv = { - dependencies = ["capistrano" "sshkit"]; - groups = ["development"]; - platforms = []; + dependencies = [ "capistrano" "sshkit" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1x9m1i5zd0wx122zw3m40zprlmxk9d47bd6w61k81wr4qsvkk3rw"; type = "gem"; }; version = "2.2.0"; }; capistrano-yarn = { - dependencies = ["capistrano"]; - groups = ["development"]; - platforms = []; + dependencies = [ "capistrano" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1zdg2s061vl5b8114n909mrjb2hc1qx0i4wqx9nacsrcjgyp07l9"; type = "gem"; }; version = "2.0.2"; }; capybara = { - dependencies = ["addressable" "matrix" "mini_mime" "nokogiri" "rack" "rack-test" "regexp_parser" "xpath"]; - groups = ["test"]; - platforms = []; + dependencies = [ "addressable" "matrix" "mini_mime" "nokogiri" "rack" "rack-test" "regexp_parser" "xpath" ]; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "114qm5f5vhwaaw9rj1h2lcamh46zl13v1m18jiw68zl961gwmw6n"; type = "gem"; }; version = "3.39.2"; }; case_transform = { - dependencies = ["activesupport"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activesupport" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0fzyws6spn5arqf6q604dh9mrj84a36k5hsc8z7jgcpfvhc49bg2"; type = "gem"; }; version = "0.2"; }; cbor = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0511idr8xps9625nh3kxr68sdy6l3xy2kcz7r57g47fxb1v18jj3"; type = "gem"; }; version = "0.5.9.6"; }; charlock_holmes = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0hybw8jw9ryvz5zrki3gc9r88jqy373m6v46ynxsdzv1ysiyr40p"; type = "gem"; }; version = "0.7.7"; }; chewy = { - dependencies = ["activesupport" "elasticsearch" "elasticsearch-dsl"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activesupport" "elasticsearch" "elasticsearch-dsl" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0zca6v8i66jkxfdfjnn9xwg21pk95qn4ic8vzfvrx49d6sb8319y"; type = "gem"; }; version = "7.3.4"; }; chunky_png = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1znw5x86hmm9vfhidwdsijz8m38pqgmv98l9ryilvky0aldv7mc9"; type = "gem"; }; version = "1.4.0"; }; climate_control = { - groups = ["test"]; - platforms = []; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0q11v0iabvr6rif0d025xh078ili5frrihlj0m04zfg7lgvagxji"; type = "gem"; }; version = "0.2.0"; }; cocoon = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "038z97pkhvsqbh6cmyyzj58ya968p24k7r0f0rx7sa2kjvk193yh"; type = "gem"; }; version = "1.2.15"; }; color_diff = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "01dpvqlzybpb3pkcwd9ik5sbjw283618ywvdphxslhiy8ps3kp4r"; type = "gem"; }; version = "0.1"; }; concurrent-ruby = { - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0krcwb6mn0iklajwngwsg850nk8k9b35dhmc2qkbdqvmifdi2y9q"; type = "gem"; }; version = "1.2.2"; }; connection_pool = { - groups = ["default" "test"]; - platforms = []; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1x32mcpm2cl5492kd6lbjbaf17qsssmpx9kdyr7z1wcif2cwyh0g"; type = "gem"; }; version = "2.4.1"; }; cose = { - dependencies = ["cbor" "openssl-signature_algorithm"]; - groups = ["default"]; - platforms = []; + dependencies = [ "cbor" "openssl-signature_algorithm" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "00c6x4ha7qiaaf88qdbyf240mk146zz78rbm4qwyaxmwlmk7q933"; type = "gem"; }; version = "1.3.0"; }; crack = { - dependencies = ["rexml"]; - groups = ["default" "test"]; - platforms = []; + dependencies = [ "rexml" ]; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1cr1kfpw3vkhysvkk3wg7c54m75kd68mbm9rs5azdjdq57xid13r"; type = "gem"; }; version = "0.4.5"; }; crass = { - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0pfl5c0pyqaparxaqxi6s4gfl21bdldwiawrc0aknyvflli60lfw"; type = "gem"; }; version = "1.0.6"; }; css_parser = { - dependencies = ["addressable"]; - groups = ["default"]; - platforms = []; + dependencies = [ "addressable" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "04q1vin8slr3k8mp76qz0wqgap6f9kdsbryvgfq9fljhrm463kpj"; type = "gem"; }; version = "1.14.0"; }; database_cleaner-active_record = { - dependencies = ["activerecord" "database_cleaner-core"]; - groups = ["test"]; - platforms = []; + dependencies = [ "activerecord" "database_cleaner-core" ]; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "12hdsqnws9gyc9sxiyc8pjiwr0xa7136m1qbhmd1pk3vsrrvk13k"; type = "gem"; }; version = "2.1.0"; }; database_cleaner-core = { - groups = ["default" "test"]; - platforms = []; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0v44bn386ipjjh4m2kl53dal8g4d41xajn2jggnmjbhn6965fil6"; type = "gem"; }; version = "2.0.1"; }; date = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "03skfikihpx37rc27vr3hwrb057gxnmdzxhmzd4bf4jpkl0r55w1"; type = "gem"; }; version = "3.3.3"; }; debug_inspector = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "01l678ng12rby6660pmwagmyg8nccvjfgs3487xna7ay378a59ga"; type = "gem"; }; version = "1.1.0"; }; devise = { - dependencies = ["bcrypt" "orm_adapter" "railties" "responders" "warden"]; - groups = ["default" "pam_authentication"]; - platforms = []; + dependencies = [ "bcrypt" "orm_adapter" "railties" "responders" "warden" ]; + groups = [ "default" "pam_authentication" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0vpd7d61d4pfmyb2plnnv82wmczzlhw4k4gjhd2fv4r6vq8ilqqi"; type = "gem"; }; version = "4.9.2"; }; devise-two-factor = { - dependencies = ["activesupport" "attr_encrypted" "devise" "railties" "rotp"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activesupport" "attr_encrypted" "devise" "railties" "rotp" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1nk43p339zyp4y5vab3w3s0zbjd4xfs8qn0ymxdnz6d961dbbdm8"; type = "gem"; }; version = "4.1.0"; }; devise_pam_authenticatable2 = { - dependencies = ["devise" "rpam2"]; - groups = ["pam_authentication"]; - platforms = []; + dependencies = [ "devise" "rpam2" ]; + groups = [ "pam_authentication" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "13ipl52pkhc6vxp8ca31viwv01237bi2bfk3b1fixq1x46nf87p2"; type = "gem"; }; version = "9.2.0"; }; diff-lcs = { - groups = ["default" "development" "test"]; - platforms = []; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0rwvjahnp7cpmracd8x732rjgnilqv2sx7d1gfrysslc3h039fa9"; type = "gem"; }; version = "1.5.0"; }; discard = { - dependencies = ["activerecord"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activerecord" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1xavjhccyyzn9z6fz3034vgvzprc983mbrq6n9sc0drfw7m3vrip"; type = "gem"; }; version = "1.2.1"; }; docile = { - groups = ["default" "test"]; - platforms = []; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1lxqxgq71rqwj1lpl9q1mbhhhhhhdkkj7my341f2889pwayk85sz"; type = "gem"; }; version = "1.4.0"; }; domain_name = { - dependencies = ["unf"]; - groups = ["default"]; - platforms = []; + dependencies = [ "unf" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0lcqjsmixjp52bnlgzh4lg9ppsk52x9hpwdjd53k8jnbah2602h0"; type = "gem"; }; version = "0.5.20190701"; }; doorkeeper = { - dependencies = ["railties"]; - groups = ["default"]; - platforms = []; + dependencies = [ "railties" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1q2pywgyn6cbnm0fh3dln5z1qgd1g8hvb4x8rppjc1bpfxnfhi13"; type = "gem"; }; version = "5.6.6"; }; dotenv = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1n0pi8x8ql5h1mijvm8lgn6bhq4xjb5a500p5r1krq4s6j9lg565"; type = "gem"; }; version = "2.8.1"; }; dotenv-rails = { - dependencies = ["dotenv" "railties"]; - groups = ["default"]; - platforms = []; + dependencies = [ "dotenv" "railties" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0v0gcbxzypcvy6fqq4gp80jb310xvdwj5n8qw9ci67g5yjvq2nxh"; type = "gem"; }; version = "2.8.1"; }; ed25519 = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0zb2dr2ihb1qiknn5iaj1ha1w9p7lj9yq5waasndlfadz225ajji"; type = "gem"; }; version = "1.3.0"; }; elasticsearch = { - dependencies = ["elasticsearch-api" "elasticsearch-transport"]; - groups = ["default"]; - platforms = []; + dependencies = [ "elasticsearch-api" "elasticsearch-transport" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0havyxmvl157a653prspnbhgdchlx44xqxl170v1im5ggxwavcaq"; type = "gem"; }; version = "7.13.3"; }; elasticsearch-api = { - dependencies = ["multi_json"]; - groups = ["default"]; - platforms = []; + dependencies = [ "multi_json" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0bmssarkk7lqkjdn8c9j7jvxcnn4hg1zcmhsky8bfvc99k33b3w8"; type = "gem"; }; version = "7.13.3"; }; elasticsearch-dsl = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "174m3fwm3mawbkjg2xbmqvljq7ava4s95m8vpg5khcvfj506wxfk"; type = "gem"; }; version = "0.1.10"; }; elasticsearch-transport = { - dependencies = ["faraday" "multi_json"]; - groups = ["default"]; - platforms = []; + dependencies = [ "faraday" "multi_json" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0blfii8qvj0m6bg9sbfynxc40in7zfmw2wpi4clv7d9gclk053db"; type = "gem"; }; version = "7.13.3"; }; encryptor = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0s8rvfl0vn8w7k1sgkc234060jh468s3zd45xa64p1jdmfa3zwmb"; type = "gem"; }; version = "3.0.0"; }; erubi = { - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "08s75vs9cxlc4r1q2bjg4br8g9wc5lc5x5vl0vv4zq5ivxsdpgi7"; type = "gem"; }; version = "1.12.0"; }; et-orbi = { - dependencies = ["tzinfo"]; - groups = ["default"]; - platforms = []; + dependencies = [ "tzinfo" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1d2z4ky2v15dpcz672i2p7lb2nc793dasq3yq3660h2az53kss9v"; type = "gem"; }; version = "1.2.7"; }; excon = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "08r6qgbpkxxsihjmlspk3l1sr69q5hx35p1l4wp7rmkbzys89867"; type = "gem"; }; version = "0.100.0"; }; fabrication = { - groups = ["test"]; - platforms = []; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0bxssmjp49whzq2zv7w751gr4nkdaiwcxd1vda0byigwyrnj6f5q"; type = "gem"; }; version = "2.30.0"; }; faker = { - dependencies = ["i18n"]; - groups = ["test"]; - platforms = []; + dependencies = [ "i18n" ]; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0ysiqlvyy1351bzx7h92r93a35s32l8giyf9bac6sgr142sh3cnn"; type = "gem"; }; version = "3.2.1"; }; faraday = { - dependencies = ["faraday-em_http" "faraday-em_synchrony" "faraday-excon" "faraday-httpclient" "faraday-multipart" "faraday-net_http" "faraday-net_http_persistent" "faraday-patron" "faraday-rack" "faraday-retry" "ruby2_keywords"]; - groups = ["default"]; - platforms = []; + dependencies = [ "faraday-em_http" "faraday-em_synchrony" "faraday-excon" "faraday-httpclient" "faraday-multipart" "faraday-net_http" "faraday-net_http_persistent" "faraday-patron" "faraday-rack" "faraday-retry" "ruby2_keywords" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1c760q0ks4vj4wmaa7nh1dgvgqiwaw0mjr7v8cymy7i3ffgjxx90"; type = "gem"; }; version = "1.10.3"; }; faraday-em_http = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "12cnqpbak4vhikrh2cdn94assh3yxza8rq2p9w2j34bqg5q4qgbs"; type = "gem"; }; version = "1.0.0"; }; faraday-em_synchrony = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1vgrbhkp83sngv6k4mii9f2s9v5lmp693hylfxp2ssfc60fas3a6"; type = "gem"; }; version = "1.0.0"; }; faraday-excon = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0h09wkb0k0bhm6dqsd47ac601qiaah8qdzjh8gvxfd376x1chmdh"; type = "gem"; }; version = "1.1.0"; }; faraday-httpclient = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0fyk0jd3ks7fdn8nv3spnwjpzx2lmxmg2gh4inz3by1zjzqg33sc"; type = "gem"; }; version = "1.0.1"; }; faraday-multipart = { - dependencies = ["multipart-post"]; - groups = ["default"]; - platforms = []; + dependencies = [ "multipart-post" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "09871c4hd7s5ws1wl4gs7js1k2wlby6v947m2bbzg43pnld044lh"; type = "gem"; }; version = "1.0.4"; }; faraday-net_http = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1fi8sda5hc54v1w3mqfl5yz09nhx35kglyx72w7b8xxvdr0cwi9j"; type = "gem"; }; version = "1.0.1"; }; faraday-net_http_persistent = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0dc36ih95qw3rlccffcb0vgxjhmipsvxhn6cw71l7ffs0f7vq30b"; type = "gem"; }; version = "1.2.0"; }; faraday-patron = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "19wgsgfq0xkski1g7m96snv39la3zxz6x7nbdgiwhg5v82rxfb6w"; type = "gem"; }; version = "1.0.0"; }; faraday-rack = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1h184g4vqql5jv9s9im6igy00jp6mrah2h14py6mpf9bkabfqq7g"; type = "gem"; }; version = "1.0.0"; }; faraday-retry = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "153i967yrwnswqgvnnajgwp981k9p50ys1h80yz3q94rygs59ldd"; type = "gem"; }; version = "1.0.3"; }; faraday_middleware = { - dependencies = ["faraday"]; - groups = ["default"]; - platforms = []; + dependencies = [ "faraday" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1bw8mfh4yin2xk7138rg3fhb2p5g2dlmdma88k82psah9mbmvlfy"; type = "gem"; }; version = "1.2.0"; }; fast_blank = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1shpmamyzyhyxmv95r96ja5rylzaw60r19647d0fdm7y2h2c77r6"; type = "gem"; }; version = "1.0.1"; }; fastimage = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1pd7pamzhdz2w0fbcvsfn2nyslznvphnwj16zw35g2b28zd2xyzx"; type = "gem"; }; version = "2.2.7"; }; ffi = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1862ydmclzy1a0cjbvm8dz7847d9rch495ib0zb64y84d3xd4bkg"; type = "gem"; }; version = "1.15.5"; }; ffi-compiler = { - dependencies = ["ffi" "rake"]; - groups = ["default"]; - platforms = []; + dependencies = [ "ffi" "rake" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0c2caqm9wqnbidcb8dj4wd3s902z15qmgxplwyfyqbwa0ydki7q1"; type = "gem"; }; version = "1.0.1"; }; fog-core = { - dependencies = ["builder" "excon" "formatador" "mime-types"]; - groups = ["default"]; - platforms = []; + dependencies = [ "builder" "excon" "formatador" "mime-types" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1agd6xgzk0rxrsjdpn94v4hy89s0nm2cs4zg2p880w2dan9xgrak"; type = "gem"; }; version = "2.1.0"; }; fog-json = { - dependencies = ["fog-core" "multi_json"]; - groups = ["default"]; - platforms = []; + dependencies = [ "fog-core" "multi_json" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1zj8llzc119zafbmfa4ai3z5s7c4vp9akfs0f9l2piyvcarmlkyx"; type = "gem"; }; version = "1.2.0"; }; fog-openstack = { - dependencies = ["fog-core" "fog-json" "ipaddress"]; - groups = ["default"]; - platforms = []; + dependencies = [ "fog-core" "fog-json" "ipaddress" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "11j18h61d3p0pcp9k5346lbj1lahab1dqybkrx9338932lmjn7ap"; type = "gem"; }; version = "0.3.10"; }; formatador = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0mprf1dwznz5ld0q1jpbyl59fwnwk6azspnd0am7zz7kfg3pxhv5"; type = "gem"; }; version = "0.3.0"; }; fugit = { - dependencies = ["et-orbi" "raabro"]; - groups = ["default"]; - platforms = []; + dependencies = [ "et-orbi" "raabro" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1cm2lrvhrpqq19hbdsxf4lq2nkb2qdldbdxh3gvi15l62dlb5zqq"; type = "gem"; }; version = "1.8.1"; }; fuubar = { - dependencies = ["rspec-core" "ruby-progressbar"]; - groups = ["test"]; - platforms = []; + dependencies = [ "rspec-core" "ruby-progressbar" ]; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1028vn7j3kc5qqwswrf3has3qm4j9xva70xmzb3n29i89f0afwmj"; type = "gem"; }; version = "2.5.1"; }; globalid = { - dependencies = ["activesupport"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "activesupport" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0kqm5ndzaybpnpxqiqkc41k4ksyxl41ln8qqr6kb130cdxsf2dxk"; type = "gem"; }; version = "1.1.0"; }; haml = { - dependencies = ["temple" "thor" "tilt"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "temple" "thor" "tilt" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "154svzqlkdq7gslv3p8mfih28gbw4gsj4pd8wr1wpwz6nyzmhh8m"; type = "gem"; }; version = "6.1.2"; }; haml-rails = { - dependencies = ["actionpack" "activesupport" "haml" "railties"]; - groups = ["default"]; - platforms = []; + dependencies = [ "actionpack" "activesupport" "haml" "railties" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1sjrdwc4azzfpsp2xk0365z031482gcrs0c54d5wx0igkqca0fr7"; type = "gem"; }; version = "2.1.0"; }; haml_lint = { - dependencies = ["haml" "parallel" "rainbow" "rubocop" "sysexits"]; - groups = ["development"]; - platforms = []; + dependencies = [ "haml" "parallel" "rainbow" "rubocop" "sysexits" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1qics7sll6yw7fm499q4b1frfr5f3gav94ach0fwy49zprl9yk33"; type = "gem"; }; version = "0.50.0"; }; hashdiff = { - groups = ["default" "test"]; - platforms = []; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1nynpl0xbj0nphqx1qlmyggq58ms1phf5i03hk64wcc0a17x1m1c"; type = "gem"; }; version = "1.0.1"; }; hashie = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1nh3arcrbz1rc1cr59qm53sdhqm137b258y8rcb4cvd3y98lwv4x"; type = "gem"; }; version = "5.0.0"; }; hcaptcha = { - dependencies = ["json"]; - groups = ["default"]; - platforms = []; + dependencies = [ "json" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0fh6391zlv2ikvzqj2gymb70k1avk1j9da8bzgw0scsz2wqq98m2"; type = "gem"; }; version = "7.1.0"; }; highline = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1f8cr014j7mdqpdb9q17fp5vb5b8n1pswqaif91s3ylg5x3pygfn"; type = "gem"; }; version = "2.1.0"; }; hiredis = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "04jj8k7lxqxw24sp0jiravigdkgsyrpprxpxm71ba93x1wr2w1bz"; type = "gem"; }; version = "0.6.3"; }; hkdf = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "04fixg0a51n4vy0j6c1hvisa2yl33m3jrrpxpb5sq6j511vjriil"; type = "gem"; }; version = "0.3.0"; }; htmlentities = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1nkklqsn8ir8wizzlakncfv42i32wc0w9hxp00hvdlgjr7376nhj"; type = "gem"; }; version = "4.3.4"; }; http = { - dependencies = ["addressable" "http-cookie" "http-form_data" "llhttp-ffi"]; - groups = ["default"]; - platforms = []; + dependencies = [ "addressable" "http-cookie" "http-form_data" "llhttp-ffi" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1bzb8p31kzv6q5p4z5xq88mnqk414rrw0y5rkhpnvpl29x5c3bpw"; type = "gem"; }; version = "5.1.1"; }; http-cookie = { - dependencies = ["domain_name"]; - groups = ["default"]; - platforms = []; + dependencies = [ "domain_name" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "13rilvlv8kwbzqfb644qp6hrbsj82cbqmnzcvqip1p6vqx36sxbk"; type = "gem"; }; version = "1.0.5"; }; http-form_data = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1wx591jdhy84901pklh1n9sgh74gnvq1qyqxwchni1yrc49ynknc"; type = "gem"; }; version = "2.3.0"; }; http_accept_language = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0d0nlfz9vm4jr1l6q0chx4rp2hrnrfbx3gadc1dz930lbbaz0hq0"; type = "gem"; }; version = "2.1.1"; }; httpclient = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "19mxmvghp7ki3klsxwrlwr431li7hm1lczhhj8z4qihl2acy8l99"; type = "gem"; }; version = "2.8.3"; }; httplog = { - dependencies = ["rack" "rainbow"]; - groups = ["default"]; - platforms = []; + dependencies = [ "rack" "rainbow" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0zjsgrlvwpqsnrza4ijlxjld4550c661sgbqp2j2wp638nlnls1a"; type = "gem"; }; version = "1.6.2"; }; i18n = { - dependencies = ["concurrent-ruby"]; - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + dependencies = [ "concurrent-ruby" ]; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0qaamqsh5f3szhcakkak8ikxlzxqnv49n2p7504hcz2l0f4nj0wx"; type = "gem"; }; version = "1.14.1"; }; i18n-tasks = { - dependencies = ["activesupport" "ast" "better_html" "erubi" "highline" "i18n" "parser" "rails-i18n" "rainbow" "terminal-table"]; - groups = ["development"]; - platforms = []; + dependencies = [ "activesupport" "ast" "better_html" "erubi" "highline" "i18n" "parser" "rails-i18n" "rainbow" "terminal-table" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "19zkcsqwzc3i6vizj26mxxww6m5grv9zmp6yxyswbqq9kyzb081z"; type = "gem"; }; version = "1.0.12"; }; idn-ruby = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0dy04jx3n1ddz744b80mg7hp87miysnjp0h21lqr43hpmhdglxih"; type = "gem"; }; version = "0.1.5"; }; ipaddress = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1x86s0s11w202j6ka40jbmywkrx8fhq8xiy8mwvnkhllj57hqr45"; type = "gem"; }; version = "0.8.3"; }; jmespath = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1cdw9vw2qly7q7r41s7phnac264rbsdqgj4l0h4nqgbjb157g393"; type = "gem"; }; version = "1.6.2"; }; json = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0nalhin1gda4v8ybk6lq8f407cgfrj6qzn234yra4ipkmlbfmal6"; type = "gem"; }; version = "2.6.3"; }; json-canonicalization = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1rvsalsrs8njk2gqxgq0ydg5cd02jqdawskbq2ccz663qxz8wwq5"; type = "gem"; }; version = "0.3.2"; }; json-jwt = { - dependencies = ["activesupport" "aes_key_wrap" "bindata" "httpclient"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activesupport" "aes_key_wrap" "bindata" "httpclient" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "04315mf4p9qa97grdfqv922paghzdfrbb982ap0p99rqwla4znv6"; type = "gem"; }; version = "1.15.3"; }; json-ld = { - dependencies = ["htmlentities" "json-canonicalization" "link_header" "multi_json" "rack" "rdf"]; - groups = ["default"]; - platforms = []; + dependencies = [ "htmlentities" "json-canonicalization" "link_header" "multi_json" "rack" "rdf" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1z3kqacjmqs02vwwqm9di7sw7f7nchxx99v84myrrzmh64c6zfcq"; type = "gem"; }; version = "3.2.5"; }; json-ld-preloaded = { - dependencies = ["json-ld" "rdf"]; - groups = ["default"]; - platforms = []; + dependencies = [ "json-ld" "rdf" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "004s52m37b2kbw8dv4rdfm2d90h1023z1mw9zfcs0x87v8aq7zyn"; type = "gem"; }; version = "3.2.2"; }; json-schema = { - dependencies = ["addressable"]; - groups = ["test"]; - platforms = []; + dependencies = [ "addressable" ]; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "155rygs093i8i04i38a97hs5icmqk2jkkhx76w31yxyr3bxfbgx3"; type = "gem"; }; version = "4.0.0"; }; jsonapi-renderer = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0ys4drd0k9rw5ixf8n8fx8v0pjh792w4myh0cpdspd317l1lpi5m"; type = "gem"; }; version = "0.2.2"; }; jwt = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "16z11alz13vfc4zs5l3fk6n51n2jw9lskvc4h4prnww0y797qd87"; type = "gem"; }; version = "2.7.1"; }; kaminari = { - dependencies = ["activesupport" "kaminari-actionview" "kaminari-activerecord" "kaminari-core"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activesupport" "kaminari-actionview" "kaminari-activerecord" "kaminari-core" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0gia8irryvfhcr6bsr64kpisbgdbqjsqfgrk12a11incmpwny1y4"; type = "gem"; }; version = "1.2.2"; }; kaminari-actionview = { - dependencies = ["actionview" "kaminari-core"]; - groups = ["default"]; - platforms = []; + dependencies = [ "actionview" "kaminari-core" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "02f9ghl3a9b5q7l079d3yzmqjwkr4jigi7sldbps992rigygcc0k"; type = "gem"; }; version = "1.2.2"; }; kaminari-activerecord = { - dependencies = ["activerecord" "kaminari-core"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activerecord" "kaminari-core" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0c148z97s1cqivzbwrak149z7kl1rdmj7dxk6rpkasimmdxsdlqd"; type = "gem"; }; version = "1.2.2"; }; kaminari-core = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1zw3pg6kj39y7jxakbx7if59pl28lhk98fx71ks5lr3hfgn6zliv"; type = "gem"; }; version = "1.2.2"; }; kt-paperclip = { - dependencies = ["activemodel" "activesupport" "marcel" "mime-types" "terrapin"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activemodel" "activesupport" "marcel" "mime-types" "terrapin" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0qrv9xyxxhxr482p25f3m7nfghw66i8jl02hy9b6pwam8m1knngp"; type = "gem"; }; version = "7.2.0"; }; language_server-protocol = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0gvb1j8xsqxms9mww01rmdl78zkd72zgxaap56bhv8j45z05hp1x"; type = "gem"; }; version = "3.17.0.3"; }; launchy = { - dependencies = ["addressable"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "addressable" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "06r43899384das2bkbrpsdxsafyyqa94il7111053idfalb4984a"; type = "gem"; }; version = "2.5.2"; }; letter_opener = { - dependencies = ["launchy"]; - groups = ["development"]; - platforms = []; + dependencies = [ "launchy" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1y5d4ip4l12v58bgazadl45iv3a5j7jp2gwg96b6jy378zn42a1d"; type = "gem"; }; version = "1.8.1"; }; letter_opener_web = { - dependencies = ["actionmailer" "letter_opener" "railties" "rexml"]; - groups = ["development"]; - platforms = []; + dependencies = [ "actionmailer" "letter_opener" "railties" "rexml" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0vvvaz2ngaxv0s6sj25gdvp73vd8pfl8q3jharadg18p3va0m1ik"; type = "gem"; }; version = "2.0.0"; }; link_header = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1yamrdq4rywmnpdhbygnkkl9fdy249fg5r851nrkkxr97gj5rihm"; type = "gem"; }; version = "0.0.8"; }; llhttp-ffi = { - dependencies = ["ffi-compiler" "rake"]; - groups = ["default"]; - platforms = []; + dependencies = [ "ffi-compiler" "rake" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "00dh6zmqdj59rhcya0l4b9aaxq6n8xizfbil93k0g06gndyk5xz5"; type = "gem"; }; version = "0.4.0"; }; lograge = { - dependencies = ["actionpack" "activesupport" "railties" "request_store"]; - groups = ["production"]; - platforms = []; + dependencies = [ "actionpack" "activesupport" "railties" "request_store" ]; + groups = [ "production" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "01kdw5dbzimb89rq4zf44zf8990czb5qxvib0hzja1l4hrha8cki"; type = "gem"; }; version = "0.13.0"; }; loofah = { - dependencies = ["crass" "nokogiri"]; - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + dependencies = [ "crass" "nokogiri" ]; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1p744kjpb5zk2ihklbykzii77alycjc04vpnm2ch2f3cp65imlj3"; type = "gem"; }; version = "2.21.3"; }; mail = { - dependencies = ["mini_mime" "net-imap" "net-pop" "net-smtp"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "mini_mime" "net-imap" "net-pop" "net-smtp" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1bf9pysw1jfgynv692hhaycfxa8ckay1gjw5hz3madrbrynryfzc"; type = "gem"; }; version = "2.8.1"; }; marcel = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0kky3yiwagsk8gfbzn3mvl2fxlh3b39v6nawzm4wpjs6xxvvc4x0"; type = "gem"; }; version = "1.0.2"; }; mario-redis-lock = { - dependencies = ["redis"]; - groups = ["default"]; - platforms = []; + dependencies = [ "redis" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1v9wdjcjqzpns2migxp4a5b4w82mipi0fwihbqz3q2qj2qm7wc17"; type = "gem"; }; version = "1.2.1"; }; matrix = { - groups = ["default" "test"]; - platforms = []; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1h2cgkpzkh3dd0flnnwfq6f3nl2b1zff9lvqz8xs853ssv5kq23i"; type = "gem"; }; version = "0.4.2"; }; md-paperclip-azure = { - dependencies = ["addressable" "azure-storage-blob" "hashie"]; - groups = ["default"]; - platforms = []; + dependencies = [ "addressable" "azure-storage-blob" "hashie" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1hb1a06x3i8zrhl715jf46ha8r4iy0srcpdhnmp9l14qnnhzn0l5"; type = "gem"; }; version = "2.2.0"; }; memory_profiler = { - groups = ["development" "test"]; - platforms = []; + groups = [ "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1c81d68r4wx0ckbmqxlfqc2qpd94jwcmqdm0xgr0s46r48pv9k9q"; type = "gem"; }; version = "1.0.1"; }; method_source = { - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1pnyh44qycnf9mzi1j6fywd5fkskv3x7nmsqrrws0rjn5dd4ayfp"; type = "gem"; }; version = "1.0.0"; }; mime-types = { - dependencies = ["mime-types-data"]; - groups = ["default"]; - platforms = []; + dependencies = [ "mime-types-data" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0q8d881k1b3rbsfcdi3fx0b5vpdr5wcrhn88r2d9j7zjdkxp5mw5"; type = "gem"; }; version = "3.5.1"; }; mime-types-data = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "17zdim7kzrh5j8c97vjqp4xp78wbyz7smdp4hi5iyzk0s9imdn5a"; type = "gem"; }; version = "3.2023.0808"; }; mini_mime = { - groups = ["default" "development" "test"]; - platforms = []; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1vycif7pjzkr29mfk4dlqv3disc5dn0va04lkwajlpr1wkibg0c6"; type = "gem"; }; version = "1.1.5"; }; mini_portile2 = { - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "02mj8mpd6ck5gpcnsimx5brzggw5h5mmmpq2djdypfq16wcw82qq"; type = "gem"; }; version = "2.8.4"; }; minitest = { - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0jnpsbb2dbcs95p4is4431l2pw1l5pn7dfg3vkgb4ga464j0c5l6"; type = "gem"; }; version = "5.19.0"; }; msgpack = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "06n7556vxr3awh92xy1k5bli98bvq4pjm08mnl68ay4fzln7lcsg"; type = "gem"; }; version = "1.7.1"; }; multi_json = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0pb1g1y3dsiahavspyzkdy39j4q377009f6ix0bh1ag4nqw43l0z"; type = "gem"; }; version = "1.15.0"; }; multipart-post = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0lgyysrpl50wgcb9ahg29i4p01z0irb3p9lirygma0kkfr5dgk9x"; type = "gem"; }; version = "2.3.0"; }; net-http = { - dependencies = ["uri"]; - groups = ["default"]; - platforms = []; + dependencies = [ "uri" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0y55ib1v2b8prqfi9ij7hca60b1j94s2bzr6vskwi3i5735472wq"; type = "gem"; }; version = "0.3.2"; }; net-http-persistent = { - dependencies = ["connection_pool"]; - groups = ["default"]; - platforms = []; + dependencies = [ "connection_pool" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0i1as2lgnw7b4jid0gw5glv5hnxz36nmfsbr9rmxbcap72ijgy03"; type = "gem"; }; version = "4.0.2"; }; net-imap = { - dependencies = ["date" "net-protocol"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "date" "net-protocol" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0lf7wqg7czhaj51qsnmn28j7jmcxhkh3m28rl1cjrqsgjxhwj7r3"; type = "gem"; }; version = "0.3.7"; }; net-ldap = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0xqcffn3c1564c4fizp10dzw2v5g2pabdzrcn25hq05bqhsckbar"; type = "gem"; }; version = "0.18.0"; }; net-pop = { - dependencies = ["net-protocol"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "net-protocol" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1wyz41jd4zpjn0v1xsf9j778qx1vfrl24yc20cpmph8k42c4x2w4"; type = "gem"; }; version = "0.1.2"; }; net-protocol = { - dependencies = ["timeout"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "timeout" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0dxckrlw4q1lcn3qg4mimmjazmg9bma5gllv72f8js3p36fb3b91"; type = "gem"; }; version = "0.2.1"; }; net-scp = { - dependencies = ["net-ssh"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "net-ssh" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1si2nq9l6jy5n2zw1q59a5gaji7v9vhy8qx08h4fg368906ysbdk"; type = "gem"; }; version = "4.0.0"; }; net-smtp = { - dependencies = ["net-protocol"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "net-protocol" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1c6md06hm5bf6rv53sk54dl2vg038pg8kglwv3rayx0vk2mdql9x"; type = "gem"; }; version = "0.3.3"; }; net-ssh = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0yx0pb5fmziz92bw8qzbh8vf20lr56nd3s6q8h0gsgr307lki687"; type = "gem"; }; version = "7.1.0"; }; nio4r = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0w9978zwjf1qhy3amkivab0f9syz6a7k0xgydjidaf7xc831d78f"; type = "gem"; }; version = "2.5.9"; }; nokogiri = { - dependencies = ["mini_portile2" "racc"]; - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + dependencies = [ "mini_portile2" "racc" ]; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0k9w2z0953mnjrsji74cshqqp08q7m1r6zhadw1w0g34xzjh3a74"; type = "gem"; }; version = "1.15.4"; }; nsa = { - dependencies = ["activesupport" "concurrent-ruby" "sidekiq" "statsd-ruby"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activesupport" "concurrent-ruby" "sidekiq" "statsd-ruby" ]; + groups = [ "default" ]; + platforms = [ ]; source = { fetchSubmodules = false; rev = "e020fcc3a54d993ab45b7194d89ab720296c111b"; @@ -1890,30 +1890,30 @@ version = "0.2.8"; }; oj = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0m4vsd6i093kmyz9gckvzpnws997laldaiaf86hg5lza1ir82x7n"; type = "gem"; }; version = "3.16.1"; }; omniauth = { - dependencies = ["hashie" "rack" "rack-protection"]; - groups = ["default"]; - platforms = []; + dependencies = [ "hashie" "rack" "rack-protection" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "15xjsxis357np7dy1lak39x1n8g8wxljb08wplw5i4gxi743zr7j"; type = "gem"; }; version = "2.1.1"; }; omniauth-cas = { - dependencies = ["addressable" "nokogiri" "omniauth"]; - groups = ["default"]; - platforms = []; + dependencies = [ "addressable" "nokogiri" "omniauth" ]; + groups = [ "default" ]; + platforms = [ ]; source = { fetchSubmodules = false; rev = "4211e6d05941b4a981f9a36b49ec166cecd0e271"; @@ -1924,382 +1924,382 @@ version = "2.0.0"; }; omniauth-rails_csrf_protection = { - dependencies = ["actionpack" "omniauth"]; - groups = ["default"]; - platforms = []; + dependencies = [ "actionpack" "omniauth" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1kwswnkyl8ym6i4wv65qh3qchqbf2n0c6lbhfgbvkds3gpmnlm7w"; type = "gem"; }; version = "1.0.1"; }; omniauth-saml = { - dependencies = ["omniauth" "ruby-saml"]; - groups = ["default"]; - platforms = []; + dependencies = [ "omniauth" "ruby-saml" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "01k9rkg97npcgm8r4x3ja8y20hsg4zy0dcjpzafx148q4yxbg74n"; type = "gem"; }; version = "2.1.0"; }; omniauth_openid_connect = { - dependencies = ["omniauth" "openid_connect"]; - groups = ["default"]; - platforms = []; + dependencies = [ "omniauth" "openid_connect" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "08yl0x203k6nrshc70zawfqh79ap1c3fyka9zwwy61cvn7sih4sz"; type = "gem"; }; version = "0.6.1"; }; openid_connect = { - dependencies = ["activemodel" "attr_required" "json-jwt" "net-smtp" "rack-oauth2" "swd" "tzinfo" "validate_email" "validate_url" "webfinger"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activemodel" "attr_required" "json-jwt" "net-smtp" "rack-oauth2" "swd" "tzinfo" "validate_email" "validate_url" "webfinger" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1k9kdivp45v6vhzdrnl5fzhd378gjj2hl4w9bazbqnfm15rsnzc8"; type = "gem"; }; version = "1.4.2"; }; openssl = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0c649921vg2l939z5cc3jwd8p1v49099pdhxfk7sb9qqx5wi5873"; type = "gem"; }; version = "3.1.0"; }; openssl-signature_algorithm = { - dependencies = ["openssl"]; - groups = ["default"]; - platforms = []; + dependencies = [ "openssl" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "103yjl68wqhl5kxaciir5jdnyi7iv9yckishdr52s5knh9g0pd53"; type = "gem"; }; version = "1.3.0"; }; orm_adapter = { - groups = ["default" "pam_authentication"]; - platforms = []; + groups = [ "default" "pam_authentication" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1fg9jpjlzf5y49qs9mlpdrgs5rpcyihq1s4k79nv9js0spjhnpda"; type = "gem"; }; version = "0.5.0"; }; ox = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1yq0h1niimm8z6z8p1yxb104kxqw69bvbrax84598zfjxifcxhxz"; type = "gem"; }; version = "2.14.17"; }; parallel = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0jcc512l38c0c163ni3jgskvq1vc3mr8ly5pvjijzwvfml9lf597"; type = "gem"; }; version = "1.23.0"; }; parser = { - dependencies = ["ast" "racc"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "ast" "racc" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1swigds85jddb5gshll1g8lkmbcgbcp9bi1d4nigwvxki8smys0h"; type = "gem"; }; version = "3.2.2.3"; }; parslet = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "01pnw6ymz6nynklqvqxs4bcai25kcvnd5x4id9z3vd1rbmlk0lfl"; type = "gem"; }; version = "2.0.0"; }; pastel = { - dependencies = ["tty-color"]; - groups = ["default"]; - platforms = []; + dependencies = [ "tty-color" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0xash2gj08dfjvq4hy6l1z22s5v30fhizwgs10d6nviggpxsj7a8"; type = "gem"; }; version = "0.8.0"; }; pg = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0pfj771p5a29yyyw58qacks464sl86d5m3jxjl5rlqqw2m3v5xq4"; type = "gem"; }; version = "1.5.4"; }; pghero = { - dependencies = ["activerecord"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activerecord" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "002v32dzyyr29xd9cdsqp55g5gx19skvq9b4a4hr9lrs4i1xsavm"; type = "gem"; }; version = "3.3.3"; }; posix-spawn = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0cmb0svalqcxfzlzc5fvrci12b79x7bakasr8gkl3q5rz6di1q52"; type = "gem"; }; version = "0.3.15"; }; premailer = { - dependencies = ["addressable" "css_parser" "htmlentities"]; - groups = ["default"]; - platforms = []; + dependencies = [ "addressable" "css_parser" "htmlentities" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "10rzwdz43yy20lwzsr2as6aivhvwjvqh4nd48sa0ga57sizf1fb4"; type = "gem"; }; version = "1.21.0"; }; premailer-rails = { - dependencies = ["actionmailer" "net-smtp" "premailer"]; - groups = ["default"]; - platforms = []; + dependencies = [ "actionmailer" "net-smtp" "premailer" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0004f73kgrglida336fqkgx906m6n05nnfc17mypzg5rc78iaf61"; type = "gem"; }; version = "1.12.0"; }; private_address_check = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "05phz0vscfh9chv90yc9091pifw3cpwkh76flnhrmvja1q3na4cy"; type = "gem"; }; version = "0.5.0"; }; public_suffix = { - groups = ["default" "development" "test"]; - platforms = []; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0n9j7mczl15r3kwqrah09cxj8hxdfawiqxa60kga2bmxl9flfz9k"; type = "gem"; }; version = "5.0.3"; }; puma = { - dependencies = ["nio4r"]; - groups = ["default"]; - platforms = []; + dependencies = [ "nio4r" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1x4dwx2shx0p7lsms97r85r7ji7zv57bjy3i1kmcpxc8bxvrr67c"; type = "gem"; }; version = "6.3.1"; }; pundit = { - dependencies = ["activesupport"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activesupport" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1wb03yzy1j41822rbfh9nn77im3zh1f5v8di05cd8rsrdpws542b"; type = "gem"; }; version = "2.3.0"; }; raabro = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "10m8bln9d00dwzjil1k42i5r7l82x25ysbi45fwyv4932zsrzynl"; type = "gem"; }; version = "1.4.0"; }; racc = { - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "11v3l46mwnlzlc371wr3x6yylpgafgwdf0q7hc7c1lzx6r414r5g"; type = "gem"; }; version = "1.7.1"; }; rack = { - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "15rdwbyk71c9nxvd527bvb8jxkcys8r3dj3vqra5b3sa63qs30vv"; type = "gem"; }; version = "2.2.8"; }; rack-attack = { - dependencies = ["rack"]; - groups = ["default"]; - platforms = []; + dependencies = [ "rack" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0z6pj5vjgl6swq7a33gssf795k958mss8gpmdb4v4cydcs7px91w"; type = "gem"; }; version = "6.7.0"; }; rack-cors = { - dependencies = ["rack"]; - groups = ["default"]; - platforms = []; + dependencies = [ "rack" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "02lvkg1nb4z3zc2nry545dap7a64bb9h2k8waxfz0jkabkgnpimw"; type = "gem"; }; version = "2.0.1"; }; rack-oauth2 = { - dependencies = ["activesupport" "attr_required" "httpclient" "json-jwt" "rack"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activesupport" "attr_required" "httpclient" "json-jwt" "rack" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1fknwsxz4429w1hndl6y30cmm2n34wmmaaj2hhp6jrm8ssfsfwjf"; type = "gem"; }; version = "1.21.3"; }; rack-protection = { - dependencies = ["rack"]; - groups = ["default"]; - platforms = []; + dependencies = [ "rack" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1a12m1mv8dc0g90fs1myvis8vsgr427k1arg1q4a9qlfw6fqyhis"; type = "gem"; }; version = "3.0.5"; }; rack-proxy = { - dependencies = ["rack"]; - groups = ["default"]; - platforms = []; + dependencies = [ "rack" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1a62439xwn5v6hsl9s11hdk4wj58czhcbg7lminv23mnkc0ca147"; type = "gem"; }; version = "0.7.6"; }; rack-test = { - dependencies = ["rack"]; - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + dependencies = [ "rack" ]; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1ysx29gk9k14a14zsp5a8czys140wacvp91fja8xcja0j1hzqq8c"; type = "gem"; }; version = "2.1.0"; }; rails = { - dependencies = ["actioncable" "actionmailbox" "actionmailer" "actionpack" "actiontext" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties"]; - groups = ["default"]; - platforms = []; + dependencies = [ "actioncable" "actionmailbox" "actionmailer" "actionpack" "actiontext" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0pxi3psfl4kpgjf6bhch1albjy9knn9c2s6sammy9lyckhh7akhq"; type = "gem"; }; version = "7.0.7.2"; }; rails-controller-testing = { - dependencies = ["actionpack" "actionview" "activesupport"]; - groups = ["test"]; - platforms = []; + dependencies = [ "actionpack" "actionview" "activesupport" ]; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "151f303jcvs8s149mhx2g5mn67487x0blrf9dzl76q1nb7dlh53l"; type = "gem"; }; version = "1.0.5"; }; rails-dom-testing = { - dependencies = ["activesupport" "minitest" "nokogiri"]; - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + dependencies = [ "activesupport" "minitest" "nokogiri" ]; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "17g05y7q7934z0ib4aph8h71c2qwjmlakkm7nb2ab45q0aqkfgjd"; type = "gem"; }; version = "2.1.1"; }; rails-html-sanitizer = { - dependencies = ["loofah" "nokogiri"]; - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + dependencies = [ "loofah" "nokogiri" ]; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1pm4z853nyz1bhhqr7fzl44alnx4bjachcr6rh6qjj375sfz3sc6"; type = "gem"; }; version = "1.6.0"; }; rails-i18n = { - dependencies = ["i18n" "railties"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "i18n" "railties" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1bbh5gsw46djmrgddwaq3wsjmj9rsh5dk13wkclwxf1rg9jpkn3g"; type = "gem"; }; version = "7.0.7"; }; rails-settings-cached = { - dependencies = ["rails"]; - groups = ["default"]; - platforms = []; + dependencies = [ "rails" ]; + groups = [ "default" ]; + platforms = [ ]; source = { fetchSubmodules = false; rev = "86328ef0bd04ce21cc0504ff5e334591e8c2ccab"; @@ -2310,954 +2310,954 @@ version = "0.6.6"; }; railties = { - dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor" "zeitwerk"]; - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + dependencies = [ "actionpack" "activesupport" "method_source" "rake" "thor" "zeitwerk" ]; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "01pdn9sn7kawwrvrbr3vz44j287xbka8mm7nrv9cl510y8gzxi2x"; type = "gem"; }; version = "7.0.7.2"; }; rainbow = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0smwg4mii0fm38pyb5fddbmrdpifwv22zv3d3px2xx497am93503"; type = "gem"; }; version = "3.1.1"; }; rake = { - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "15whn7p9nrkxangbs9hh75q585yfn66lv0v2mhj6q6dl6x8bzr2w"; type = "gem"; }; version = "13.0.6"; }; rdf = { - dependencies = ["link_header"]; - groups = ["default"]; - platforms = []; + dependencies = [ "link_header" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1jx4xyip4inrhr099zac8ah5232g70rv39mm19p85sgpwg80a6ip"; type = "gem"; }; version = "3.2.11"; }; rdf-normalize = { - dependencies = ["rdf"]; - groups = ["default"]; - platforms = []; + dependencies = [ "rdf" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "12slrdq6xch5rqj1m79k1wv09264pmhs76nm300j1jsjpcfmdg0r"; type = "gem"; }; version = "0.6.1"; }; redcarpet = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1sg9sbf9pm91l7lac7fs4silabyn0vflxwaa2x3lrzsm0ff8ilca"; type = "gem"; }; version = "3.6.0"; }; redis = { - groups = ["default" "test"]; - platforms = []; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0fikjg6j12ka6hh36dxzhfkpqqmilzjfzcdf59iwkzsgd63f0ziq"; type = "gem"; }; version = "4.8.1"; }; redis-namespace = { - dependencies = ["redis"]; - groups = ["default"]; - platforms = []; + dependencies = [ "redis" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0f92i9cwlp6xj6fyn7qn4qsaqvxfw4wqvayll7gbd26qnai1l6p9"; type = "gem"; }; version = "1.11.0"; }; redlock = { - dependencies = ["redis"]; - groups = ["default"]; - platforms = []; + dependencies = [ "redis" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0xvjwfzq7rqj4k311kidwmv5app3i7glz4miys6ixqy6c8yylz3c"; type = "gem"; }; version = "1.3.2"; }; regexp_parser = { - groups = ["default" "development" "test"]; - platforms = []; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "136br91alxdwh1s85z912dwz23qlhm212vy6i3wkinz3z8mkxxl3"; type = "gem"; }; version = "2.8.1"; }; request_store = { - dependencies = ["rack"]; - groups = ["default" "production"]; - platforms = []; + dependencies = [ "rack" ]; + groups = [ "default" "production" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "13ppgmsbrqah08j06bybd3cddv6dml79yzyjn7r8j1src78h98h7"; type = "gem"; }; version = "1.5.1"; }; responders = { - dependencies = ["actionpack" "railties"]; - groups = ["default" "pam_authentication"]; - platforms = []; + dependencies = [ "actionpack" "railties" ]; + groups = [ "default" "pam_authentication" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0m9s0mkkprrz02gxhq0ijlwjy0nx1j5yrjf8ssjnhyagnx03lyrx"; type = "gem"; }; version = "3.1.0"; }; rexml = { - groups = ["default" "development" "test"]; - platforms = []; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "05i8518ay14kjbma550mv0jm8a6di8yp5phzrd8rj44z9qnrlrp0"; type = "gem"; }; version = "3.2.6"; }; rotp = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "10mmzc85y7andsich586ndykw678qn1ns2wpjxrg0sc0gr4w3pig"; type = "gem"; }; version = "6.2.2"; }; rouge = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0pym2zjwl6dwdfvbn7rbvmds32r70jx9qddhvvi6pqy6987ack1v"; type = "gem"; }; version = "4.1.2"; }; rpam2 = { - groups = ["default" "pam_authentication"]; - platforms = []; + groups = [ "default" "pam_authentication" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1zvli3s4z1hf2l7gyfickm5i3afjrnycc3ihbiax6ji6arpbyf33"; type = "gem"; }; version = "4.0.2"; }; rqrcode = { - dependencies = ["chunky_png" "rqrcode_core"]; - groups = ["default"]; - platforms = []; + dependencies = [ "chunky_png" "rqrcode_core" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1hggzz8i1l62pkkiybhiqv6ypxw7q844sddrrbbfczjcnj5sivi3"; type = "gem"; }; version = "2.2.0"; }; rqrcode_core = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "06ld6386hbdhy5h0k09axmgn424kavpc8f27k1vjhknjhbf8jjfg"; type = "gem"; }; version = "1.2.0"; }; rspec-core = { - dependencies = ["rspec-support"]; - groups = ["default" "development" "test"]; - platforms = []; + dependencies = [ "rspec-support" ]; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0l95bnjxdabrn79hwdhn2q1n7mn26pj7y1w5660v5qi81x458nqm"; type = "gem"; }; version = "3.12.2"; }; rspec-expectations = { - dependencies = ["diff-lcs" "rspec-support"]; - groups = ["default" "development" "test"]; - platforms = []; + dependencies = [ "diff-lcs" "rspec-support" ]; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "05j44jfqlv7j2rpxb5vqzf9hfv7w8ba46wwgxwcwd8p0wzi1hg89"; type = "gem"; }; version = "3.12.3"; }; rspec-mocks = { - dependencies = ["diff-lcs" "rspec-support"]; - groups = ["default" "development" "test"]; - platforms = []; + dependencies = [ "diff-lcs" "rspec-support" ]; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1hfm17xakfvwya236graj6c2arr4sb9zasp35q5fykhyz8mhs0w2"; type = "gem"; }; version = "3.12.5"; }; rspec-rails = { - dependencies = ["actionpack" "activesupport" "railties" "rspec-core" "rspec-expectations" "rspec-mocks" "rspec-support"]; - groups = ["development" "test"]; - platforms = []; + dependencies = [ "actionpack" "activesupport" "railties" "rspec-core" "rspec-expectations" "rspec-mocks" "rspec-support" ]; + groups = [ "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "086qdyz7c4s5dslm6j06mq7j4jmj958whc3yinhabnqqmz7i463d"; type = "gem"; }; version = "6.0.3"; }; rspec-sidekiq = { - dependencies = ["rspec-core" "rspec-expectations" "rspec-mocks" "sidekiq"]; - groups = ["test"]; - platforms = []; + dependencies = [ "rspec-core" "rspec-expectations" "rspec-mocks" "sidekiq" ]; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0dijmcwjn8k6lrld3yqbqfrqb5g73l57yx98y5frx54p5qxjzbzy"; type = "gem"; }; version = "4.0.1"; }; rspec-support = { - groups = ["default" "development" "test"]; - platforms = []; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1ky86j3ksi26ng9ybd7j0qsdf1lpr8mzrmn98yy9gzv801fvhsgr"; type = "gem"; }; version = "3.12.1"; }; rspec_chunked = { - groups = ["test"]; - platforms = []; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0h4bsj3m7vb47qnx5bry4v0xscrb3lhg1f1vyxl524znb3i2qqzv"; type = "gem"; }; version = "0.6"; }; rubocop = { - dependencies = ["base64" "json" "language_server-protocol" "parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width"]; - groups = ["development"]; - platforms = []; + dependencies = [ "base64" "json" "language_server-protocol" "parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1hr8g9pqw3w87a83kqcxpayrx4jmsziharrg4vqw0gr9kksx2dfv"; type = "gem"; }; version = "1.56.2"; }; rubocop-ast = { - dependencies = ["parser"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "parser" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "188bs225kkhrb17dsf3likdahs2p1i1sqn0pr3pvlx50g6r2mnni"; type = "gem"; }; version = "1.29.0"; }; rubocop-capybara = { - dependencies = ["rubocop"]; - groups = ["development"]; - platforms = []; + dependencies = [ "rubocop" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "01fn05a87g009ch1sh00abdmgjab87i995msap26vxq1a5smdck6"; type = "gem"; }; version = "2.18.0"; }; rubocop-factory_bot = { - dependencies = ["rubocop"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "rubocop" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0kqchl8f67k2g56sq2h1sm2wb6br5gi47s877hlz94g5086f77n1"; type = "gem"; }; version = "2.23.1"; }; rubocop-performance = { - dependencies = ["rubocop" "rubocop-ast"]; - groups = ["development"]; - platforms = []; + dependencies = [ "rubocop" "rubocop-ast" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1v3a2g3wk3aqa0k0zzla10qkxlc625zkj3yf4zcsybs86r5bm4xn"; type = "gem"; }; version = "1.19.0"; }; rubocop-rails = { - dependencies = ["activesupport" "rack" "rubocop"]; - groups = ["development"]; - platforms = []; + dependencies = [ "activesupport" "rack" "rubocop" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "05r46ds0dm44fb4p67hbz721zck8mdwblzssz2y25yh075hvs36j"; type = "gem"; }; version = "2.20.2"; }; rubocop-rspec = { - dependencies = ["rubocop" "rubocop-capybara" "rubocop-factory_bot"]; - groups = ["development"]; - platforms = []; + dependencies = [ "rubocop" "rubocop-capybara" "rubocop-factory_bot" ]; + groups = [ "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0ylwy4afnxhbrvlaf8an9nrizj78axnzggiyfcp8v531cv8six5f"; type = "gem"; }; version = "2.23.2"; }; ruby-prof = { - groups = ["development" "test"]; - platforms = []; + groups = [ "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "13fsfw43zx9pcix1fzxb95g09yadqjvc8971k74krrjz81vbyh51"; type = "gem"; }; version = "1.6.3"; }; ruby-progressbar = { - groups = ["default" "development" "test"]; - platforms = []; + groups = [ "default" "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0cwvyb7j47m7wihpfaq7rc47zwwx9k4v7iqd9s1xch5nm53rrz40"; type = "gem"; }; version = "1.13.0"; }; ruby-saml = { - dependencies = ["nokogiri" "rexml"]; - groups = ["default"]; - platforms = []; + dependencies = [ "nokogiri" "rexml" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "18vnbzin5ypxrgcs9lllg7x311b69dyrdw2w1pwz84438hmxm79s"; type = "gem"; }; version = "1.15.0"; }; ruby2_keywords = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1vz322p8n39hz3b4a9gkmz9y7a5jaz41zrm2ywf31dvkqm03glgz"; type = "gem"; }; version = "0.0.5"; }; rubyzip = { - groups = ["default" "test"]; - platforms = []; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0grps9197qyxakbpw02pda59v45lfgbgiyw48i0mq9f2bn9y6mrz"; type = "gem"; }; version = "2.3.2"; }; rufus-scheduler = { - dependencies = ["fugit"]; - groups = ["default"]; - platforms = []; + dependencies = [ "fugit" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "14lr8c2sswn0sisvrfi4448pmr34za279k3zlxgh581rl1y0gjjz"; type = "gem"; }; version = "3.9.1"; }; safety_net_attestation = { - dependencies = ["jwt"]; - groups = ["default"]; - platforms = []; + dependencies = [ "jwt" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1khq0y5w7lf2b9a220298hphf3pakd216jc9a4x4a9pdwxs2vgln"; type = "gem"; }; version = "0.4.0"; }; sanitize = { - dependencies = ["crass" "nokogiri"]; - groups = ["default"]; - platforms = []; + dependencies = [ "crass" "nokogiri" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1kymrjdpbmn4yaml3aaqyj1dzj8gqmm9h030dc2rj5mvja7fpi28"; type = "gem"; }; version = "6.0.2"; }; scenic = { - dependencies = ["activerecord" "railties"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activerecord" "railties" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "04sd4jmgnwpilr3k061x87yyryya2mj15a8602fip49lfxza5548"; type = "gem"; }; version = "1.7.0"; }; selenium-webdriver = { - dependencies = ["rexml" "rubyzip" "websocket"]; - groups = ["test"]; - platforms = []; + dependencies = [ "rexml" "rubyzip" "websocket" ]; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0ws0mh230l1pvyxcrlcr48w01alfhprjs1jbd8yrn463drsr2yac"; type = "gem"; }; version = "4.11.0"; }; semantic_range = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1dlp97vg95plrsaaqj7x8l7z9vsjbhnqk4rw1l30gy26lmxpfrih"; type = "gem"; }; version = "3.0.0"; }; sidekiq = { - dependencies = ["connection_pool" "rack" "redis"]; - groups = ["default" "test"]; - platforms = []; + dependencies = [ "connection_pool" "rack" "redis" ]; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0iv7vgqyrpymiwvc3ca24sl4lda8m627p657p0v4xzdpzincrnbr"; type = "gem"; }; version = "6.5.9"; }; sidekiq-bulk = { - dependencies = ["sidekiq"]; - groups = ["default"]; - platforms = []; + dependencies = [ "sidekiq" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "08nyxzmgf742irafy3l4fj09d4s5pyvsh0dzlh8y4hl51rgkh4xv"; type = "gem"; }; version = "0.2.0"; }; sidekiq-scheduler = { - dependencies = ["rufus-scheduler" "sidekiq" "tilt"]; - groups = ["default"]; - platforms = []; + dependencies = [ "rufus-scheduler" "sidekiq" "tilt" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0p5jjs3x2pa2fy494xs39xbq642pri13809dcr1l3hjsm56qvp1h"; type = "gem"; }; version = "5.0.3"; }; sidekiq-unique-jobs = { - dependencies = ["brpoplpush-redis_script" "concurrent-ruby" "redis" "sidekiq" "thor"]; - groups = ["default"]; - platforms = []; + dependencies = [ "brpoplpush-redis_script" "concurrent-ruby" "redis" "sidekiq" "thor" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "02f91b24hrrn688wqvxb13lwvcgqb7g9k3sxylnydd6v89wr8mcg"; type = "gem"; }; version = "7.1.29"; }; simple-navigation = { - dependencies = ["activesupport"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activesupport" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1wc1rapwhqymcjfxmlgam4cvbyhnzfxada2damq88ij2p77pjz4q"; type = "gem"; }; version = "4.4.0"; }; simple_form = { - dependencies = ["actionpack" "activemodel"]; - groups = ["default"]; - platforms = []; + dependencies = [ "actionpack" "activemodel" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0z4df65w9qpri315lpvzazdxa9xb7yj0j3d77q06wf0jnpvw4mzs"; type = "gem"; }; version = "5.2.0"; }; simplecov = { - dependencies = ["docile" "simplecov-html" "simplecov_json_formatter"]; - groups = ["test"]; - platforms = []; + dependencies = [ "docile" "simplecov-html" "simplecov_json_formatter" ]; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "198kcbrjxhhzca19yrdcd6jjj9sb51aaic3b0sc3pwjghg3j49py"; type = "gem"; }; version = "0.22.0"; }; simplecov-html = { - groups = ["default" "test"]; - platforms = []; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0yx01bxa8pbf9ip4hagqkp5m0mqfnwnw2xk8kjraiywz4lrss6jb"; type = "gem"; }; version = "0.12.3"; }; simplecov_json_formatter = { - groups = ["default" "test"]; - platforms = []; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0a5l0733hj7sk51j81ykfmlk2vd5vaijlq9d5fn165yyx3xii52j"; type = "gem"; }; version = "0.1.4"; }; smart_properties = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0jrqssk9qhwrpq41arm712226vpcr458xv6xaqbk8cp94a0kycpr"; type = "gem"; }; version = "1.17.0"; }; sprockets = { - dependencies = ["concurrent-ruby" "rack"]; - groups = ["default"]; - platforms = []; + dependencies = [ "concurrent-ruby" "rack" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "182jw5a0fbqah5w9jancvfmjbk88h8bxdbwnl4d3q809rpxdg8ay"; type = "gem"; }; version = "3.7.2"; }; sprockets-rails = { - dependencies = ["actionpack" "activesupport" "sprockets"]; - groups = ["default"]; - platforms = []; + dependencies = [ "actionpack" "activesupport" "sprockets" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1b9i14qb27zs56hlcc2hf139l0ghbqnjpmfi0054dxycaxvk5min"; type = "gem"; }; version = "3.4.2"; }; sshkit = { - dependencies = ["net-scp" "net-ssh"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "net-scp" "net-ssh" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "14a717mr2cmpgld5fcdd124cvlc5b634f96rhwlnmmc4m8bbkcp9"; type = "gem"; }; version = "1.21.5"; }; stackprof = { - groups = ["development" "test"]; - platforms = []; + groups = [ "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0bhdgfb0pmw9mav1kw9fn0ka012sa0i3h5ppvqssw5xq48nhxnr8"; type = "gem"; }; version = "0.2.25"; }; statsd-ruby = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "028136c463nbravckxb1qi5c5nnv9r6vh2cyhiry423lac4xz79n"; type = "gem"; }; version = "1.5.0"; }; stoplight = { - dependencies = ["redlock"]; - groups = ["default"]; - platforms = []; + dependencies = [ "redlock" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1vhqx7q8qpq3x9ba504n7bp0r9dxcck0r0hd73cac2iqkix6khlv"; type = "gem"; }; version = "3.0.2"; }; strong_migrations = { - dependencies = ["activerecord"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activerecord" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0wz4zhsp4xia8zcpi98v4sgjlv2prd515l8jz4f7j0wk45dfkjs1"; type = "gem"; }; version = "0.8.0"; }; swd = { - dependencies = ["activesupport" "attr_required" "httpclient"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activesupport" "attr_required" "httpclient" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "12b3q2sw42nnilfb51nlqdv07f31vdv2j595kd99asnkw4cjlf5w"; type = "gem"; }; version = "1.3.0"; }; sysexits = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0qjng6pllznmprzx8vb0zg0c86hdrkyjs615q41s9fjpmv2430jr"; type = "gem"; }; version = "1.2.0"; }; temple = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "09p32vp94sa1mbr0if0adf02yzc4ns00lsmpwns2xbkncwpzrqm4"; type = "gem"; }; version = "0.10.2"; }; terminal-table = { - dependencies = ["unicode-display_width"]; - groups = ["default" "development"]; - platforms = []; + dependencies = [ "unicode-display_width" ]; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "14dfmfjppmng5hwj7c5ka6qdapawm3h6k9lhn8zj001ybypvclgr"; type = "gem"; }; version = "3.0.2"; }; terrapin = { - dependencies = ["climate_control"]; - groups = ["default"]; - platforms = []; + dependencies = [ "climate_control" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0p18f05r0c5s70571gqig3z2ym74wx79s6rd45sprp207bqskzn9"; type = "gem"; }; version = "0.6.0"; }; test-prof = { - groups = ["development" "test"]; - platforms = []; + groups = [ "development" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "08j5456rdpgxvv8bs44x81jrxzpxb79wxfxdq4fqwxyircxzi2jj"; type = "gem"; }; version = "1.2.2"; }; thor = { - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0k7j2wn14h1pl4smibasw0bp66kg626drxb59z7rzflch99cd4rg"; type = "gem"; }; version = "1.2.2"; }; tilt = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0bmjgbv8158klwp2r3klxjwaj93nh1sbl4xvj9wsha0ic478avz7"; type = "gem"; }; version = "2.2.0"; }; timeout = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1d9cvm0f4zdpwa795v3zv4973y5zk59j7s1x3yn90jjrhcz1yvfd"; type = "gem"; }; version = "0.4.0"; }; tpm-key_attestation = { - dependencies = ["bindata" "openssl" "openssl-signature_algorithm"]; - groups = ["default"]; - platforms = []; + dependencies = [ "bindata" "openssl" "openssl-signature_algorithm" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0v8y5dibsyskv1ncdgszhxwzq0gzmvb0zl7sgmx0xvsgy86dhcz1"; type = "gem"; }; version = "0.12.0"; }; tty-color = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0aik4kmhwwrmkysha7qibi2nyzb4c8kp42bd5vxnf8sf7b53g73g"; type = "gem"; }; version = "0.6.0"; }; tty-cursor = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0j5zw041jgkmn605ya1zc151bxgxl6v192v2i26qhxx7ws2l2lvr"; type = "gem"; }; version = "0.7.1"; }; tty-prompt = { - dependencies = ["pastel" "tty-reader"]; - groups = ["default"]; - platforms = []; + dependencies = [ "pastel" "tty-reader" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1j4y8ik82azjxshgd4i1v4wwhsv3g9cngpygxqkkz69qaa8cxnzw"; type = "gem"; }; version = "0.23.1"; }; tty-reader = { - dependencies = ["tty-cursor" "tty-screen" "wisper"]; - groups = ["default"]; - platforms = []; + dependencies = [ "tty-cursor" "tty-screen" "wisper" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1cf2k7w7d84hshg4kzrjvk9pkyc2g1m3nx2n1rpmdcf0hp4p4af6"; type = "gem"; }; version = "0.9.0"; }; tty-screen = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "18jr6s1cg8yb26wzkqa6874q0z93rq0y5aw092kdqazk71y6a235"; type = "gem"; }; version = "0.8.1"; }; twitter-text = { - dependencies = ["idn-ruby" "unf"]; - groups = ["default"]; - platforms = []; + dependencies = [ "idn-ruby" "unf" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1dnmp0bj3l01nbb52zby2c7hrazcdwfg846knkrjdfl0yfmv793z"; type = "gem"; }; version = "3.1.0"; }; tzinfo = { - dependencies = ["concurrent-ruby"]; - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + dependencies = [ "concurrent-ruby" ]; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "16w2g84dzaf3z13gxyzlzbf748kylk5bdgg3n1ipvkvvqy685bwd"; type = "gem"; }; version = "2.0.6"; }; tzinfo-data = { - dependencies = ["tzinfo"]; - groups = ["default"]; - platforms = []; + dependencies = [ "tzinfo" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0m2d0gpsgqnv29j5h2d6g57g0rayvd460b8s2vjr8sn46bqf89m5"; type = "gem"; }; version = "1.2023.3"; }; unf = { - dependencies = ["unf_ext"]; - groups = ["default"]; - platforms = []; + dependencies = [ "unf_ext" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9"; type = "gem"; }; version = "0.1.4"; }; unf_ext = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1yj2nz2l101vr1x9w2k83a0fag1xgnmjwp8w8rw4ik2rwcz65fch"; type = "gem"; }; version = "0.0.8.2"; }; unicode-display_width = { - groups = ["default" "development"]; - platforms = []; + groups = [ "default" "development" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1gi82k102q7bkmfi7ggn9ciypn897ylln1jk9q67kjhr39fj043a"; type = "gem"; }; version = "2.4.2"; }; uri = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0fa49cdssxllj1j37a56kq27wsibx5lmqxkqdk1rz3452y0bsydy"; type = "gem"; }; version = "0.12.2"; }; validate_email = { - dependencies = ["activemodel" "mail"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activemodel" "mail" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1r1fz29l699arka177c9xw7409d1a3ff95bf7a6pmc97slb91zlx"; type = "gem"; }; version = "0.1.6"; }; validate_url = { - dependencies = ["activemodel" "public_suffix"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activemodel" "public_suffix" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0lblym140w5n88ijyfgcvkxvpfj8m6z00rxxf2ckmmhk0x61dzkj"; type = "gem"; }; version = "1.0.15"; }; warden = { - dependencies = ["rack"]; - groups = ["default" "pam_authentication"]; - platforms = []; + dependencies = [ "rack" ]; + groups = [ "default" "pam_authentication" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1l7gl7vms023w4clg02pm4ky9j12la2vzsixi2xrv9imbn44ys26"; type = "gem"; }; version = "1.2.9"; }; webauthn = { - dependencies = ["android_key_attestation" "awrence" "bindata" "cbor" "cose" "openssl" "safety_net_attestation" "tpm-key_attestation"]; - groups = ["default"]; - platforms = []; + dependencies = [ "android_key_attestation" "awrence" "bindata" "cbor" "cose" "openssl" "safety_net_attestation" "tpm-key_attestation" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1ri09bf640kkw4v6k2g90q2nw1mx2hsghhngaqgb7958q8id8xrz"; type = "gem"; }; version = "3.0.0"; }; webfinger = { - dependencies = ["activesupport" "httpclient"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activesupport" "httpclient" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "18jj50b44a471ig7hw1ax90wxaaz40acmrf6cm7m2iyshlffy53q"; type = "gem"; }; version = "1.2.0"; }; webmock = { - dependencies = ["addressable" "crack" "hashdiff"]; - groups = ["test"]; - platforms = []; + dependencies = [ "addressable" "crack" "hashdiff" ]; + groups = [ "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0vfispr7wd2p1fs9ckn1qnby1yyp4i1dl7qz8n482iw977iyxrza"; type = "gem"; }; version = "3.19.1"; }; webpacker = { - dependencies = ["activesupport" "rack-proxy" "railties" "semantic_range"]; - groups = ["default"]; - platforms = []; + dependencies = [ "activesupport" "rack-proxy" "railties" "semantic_range" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0fh4vijqiq1h7w28llk67y9csc0m4wkdivrsl4fsxg279v6j5z3i"; type = "gem"; }; version = "5.4.4"; }; webpush = { - dependencies = ["hkdf" "jwt"]; - groups = ["default"]; - platforms = []; + dependencies = [ "hkdf" "jwt" ]; + groups = [ "default" ]; + platforms = [ ]; source = { fetchSubmodules = false; rev = "f14a4d52e201128b1b00245d11b6de80d6cfdcd9"; @@ -3268,72 +3268,72 @@ version = "0.3.8"; }; websocket = { - groups = ["default" "test"]; - platforms = []; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0dib6p55sl606qb4vpwrvj5wh881kk4aqn2zpfapf8ckx7g14jw8"; type = "gem"; }; version = "1.2.9"; }; websocket-driver = { - dependencies = ["websocket-extensions"]; - groups = ["default"]; - platforms = []; + dependencies = [ "websocket-extensions" ]; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1nyh873w4lvahcl8kzbjfca26656d5c6z3md4sbqg5y1gfz0157n"; type = "gem"; }; version = "0.7.6"; }; websocket-extensions = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0hc2g9qps8lmhibl5baa91b4qx8wqw872rgwagml78ydj8qacsqw"; type = "gem"; }; version = "0.1.5"; }; wisper = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1rpsi0ziy78cj82sbyyywby4d0aw0a5q84v65qd28vqn79fbq5yf"; type = "gem"; }; version = "2.0.1"; }; xorcist = { - groups = ["default"]; - platforms = []; + groups = [ "default" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1dbbiy8xlcfvn9ais37xfb5rci4liwakkmxzbkp72wmvlgcrf339"; type = "gem"; }; version = "1.1.3"; }; xpath = { - dependencies = ["nokogiri"]; - groups = ["default" "test"]; - platforms = []; + dependencies = [ "nokogiri" ]; + groups = [ "default" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "0bh8lk9hvlpn7vmi6h4hkcwjzvs2y0cmkk3yjjdr8fxvj6fsgzbd"; type = "gem"; }; version = "3.2.0"; }; zeitwerk = { - groups = ["default" "development" "pam_authentication" "production" "test"]; - platforms = []; + groups = [ "default" "development" "pam_authentication" "production" "test" ]; + platforms = [ ]; source = { - remotes = ["https://rubygems.org"]; + remotes = [ "https://rubygems.org" ]; sha256 = "1mwdd445w63khz13hpv17m2br5xngyjl3jdj08xizjbm78i2zrxd"; type = "gem"; }; diff --git a/nixos/pkgs/glitch-soc/source.nix b/nixos/pkgs/glitch-soc/source.nix index cf57d44..9f67c32 100644 --- a/nixos/pkgs/glitch-soc/source.nix +++ b/nixos/pkgs/glitch-soc/source.nix @@ -1,11 +1,13 @@ # This file was generated by pkgs.mastodon.updateScript. -{ fetchgit, applyPatches }: let +{ fetchgit, applyPatches }: +let src = fetchgit { url = "https://github.com/glitch-soc/mastodon.git"; rev = "a1df9fdb06854bd55f018918236132ccfa7d9d84"; sha256 = "0amqiigq3qgag6qm119aaysmd2k93vwgr1aynxjxmbpn35ykcay3"; }; -in applyPatches { +in +applyPatches { inherit src; - patches = []; + patches = [ ]; } diff --git a/nixos/pkgs/glitch-soc/update.nix b/nixos/pkgs/glitch-soc/update.nix index 40a7fe5..a4318e7 100644 --- a/nixos/pkgs/glitch-soc/update.nix +++ b/nixos/pkgs/glitch-soc/update.nix @@ -1,5 +1,14 @@ -{ runCommand, lib, makeWrapper, yarn2nix, bundix, coreutils, diffutils -, nix-prefetch-git, gnused, jq }: +{ runCommand +, lib +, makeWrapper +, yarn2nix +, bundix +, coreutils +, diffutils +, nix-prefetch-git +, gnused +, jq +}: let binPath = lib.makeBinPath [ yarn2nix @@ -10,7 +19,9 @@ let gnused jq ]; -in runCommand "mastodon-update-script" { +in +runCommand "mastodon-update-script" +{ nativeBuildInputs = [ makeWrapper ]; meta = { diff --git a/nixos/pkgs/plex-pass/raw.nix b/nixos/pkgs/plex-pass/raw.nix index b2f13ff..425928b 100644 --- a/nixos/pkgs/plex-pass/raw.nix +++ b/nixos/pkgs/plex-pass/raw.nix @@ -2,8 +2,10 @@ let sources = builtins.fromJSON (builtins.readFile ./sources.json); source = lib.findFirst (x: x.platform == stdenv.hostPlatform.system) - (throw "unsupported platform: ${stdenv.hostPlatform.system}") sources; -in plexRaw.overrideAttrs (attrs: { + (throw "unsupported platform: ${stdenv.hostPlatform.system}") + sources; +in +plexRaw.overrideAttrs (attrs: { pname = attrs.pname + "-plexpass"; inherit (source) version; src = fetchurl { diff --git a/nixos/pkgs/roundcube-swipe/default.nix b/nixos/pkgs/roundcube-swipe/default.nix index 1287e7b..50aeb28 100644 --- a/nixos/pkgs/roundcube-swipe/default.nix +++ b/nixos/pkgs/roundcube-swipe/default.nix @@ -6,7 +6,8 @@ let mkdir -p $out/plugins/ cp -r ${src} $out/plugins/swipe ''; -in roundcubePlugin rec { +in +roundcubePlugin rec { pname = "roundcube-swipe"; version = "0.5"; diff --git a/nixos/util.nix b/nixos/util.nix index 3ed3f20..5a55aa5 100644 --- a/nixos/util.nix +++ b/nixos/util.nix @@ -7,19 +7,21 @@ let mailserver.nixosModules.mailserver attic.nixosModules.atticd ]; - type_import = let - import_cases = { - "lxc" = [ - "${nixpkgs}/nixos/modules/virtualisation/lxc-container.nix" - ./common/generic-lxc.nix - ]; - "vm" = [ ./common/generic-vm.nix ]; - "local" = [ - lanzaboote.nixosModules.lanzaboote - ./common/desktop - ]; - }; - in type: import_cases.${type} ++ base_imports; + type_import = + let + import_cases = { + "lxc" = [ + "${nixpkgs}/nixos/modules/virtualisation/lxc-container.nix" + ./common/generic-lxc.nix + ]; + "vm" = [ ./common/generic-vm.nix ]; + "local" = [ + lanzaboote.nixosModules.lanzaboote + ./common/desktop + ]; + }; + in + type: import_cases.${type} ++ base_imports; # Helper function to resolve what should be imported depending on the type of config (lxc, vm, bare metal) resolve_imports = { hostname, realm, profile ? hostname, type ? "lxc", ... }: type_import type @@ -38,7 +40,7 @@ let # Flatten all hosts to a single list flatten_hosts = realms: concatMap (mapAttrsToList (name: value: value // { hostname = name; })) - (attrValues realms); + (attrValues realms); # Filter out all hosts which aren't nixos filter_nix_hosts = filter ({ nix ? true, ... }: nix); @@ -46,12 +48,20 @@ let # outputs # Helper function to build a colmena host definition - mkColmenaHost = { ip ? null, exposes ? null, hostname, tags, realm - , type ? "lxc", ... }@host: + mkColmenaHost = + { ip ? null + , exposes ? null + , hostname + , tags + , realm + , type ? "lxc" + , ... + }@host: let # this makes local apply work a bit nicer name = if type == "local" then hostname else "${hostname}.${realm}"; - in { + in + { "${name}" = { imports = resolve_imports host; networking = { @@ -73,4 +83,5 @@ let hosts = add_realm_to_tags (import ./hosts); flat_hosts = flatten_hosts hosts; nixHosts = filter_nix_hosts flat_hosts; -in { inherit base_imports mkColmenaHost hosts flat_hosts nixHosts; } +in +{ inherit base_imports mkColmenaHost hosts flat_hosts nixHosts; } diff --git a/repl.nix b/repl.nix index 592bf14..7141319 100644 --- a/repl.nix +++ b/repl.nix @@ -1,6 +1,7 @@ let flake = builtins.getFlake (toString ./.); nixpkgs = import { }; -in { +in +{ inherit flake; } // flake // builtins // nixpkgs // nixpkgs.lib // flake.nixosConfigurations