From: Ismaël Bouya Date: Tue, 3 Oct 2023 23:35:06 +0000 (+0200) Subject: Squash changes containing private information X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FConfig%2FNix.git;a=commitdiff_plain;h=1a64deeb894dc95e2645a75771732c6cc53a79ad Squash changes containing private information There were a lot of changes since the previous commit, but a lot of them contained personnal information about users. All thos changes got stashed into a single commit (history is kept in a different place) and private information was moved in a separate private repository --- diff --git a/.envrc b/.envrc index 438d807..4718a18 100644 --- a/.envrc +++ b/.envrc @@ -1,13 +1,25 @@ # vim: filetype=bash -export NIX_PATH=nixpkgs=$(cat $(expand_path nix/sources.json) | jq -r '."nixpkgs-nixops".url') -NIX_PATH=$NIX_PATH:nixpkgs-nix=$(cat $(expand_path nix/sources.json) | jq -r '."nixpkgs-nix".url') +export DIRENV_FLAKE_DONT_ADD_SOURCES_ROOT=y +nix_direnv_watch_file() { + nix_watches+=("$@") + filtered=() + for i in "$@"; do + case "$i" in + */flake.lock) + ;; + *) + filtered+=("$i") + esac + done + watch_file "${filtered[@]}" +} -export NIXOPS_ENV_LOADED=1 +if nix eval './deploy#sops-vars-file' 2>/dev/null >/dev/null; then + export DEVSHELL_NO_MOTD=1 + cd deploy + use flake . --no-warn-dirty + cd .. + unset DEVSHELL_NO_MOTD +fi -PATH_add $(expand_path scripts) -PATH_add $(expand_path nixops/scripts) - -use nix -watch_file $(expand_path nix/sources.json) - -clean_nix_shell +use flake . --no-warn-dirty diff --git a/.gitconfig b/.gitconfig deleted file mode 100644 index 7aa8870..0000000 --- a/.gitconfig +++ /dev/null @@ -1,9 +0,0 @@ -; git config --local include.path '../.gitconfig' -[push] - recurseSubmodules = on-demand -; Find a way to include this file automatically? -; git -C nixops/secrets config --local diff.gpgdiffer.textconv "gpg --quiet -d" -[diff "gpgdiffer"] - textconv = "gpg --quiet -d" -[diff "sopsdiffer"] - textconv = "sops -d" diff --git a/.gitignore b/.gitignore index ff9c9cf..0c17e7a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /result* /versions_log .direnv/ -/nixops/.gcroots +/deploy/.gcroots +/deploy/history diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index c2d9b18..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "nixops/secrets"] - path = nixops/secrets - url = gitolite@git.immae.eu:perso/Immae/Config/Nix/Nixops/Secrets diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md index 6c68680..fcd0b15 100644 --- a/DOCUMENTATION.md +++ b/DOCUMENTATION.md @@ -1,7 +1,7 @@ Get Started =========== -- You may run ./nixops/scripts/setup to setup the directory and variables +- You may run ./scripts/setup to setup the directory and variables The script won’t do anything without asking first, you may stop at any step. @@ -43,8 +43,7 @@ The directory is divided in several sections: of hosts. They tend to be less used now. But sometimes they need to have an identity (mostly to be able to send e-mails) The subsection "roles" (ou=roles,ou=hosts,dc=immae,dc=eu) was from a Puppet age and - is deprecated. Only one host remains handled by Puppet (caldance) and - should be replaced with an internal VM. + is deprecated. - The "groups" section (ou=groups,dc=immae,dc=eu) contains the generic groups of users not associated to a service. - The "group_users" and "users" sections contain the users (usually with @@ -58,7 +57,7 @@ How does nixpkgs resolve To build nixops machines ------------------------ -The `NIX_PATH` environment variable is built in nixops/Makefile and +The `NIX_PATH` environment variable is built in deploy/Makefile and contains three paths: nixpkgs, nixpkgsNext, nixpkgsPrevious. Only the first one is actually used most of the time. Derivations that need pinned nixpkgs should declare it in `nix/sources.json` (it’s the case @@ -236,13 +235,18 @@ Nextcloud --------- - Do not skip major versions! +- Check php supported version (lib/versioncheck.php file) +- Update all the apps: check on https://apps.nextcloud.com/ and build with + ``` + nix-build -E "with import {};webapps.nextcloud.withApps (a: builtins.attrValues webapps.nextcloud.allApps)" + ``` - Put nextcloud in maintenance mode : ``` nextcloud-occ maintenance:mode --on ``` - Do a backup : ``` - sudo -u postgres pg_dump -n owncloud webapps > nextcloud.sql + sudo -u postgres pg_dump owncloud > nextcloud.sql ``` - Upgrade - Run the upgrade task : @@ -256,6 +260,22 @@ Nextcloud - Issues : https://docs.nextcloud.com/server/16/admin_manual/maintenance/manual_upgrade.html +- Farm : + Once a new instance thename is created, create the database: + ``` + CREATE USER nextcloud_thename WITH PASSWORD 'somepassword'; + CREATE DATABASE nextcloud_thename WITH OWNER nextcloud_thename; + ``` + Then add this to the config.php: + ``` + 'appstoreenabled' => false, + ``` + Then run: + ``` + nextcloud-occ-thename maintenance:install --database=pgsql --database-name=nextcloud_thename --database-host=/run/postgresql --database-user=nextcloud_thename --admin-user=immae --data-dir=/var/lib/nextcloud_farm/thename/data + ``` + Finally, edit the config.php to add the correct trusted domain + Flakes ------ diff --git a/Makefile b/Makefile index 50fa09f..6282df2 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,128 @@ -subrecipes = setup nix-info edit_env edit_vars -subrecipes += ssh-eldiron ssh-backup-2 ssh-monitoring-1 ssh-4c -subrecipes += debug build dry-run upload deploy next-boot deploy-reboot -subrecipes += list-generations delete-generations cleanup -${subrecipes}: - @$(MAKE) --no-print-directory -C nixops/ $@ -.PHONY: ${subrecipes} - nur: ./scripts/make-nur curl -o /dev/null -XPOST "https://nur-update.herokuapp.com/update?repo=immae" shellcheck: - shellcheck scripts/* nixops/scripts/* modules/private/gitolite/gitolite_ldap_groups.sh modules/private/ssh/ldap_authorized_keys.sh modules/private/pub/restrict + shellcheck scripts/* deploy/scripts/* modules/private/gitolite/gitolite_ldap_groups.sh modules/private/ssh/ldap_authorized_keys.sh modules/private/pub/restrict .PHONY: nur shellcheck + +###### Initial setup +setup: + ./scripts/setup +.PHONY: setup + +###### Morph regular tasks +PROFILE=./deploy/history +TARGET ?= +COMMON_COLEMNA_ARGS = -f ./deploy/flake.nix -v +#Only enabled in colemna 0.4: --nix-option allow-unsafe-native-code-during-evaluation true --nix-option allow-import-from-derivation true --nix-option substituters https://cache.nixos.org/ +MORPH_ARGS ?= +ifdef TARGET + # multiple targets: --on="{machine1,machine2}" (works with * glob too) + override MORPH_ARGS +=--on=$(TARGET) +endif +SSH_ARGS ?= + +nodes= dilion eldiron backup-2 monitoring-1 quatresaisons zoldene + +refresh_flakes: + @if [ -n "$(TARGET)" ]; then \ + ./scripts/refresh_flakes --no-new-inputs ./systems/$(TARGET)/flake.nix; \ + nix --no-warn-dirty flake lock --update-input n-$(TARGET) ./flakes; \ + nix --no-warn-dirty flake lock --update-input main-flake ./deploy; \ + else \ + ./scripts/refresh_flakes --no-new-inputs; \ + fi + (cd deploy ; nix flake lock --update-input secrets-local || true) + +.PHONY: refresh_flakes + +.PHONY: build $(addprefix build-,$(nodes)) +build-dilion build-eldiron build-backup-2 build-monitoring-1 build-quatresaisons build-zoldene: + $(MAKE) build TARGET=$(@:build-%=%) +build: refresh_flakes + colmena build $(COMMON_COLEMNA_ARGS) $(MORPH_ARGS) + +.PHONY: deploy $(addprefix deploy-,$(nodes)) +deploy-dilion deploy-eldiron deploy-backup-2 deploy-monitoring-1 deploy-quatresaisons deploy-zoldene: + $(MAKE) deploy TARGET=$(@:deploy-%=%) +deploy: refresh_flakes + ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) switch --keep-result $(MORPH_ARGS) + $(MAKE) keep-roots + +.PHONY: ssh $(addprefix ssh-,$(nodes)) +ssh-4c: ssh-quatresaisons +ssh-dilion ssh-eldiron ssh-backup-2 ssh-monitoring-1 ssh-quatresaisons ssh-zoldene: + $(MAKE) ssh TARGET=$(@:ssh-%=%) +ssh: + ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@$(TARGET) $(SSH_ARGS)' + +.PHONY: ssh-decrypt $(addsuffix -decrypt,$(addprefix ssh-,$(nodes))) +ssh-zoldene-decrypt: + $(MAKE) ssh-decrypt TARGET=$(@:ssh-%-decrypt=%) +ssh-decrypt: + ./scripts/with_env bash -c 'ssh -p 2222 -i $$SSH_IDENTITY_FILE root@$(TARGET) $(SSH_ARGS)' + +.PHONY: debug $(addprefix debug-,$(nodes)) +debug-dilion debug-eldiron debug-backup-2 debug-monitoring-1 debug-quatresaisons debug-zoldene: + $(MAKE) debug TARGET=$(@:debug-%=%) +debug: refresh_flakes + colmena build $(COMMON_COLEMNA_ARGS) --show-trace $(MORPH_ARGS) + +.PHONY: upload $(addprefix upload-,$(nodes)) +upload-dilion upload-eldiron upload-backup-2 upload-monitoring-1 upload-quatresaisons upload-zoldene: + $(MAKE) upload TARGET=$(@:upload-%=%) +upload: refresh_flakes + ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) push $(MORPH_ARGS) + +.PHONY: test-deploy $(addprefix test-deploy-,$(nodes)) +test-deploy-dilion test-deploy-eldiron test-deploy-backup-2 test-deploy-monitoring-1 test-deploy-quatresaisons test-deploy-zoldene: + $(MAKE) test-deploy TARGET=$(@:test-deploy-%=%) +test-deploy: refresh_flakes + ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) test $(MORPH_ARGS) + +.PHONY: next-boot $(addprefix next-boot-,$(nodes)) +next-boot-dilion next-boot-eldiron next-boot-backup-2 next-boot-monitoring-1 next-boot-quatresaisons next-boot-zoldene: + $(MAKE) next-boot TARGET=$(@:next-boot-%=%) +next-boot: refresh_flakes + ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) boot $(MORPH_ARGS) + +.PHONY: deploy-reboot $(addprefix deploy-reboot-,$(nodes)) +deploy-reboot-dilion deploy-reboot-eldiron deploy-reboot-backup-2 deploy-reboot-monitoring-1 deploy-reboot-quatresaisons deploy-reboot-zoldene: + $(MAKE) deploy-reboot TARGET=$(@:deploy-reboot-%=%) +deploy-reboot: refresh_flakes + ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) boot --reboot $(MORPH_ARGS) + # Run it a second time because first time uploads the secrets + # before rebooting + $(MAKE) deploy + +keep-roots: + mkdir -p $(PROFILE) + for i in deploy/.gcroots/node-*; do nix-env -p $(PROFILE)/$$(basename $$i | sed -e "s/node-//") --set "$$i"; done + +systems := $(shell find $(PROFILE) -type l -not -name "*link" -printf "%f ") +###### Cleanup generations and garbage collection +GEN ?= "+3" + +list-generations: + @$(foreach system, $(systems), echo $(system);\ + nix-env -p $(PROFILE)/$(system) --list-generations;\ + $(MAKE) ssh-$(system) SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --list-generations";\ + ) +.PHONY: list-generations + +delete-generations: + $(MAKE) keep-roots + @$(foreach system, $(systems), echo $(system); \ + nix-env -p $(PROFILE)/$(system) --delete-generations $(GEN);\ + $(MAKE) ssh-$(system) SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)";\ + ) +.PHONY: delete-generations + +cleanup: delete-generations + nix-store --gc + @$(foreach system, $(systems), echo $(system); \ + $(MAKE) ssh-$(system) SSH_ARGS="nix-store --gc";\ + ) +.PHONY: cleanup diff --git a/default.nix b/default.nix index 1f43cdd..d0bc618 100644 --- a/default.nix +++ b/default.nix @@ -1,11 +1,9 @@ -{ sources ? import ./nix/sources.nix, pkgs ? import sources.nixpkgs {} }: +{}: let - mypkgs = pkgs.callPackage ./pkgs {}; + mypackages = builtins.getFlake "path:${builtins.toString ./flakes/mypackages}"; in { - lib = pkgs.callPackage ./lib {}; - modules = import ./modules; - overlays = import ./overlays; - pkgs = mypkgs; - environments = pkgs.callPackage ./environments {}; -} // mypkgs + lib = mypackages.mylibs; + overlays = mypackages.overlays; + pkgs = mypackages.packages."${builtins.currentSystem}"; +} // mypackages.packages."${builtins.currentSystem}" diff --git a/deploy/flake.lock b/deploy/flake.lock new file mode 100644 index 0000000..afa2ec5 --- /dev/null +++ b/deploy/flake.lock @@ -0,0 +1,9816 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_6", + "nixpkgs": "nixpkgs_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_2": { + "inputs": { + "flake-utils": "flake-utils_8", + "nixpkgs": "nixpkgs_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_3": { + "inputs": { + "flake-utils": "flake-utils_20", + "nixpkgs": "nixpkgs_34" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_4": { + "inputs": { + "flake-utils": "flake-utils_34", + "nixpkgs": "nixpkgs_57" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_5": { + "inputs": { + "flake-utils": "flake-utils_37", + "nixpkgs": "nixpkgs_65" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_6": { + "inputs": { + "flake-utils": "flake-utils_39", + "nixpkgs": "nixpkgs_72" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_7": { + "inputs": { + "flake-utils": "flake-utils_61", + "nixpkgs": "nixpkgs_101" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "buildslist": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "buildslist_2": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "chatons": { + "inputs": { + "environment": "environment" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "chatons_2": { + "inputs": { + "environment": "environment_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_4", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_2": { + "inputs": { + "flake-compat": "flake-compat_2", + "flake-utils": "flake-utils_7", + "nixpkgs": "nixpkgs_13", + "stable": "stable_2" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_3": { + "inputs": { + "flake-compat": "flake-compat_3", + "flake-utils": "flake-utils_10", + "nixpkgs": "nixpkgs_20", + "stable": "stable_3" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_4": { + "inputs": { + "flake-compat": "flake-compat_4", + "flake-utils": "flake-utils_32", + "nixpkgs": "nixpkgs_51", + "stable": "stable_4" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_5": { + "inputs": { + "flake-compat": "flake-compat_5", + "flake-utils": "flake-utils_35", + "nixpkgs": "nixpkgs_59", + "stable": "stable_5" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_6": { + "inputs": { + "flake-compat": "flake-compat_6", + "flake-utils": "flake-utils_38", + "nixpkgs": "nixpkgs_67", + "stable": "stable_6" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_7": { + "inputs": { + "flake-compat": "flake-compat_7", + "flake-utils": "flake-utils_45", + "nixpkgs": "nixpkgs_81", + "stable": "stable_7" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "copanier": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "copanier_2": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "devshell": { + "inputs": { + "nixpkgs": "nixpkgs", + "systems": "systems" + }, + "locked": { + "lastModified": 1688380630, + "narHash": "sha256-8ilApWVb1mAi4439zS3iFeIT0ODlbrifm/fegWwgHjA=", + "owner": "numtide", + "repo": "devshell", + "rev": "f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "diaspora": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "diaspora_2": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_5" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_2": { + "inputs": { + "nixpkgs": "nixpkgs_14" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_3": { + "inputs": { + "nixpkgs": "nixpkgs_21" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_4": { + "inputs": { + "nixpkgs": "nixpkgs_52" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_5": { + "inputs": { + "nixpkgs": "nixpkgs_60" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_6": { + "inputs": { + "nixpkgs": "nixpkgs_68" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_7": { + "inputs": { + "nixpkgs": "nixpkgs_82" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "dns-nix": { + "inputs": { + "flake-utils": "flake-utils_9", + "nixpkgs": [ + "main-flake", + "n-eldiron", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1635273082, + "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=", + "owner": "kirelagin", + "repo": "dns.nix", + "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a", + "type": "github" + }, + "original": { + "owner": "kirelagin", + "repo": "dns.nix", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_27": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_28": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_29": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_30": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_31": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_32": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_33": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "etherpad-lite": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "etherpad-lite_2": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_5": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_6": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_7": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_10": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_13" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_11": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_15" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_12": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_16" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_13": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_18" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_14": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_19" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_15": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_20" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_16": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_21" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_17": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_22" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_18": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_23" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_19": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_24" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_20": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_25" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_21": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_27" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_22": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_28" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_5" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_4": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_6" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_5": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_7" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_6": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_9" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_7": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_10" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_8": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_11" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_9": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_12" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_10": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_11": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_12": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_13": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_14": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_15": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_16": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_17": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_18": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_19": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_20": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_21": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_22": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_23": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_24": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_25": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_26": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_27": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_28": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_29": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_30": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_31": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_32": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_33": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_34": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_35": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_36": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_37": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_38": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_39": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_40": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_41": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_42": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_43": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_44": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_45": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_46": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_47": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_48": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_49": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_50": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_51": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_52": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_53": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_54": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_55": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_56": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_57": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_58": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_59": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_6": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_60": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_61": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_62": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_63": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_7": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_8": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_9": { + "locked": { + "lastModified": 1614513358, + "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "grocy": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "grocy_2": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "impermanence": { + "locked": { + "lastModified": 1684264534, + "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=", + "owner": "nix-community", + "repo": "impermanence", + "rev": "89253fb1518063556edd5e54509c30ac3089d5e6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "impermanence", + "type": "github" + } + }, + "landing-page": { + "flake": false, + "locked": { + "lastModified": 1691524124, + "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=", + "ref": "main", + "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf", + "revCount": 573, + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + }, + "original": { + "ref": "main", + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + } + }, + "loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "loginctl-linger_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "loginctl-linger_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "mail-relay": { + "inputs": { + "environment": "environment_3", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "mail-relay_2": { + "inputs": { + "environment": "environment_20", + "secrets": "secrets_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "main-flake": { + "inputs": { + "n-backup-2": "n-backup-2", + "n-dilion": "n-dilion", + "n-eldiron": "n-eldiron", + "n-monitoring-1": "n-monitoring-1", + "n-quatresaisons": "n-quatresaisons", + "n-zoldene": "n-zoldene", + "s-backports": "s-backports", + "s-copanier": "s-copanier", + "s-diaspora": "s-diaspora", + "s-etherpad-lite": "s-etherpad-lite", + "s-fiche": "s-fiche", + "s-files-watcher": "s-files-watcher", + "s-grocy": "s-grocy", + "s-lib": "s-lib", + "s-loginctl-linger": "s-loginctl-linger", + "s-mastodon": "s-mastodon", + "s-mediagoblin": "s-mediagoblin", + "s-multi-apache-container": "s-multi-apache-container", + "s-mypackages": "s-mypackages", + "s-myuids": "s-myuids", + "s-naemon": "s-naemon", + "s-openarc": "s-openarc", + "s-opendmarc": "s-opendmarc", + "s-paste": "s-paste", + "s-peertube": "s-peertube", + "s-private-buildbot": "s-private-buildbot", + "s-private-chatons": "s-private-chatons", + "s-private-environment": "s-private-environment", + "s-private-mail-relay": "s-private-mail-relay", + "s-private-milters": "s-private-milters", + "s-private-monitoring": "s-private-monitoring", + "s-private-openarc": "s-private-openarc", + "s-private-opendmarc": "s-private-opendmarc", + "s-private-openldap": "s-private-openldap", + "s-private-paste": "s-private-paste", + "s-private-peertube": "s-private-peertube", + "s-private-php": "s-private-php", + "s-private-ssh": "s-private-ssh", + "s-private-system": "s-private-system", + "s-rsync_backup": "s-rsync_backup", + "s-secrets": "s-secrets", + "s-surfer": "s-surfer", + "s-taskwarrior-web": "s-taskwarrior-web", + "secrets": [ + "secrets" + ] + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LBw8FCxHXW6b1WFvsEnmLmNpZjow6+N4Q+3zAfcudIU=", + "path": "../flakes", + "type": "path" + }, + "original": { + "path": "../flakes", + "type": "path" + } + }, + "mastodon": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mastodon_2": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mediagoblin": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "mediagoblin_2": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "milters": { + "inputs": { + "environment": "environment_4", + "files-watcher": "files-watcher", + "openarc": "openarc", + "opendmarc": "opendmarc", + "secrets": "secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_5", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_2": { + "inputs": { + "environment": "environment_9", + "naemon": "naemon_2", + "nixpkgs-lib": "nixpkgs-lib_4", + "secrets": "secrets_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_3": { + "inputs": { + "environment": "environment_21", + "naemon": "naemon_4", + "nixpkgs-lib": "nixpkgs-lib_14", + "secrets": "secrets_16" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_4": { + "inputs": { + "environment": "environment_24", + "naemon": "naemon_5", + "nixpkgs-lib": "nixpkgs-lib_17", + "secrets": "secrets_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_11", + "myuids": "myuids_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_2": { + "inputs": { + "colmena": "colmena_2", + "disko": "disko_2", + "flake-parts": "flake-parts_3", + "nixos-anywhere": "nixos-anywhere_2", + "nixpkgs": "nixpkgs_16" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_3": { + "inputs": { + "colmena": "colmena_3", + "disko": "disko_3", + "flake-parts": "flake-parts_5", + "nixos-anywhere": "nixos-anywhere_3", + "nixpkgs": "nixpkgs_23" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_4": { + "inputs": { + "colmena": "colmena_4", + "disko": "disko_4", + "flake-parts": "flake-parts_11", + "nixos-anywhere": "nixos-anywhere_4", + "nixpkgs": "nixpkgs_54" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_5": { + "inputs": { + "colmena": "colmena_5", + "disko": "disko_5", + "flake-parts": "flake-parts_13", + "nixos-anywhere": "nixos-anywhere_5", + "nixpkgs": "nixpkgs_62" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_6": { + "inputs": { + "colmena": "colmena_6", + "disko": "disko_6", + "flake-parts": "flake-parts_15", + "nixos-anywhere": "nixos-anywhere_6", + "nixpkgs": "nixpkgs_70" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_12", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_10": { + "inputs": { + "flake-parts": "flake-parts_17", + "nixpkgs": "nixpkgs_77", + "webapps-ttrss": "webapps-ttrss_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_11": { + "inputs": { + "flake-parts": "flake-parts_18", + "nixpkgs": "nixpkgs_79", + "webapps-ttrss": "webapps-ttrss_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_12": { + "inputs": { + "flake-parts": "flake-parts_21", + "nixpkgs": "nixpkgs_102", + "webapps-ttrss": "webapps-ttrss_14" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_13": { + "inputs": { + "flake-parts": "flake-parts_22", + "nixpkgs": "nixpkgs_103", + "webapps-ttrss": "webapps-ttrss_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_2": { + "inputs": { + "flake-parts": "flake-parts_4", + "nixpkgs": "nixpkgs_19", + "webapps-ttrss": "webapps-ttrss_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_3": { + "inputs": { + "flake-parts": "flake-parts_6", + "nixpkgs": "nixpkgs_35", + "webapps-ttrss": "webapps-ttrss_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_4": { + "inputs": { + "flake-parts": "flake-parts_7", + "nixpkgs": "nixpkgs_38", + "webapps-ttrss": "webapps-ttrss_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_5": { + "inputs": { + "flake-parts": "flake-parts_8", + "nixpkgs": "nixpkgs_40", + "webapps-ttrss": "webapps-ttrss_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_6": { + "inputs": { + "flake-parts": "flake-parts_10", + "nixpkgs": "nixpkgs_48", + "webapps-ttrss": "webapps-ttrss_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_7": { + "inputs": { + "flake-parts": "flake-parts_12", + "nixpkgs": "nixpkgs_58", + "webapps-ttrss": "webapps-ttrss_8" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_8": { + "inputs": { + "flake-parts": "flake-parts_14", + "nixpkgs": "nixpkgs_66", + "webapps-ttrss": "webapps-ttrss_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_9": { + "inputs": { + "flake-parts": "flake-parts_16", + "nixpkgs": "nixpkgs_73", + "webapps-ttrss": "webapps-ttrss_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_27": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_28": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_29": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_30": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_31": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_32": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_33": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_34": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_35": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_36": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_37": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_38": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_39": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_40": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_41": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_42": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "n-backup-2": { + "inputs": { + "chatons": "chatons", + "environment": "environment_2", + "loginctl-linger": "loginctl-linger", + "mail-relay": "mail-relay", + "milters": "milters", + "monitoring": "monitoring", + "my-lib": "my-lib", + "myuids": "myuids_3", + "nixpkgs": "nixpkgs_8", + "openarc": "openarc_3", + "opendmarc": "opendmarc_2", + "openldap": "openldap", + "rsync_backup": "rsync_backup", + "secrets": "secrets_6", + "system": "system" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0CPGGyOWQadU9c8y+A4XtveOrmkMlFiH+WJ55RPzJnE=", + "path": "../systems/backup-2", + "type": "path" + }, + "original": { + "path": "../systems/backup-2", + "type": "path" + } + }, + "n-dilion": { + "inputs": { + "environment": "environment_8", + "files-watcher": "files-watcher_4", + "loginctl-linger": "loginctl-linger_2", + "monitoring": "monitoring_2", + "my-lib": "my-lib_2", + "myuids": "myuids_7", + "nixpkgs": "nixpkgs_17", + "secrets": "secrets_8", + "ssh": "ssh", + "system": "system_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Ctp8QY0OkGwv/YkOlipwM1ldEz7OebVDbAqg1O/tRe8=", + "path": "../systems/dilion", + "type": "path" + }, + "original": { + "path": "../systems/dilion", + "type": "path" + } + }, + "n-eldiron": { + "inputs": { + "dns-nix": "dns-nix", + "my-lib": "my-lib_3", + "nixpkgs": "nixpkgs_24", + "private-buildbot": "private-buildbot", + "private-chatons": "private-chatons", + "private-environment": "private-environment", + "private-milters": "private-milters", + "private-monitoring": "private-monitoring", + "private-openarc": "private-openarc", + "private-opendmarc": "private-opendmarc", + "private-openldap": "private-openldap", + "private-paste": "private-paste", + "private-peertube": "private-peertube", + "private-php": "private-php", + "private-ssh": "private-ssh", + "private-system": "private-system", + "public-copanier": "public-copanier", + "public-diaspora": "public-diaspora", + "public-etherpad-lite": "public-etherpad-lite", + "public-fiche": "public-fiche", + "public-files-watcher": "public-files-watcher", + "public-grocy": "public-grocy", + "public-loginctl-linger": "public-loginctl-linger", + "public-mastodon": "public-mastodon", + "public-mediagoblin": "public-mediagoblin", + "public-multi-apache-container": "public-multi-apache-container", + "public-mypackages": "public-mypackages", + "public-myuids": "public-myuids", + "public-openarc": "public-openarc", + "public-opendmarc": "public-opendmarc", + "public-peertube": "public-peertube", + "public-secrets": "public-secrets", + "public-surfer": "public-surfer", + "public-taskwarrior-web": "public-taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-g9f3SCavl9ssNr8Xw9Z8KkpeEwCYv+47dqwoIPneMSs=", + "path": "../systems/eldiron", + "type": "path" + }, + "original": { + "path": "../systems/eldiron", + "type": "path" + } + }, + "n-monitoring-1": { + "inputs": { + "chatons": "chatons_2", + "environment": "environment_19", + "files-watcher": "files-watcher_9", + "loginctl-linger": "loginctl-linger_3", + "mail-relay": "mail-relay_2", + "monitoring": "monitoring_3", + "my-lib": "my-lib_4", + "myuids": "myuids_23", + "nixpkgs": "nixpkgs_55", + "php": "php", + "secrets": "secrets_17", + "system": "system_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-kLIVhZAxEWcN3W1AaF/gmopYuRdq0U43jkA4hliY50I=", + "path": "../systems/monitoring-1", + "type": "path" + }, + "original": { + "path": "../systems/monitoring-1", + "type": "path" + } + }, + "n-quatresaisons": { + "inputs": { + "environment": "environment_23", + "files-watcher": "files-watcher_10", + "landing-page": "landing-page", + "monitoring": "monitoring_4", + "multi-apache-container": "multi-apache-container", + "my-lib": "my-lib_5", + "myuids": "myuids_26", + "nixpkgs": "nixpkgs_63", + "php": "php_2", + "secrets": "secrets_19", + "system": "system_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-FtjFgqcSXs0dTkbUggbPwaDeCoOoYZragHCUkcyq538=", + "path": "../systems/quatresaisons", + "type": "path" + }, + "original": { + "path": "../systems/quatresaisons", + "type": "path" + } + }, + "n-zoldene": { + "inputs": { + "impermanence": "impermanence", + "my-lib": "my-lib_6", + "nixpkgs": "nixpkgs_71", + "private-environment": "private-environment_2", + "private-system": "private-system_2", + "public-secrets": "public-secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-YSYLjETf7yMwdHeEisU1V7e5O3yB+YxVoIPLi00PCdo=", + "path": "../systems/zoldene", + "type": "path" + }, + "original": { + "path": "../systems/zoldene", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_2": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_3": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_4": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_5": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_6": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_7": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "main-flake", + "n-backup-2", + "my-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "n-backup-2", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_6", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_2": { + "inputs": { + "disko": [ + "main-flake", + "n-dilion", + "my-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "n-dilion", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_2", + "nixos-images": "nixos-images_2", + "nixpkgs": "nixpkgs_15", + "treefmt-nix": "treefmt-nix_2" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_3": { + "inputs": { + "disko": [ + "main-flake", + "n-eldiron", + "my-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "n-eldiron", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_3", + "nixos-images": "nixos-images_3", + "nixpkgs": "nixpkgs_22", + "treefmt-nix": "treefmt-nix_3" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_4": { + "inputs": { + "disko": [ + "main-flake", + "n-monitoring-1", + "my-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "n-monitoring-1", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_4", + "nixos-images": "nixos-images_4", + "nixpkgs": "nixpkgs_53", + "treefmt-nix": "treefmt-nix_4" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_5": { + "inputs": { + "disko": [ + "main-flake", + "n-quatresaisons", + "my-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "n-quatresaisons", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_5", + "nixos-images": "nixos-images_5", + "nixpkgs": "nixpkgs_61", + "treefmt-nix": "treefmt-nix_5" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_6": { + "inputs": { + "disko": [ + "main-flake", + "n-zoldene", + "my-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "n-zoldene", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_6", + "nixos-images": "nixos-images_6", + "nixpkgs": "nixpkgs_69", + "treefmt-nix": "treefmt-nix_6" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_7": { + "inputs": { + "disko": [ + "main-flake", + "s-lib", + "disko" + ], + "flake-parts": [ + "main-flake", + "s-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_7", + "nixos-images": "nixos-images_7", + "nixpkgs": "nixpkgs_83", + "treefmt-nix": "treefmt-nix_7" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "main-flake", + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_2": { + "inputs": { + "nixos-2305": [ + "main-flake", + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_3": { + "inputs": { + "nixos-2305": [ + "main-flake", + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_4": { + "inputs": { + "nixos-2305": [ + "main-flake", + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_5": { + "inputs": { + "nixos-2305": [ + "main-flake", + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_6": { + "inputs": { + "nixos-2305": [ + "main-flake", + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_7": { + "inputs": { + "nixos-2305": [ + "main-flake", + "s-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "main-flake", + "s-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1677383253, + "narHash": "sha256-UfpzWfSxkfXHnb4boXZNaKsAcUrZT9Hw+tao1oZxd08=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "9952d6bc395f5841262b006fbace8dd7e143b634", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_2": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_3": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_10": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_11": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_12": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_13": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_14": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_15": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_16": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_17": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_18": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_19": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_20": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_21": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_22": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_23": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_24": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_25": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_26": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_27": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_28": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_4": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_5": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_6": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_7": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_8": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_9": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_100": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_101": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_102": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_103": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_104": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_105": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_106": { + "locked": { + "dir": "lib", + "lastModified": 1691472822, + "narHash": "sha256-XVfYZ2oB3lNPVq6sHCY9WkdQ8lHoIDzzbpg8bB6oBxA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "41c7605718399dcfa53dd7083793b6ae3bc969ff", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_107": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_12": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_13": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_14": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_15": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_16": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_17": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_18": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_19": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_20": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_21": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_22": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_23": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_24": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_25": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_26": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_27": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_28": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_29": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_30": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_31": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_32": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_33": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_34": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_35": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_36": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_37": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_38": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_39": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_40": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_41": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_42": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_43": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_44": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_45": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_46": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_47": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_48": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_49": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_50": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_51": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_52": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_53": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_54": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_55": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_56": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_57": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_58": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_59": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_60": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_61": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_62": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_63": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_64": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_65": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_66": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_67": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_68": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_69": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_70": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_71": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_72": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_73": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_74": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_75": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_76": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_77": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_78": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_79": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_80": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_81": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_82": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_83": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_84": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_85": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_86": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_87": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_88": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_89": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_90": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_91": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_92": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_93": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_94": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_95": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_96": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_97": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_98": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_99": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "openarc": { + "inputs": { + "flake-utils": "flake-utils", + "myuids": "myuids", + "nixpkgs": "nixpkgs_2", + "openarc": "openarc_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_10": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_11": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_12": { + "inputs": { + "flake-utils": "flake-utils_53", + "myuids": "myuids_36", + "nixpkgs": "nixpkgs_93", + "openarc": "openarc_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_13": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_14": { + "inputs": { + "flake-utils": "flake-utils_55", + "myuids": "myuids_38", + "nixpkgs": "nixpkgs_95", + "openarc": "openarc_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_15": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_2": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_3": { + "inputs": { + "files-watcher": "files-watcher_2", + "openarc": "openarc_4", + "secrets": "secrets_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "openarc_4": { + "inputs": { + "flake-utils": "flake-utils_4", + "myuids": "myuids_4", + "nixpkgs": "nixpkgs_9", + "openarc": "openarc_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_5": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_6": { + "inputs": { + "flake-utils": "flake-utils_12", + "myuids": "myuids_9", + "nixpkgs": "nixpkgs_26", + "openarc": "openarc_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_7": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_8": { + "inputs": { + "flake-utils": "flake-utils_14", + "myuids": "myuids_11", + "nixpkgs": "nixpkgs_28", + "openarc": "openarc_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_9": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "opendmarc": { + "inputs": { + "flake-utils": "flake-utils_2", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_2": { + "inputs": { + "environment": "environment_6", + "files-watcher": "files-watcher_3", + "opendmarc": "opendmarc_3", + "secrets": "secrets_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "opendmarc_3": { + "inputs": { + "flake-utils": "flake-utils_5", + "myuids": "myuids_5", + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_4": { + "inputs": { + "flake-utils": "flake-utils_13", + "myuids": "myuids_10", + "nixpkgs": "nixpkgs_27" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_5": { + "inputs": { + "flake-utils": "flake-utils_15", + "myuids": "myuids_12", + "nixpkgs": "nixpkgs_29" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_6": { + "inputs": { + "flake-utils": "flake-utils_54", + "myuids": "myuids_37", + "nixpkgs": "nixpkgs_94" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_7": { + "inputs": { + "flake-utils": "flake-utils_56", + "myuids": "myuids_39", + "nixpkgs": "nixpkgs_96" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "paste": { + "inputs": { + "flake-utils": "flake-utils_16", + "nixpkgs": "nixpkgs_30" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "paste_2": { + "inputs": { + "flake-utils": "flake-utils_57", + "nixpkgs": "nixpkgs_97" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "peertube": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_2": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_3": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_4": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_5": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_6": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_open_instance": { + "inputs": { + "flake-utils": "flake-utils_17", + "myuids": "myuids_13", + "nixpkgs": "nixpkgs_31", + "peertube": "peertube" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_open_instance_2": { + "inputs": { + "flake-utils": "flake-utils_58", + "myuids": "myuids_40", + "nixpkgs": "nixpkgs_98", + "peertube": "peertube_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin": { + "inputs": { + "flake-utils": "flake-utils_18", + "myuids": "myuids_14", + "nixpkgs": "nixpkgs_32", + "peertube": "peertube_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin_2": { + "inputs": { + "flake-utils": "flake-utils_59", + "myuids": "myuids_41", + "nixpkgs": "nixpkgs_99", + "peertube": "peertube_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "php": { + "inputs": { + "flake-utils": "flake-utils_33", + "nixpkgs": "nixpkgs_56", + "nixpkgs-4": "nixpkgs-4_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "php_2": { + "inputs": { + "flake-utils": "flake-utils_36", + "nixpkgs": "nixpkgs_64", + "nixpkgs-4": "nixpkgs-4_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-buildbot": { + "inputs": { + "buildslist": "buildslist", + "flake-utils": "flake-utils_11", + "nixpkgs": "nixpkgs_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "../../flakes/private/buildbot", + "type": "path" + }, + "original": { + "path": "../../flakes/private/buildbot", + "type": "path" + } + }, + "private-chatons": { + "inputs": { + "environment": "environment_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-milters": { + "inputs": { + "environment": "environment_13", + "files-watcher": "files-watcher_5", + "openarc": "openarc_6", + "opendmarc": "opendmarc_4", + "secrets": "secrets_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "private-monitoring": { + "inputs": { + "environment": "environment_14", + "naemon": "naemon_3", + "nixpkgs-lib": "nixpkgs-lib_8", + "secrets": "secrets_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "private-openarc": { + "inputs": { + "files-watcher": "files-watcher_6", + "openarc": "openarc_8", + "secrets": "secrets_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "private-opendmarc": { + "inputs": { + "environment": "environment_15", + "files-watcher": "files-watcher_7", + "opendmarc": "opendmarc_5", + "secrets": "secrets_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "private-paste": { + "inputs": { + "paste": "paste" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "../../flakes/private/paste", + "type": "path" + }, + "original": { + "path": "../../flakes/private/paste", + "type": "path" + } + }, + "private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance", + "peertube_origin": "peertube_origin" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "../../flakes/private/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/private/peertube", + "type": "path" + } + }, + "private-php": { + "inputs": { + "flake-utils": "flake-utils_19", + "nixpkgs": "nixpkgs_33", + "nixpkgs-4": "nixpkgs-4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-ssh": { + "inputs": { + "environment": "environment_16", + "secrets": "secrets_14" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "private-system": { + "inputs": { + "backports": "backports_3", + "environment": "environment_17", + "mypackages": "mypackages_3", + "myuids": "myuids_15", + "secrets-public": "secrets-public_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "private-system_2": { + "inputs": { + "backports": "backports_6", + "environment": "environment_26", + "mypackages": "mypackages_9", + "myuids": "myuids_28", + "secrets-public": "secrets-public_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "public-copanier": { + "inputs": { + "copanier": "copanier", + "flake-utils": "flake-utils_21", + "nixpkgs": "nixpkgs_36" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "../../flakes/copanier", + "type": "path" + }, + "original": { + "path": "../../flakes/copanier", + "type": "path" + } + }, + "public-diaspora": { + "inputs": { + "diaspora": "diaspora", + "flake-utils": "flake-utils_22", + "myuids": "myuids_16", + "nixpkgs": "nixpkgs_37" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "../../flakes/diaspora", + "type": "path" + }, + "original": { + "path": "../../flakes/diaspora", + "type": "path" + } + }, + "public-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite", + "flake-utils": "flake-utils_23", + "mypackages": "mypackages_4", + "nixpkgs": "nixpkgs_39" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "../../flakes/etherpad-lite", + "type": "path" + }, + "original": { + "path": "../../flakes/etherpad-lite", + "type": "path" + } + }, + "public-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "../../flakes/fiche", + "type": "path" + }, + "original": { + "path": "../../flakes/fiche", + "type": "path" + } + }, + "public-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "public-grocy": { + "inputs": { + "flake-utils": "flake-utils_24", + "grocy": "grocy", + "mypackages": "mypackages_5", + "nixpkgs": "nixpkgs_41" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "../../flakes/grocy", + "type": "path" + }, + "original": { + "path": "../../flakes/grocy", + "type": "path" + } + }, + "public-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "public-mastodon": { + "inputs": { + "flake-utils": "flake-utils_25", + "mastodon": "mastodon", + "myuids": "myuids_17", + "nixpkgs": "nixpkgs_42" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "../../flakes/mastodon", + "type": "path" + }, + "original": { + "path": "../../flakes/mastodon", + "type": "path" + } + }, + "public-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_26", + "mediagoblin": "mediagoblin", + "myuids": "myuids_18", + "nixpkgs": "nixpkgs_43" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "../../flakes/mediagoblin", + "type": "path" + }, + "original": { + "path": "../../flakes/mediagoblin", + "type": "path" + } + }, + "public-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_8", + "myuids": "myuids_19" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "public-mypackages": { + "inputs": { + "flake-parts": "flake-parts_9", + "nixpkgs": "nixpkgs_44", + "webapps-ttrss": "webapps-ttrss_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../flakes/mypackages", + "type": "path" + }, + "original": { + "path": "../../flakes/mypackages", + "type": "path" + } + }, + "public-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "public-openarc": { + "inputs": { + "flake-utils": "flake-utils_27", + "myuids": "myuids_20", + "nixpkgs": "nixpkgs_45", + "openarc": "openarc_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../flakes/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/openarc", + "type": "path" + } + }, + "public-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_28", + "myuids": "myuids_21", + "nixpkgs": "nixpkgs_46" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../flakes/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/opendmarc", + "type": "path" + } + }, + "public-peertube": { + "inputs": { + "flake-utils": "flake-utils_29", + "myuids": "myuids_22", + "nixpkgs": "nixpkgs_47", + "peertube": "peertube_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "../../flakes/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/peertube", + "type": "path" + } + }, + "public-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-surfer": { + "inputs": { + "flake-utils": "flake-utils_30", + "mypackages": "mypackages_6", + "nixpkgs": "nixpkgs_49", + "surfer": "surfer" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "../../flakes/surfer", + "type": "path" + }, + "original": { + "path": "../../flakes/surfer", + "type": "path" + } + }, + "public-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_31", + "nixpkgs": "nixpkgs_50", + "taskwarrior-web": "taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "../../flakes/taskwarrior-web", + "type": "path" + }, + "original": { + "path": "../../flakes/taskwarrior-web", + "type": "path" + } + }, + "root": { + "inputs": { + "devshell": "devshell", + "main-flake": "main-flake", + "nixpkgs": "nixpkgs_106", + "secrets": "secrets_26" + } + }, + "rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "../../flakes/rsync_backup", + "type": "path" + }, + "original": { + "path": "../../flakes/rsync_backup", + "type": "path" + } + }, + "s-backports": { + "inputs": { + "flake-utils": "flake-utils_40", + "nixpkgs": "nixpkgs_74" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "./backports", + "type": "path" + }, + "original": { + "path": "./backports", + "type": "path" + } + }, + "s-copanier": { + "inputs": { + "copanier": "copanier_2", + "flake-utils": "flake-utils_41", + "nixpkgs": "nixpkgs_75" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "./copanier", + "type": "path" + }, + "original": { + "path": "./copanier", + "type": "path" + } + }, + "s-diaspora": { + "inputs": { + "diaspora": "diaspora_2", + "flake-utils": "flake-utils_42", + "myuids": "myuids_29", + "nixpkgs": "nixpkgs_76" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "./diaspora", + "type": "path" + }, + "original": { + "path": "./diaspora", + "type": "path" + } + }, + "s-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite_2", + "flake-utils": "flake-utils_43", + "mypackages": "mypackages_10", + "nixpkgs": "nixpkgs_78" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "./etherpad-lite", + "type": "path" + }, + "original": { + "path": "./etherpad-lite", + "type": "path" + } + }, + "s-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "./fiche", + "type": "path" + }, + "original": { + "path": "./fiche", + "type": "path" + } + }, + "s-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "./files-watcher", + "type": "path" + }, + "original": { + "path": "./files-watcher", + "type": "path" + } + }, + "s-grocy": { + "inputs": { + "flake-utils": "flake-utils_44", + "grocy": "grocy_2", + "mypackages": "mypackages_11", + "nixpkgs": "nixpkgs_80" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "./grocy", + "type": "path" + }, + "original": { + "path": "./grocy", + "type": "path" + } + }, + "s-lib": { + "inputs": { + "colmena": "colmena_7", + "disko": "disko_7", + "flake-parts": "flake-parts_19", + "nixos-anywhere": "nixos-anywhere_7", + "nixpkgs": "nixpkgs_84" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "./lib", + "type": "path" + }, + "original": { + "path": "./lib", + "type": "path" + } + }, + "s-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "./loginctl-linger", + "type": "path" + }, + "original": { + "path": "./loginctl-linger", + "type": "path" + } + }, + "s-mastodon": { + "inputs": { + "flake-utils": "flake-utils_46", + "mastodon": "mastodon_2", + "myuids": "myuids_30", + "nixpkgs": "nixpkgs_85" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "./mastodon", + "type": "path" + }, + "original": { + "path": "./mastodon", + "type": "path" + } + }, + "s-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_47", + "mediagoblin": "mediagoblin_2", + "myuids": "myuids_31", + "nixpkgs": "nixpkgs_86" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "./mediagoblin", + "type": "path" + }, + "original": { + "path": "./mediagoblin", + "type": "path" + } + }, + "s-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_12", + "myuids": "myuids_32" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "./multi-apache-container", + "type": "path" + }, + "original": { + "path": "./multi-apache-container", + "type": "path" + } + }, + "s-mypackages": { + "inputs": { + "flake-parts": "flake-parts_20", + "nixpkgs": "nixpkgs_87", + "webapps-ttrss": "webapps-ttrss_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "./mypackages", + "type": "path" + }, + "original": { + "path": "./mypackages", + "type": "path" + } + }, + "s-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "./myuids", + "type": "path" + }, + "original": { + "path": "./myuids", + "type": "path" + } + }, + "s-naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "./naemon", + "type": "path" + }, + "original": { + "path": "./naemon", + "type": "path" + } + }, + "s-openarc": { + "inputs": { + "flake-utils": "flake-utils_48", + "myuids": "myuids_33", + "nixpkgs": "nixpkgs_88", + "openarc": "openarc_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "./openarc", + "type": "path" + }, + "original": { + "path": "./openarc", + "type": "path" + } + }, + "s-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_49", + "myuids": "myuids_34", + "nixpkgs": "nixpkgs_89" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "./opendmarc", + "type": "path" + }, + "original": { + "path": "./opendmarc", + "type": "path" + } + }, + "s-paste": { + "inputs": { + "flake-utils": "flake-utils_50", + "nixpkgs": "nixpkgs_90" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "./paste", + "type": "path" + }, + "original": { + "path": "./paste", + "type": "path" + } + }, + "s-peertube": { + "inputs": { + "flake-utils": "flake-utils_51", + "myuids": "myuids_35", + "nixpkgs": "nixpkgs_91", + "peertube": "peertube_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./peertube", + "type": "path" + }, + "original": { + "path": "./peertube", + "type": "path" + } + }, + "s-private-buildbot": { + "inputs": { + "buildslist": "buildslist_2", + "flake-utils": "flake-utils_52", + "nixpkgs": "nixpkgs_92" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "./private/buildbot", + "type": "path" + }, + "original": { + "path": "./private/buildbot", + "type": "path" + } + }, + "s-private-chatons": { + "inputs": { + "environment": "environment_27" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "./private/chatons", + "type": "path" + }, + "original": { + "path": "./private/chatons", + "type": "path" + } + }, + "s-private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "./private/environment", + "type": "path" + }, + "original": { + "path": "./private/environment", + "type": "path" + } + }, + "s-private-mail-relay": { + "inputs": { + "environment": "environment_28", + "secrets": "secrets_20" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "./private/mail-relay", + "type": "path" + }, + "original": { + "path": "./private/mail-relay", + "type": "path" + } + }, + "s-private-milters": { + "inputs": { + "environment": "environment_29", + "files-watcher": "files-watcher_13", + "openarc": "openarc_12", + "opendmarc": "opendmarc_6", + "secrets": "secrets_21" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "./private/milters", + "type": "path" + }, + "original": { + "path": "./private/milters", + "type": "path" + } + }, + "s-private-monitoring": { + "inputs": { + "environment": "environment_30", + "naemon": "naemon_6", + "nixpkgs-lib": "nixpkgs-lib_26", + "secrets": "secrets_22" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "./private/monitoring", + "type": "path" + }, + "original": { + "path": "./private/monitoring", + "type": "path" + } + }, + "s-private-openarc": { + "inputs": { + "files-watcher": "files-watcher_14", + "openarc": "openarc_14", + "secrets": "secrets_23" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "./private/openarc", + "type": "path" + }, + "original": { + "path": "./private/openarc", + "type": "path" + } + }, + "s-private-opendmarc": { + "inputs": { + "environment": "environment_31", + "files-watcher": "files-watcher_15", + "opendmarc": "opendmarc_7", + "secrets": "secrets_24" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "./private/opendmarc", + "type": "path" + }, + "original": { + "path": "./private/opendmarc", + "type": "path" + } + }, + "s-private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "./private/openldap", + "type": "path" + }, + "original": { + "path": "./private/openldap", + "type": "path" + } + }, + "s-private-paste": { + "inputs": { + "paste": "paste_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "./private/paste", + "type": "path" + }, + "original": { + "path": "./private/paste", + "type": "path" + } + }, + "s-private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance_2", + "peertube_origin": "peertube_origin_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "./private/peertube", + "type": "path" + }, + "original": { + "path": "./private/peertube", + "type": "path" + } + }, + "s-private-php": { + "inputs": { + "flake-utils": "flake-utils_60", + "nixpkgs": "nixpkgs_100", + "nixpkgs-4": "nixpkgs-4_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "./private/php", + "type": "path" + }, + "original": { + "path": "./private/php", + "type": "path" + } + }, + "s-private-ssh": { + "inputs": { + "environment": "environment_32", + "secrets": "secrets_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "./private/ssh", + "type": "path" + }, + "original": { + "path": "./private/ssh", + "type": "path" + } + }, + "s-private-system": { + "inputs": { + "backports": "backports_7", + "environment": "environment_33", + "mypackages": "mypackages_12", + "myuids": "myuids_42", + "secrets-public": "secrets-public_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "./private/system", + "type": "path" + }, + "original": { + "path": "./private/system", + "type": "path" + } + }, + "s-rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "./rsync_backup", + "type": "path" + }, + "original": { + "path": "./rsync_backup", + "type": "path" + } + }, + "s-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "./secrets", + "type": "path" + }, + "original": { + "path": "./secrets", + "type": "path" + } + }, + "s-surfer": { + "inputs": { + "flake-utils": "flake-utils_62", + "mypackages": "mypackages_13", + "nixpkgs": "nixpkgs_104", + "surfer": "surfer_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "./surfer", + "type": "path" + }, + "original": { + "path": "./surfer", + "type": "path" + } + }, + "s-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_63", + "nixpkgs": "nixpkgs_105", + "taskwarrior-web": "taskwarrior-web_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "./taskwarrior-web", + "type": "path" + }, + "original": { + "path": "./taskwarrior-web", + "type": "path" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_26": { + "inputs": { + "nixpkgs": "nixpkgs_107" + }, + "locked": { + "lastModified": 1696144631, + "narHash": "sha256-zV7tbNrrrUpPkaATkc6OsQC8n75QybaBKsaD7d5kQGA=", + "ref": "master", + "rev": "ae51ac0227647e30348256067934b8c9eb7e3f06", + "revCount": 688, + "type": "git", + "url": "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets" + }, + "original": { + "ref": "master", + "type": "git", + "url": "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "ssh": { + "inputs": { + "environment": "environment_10", + "secrets": "secrets_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_2": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_3": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_4": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_5": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_6": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_7": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "surfer": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "surfer_2": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_7", + "mypackages": "mypackages", + "myuids": "myuids_6", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_2": { + "inputs": { + "backports": "backports_2", + "environment": "environment_11", + "mypackages": "mypackages_2", + "myuids": "myuids_8", + "secrets-public": "secrets-public_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_3": { + "inputs": { + "backports": "backports_4", + "environment": "environment_22", + "mypackages": "mypackages_7", + "myuids": "myuids_24", + "secrets-public": "secrets-public_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_4": { + "inputs": { + "backports": "backports_5", + "environment": "environment_25", + "mypackages": "mypackages_8", + "myuids": "myuids_27", + "secrets-public": "secrets-public_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "taskwarrior-web": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "taskwarrior-web_2": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "main-flake", + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_2": { + "inputs": { + "nixpkgs": [ + "main-flake", + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_3": { + "inputs": { + "nixpkgs": [ + "main-flake", + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_4": { + "inputs": { + "nixpkgs": [ + "main-flake", + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_5": { + "inputs": { + "nixpkgs": [ + "main-flake", + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_6": { + "inputs": { + "nixpkgs": [ + "main-flake", + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_7": { + "inputs": { + "nixpkgs": [ + "main-flake", + "s-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_10": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_11": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_12": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_13": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_14": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_15": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_2": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_3": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_4": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_5": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_6": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_7": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_8": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_9": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/deploy/flake.nix b/deploy/flake.nix new file mode 100644 index 0000000..f613b19 --- /dev/null +++ b/deploy/flake.nix @@ -0,0 +1,45 @@ +{ + inputs = { + devshell.url = "github:numtide/devshell"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable?dir=lib"; + # Uncomment temporarily below value and replace with local path to + # your secrets, and replace "follows" key below to use it. + #secrets-local.url = "path:/home/immae/projets/mes_sites/nixops-secrets"; + secrets = { + type = "git"; + url = "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets"; + ref = "master"; + }; + main-flake.url = "path:../flakes"; + main-flake.inputs.secrets.follows = "secrets"; + }; + outputs = inputs@{ self, nixpkgs, main-flake, devshell, ... }: { + sops-vars-file = (inputs.secrets-local or inputs.secrets).vars-file; + # FIXME: next line Can be removed in nix 2.16.* + devShell.x86_64-linux = self.devShells.x86_64-linux.default; + devShells.x86_64-linux.default = devshell.legacyPackages.x86_64-linux.mkShell { + env = [ + { name = "NIX_BUILD_TOP"; value = ""; } + { name = "SOPS_VARS_FILE"; value = builtins.toString self.sops-vars-file; } + ]; + }; + colmena = + let + nodeFlakes = main-flake.subflakes.nodes; + hosts = builtins.attrNames nodeFlakes; + toHostNixpkgs = name: nodeFlakes.${name}.colmena.meta.nixpkgs; + toHostSpecialArgs = name: nodeFlakes.${name}.colmena.meta.specialArgs; + toHostColmena = name: nodeFlakes.${name}.colmena.${name}; + + in nixpkgs.lib.genAttrs hosts toHostColmena + // { + meta = { + # nixpkgs is required for colmena, but only lib is actually used + nixpkgs.lib = nixpkgs.lib; + specialArgs.secrets = main-flake.subflakes.secrets; + nodeNixpkgs = nixpkgs.lib.genAttrs hosts toHostNixpkgs; + nodeSpecialArgs = nixpkgs.lib.genAttrs hosts toHostSpecialArgs; + }; + }; + }; +} diff --git a/environments/default.nix b/environments/default.nix deleted file mode 100644 index 5f17eb9..0000000 --- a/environments/default.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ callPackage }: -{ - immae-eu = callPackage ./immae-eu.nix {}; -} diff --git a/environments/immae-eu.nix b/environments/immae-eu.nix deleted file mode 100644 index 4def84b..0000000 --- a/environments/immae-eu.nix +++ /dev/null @@ -1,146 +0,0 @@ -{ pkgs }: with pkgs; -let - # https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh - # https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks - vlock' = vlock.overrideAttrs(old: { - configureFlags = old.configureFlags ++ [ "--enable-root-password=no" ]; - }); - paths = [ - # archives - lzo unzip bzip2 xz - # unrar is unfree - - # backups - duply - - # calendar/contacts - abook khard khal cadaver vdirsyncerStable pal - - # computing - boinctui - - # cryptocurrencies - monero - cointop - # failing xmr-stak - solc - iota-cli-app - - # debugging - rr valgrind netcat-gnu strace shellcheck - - # documentations - unicodeDoc - - # e-mails - muttprint mutt-ics - notmuch-python2 notmuch-python3 notmuch-vim - neomutt mairix - bogofilter fetchmail - sieve-connect - - # git - vcsh gitRepo stgit tig ripgrep mr - - # graphical tools - nextcloud-client firefox - dwm dmenu st xorg.xauth tigervnc - - # images - feh imagemagick tiv graphicsmagick qrcode - - # internet browsing - w3m lynx links elinks browsh woob urlview urlscan googler urlwatch - - # less - python3Packages.pygments lesspipe highlight sourceHighlight - - # monitoring - cnagios mtop pg_activity nagios-cli mtr - iftop htop iotop iperf bonfire - goaccess tcpdump tshark tcpflow - mitmproxy - # nagnu - - # messaging/forums/news - flrn slrn - signal-cli signaldctl - telegram-cli telegram-history-dump telegramircd - weechat profanity - newsboat irssi - - # nix - yarn2nix-moretea.yarn2nix nixUnstable - nixops nix-prefetch-scripts nix-generate-from-cpan - bundix nodePackages.bower2nix nix-diff - nodePackages.node2nix niv - # (nixos {}).nixos-generate-config - # (nixos {}).nixos-install - # (nixos {}).nixos-enter - # (nixos {}).manual.manpages - - # note taking - note terminal-velocity jrnl doing nb - - # office - sc-im ranger - genius bc - ledger - tmux - rtorrent - ldapvi - fzf - buku - vimPlugins.vim-plug - (vim_configurable.override { python = python3; }) - mailcap - webapps.surfer - - # password management - (pass.withExtensions (exts: [ exts.pass-otp ])) apg pwgen - - # pdf - pdftk poppler_utils - - # programming - pelican emacs26-nox ctags - wdiff patch gnumake - - # security - keybase gnupg - - # todolist/time management - taskwarrior vit timewarrior taskopen - bugwarrior - - # video/music - youtube-dl ncmpc ncmpcpp ffmpeg - - # s6 tools (part of skawarePackages) - skalibs execline s6 s6-dns s6-linux-utils s6-networking - s6-portable-utils - - # system tools - telnet bind.dnsutils httpie ngrep nmap p0f socat lsof psmisc - wget patchelf rename tmux (lib.meta.hiPrio nettools) - vlock' mosh manpages openssl openssl.doc openssl.man - sshfs ncdu procps-ng - - # other tools - pgloader s3cmd lftp jq cpulimit libxslt gandi-cli bubblewrap - - # Terraform + AWS - terraform_0_12 awscli - ansible python3Packages.boto - openvpn - - zsh-completions - ]; -in -buildEnv { - name = "immae-eu-packages"; - inherit paths; - pathsToLink = [ "/bin" "/etc" "/include" "/lib" "/libexec" "/share"]; - extraOutputsToInstall = [ "bin" "man" "doc" "info" ]; - passthru = { packages = paths; }; -} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b109986 --- /dev/null +++ b/flake.lock @@ -0,0 +1,9825 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_6", + "nixpkgs": "nixpkgs_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_2": { + "inputs": { + "flake-utils": "flake-utils_8", + "nixpkgs": "nixpkgs_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_3": { + "inputs": { + "flake-utils": "flake-utils_20", + "nixpkgs": "nixpkgs_34" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_4": { + "inputs": { + "flake-utils": "flake-utils_34", + "nixpkgs": "nixpkgs_57" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_5": { + "inputs": { + "flake-utils": "flake-utils_37", + "nixpkgs": "nixpkgs_65" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_6": { + "inputs": { + "flake-utils": "flake-utils_39", + "nixpkgs": "nixpkgs_72" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_7": { + "inputs": { + "flake-utils": "flake-utils_61", + "nixpkgs": "nixpkgs_101" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "buildslist": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "buildslist_2": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "chatons": { + "inputs": { + "environment": "environment" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "chatons_2": { + "inputs": { + "environment": "environment_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_4", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_2": { + "inputs": { + "flake-compat": "flake-compat_2", + "flake-utils": "flake-utils_7", + "nixpkgs": "nixpkgs_13", + "stable": "stable_2" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_3": { + "inputs": { + "flake-compat": "flake-compat_3", + "flake-utils": "flake-utils_10", + "nixpkgs": "nixpkgs_20", + "stable": "stable_3" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_4": { + "inputs": { + "flake-compat": "flake-compat_4", + "flake-utils": "flake-utils_32", + "nixpkgs": "nixpkgs_51", + "stable": "stable_4" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_5": { + "inputs": { + "flake-compat": "flake-compat_5", + "flake-utils": "flake-utils_35", + "nixpkgs": "nixpkgs_59", + "stable": "stable_5" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_6": { + "inputs": { + "flake-compat": "flake-compat_6", + "flake-utils": "flake-utils_38", + "nixpkgs": "nixpkgs_67", + "stable": "stable_6" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_7": { + "inputs": { + "flake-compat": "flake-compat_7", + "flake-utils": "flake-utils_45", + "nixpkgs": "nixpkgs_81", + "stable": "stable_7" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "copanier": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "copanier_2": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "devshell": { + "inputs": { + "nixpkgs": "nixpkgs", + "systems": "systems" + }, + "locked": { + "lastModified": 1688380630, + "narHash": "sha256-8ilApWVb1mAi4439zS3iFeIT0ODlbrifm/fegWwgHjA=", + "owner": "numtide", + "repo": "devshell", + "rev": "f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "diaspora": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "diaspora_2": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_5" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_2": { + "inputs": { + "nixpkgs": "nixpkgs_14" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_3": { + "inputs": { + "nixpkgs": "nixpkgs_21" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_4": { + "inputs": { + "nixpkgs": "nixpkgs_52" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_5": { + "inputs": { + "nixpkgs": "nixpkgs_60" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_6": { + "inputs": { + "nixpkgs": "nixpkgs_68" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_7": { + "inputs": { + "nixpkgs": "nixpkgs_82" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "dns-nix": { + "inputs": { + "flake-utils": "flake-utils_9", + "nixpkgs": [ + "flakes", + "n-eldiron", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1635273082, + "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=", + "owner": "kirelagin", + "repo": "dns.nix", + "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a", + "type": "github" + }, + "original": { + "owner": "kirelagin", + "repo": "dns.nix", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_27": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_28": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_29": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_30": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_31": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_32": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_33": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "etherpad-lite": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "etherpad-lite_2": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_5": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_6": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_7": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_10": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_13" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_11": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_14" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_12": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_16" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_13": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_17" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_14": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_19" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_15": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_20" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_16": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_21" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_17": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_22" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_18": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_23" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_19": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_24" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_20": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_25" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_21": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_26" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_22": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_28" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_23": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_29" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_4" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_4": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_6" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_5": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_7" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_6": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_8" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_7": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_10" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_8": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_11" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_9": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_12" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_10": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_11": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_12": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_13": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_14": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_15": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_16": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_17": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_18": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_19": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_20": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_21": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_22": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_23": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_24": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_25": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_26": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_27": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_28": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_29": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_30": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_31": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_32": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_33": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_34": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_35": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_36": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_37": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_38": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_39": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_40": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_41": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_42": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_43": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_44": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_45": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_46": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_47": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_48": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_49": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_50": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_51": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_52": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_53": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_54": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_55": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_56": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_57": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_58": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_59": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_6": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_60": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_61": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_62": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_63": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_7": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_8": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_9": { + "locked": { + "lastModified": 1614513358, + "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flakes": { + "inputs": { + "n-backup-2": "n-backup-2", + "n-dilion": "n-dilion", + "n-eldiron": "n-eldiron", + "n-monitoring-1": "n-monitoring-1", + "n-quatresaisons": "n-quatresaisons", + "n-zoldene": "n-zoldene", + "s-backports": "s-backports", + "s-copanier": "s-copanier", + "s-diaspora": "s-diaspora", + "s-etherpad-lite": "s-etherpad-lite", + "s-fiche": "s-fiche", + "s-files-watcher": "s-files-watcher", + "s-grocy": "s-grocy", + "s-lib": "s-lib", + "s-loginctl-linger": "s-loginctl-linger", + "s-mastodon": "s-mastodon", + "s-mediagoblin": "s-mediagoblin", + "s-multi-apache-container": "s-multi-apache-container", + "s-mypackages": "s-mypackages", + "s-myuids": "s-myuids", + "s-naemon": "s-naemon", + "s-openarc": "s-openarc", + "s-opendmarc": "s-opendmarc", + "s-paste": "s-paste", + "s-peertube": "s-peertube", + "s-private-buildbot": "s-private-buildbot", + "s-private-chatons": "s-private-chatons", + "s-private-environment": "s-private-environment", + "s-private-mail-relay": "s-private-mail-relay", + "s-private-milters": "s-private-milters", + "s-private-monitoring": "s-private-monitoring", + "s-private-openarc": "s-private-openarc", + "s-private-opendmarc": "s-private-opendmarc", + "s-private-openldap": "s-private-openldap", + "s-private-paste": "s-private-paste", + "s-private-peertube": "s-private-peertube", + "s-private-php": "s-private-php", + "s-private-ssh": "s-private-ssh", + "s-private-system": "s-private-system", + "s-rsync_backup": "s-rsync_backup", + "s-secrets": "s-secrets", + "s-surfer": "s-surfer", + "s-taskwarrior-web": "s-taskwarrior-web", + "secrets": "secrets_26" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LBw8FCxHXW6b1WFvsEnmLmNpZjow6+N4Q+3zAfcudIU=", + "path": "./flakes", + "type": "path" + }, + "original": { + "path": "./flakes", + "type": "path" + } + }, + "grocy": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "grocy_2": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "impermanence": { + "locked": { + "lastModified": 1684264534, + "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=", + "owner": "nix-community", + "repo": "impermanence", + "rev": "89253fb1518063556edd5e54509c30ac3089d5e6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "impermanence", + "type": "github" + } + }, + "landing-page": { + "flake": false, + "locked": { + "lastModified": 1691524124, + "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=", + "ref": "main", + "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf", + "revCount": 573, + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + }, + "original": { + "ref": "main", + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + } + }, + "loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "loginctl-linger_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "loginctl-linger_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "mail-relay": { + "inputs": { + "environment": "environment_3", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "mail-relay_2": { + "inputs": { + "environment": "environment_20", + "secrets": "secrets_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "mastodon": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mastodon_2": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mediagoblin": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "mediagoblin_2": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "milters": { + "inputs": { + "environment": "environment_4", + "files-watcher": "files-watcher", + "openarc": "openarc", + "opendmarc": "opendmarc", + "secrets": "secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_5", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib_2", + "secrets": "secrets_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_2": { + "inputs": { + "environment": "environment_9", + "naemon": "naemon_2", + "nixpkgs-lib": "nixpkgs-lib_5", + "secrets": "secrets_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_3": { + "inputs": { + "environment": "environment_21", + "naemon": "naemon_4", + "nixpkgs-lib": "nixpkgs-lib_15", + "secrets": "secrets_16" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_4": { + "inputs": { + "environment": "environment_24", + "naemon": "naemon_5", + "nixpkgs-lib": "nixpkgs-lib_18", + "secrets": "secrets_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_11", + "myuids": "myuids_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts_2", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_2": { + "inputs": { + "colmena": "colmena_2", + "disko": "disko_2", + "flake-parts": "flake-parts_4", + "nixos-anywhere": "nixos-anywhere_2", + "nixpkgs": "nixpkgs_16" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_3": { + "inputs": { + "colmena": "colmena_3", + "disko": "disko_3", + "flake-parts": "flake-parts_6", + "nixos-anywhere": "nixos-anywhere_3", + "nixpkgs": "nixpkgs_23" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_4": { + "inputs": { + "colmena": "colmena_4", + "disko": "disko_4", + "flake-parts": "flake-parts_12", + "nixos-anywhere": "nixos-anywhere_4", + "nixpkgs": "nixpkgs_54" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_5": { + "inputs": { + "colmena": "colmena_5", + "disko": "disko_5", + "flake-parts": "flake-parts_14", + "nixos-anywhere": "nixos-anywhere_5", + "nixpkgs": "nixpkgs_62" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_6": { + "inputs": { + "colmena": "colmena_6", + "disko": "disko_6", + "flake-parts": "flake-parts_16", + "nixos-anywhere": "nixos-anywhere_6", + "nixpkgs": "nixpkgs_70" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_3", + "nixpkgs": "nixpkgs_12", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_10": { + "inputs": { + "flake-parts": "flake-parts_18", + "nixpkgs": "nixpkgs_77", + "webapps-ttrss": "webapps-ttrss_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_11": { + "inputs": { + "flake-parts": "flake-parts_19", + "nixpkgs": "nixpkgs_79", + "webapps-ttrss": "webapps-ttrss_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_12": { + "inputs": { + "flake-parts": "flake-parts_22", + "nixpkgs": "nixpkgs_102", + "webapps-ttrss": "webapps-ttrss_14" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_13": { + "inputs": { + "flake-parts": "flake-parts_23", + "nixpkgs": "nixpkgs_103", + "webapps-ttrss": "webapps-ttrss_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_2": { + "inputs": { + "flake-parts": "flake-parts_5", + "nixpkgs": "nixpkgs_19", + "webapps-ttrss": "webapps-ttrss_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_3": { + "inputs": { + "flake-parts": "flake-parts_7", + "nixpkgs": "nixpkgs_35", + "webapps-ttrss": "webapps-ttrss_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_4": { + "inputs": { + "flake-parts": "flake-parts_8", + "nixpkgs": "nixpkgs_38", + "webapps-ttrss": "webapps-ttrss_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_5": { + "inputs": { + "flake-parts": "flake-parts_9", + "nixpkgs": "nixpkgs_40", + "webapps-ttrss": "webapps-ttrss_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_6": { + "inputs": { + "flake-parts": "flake-parts_11", + "nixpkgs": "nixpkgs_48", + "webapps-ttrss": "webapps-ttrss_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_7": { + "inputs": { + "flake-parts": "flake-parts_13", + "nixpkgs": "nixpkgs_58", + "webapps-ttrss": "webapps-ttrss_8" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_8": { + "inputs": { + "flake-parts": "flake-parts_15", + "nixpkgs": "nixpkgs_66", + "webapps-ttrss": "webapps-ttrss_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_9": { + "inputs": { + "flake-parts": "flake-parts_17", + "nixpkgs": "nixpkgs_73", + "webapps-ttrss": "webapps-ttrss_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_27": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_28": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_29": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_30": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_31": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_32": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_33": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_34": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_35": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_36": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_37": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_38": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_39": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_40": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_41": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_42": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "n-backup-2": { + "inputs": { + "chatons": "chatons", + "environment": "environment_2", + "loginctl-linger": "loginctl-linger", + "mail-relay": "mail-relay", + "milters": "milters", + "monitoring": "monitoring", + "my-lib": "my-lib", + "myuids": "myuids_3", + "nixpkgs": "nixpkgs_8", + "openarc": "openarc_3", + "opendmarc": "opendmarc_2", + "openldap": "openldap", + "rsync_backup": "rsync_backup", + "secrets": "secrets_6", + "system": "system" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0CPGGyOWQadU9c8y+A4XtveOrmkMlFiH+WJ55RPzJnE=", + "path": "../systems/backup-2", + "type": "path" + }, + "original": { + "path": "../systems/backup-2", + "type": "path" + } + }, + "n-dilion": { + "inputs": { + "environment": "environment_8", + "files-watcher": "files-watcher_4", + "loginctl-linger": "loginctl-linger_2", + "monitoring": "monitoring_2", + "my-lib": "my-lib_2", + "myuids": "myuids_7", + "nixpkgs": "nixpkgs_17", + "secrets": "secrets_8", + "ssh": "ssh", + "system": "system_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Ctp8QY0OkGwv/YkOlipwM1ldEz7OebVDbAqg1O/tRe8=", + "path": "../systems/dilion", + "type": "path" + }, + "original": { + "path": "../systems/dilion", + "type": "path" + } + }, + "n-eldiron": { + "inputs": { + "dns-nix": "dns-nix", + "my-lib": "my-lib_3", + "nixpkgs": "nixpkgs_24", + "private-buildbot": "private-buildbot", + "private-chatons": "private-chatons", + "private-environment": "private-environment", + "private-milters": "private-milters", + "private-monitoring": "private-monitoring", + "private-openarc": "private-openarc", + "private-opendmarc": "private-opendmarc", + "private-openldap": "private-openldap", + "private-paste": "private-paste", + "private-peertube": "private-peertube", + "private-php": "private-php", + "private-ssh": "private-ssh", + "private-system": "private-system", + "public-copanier": "public-copanier", + "public-diaspora": "public-diaspora", + "public-etherpad-lite": "public-etherpad-lite", + "public-fiche": "public-fiche", + "public-files-watcher": "public-files-watcher", + "public-grocy": "public-grocy", + "public-loginctl-linger": "public-loginctl-linger", + "public-mastodon": "public-mastodon", + "public-mediagoblin": "public-mediagoblin", + "public-multi-apache-container": "public-multi-apache-container", + "public-mypackages": "public-mypackages", + "public-myuids": "public-myuids", + "public-openarc": "public-openarc", + "public-opendmarc": "public-opendmarc", + "public-peertube": "public-peertube", + "public-secrets": "public-secrets", + "public-surfer": "public-surfer", + "public-taskwarrior-web": "public-taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-g9f3SCavl9ssNr8Xw9Z8KkpeEwCYv+47dqwoIPneMSs=", + "path": "../systems/eldiron", + "type": "path" + }, + "original": { + "path": "../systems/eldiron", + "type": "path" + } + }, + "n-monitoring-1": { + "inputs": { + "chatons": "chatons_2", + "environment": "environment_19", + "files-watcher": "files-watcher_9", + "loginctl-linger": "loginctl-linger_3", + "mail-relay": "mail-relay_2", + "monitoring": "monitoring_3", + "my-lib": "my-lib_4", + "myuids": "myuids_23", + "nixpkgs": "nixpkgs_55", + "php": "php", + "secrets": "secrets_17", + "system": "system_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-kLIVhZAxEWcN3W1AaF/gmopYuRdq0U43jkA4hliY50I=", + "path": "../systems/monitoring-1", + "type": "path" + }, + "original": { + "path": "../systems/monitoring-1", + "type": "path" + } + }, + "n-quatresaisons": { + "inputs": { + "environment": "environment_23", + "files-watcher": "files-watcher_10", + "landing-page": "landing-page", + "monitoring": "monitoring_4", + "multi-apache-container": "multi-apache-container", + "my-lib": "my-lib_5", + "myuids": "myuids_26", + "nixpkgs": "nixpkgs_63", + "php": "php_2", + "secrets": "secrets_19", + "system": "system_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-FtjFgqcSXs0dTkbUggbPwaDeCoOoYZragHCUkcyq538=", + "path": "../systems/quatresaisons", + "type": "path" + }, + "original": { + "path": "../systems/quatresaisons", + "type": "path" + } + }, + "n-zoldene": { + "inputs": { + "impermanence": "impermanence", + "my-lib": "my-lib_6", + "nixpkgs": "nixpkgs_71", + "private-environment": "private-environment_2", + "private-system": "private-system_2", + "public-secrets": "public-secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-YSYLjETf7yMwdHeEisU1V7e5O3yB+YxVoIPLi00PCdo=", + "path": "../systems/zoldene", + "type": "path" + }, + "original": { + "path": "../systems/zoldene", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_2": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_3": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_4": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_5": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_6": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_7": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "flakes", + "n-backup-2", + "my-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "n-backup-2", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_6", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_2": { + "inputs": { + "disko": [ + "flakes", + "n-dilion", + "my-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "n-dilion", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_2", + "nixos-images": "nixos-images_2", + "nixpkgs": "nixpkgs_15", + "treefmt-nix": "treefmt-nix_2" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_3": { + "inputs": { + "disko": [ + "flakes", + "n-eldiron", + "my-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "n-eldiron", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_3", + "nixos-images": "nixos-images_3", + "nixpkgs": "nixpkgs_22", + "treefmt-nix": "treefmt-nix_3" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_4": { + "inputs": { + "disko": [ + "flakes", + "n-monitoring-1", + "my-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "n-monitoring-1", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_4", + "nixos-images": "nixos-images_4", + "nixpkgs": "nixpkgs_53", + "treefmt-nix": "treefmt-nix_4" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_5": { + "inputs": { + "disko": [ + "flakes", + "n-quatresaisons", + "my-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "n-quatresaisons", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_5", + "nixos-images": "nixos-images_5", + "nixpkgs": "nixpkgs_61", + "treefmt-nix": "treefmt-nix_5" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_6": { + "inputs": { + "disko": [ + "flakes", + "n-zoldene", + "my-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "n-zoldene", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_6", + "nixos-images": "nixos-images_6", + "nixpkgs": "nixpkgs_69", + "treefmt-nix": "treefmt-nix_6" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_7": { + "inputs": { + "disko": [ + "flakes", + "s-lib", + "disko" + ], + "flake-parts": [ + "flakes", + "s-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_7", + "nixos-images": "nixos-images_7", + "nixpkgs": "nixpkgs_83", + "treefmt-nix": "treefmt-nix_7" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "flakes", + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_2": { + "inputs": { + "nixos-2305": [ + "flakes", + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_3": { + "inputs": { + "nixos-2305": [ + "flakes", + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_4": { + "inputs": { + "nixos-2305": [ + "flakes", + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_5": { + "inputs": { + "nixos-2305": [ + "flakes", + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_6": { + "inputs": { + "nixos-2305": [ + "flakes", + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_7": { + "inputs": { + "nixos-2305": [ + "flakes", + "s-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "flakes", + "s-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1677383253, + "narHash": "sha256-UfpzWfSxkfXHnb4boXZNaKsAcUrZT9Hw+tao1oZxd08=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "9952d6bc395f5841262b006fbace8dd7e143b634", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_2": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_3": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_10": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_11": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_12": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_13": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_14": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_15": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_16": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_17": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_18": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_19": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_20": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_21": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_22": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_23": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_24": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_25": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_26": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_27": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_28": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_29": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_4": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_5": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_6": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_7": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_8": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_9": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_100": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_101": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_102": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_103": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_104": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_105": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_106": { + "locked": { + "lastModified": 1692447944, + "narHash": "sha256-fkJGNjEmTPvqBs215EQU4r9ivecV5Qge5cF/QDLVn3U=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "d680ded26da5cf104dd2735a51e88d2d8f487b4d", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_12": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_13": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_14": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_15": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_16": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_17": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_18": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_19": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_20": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_21": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_22": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_23": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_24": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_25": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_26": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_27": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_28": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_29": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_30": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_31": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_32": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_33": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_34": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_35": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_36": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_37": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_38": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_39": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_40": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_41": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_42": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_43": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_44": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_45": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_46": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_47": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_48": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_49": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_50": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_51": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_52": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_53": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_54": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_55": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_56": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_57": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_58": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_59": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_60": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_61": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_62": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_63": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_64": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_65": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_66": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_67": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_68": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_69": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_70": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_71": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_72": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_73": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_74": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_75": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_76": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_77": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_78": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_79": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_80": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_81": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_82": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_83": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_84": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_85": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_86": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_87": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_88": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_89": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_90": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_91": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_92": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_93": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_94": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_95": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_96": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_97": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_98": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_99": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "openarc": { + "inputs": { + "flake-utils": "flake-utils", + "myuids": "myuids", + "nixpkgs": "nixpkgs_2", + "openarc": "openarc_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_10": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_11": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_12": { + "inputs": { + "flake-utils": "flake-utils_53", + "myuids": "myuids_36", + "nixpkgs": "nixpkgs_93", + "openarc": "openarc_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_13": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_14": { + "inputs": { + "flake-utils": "flake-utils_55", + "myuids": "myuids_38", + "nixpkgs": "nixpkgs_95", + "openarc": "openarc_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_15": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_2": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_3": { + "inputs": { + "files-watcher": "files-watcher_2", + "openarc": "openarc_4", + "secrets": "secrets_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "openarc_4": { + "inputs": { + "flake-utils": "flake-utils_4", + "myuids": "myuids_4", + "nixpkgs": "nixpkgs_9", + "openarc": "openarc_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_5": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_6": { + "inputs": { + "flake-utils": "flake-utils_12", + "myuids": "myuids_9", + "nixpkgs": "nixpkgs_26", + "openarc": "openarc_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_7": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_8": { + "inputs": { + "flake-utils": "flake-utils_14", + "myuids": "myuids_11", + "nixpkgs": "nixpkgs_28", + "openarc": "openarc_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_9": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "opendmarc": { + "inputs": { + "flake-utils": "flake-utils_2", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_2": { + "inputs": { + "environment": "environment_6", + "files-watcher": "files-watcher_3", + "opendmarc": "opendmarc_3", + "secrets": "secrets_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "opendmarc_3": { + "inputs": { + "flake-utils": "flake-utils_5", + "myuids": "myuids_5", + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_4": { + "inputs": { + "flake-utils": "flake-utils_13", + "myuids": "myuids_10", + "nixpkgs": "nixpkgs_27" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_5": { + "inputs": { + "flake-utils": "flake-utils_15", + "myuids": "myuids_12", + "nixpkgs": "nixpkgs_29" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_6": { + "inputs": { + "flake-utils": "flake-utils_54", + "myuids": "myuids_37", + "nixpkgs": "nixpkgs_94" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_7": { + "inputs": { + "flake-utils": "flake-utils_56", + "myuids": "myuids_39", + "nixpkgs": "nixpkgs_96" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "paste": { + "inputs": { + "flake-utils": "flake-utils_16", + "nixpkgs": "nixpkgs_30" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "paste_2": { + "inputs": { + "flake-utils": "flake-utils_57", + "nixpkgs": "nixpkgs_97" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "peertube": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_2": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_3": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_4": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_5": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_6": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_open_instance": { + "inputs": { + "flake-utils": "flake-utils_17", + "myuids": "myuids_13", + "nixpkgs": "nixpkgs_31", + "peertube": "peertube" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_open_instance_2": { + "inputs": { + "flake-utils": "flake-utils_58", + "myuids": "myuids_40", + "nixpkgs": "nixpkgs_98", + "peertube": "peertube_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin": { + "inputs": { + "flake-utils": "flake-utils_18", + "myuids": "myuids_14", + "nixpkgs": "nixpkgs_32", + "peertube": "peertube_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin_2": { + "inputs": { + "flake-utils": "flake-utils_59", + "myuids": "myuids_41", + "nixpkgs": "nixpkgs_99", + "peertube": "peertube_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "php": { + "inputs": { + "flake-utils": "flake-utils_33", + "nixpkgs": "nixpkgs_56", + "nixpkgs-4": "nixpkgs-4_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "php_2": { + "inputs": { + "flake-utils": "flake-utils_36", + "nixpkgs": "nixpkgs_64", + "nixpkgs-4": "nixpkgs-4_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-buildbot": { + "inputs": { + "buildslist": "buildslist", + "flake-utils": "flake-utils_11", + "nixpkgs": "nixpkgs_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "../../flakes/private/buildbot", + "type": "path" + }, + "original": { + "path": "../../flakes/private/buildbot", + "type": "path" + } + }, + "private-chatons": { + "inputs": { + "environment": "environment_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-milters": { + "inputs": { + "environment": "environment_13", + "files-watcher": "files-watcher_5", + "openarc": "openarc_6", + "opendmarc": "opendmarc_4", + "secrets": "secrets_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "private-monitoring": { + "inputs": { + "environment": "environment_14", + "naemon": "naemon_3", + "nixpkgs-lib": "nixpkgs-lib_9", + "secrets": "secrets_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "private-openarc": { + "inputs": { + "files-watcher": "files-watcher_6", + "openarc": "openarc_8", + "secrets": "secrets_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "private-opendmarc": { + "inputs": { + "environment": "environment_15", + "files-watcher": "files-watcher_7", + "opendmarc": "opendmarc_5", + "secrets": "secrets_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "private-paste": { + "inputs": { + "paste": "paste" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "../../flakes/private/paste", + "type": "path" + }, + "original": { + "path": "../../flakes/private/paste", + "type": "path" + } + }, + "private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance", + "peertube_origin": "peertube_origin" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "../../flakes/private/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/private/peertube", + "type": "path" + } + }, + "private-php": { + "inputs": { + "flake-utils": "flake-utils_19", + "nixpkgs": "nixpkgs_33", + "nixpkgs-4": "nixpkgs-4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-ssh": { + "inputs": { + "environment": "environment_16", + "secrets": "secrets_14" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "private-system": { + "inputs": { + "backports": "backports_3", + "environment": "environment_17", + "mypackages": "mypackages_3", + "myuids": "myuids_15", + "secrets-public": "secrets-public_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "private-system_2": { + "inputs": { + "backports": "backports_6", + "environment": "environment_26", + "mypackages": "mypackages_9", + "myuids": "myuids_28", + "secrets-public": "secrets-public_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "public-copanier": { + "inputs": { + "copanier": "copanier", + "flake-utils": "flake-utils_21", + "nixpkgs": "nixpkgs_36" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "../../flakes/copanier", + "type": "path" + }, + "original": { + "path": "../../flakes/copanier", + "type": "path" + } + }, + "public-diaspora": { + "inputs": { + "diaspora": "diaspora", + "flake-utils": "flake-utils_22", + "myuids": "myuids_16", + "nixpkgs": "nixpkgs_37" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "../../flakes/diaspora", + "type": "path" + }, + "original": { + "path": "../../flakes/diaspora", + "type": "path" + } + }, + "public-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite", + "flake-utils": "flake-utils_23", + "mypackages": "mypackages_4", + "nixpkgs": "nixpkgs_39" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "../../flakes/etherpad-lite", + "type": "path" + }, + "original": { + "path": "../../flakes/etherpad-lite", + "type": "path" + } + }, + "public-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "../../flakes/fiche", + "type": "path" + }, + "original": { + "path": "../../flakes/fiche", + "type": "path" + } + }, + "public-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "public-grocy": { + "inputs": { + "flake-utils": "flake-utils_24", + "grocy": "grocy", + "mypackages": "mypackages_5", + "nixpkgs": "nixpkgs_41" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "../../flakes/grocy", + "type": "path" + }, + "original": { + "path": "../../flakes/grocy", + "type": "path" + } + }, + "public-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "public-mastodon": { + "inputs": { + "flake-utils": "flake-utils_25", + "mastodon": "mastodon", + "myuids": "myuids_17", + "nixpkgs": "nixpkgs_42" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "../../flakes/mastodon", + "type": "path" + }, + "original": { + "path": "../../flakes/mastodon", + "type": "path" + } + }, + "public-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_26", + "mediagoblin": "mediagoblin", + "myuids": "myuids_18", + "nixpkgs": "nixpkgs_43" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "../../flakes/mediagoblin", + "type": "path" + }, + "original": { + "path": "../../flakes/mediagoblin", + "type": "path" + } + }, + "public-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_8", + "myuids": "myuids_19" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "public-mypackages": { + "inputs": { + "flake-parts": "flake-parts_10", + "nixpkgs": "nixpkgs_44", + "webapps-ttrss": "webapps-ttrss_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../flakes/mypackages", + "type": "path" + }, + "original": { + "path": "../../flakes/mypackages", + "type": "path" + } + }, + "public-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "public-openarc": { + "inputs": { + "flake-utils": "flake-utils_27", + "myuids": "myuids_20", + "nixpkgs": "nixpkgs_45", + "openarc": "openarc_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../flakes/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/openarc", + "type": "path" + } + }, + "public-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_28", + "myuids": "myuids_21", + "nixpkgs": "nixpkgs_46" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../flakes/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/opendmarc", + "type": "path" + } + }, + "public-peertube": { + "inputs": { + "flake-utils": "flake-utils_29", + "myuids": "myuids_22", + "nixpkgs": "nixpkgs_47", + "peertube": "peertube_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "../../flakes/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/peertube", + "type": "path" + } + }, + "public-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-surfer": { + "inputs": { + "flake-utils": "flake-utils_30", + "mypackages": "mypackages_6", + "nixpkgs": "nixpkgs_49", + "surfer": "surfer" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "../../flakes/surfer", + "type": "path" + }, + "original": { + "path": "../../flakes/surfer", + "type": "path" + } + }, + "public-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_31", + "nixpkgs": "nixpkgs_50", + "taskwarrior-web": "taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "../../flakes/taskwarrior-web", + "type": "path" + }, + "original": { + "path": "../../flakes/taskwarrior-web", + "type": "path" + } + }, + "root": { + "inputs": { + "devshell": "devshell", + "flake-parts": "flake-parts", + "flakes": "flakes", + "nixpkgs": "nixpkgs_106" + } + }, + "rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "../../flakes/rsync_backup", + "type": "path" + }, + "original": { + "path": "../../flakes/rsync_backup", + "type": "path" + } + }, + "s-backports": { + "inputs": { + "flake-utils": "flake-utils_40", + "nixpkgs": "nixpkgs_74" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "./backports", + "type": "path" + }, + "original": { + "path": "./backports", + "type": "path" + } + }, + "s-copanier": { + "inputs": { + "copanier": "copanier_2", + "flake-utils": "flake-utils_41", + "nixpkgs": "nixpkgs_75" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "./copanier", + "type": "path" + }, + "original": { + "path": "./copanier", + "type": "path" + } + }, + "s-diaspora": { + "inputs": { + "diaspora": "diaspora_2", + "flake-utils": "flake-utils_42", + "myuids": "myuids_29", + "nixpkgs": "nixpkgs_76" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "./diaspora", + "type": "path" + }, + "original": { + "path": "./diaspora", + "type": "path" + } + }, + "s-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite_2", + "flake-utils": "flake-utils_43", + "mypackages": "mypackages_10", + "nixpkgs": "nixpkgs_78" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "./etherpad-lite", + "type": "path" + }, + "original": { + "path": "./etherpad-lite", + "type": "path" + } + }, + "s-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "./fiche", + "type": "path" + }, + "original": { + "path": "./fiche", + "type": "path" + } + }, + "s-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "./files-watcher", + "type": "path" + }, + "original": { + "path": "./files-watcher", + "type": "path" + } + }, + "s-grocy": { + "inputs": { + "flake-utils": "flake-utils_44", + "grocy": "grocy_2", + "mypackages": "mypackages_11", + "nixpkgs": "nixpkgs_80" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "./grocy", + "type": "path" + }, + "original": { + "path": "./grocy", + "type": "path" + } + }, + "s-lib": { + "inputs": { + "colmena": "colmena_7", + "disko": "disko_7", + "flake-parts": "flake-parts_20", + "nixos-anywhere": "nixos-anywhere_7", + "nixpkgs": "nixpkgs_84" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "./lib", + "type": "path" + }, + "original": { + "path": "./lib", + "type": "path" + } + }, + "s-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "./loginctl-linger", + "type": "path" + }, + "original": { + "path": "./loginctl-linger", + "type": "path" + } + }, + "s-mastodon": { + "inputs": { + "flake-utils": "flake-utils_46", + "mastodon": "mastodon_2", + "myuids": "myuids_30", + "nixpkgs": "nixpkgs_85" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "./mastodon", + "type": "path" + }, + "original": { + "path": "./mastodon", + "type": "path" + } + }, + "s-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_47", + "mediagoblin": "mediagoblin_2", + "myuids": "myuids_31", + "nixpkgs": "nixpkgs_86" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "./mediagoblin", + "type": "path" + }, + "original": { + "path": "./mediagoblin", + "type": "path" + } + }, + "s-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_12", + "myuids": "myuids_32" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "./multi-apache-container", + "type": "path" + }, + "original": { + "path": "./multi-apache-container", + "type": "path" + } + }, + "s-mypackages": { + "inputs": { + "flake-parts": "flake-parts_21", + "nixpkgs": "nixpkgs_87", + "webapps-ttrss": "webapps-ttrss_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "./mypackages", + "type": "path" + }, + "original": { + "path": "./mypackages", + "type": "path" + } + }, + "s-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "./myuids", + "type": "path" + }, + "original": { + "path": "./myuids", + "type": "path" + } + }, + "s-naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "./naemon", + "type": "path" + }, + "original": { + "path": "./naemon", + "type": "path" + } + }, + "s-openarc": { + "inputs": { + "flake-utils": "flake-utils_48", + "myuids": "myuids_33", + "nixpkgs": "nixpkgs_88", + "openarc": "openarc_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "./openarc", + "type": "path" + }, + "original": { + "path": "./openarc", + "type": "path" + } + }, + "s-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_49", + "myuids": "myuids_34", + "nixpkgs": "nixpkgs_89" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "./opendmarc", + "type": "path" + }, + "original": { + "path": "./opendmarc", + "type": "path" + } + }, + "s-paste": { + "inputs": { + "flake-utils": "flake-utils_50", + "nixpkgs": "nixpkgs_90" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "./paste", + "type": "path" + }, + "original": { + "path": "./paste", + "type": "path" + } + }, + "s-peertube": { + "inputs": { + "flake-utils": "flake-utils_51", + "myuids": "myuids_35", + "nixpkgs": "nixpkgs_91", + "peertube": "peertube_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./peertube", + "type": "path" + }, + "original": { + "path": "./peertube", + "type": "path" + } + }, + "s-private-buildbot": { + "inputs": { + "buildslist": "buildslist_2", + "flake-utils": "flake-utils_52", + "nixpkgs": "nixpkgs_92" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "./private/buildbot", + "type": "path" + }, + "original": { + "path": "./private/buildbot", + "type": "path" + } + }, + "s-private-chatons": { + "inputs": { + "environment": "environment_27" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "./private/chatons", + "type": "path" + }, + "original": { + "path": "./private/chatons", + "type": "path" + } + }, + "s-private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "./private/environment", + "type": "path" + }, + "original": { + "path": "./private/environment", + "type": "path" + } + }, + "s-private-mail-relay": { + "inputs": { + "environment": "environment_28", + "secrets": "secrets_20" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "./private/mail-relay", + "type": "path" + }, + "original": { + "path": "./private/mail-relay", + "type": "path" + } + }, + "s-private-milters": { + "inputs": { + "environment": "environment_29", + "files-watcher": "files-watcher_13", + "openarc": "openarc_12", + "opendmarc": "opendmarc_6", + "secrets": "secrets_21" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "./private/milters", + "type": "path" + }, + "original": { + "path": "./private/milters", + "type": "path" + } + }, + "s-private-monitoring": { + "inputs": { + "environment": "environment_30", + "naemon": "naemon_6", + "nixpkgs-lib": "nixpkgs-lib_27", + "secrets": "secrets_22" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "./private/monitoring", + "type": "path" + }, + "original": { + "path": "./private/monitoring", + "type": "path" + } + }, + "s-private-openarc": { + "inputs": { + "files-watcher": "files-watcher_14", + "openarc": "openarc_14", + "secrets": "secrets_23" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "./private/openarc", + "type": "path" + }, + "original": { + "path": "./private/openarc", + "type": "path" + } + }, + "s-private-opendmarc": { + "inputs": { + "environment": "environment_31", + "files-watcher": "files-watcher_15", + "opendmarc": "opendmarc_7", + "secrets": "secrets_24" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "./private/opendmarc", + "type": "path" + }, + "original": { + "path": "./private/opendmarc", + "type": "path" + } + }, + "s-private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "./private/openldap", + "type": "path" + }, + "original": { + "path": "./private/openldap", + "type": "path" + } + }, + "s-private-paste": { + "inputs": { + "paste": "paste_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "./private/paste", + "type": "path" + }, + "original": { + "path": "./private/paste", + "type": "path" + } + }, + "s-private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance_2", + "peertube_origin": "peertube_origin_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "./private/peertube", + "type": "path" + }, + "original": { + "path": "./private/peertube", + "type": "path" + } + }, + "s-private-php": { + "inputs": { + "flake-utils": "flake-utils_60", + "nixpkgs": "nixpkgs_100", + "nixpkgs-4": "nixpkgs-4_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "./private/php", + "type": "path" + }, + "original": { + "path": "./private/php", + "type": "path" + } + }, + "s-private-ssh": { + "inputs": { + "environment": "environment_32", + "secrets": "secrets_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "./private/ssh", + "type": "path" + }, + "original": { + "path": "./private/ssh", + "type": "path" + } + }, + "s-private-system": { + "inputs": { + "backports": "backports_7", + "environment": "environment_33", + "mypackages": "mypackages_12", + "myuids": "myuids_42", + "secrets-public": "secrets-public_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "./private/system", + "type": "path" + }, + "original": { + "path": "./private/system", + "type": "path" + } + }, + "s-rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "./rsync_backup", + "type": "path" + }, + "original": { + "path": "./rsync_backup", + "type": "path" + } + }, + "s-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "./secrets", + "type": "path" + }, + "original": { + "path": "./secrets", + "type": "path" + } + }, + "s-surfer": { + "inputs": { + "flake-utils": "flake-utils_62", + "mypackages": "mypackages_13", + "nixpkgs": "nixpkgs_104", + "surfer": "surfer_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "./surfer", + "type": "path" + }, + "original": { + "path": "./surfer", + "type": "path" + } + }, + "s-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_63", + "nixpkgs": "nixpkgs_105", + "taskwarrior-web": "taskwarrior-web_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "./taskwarrior-web", + "type": "path" + }, + "original": { + "path": "./taskwarrior-web", + "type": "path" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-yvhc2jxW1AQVmtrKPoYPr5DgpXKt/ua+ATuxvE3iY6c=", + "path": "./private/environment-dummy", + "type": "path" + }, + "original": { + "path": "./private/environment-dummy", + "type": "path" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "ssh": { + "inputs": { + "environment": "environment_10", + "secrets": "secrets_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_2": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_3": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_4": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_5": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_6": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_7": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "surfer": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "surfer_2": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_7", + "mypackages": "mypackages", + "myuids": "myuids_6", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_2": { + "inputs": { + "backports": "backports_2", + "environment": "environment_11", + "mypackages": "mypackages_2", + "myuids": "myuids_8", + "secrets-public": "secrets-public_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_3": { + "inputs": { + "backports": "backports_4", + "environment": "environment_22", + "mypackages": "mypackages_7", + "myuids": "myuids_24", + "secrets-public": "secrets-public_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_4": { + "inputs": { + "backports": "backports_5", + "environment": "environment_25", + "mypackages": "mypackages_8", + "myuids": "myuids_27", + "secrets-public": "secrets-public_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "taskwarrior-web": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "taskwarrior-web_2": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "flakes", + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_2": { + "inputs": { + "nixpkgs": [ + "flakes", + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_3": { + "inputs": { + "nixpkgs": [ + "flakes", + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_4": { + "inputs": { + "nixpkgs": [ + "flakes", + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_5": { + "inputs": { + "nixpkgs": [ + "flakes", + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_6": { + "inputs": { + "nixpkgs": [ + "flakes", + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_7": { + "inputs": { + "nixpkgs": [ + "flakes", + "s-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_10": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_11": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_12": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_13": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_14": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_15": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_2": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_3": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_4": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_5": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_6": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_7": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_8": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_9": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..e3ed4c9 --- /dev/null +++ b/flake.nix @@ -0,0 +1,47 @@ +{ + description = "immae-eu infrastructure"; + inputs = { + flake-parts.url = "github:hercules-ci/flake-parts"; + devshell.url = "github:numtide/devshell"; + # nixpkgs for local tools + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + flakes.url = "path:./flakes"; + }; + outputs = inputs@{ self, flake-parts, flakes, ... }: + let + inherit (flakes.subflakes) public private; + inherit (public) mypackages; + in + flake-parts.lib.mkFlake { inherit inputs; } ({ withSystem, ... }: { + imports = [ + inputs.devshell.flakeModule + (mypackages.mylibs.flakePartsAddPerSystem { name = "lib"; type = "unspecified"; }) + ]; + systems = [ "x86_64-linux" ]; + perSystem = { config, inputs', pkgs, system, ... }: + { + packages = mypackages.packages."${system}"; + lib = mypackages.lib."${system}"; + devshells.default = { + packages = [ + pkgs.colmena + pkgs.nixUnstable pkgs.python3 pkgs.sops + pkgs.curl pkgs.shellcheck pkgs.jq + pkgs.gnumake pkgs.yq + ]; + env = [ + { name = "NIX_BUILD_TOP"; value = ""; } + { name = "PATH"; prefix = "scripts"; } + { name = "NIX_PATH"; value = "nixpkgs=${pkgs.path}"; } + ]; + }; + }; + flake = { + # FIXME: next line Can be removed in nix 2.16.* + devShell.x86_64-linux = self.devShells.x86_64-linux.default; + inherit (mypackages) mylibs sources overlays; + inherit (flakes) subflakes; + }; + }); +} diff --git a/flakes/backports/flake.lock b/flakes/backports/flake.lock index 5f9289e..8981e53 100644 --- a/flakes/backports/flake.lock +++ b/flakes/backports/flake.lock @@ -2,11 +2,11 @@ "nodes": { "flake-utils": { "locked": { - "lastModified": 1629481132, - "narHash": "sha256-JHgasjPR0/J1J3DRm4KxM4zTyAj4IOJY8vIl75v/kPI=", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", "owner": "numtide", "repo": "flake-utils", - "rev": "997f7efcb746a9c140ce1f13c72263189225f482", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { @@ -17,15 +17,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1634032472, - "narHash": "sha256-IoSg358w6nPpTYLWhvN3UgnU6r322dDPOLFXHyqyIkM=", + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3abf4b55b7c991909fde3115827d398dd7c5a299", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", "type": "github" }, "original": { "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flakes/backports/flake.nix b/flakes/backports/flake.nix index 8be885f..796664a 100644 --- a/flakes/backports/flake.nix +++ b/flakes/backports/flake.nix @@ -1,62 +1,19 @@ { description = "Backported packages"; - inputs.nixpkgs.url = "github:NixOS/nixpkgs"; + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; inputs.flake-utils.url = "github:numtide/flake-utils"; outputs = { self, flake-utils, nixpkgs }: flake-utils.lib.eachDefaultSystem (system: let - pkgs = import nixpkgs { inherit system; overlays = []; }; + pkgs = import nixpkgs { inherit system; overlays = []; config = {}; }; in rec { packages = { - apprise = pkgs.apprise; - bitlbee-mastodon = pkgs.bitlbee-mastodon; - cointop = pkgs.cointop; - cryptpad = pkgs.cryptpad; - dovecot_fts-xapian = pkgs.dovecot_fts_xapian; - duply = pkgs.duply; - fiche = pkgs.fiche; - influxdb2 = pkgs.influxdb2; - ldapvi = pkgs.ldapvi; - lego = pkgs.lego; - mpd = pkgs.mpd; - mpd-small = pkgs.mpd-small; - opensmtpd = pkgs.opensmtpd; - pass = pkgs.pass; - pg_activity = pkgs.pg_activity; - signald = pkgs.signald; - ssh-to-age = pkgs.ssh-to-age; - stgit = pkgs.stgit; - sops = pkgs.sops; - sudo = pkgs.sudo; - telegram-cli = pkgs.telegram-cli; - woob = pkgs.python3Packages.woob; - zrepl = pkgs.zrepl; + ntfy-sh = pkgs.ntfy-sh; }; legacyPackages = packages; apps = { - apprise = flake-utils.lib.mkApp { drv = packages.apprise; name = "apprise"; }; - cointop = flake-utils.lib.mkApp { drv = packages.cointop; name = "cointop"; }; - cryptpad = flake-utils.lib.mkApp { drv = packages.cryptpad; name = "cryptpad"; }; - duply = flake-utils.lib.mkApp { drv = packages.duply; name = "duply"; }; - fiche = flake-utils.lib.mkApp { drv = packages.fiche; name = "fiche"; }; - influxd = flake-utils.lib.mkApp { drv = packages.influxdb2; name = "influxd"; }; - influx = flake-utils.lib.mkApp { drv = packages.influxdb2; name = "influx"; }; - ldapvi = flake-utils.lib.mkApp { drv = packages.ldapvi; name = "ldapvi"; }; - lego = flake-utils.lib.mkApp { drv = packages.lego; name = "lego"; }; - mpd = flake-utils.lib.mkApp { drv = packages.mpd; name = "mpd"; }; - mpd-small = flake-utils.lib.mkApp { drv = packages.mpd-small; name = "mpd"; }; - opensmtpd = flake-utils.lib.mkApp { drv = packages.opensmtpd; name = "opensmtpd"; }; - pass = flake-utils.lib.mkApp { drv = packages.pass; name = "pass"; }; - pg_activity = flake-utils.lib.mkApp { drv = packages.pg_activity; name = "pg_activity"; }; - signald = flake-utils.lib.mkApp { drv = packages.signald; name = "signald"; }; - ssh-to-age = flake-utils.lib.mkApp { drv = packages.ssh-to-age; name = "ssh-to-age"; }; - stgit = flake-utils.lib.mkApp { drv = packages.stgit; name = "stgit"; }; - sops = flake-utils.lib.mkApp { drv = packages.sops; name = "sops"; }; - sudo = flake-utils.lib.mkApp { drv = packages.sudo; name = "sudo"; }; - telegram-cli = flake-utils.lib.mkApp { drv = packages.telegram-cli; name = "telegram-cli"; }; - woob = flake-utils.lib.mkApp { drv = packages.woob; name = "woob"; }; - zrepl = flake-utils.lib.mkApp { drv = packages.zrepl; name = "zrepl"; }; + ntfy-sh = flake-utils.lib.mkApp { drv = packages.ntfy-sh; name = "ntfy-sh"; }; }; } ) // rec { @@ -66,62 +23,14 @@ in package.override (pkgs.lib.genAttrs packageDeps (n: pkgs."${n}")); }; overlays = { - apprise = final: prev: { apprise = self.packages."${final.system}".apprise; }; - bitlbee-mastodon = final: prev: { - bitlbee-mastodon = lib.overrideDeps final self.packages."${final.system}".bitlbee-mastodon; - }; - cointop = final: prev: { cointop = self.packages."${final.system}".cointop; }; - cryptpad = final: prev: { cryptpad = self.packages."${final.system}".cryptpad; }; - dovecot_fts-xapian = final: prev: { - dovecot_fts-xapian = lib.overrideDeps final self.packages."${final.system}".dovecot_fts-xapian; - }; - duply = final: prev: { duply = self.packages."${final.system}".duply; }; - fiche = final: prev: { fiche = self.packages."${final.system}".fiche; }; - influxdb2 = final: prev: { influxdb2 = self.packages."${final.system}".influxdb2; }; - ldapvi = final: prev: { ldapvi = self.packages."${final.system}".ldapvi; }; - lego = final: prev: { lego = self.packages."${final.system}".lego; }; - mpd = final: prev: { mpd = self.packages."${final.system}".mpd; }; - opensmtpd = final: prev: { opensmtpd = self.packages."${final.system}".opensmtpd; }; - pass = final: prev: { pass = self.packages."${final.system}".pass; }; - pg_activity = final: prev: { pg_activity = self.packages."${final.system}".pg_activity; }; - signald = final: prev: { signald = self.packages."${final.system}".signald; }; - ssh-to-age = final: prev: { ssh-to-age = self.packages."${final.system}".ssh-to-age; }; - stgit = final: prev: { stgit = self.packages."${final.system}".stgit; }; - sops = final: prev: { sops = self.packages."${final.system}".sops; }; - sudo = final: prev: { sudo = self.packages."${final.system}".sudo; }; - telegram-cli = final: prev: { telegram-cli = self.packages."${final.system}".telegram-cli; }; - woob = final: prev: { woob = self.packages."${final.system}".woob; }; - zrepl = final: prev: { zrepl = self.packages."${final.system}".zrepl; }; + ntfy-sh = final: prev: { ntfy-sh = self.packages."${final.system}".ntfy-sh; }; }; overlay = final: prev: ({} - // overlays.apprise final prev - // overlays.bitlbee-mastodon final prev - // overlays.cointop final prev - // overlays.cryptpad final prev - // overlays.dovecot_fts-xapian final prev - // overlays.duply final prev - // overlays.fiche final prev - // overlays.influxdb2 final prev - // overlays.ldapvi final prev - // overlays.lego final prev - // overlays.mpd final prev - // overlays.opensmtpd final prev - // overlays.pass final prev - // overlays.pg_activity final prev - // overlays.signald final prev - // overlays.ssh-to-age final prev - // overlays.stgit final prev - // overlays.sops final prev - // overlays.sudo final prev - // overlays.telegram-cli final prev - // overlays.woob final prev - // overlays.zrepl final prev + // overlays.ntfy-sh final prev ); nixosModules = { - influxdb2 = import (nixpkgs + "/nixos/modules/services/databases/influxdb2.nix"); - mpd = import (nixpkgs + "/nixos/modules/services/audio/mpd.nix"); - zrepl = import (nixpkgs + "/nixos/modules/services/backup/zrepl.nix"); + #coturn = import (nixpkgs + "/nixos/modules/services/networking/coturn.nix"); }; }; } diff --git a/flakes/copanier/default.nix b/flakes/copanier/default.nix new file mode 100644 index 0000000..0486c0a --- /dev/null +++ b/flakes/copanier/default.nix @@ -0,0 +1,30 @@ +{ src, glibcLocales, poetry2nix, fetchFromGitHub, python37, fetchpatch }: +let + poetryApp = poetry2nix.mkPoetryApplication rec { + inherit src; + patches = [ ./fix_reduce.patch ]; + overrides = poetry2nix.overrides.withDefaults (self: super: { + weasyprint = super.weasyprint.overridePythonAttrs (old: { + patches = let + p0 = (fetchpatch { + url = "https://github.com/Kozea/WeasyPrint/commit/47043a1fd7e50a892b9836466f521df85d597c44.patch"; + sha256 = "18lmz6whjqxdpv4fdmg5vcpk2acdl99kfmp14badpw1jmffw7zl2"; + postFetch = '' + sed -i -e "s/font_filename/filename/" $out + ''; + }); + p1 = (builtins.elemAt old.patches 1).overrideAttrs(old: { + postInstall = '' + sed -i -e "s/so.0/so/" $out + ''; + }); + in [ p0 p1 ]; + }); + }); + pyproject = ./pyproject.toml; + poetrylock = ./poetry.lock; + python = python37; + locales = "${glibcLocales}/lib/locale/locale-archive"; + }; +in + poetryApp diff --git a/flakes/copanier/fix_reduce.patch b/flakes/copanier/fix_reduce.patch new file mode 100644 index 0000000..5390bcc --- /dev/null +++ b/flakes/copanier/fix_reduce.patch @@ -0,0 +1,13 @@ +diff --git a/copanier/views/delivery.py b/copanier/views/delivery.py +index 779d52c..1696919 100644 +--- a/copanier/views/delivery.py ++++ b/copanier/views/delivery.py +@@ -401,7 +401,7 @@ async def compute_payments(request, response, id): + balance.append((group_id, amount)) + + debiters, crediters = order_balance(balance) +- results = reduce_balance(debiters[:], crediters[:]) ++ results = reduce_balance(debiters[:], crediters[:], []) + + results_dict = defaultdict(partial(defaultdict, float)) + diff --git a/flakes/copanier/flake.lock b/flakes/copanier/flake.lock new file mode 100644 index 0000000..fe84a9d --- /dev/null +++ b/flakes/copanier/flake.lock @@ -0,0 +1,59 @@ +{ + "nodes": { + "copanier": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "copanier": "copanier", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/copanier/flake.nix b/flakes/copanier/flake.nix new file mode 100644 index 0000000..74e6829 --- /dev/null +++ b/flakes/copanier/flake.nix @@ -0,0 +1,28 @@ +{ + description = "Copanier"; + + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs.url = "github:NixOS/nixpkgs"; + inputs.copanier = { + url = "github:spiral-project/copanier"; + flake = false; + }; + + outputs = { self, copanier, flake-utils, nixpkgs }: flake-utils.lib.eachDefaultSystem (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + in rec { + packages.copanier = pkgs.callPackage ./. { src = copanier; }; + defaultPackage = packages.copanier; + legacyPackages.copanier = packages.copanier; + apps.copanier = flake-utils.lib.mkApp { drv = packages.copanier; }; + defaultApp = apps.copanier; + }) // rec { + overlays = { + copanier = final: prev: { + copanier = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.copanier; + }; + } diff --git a/flakes/copanier/poetry.lock b/flakes/copanier/poetry.lock new file mode 100644 index 0000000..232bdf3 --- /dev/null +++ b/flakes/copanier/poetry.lock @@ -0,0 +1,995 @@ +[[package]] +name = "autoroutes" +version = "0.3.5" +description = "Routes for speed" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +dev = ["cython", "pytest", "twine"] + +[[package]] +name = "biscuits" +version = "0.3.0" +description = "Fast and tasty cookies handling." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "cachetools" +version = "4.2.4" +description = "Extensible memoizing collections and decorators" +category = "main" +optional = false +python-versions = "~=3.5" + +[[package]] +name = "cairocffi" +version = "1.3.0" +description = "cffi-based cairo bindings for Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +cffi = ">=1.1.0" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"] +xcb = ["xcffib (>=0.3.2)"] + +[[package]] +name = "cairosvg" +version = "2.5.2" +description = "A Simple SVG Converter based on Cairo" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +cairocffi = "*" +cssselect2 = "*" +defusedxml = "*" +pillow = "*" +tinycss2 = "*" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"] + +[[package]] +name = "certifi" +version = "2021.10.8" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "cffi" +version = "1.14.6" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "chardet" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "charset-normalizer" +version = "2.0.6" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "cssselect" +version = "1.1.0" +description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "cssselect2" +version = "0.4.1" +description = "cssselect2" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +tinycss2 = "*" +webencodings = "*" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"] + +[[package]] +name = "cssutils" +version = "2.3.0" +description = "A CSS Cascading Style Sheets library for Python" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "mock", "lxml", "cssselect", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources"] + +[[package]] +name = "debts" +version = "0.5" +description = "Help solve debts settlement." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +jinja2 = "*" + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "emails" +version = "0.6" +description = "Modern python library for emails." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +chardet = "*" +cssutils = "*" +lxml = "*" +premailer = "*" +python-dateutil = "*" +requests = "*" + +[[package]] +name = "et-xmlfile" +version = "1.1.0" +description = "An implementation of lxml.xmlfile for the standard library" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["genshi", "chardet (>=2.2)", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[package]] +name = "httptools" +version = "0.2.0" +description = "A collection of framework independent HTTP protocol utils." +category = "main" +optional = false +python-versions = "*" + +[package.extras] +test = ["Cython (==0.29.22)"] + +[[package]] +name = "idna" +version = "3.2" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "importlib-metadata" +version = "4.8.1" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +perf = ["ipython"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] + +[[package]] +name = "jdcal" +version = "1.4.1" +description = "Julian dates from proleptic Gregorian and Julian calendars." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "jinja2" +version = "2.11.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +name = "lxml" +version = "4.6.3" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["beautifulsoup4"] +source = ["Cython (>=0.29.7)"] + +[[package]] +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "minicli" +version = "0.5.0" +description = "Minimalist CLI" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +doc = ["mkdocs (==1.1.2)"] +test = ["pytest (==6.0.1)"] + +[[package]] +name = "multifruits" +version = "0.1.5" +description = "Tasty multipart form data parser built with cython." +category = "main" +optional = false +python-versions = "*" + +[package.extras] +dev = ["Cython (==0.29.21)"] + +[[package]] +name = "openpyxl" +version = "3.0.5" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +category = "main" +optional = false +python-versions = ">=3.6," + +[package.dependencies] +et-xmlfile = "*" +jdcal = "*" + +[[package]] +name = "pillow" +version = "8.3.2" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "premailer" +version = "3.10.0" +description = "Turns CSS blocks into style attributes" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +cachetools = "*" +cssselect = "*" +cssutils = "*" +lxml = "*" +requests = "*" + +[package.extras] +dev = ["tox", "twine", "therapist", "black", "flake8", "wheel"] +test = ["nose", "mock"] + +[[package]] +name = "pycparser" +version = "2.20" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pyjwt" +version = "1.7.1" +description = "JSON Web Token implementation in Python" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +crypto = ["cryptography (>=1.4)"] +flake8 = ["flake8", "flake8-import-order", "pep8-naming"] +test = ["pytest (>=4.0.1,<5.0.0)", "pytest-cov (>=2.6.0,<3.0.0)", "pytest-runner (>=4.2,<5.0.0)"] + +[[package]] +name = "pyphen" +version = "0.11.0" +description = "Pure Python module to hyphenate text" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-slugify" +version = "4.0.1" +description = "A Python Slugify application that handles Unicode" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + +[[package]] +name = "pyyaml" +version = "5.3.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "requests" +version = "2.26.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "roll" +version = "0.13.0" +description = "Roll is a pico framework with performances and aesthetic in mind." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +autoroutes = "0.3.5" +biscuits = "0.3.0" +httptools = "0.2.0" +multifruits = "0.1.5" +websockets = "8.1" + +[package.extras] +docs = ["mkdocs"] +test = ["pytest"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "tinycss2" +version = "1.1.0" +description = "tinycss2" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"] + +[[package]] +name = "typing-extensions" +version = "3.10.0.2" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "ujson" +version = "3.2.0" +description = "Ultra fast JSON encoder and decoder for Python" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "urllib3" +version = "1.26.7" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "weasyprint" +version = "51" +description = "The Awesome Document Factory" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +cairocffi = ">=0.9.0" +CairoSVG = ">=2.4.0" +cffi = ">=0.6" +cssselect2 = ">=0.1" +html5lib = ">=0.999999999" +Pyphen = ">=0.9.1" +tinycss2 = ">=1.0.0" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "websockets" +version = "8.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.6.1" + +[[package]] +name = "zipp" +version = "3.6.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.7" +content-hash = "e82001513bafdfab9338f3fe9e786a7cc23c55f7e77a98e6b1d3924ab8887f5f" + +[metadata.files] +autoroutes = [ + {file = "autoroutes-0.3.5.tar.gz", hash = "sha256:087fcc5bd7e6f457931b9e8420d575f6aa7d35803d667013463c58d2bcf6b814"}, +] +biscuits = [ + {file = "biscuits-0.3.0.tar.gz", hash = "sha256:08b899164133c81b99b7307d629a45e2fb6a3bcc3ea7c08b1ff24b464b411307"}, +] +cachetools = [ + {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"}, + {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"}, +] +cairocffi = [ + {file = "cairocffi-1.3.0.tar.gz", hash = "sha256:108a3a7cb09e203bdd8501d9baad91d786d204561bd71e9364e8b34897c47b91"}, +] +cairosvg = [ + {file = "CairoSVG-2.5.2-py3-none-any.whl", hash = "sha256:98c276b7e4f0caf01e5c7176765c104ffa1aa1461d63b2053b04ab663cf7052b"}, + {file = "CairoSVG-2.5.2.tar.gz", hash = "sha256:b0b9929cf5dba005178d746a8036fcf0025550f498ca54db61873322384783bc"}, +] +certifi = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] +cffi = [ + {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, + {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, + {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, + {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, + {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, + {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, + {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, + {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"}, + {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"}, + {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"}, + {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"}, + {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"}, + {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, + {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, + {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, + {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, + {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, + {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, + {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, + {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, + {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, + {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, + {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, + {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, + {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, +] +chardet = [ + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"}, + {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"}, +] +cssselect = [ + {file = "cssselect-1.1.0-py2.py3-none-any.whl", hash = "sha256:f612ee47b749c877ebae5bb77035d8f4202c6ad0f0fc1271b3c18ad6c4468ecf"}, + {file = "cssselect-1.1.0.tar.gz", hash = "sha256:f95f8dedd925fd8f54edb3d2dfb44c190d9d18512377d3c1e2388d16126879bc"}, +] +cssselect2 = [ + {file = "cssselect2-0.4.1-py3-none-any.whl", hash = "sha256:2f4a9f20965367bae459e3bb42561f7927e0cfe5b7ea1692757cf67ef5d7dace"}, + {file = "cssselect2-0.4.1.tar.gz", hash = "sha256:93fbb9af860e95dd40bf18c3b2b6ed99189a07c0f29ba76f9c5be71344664ec8"}, +] +cssutils = [ + {file = "cssutils-2.3.0-py3-none-any.whl", hash = "sha256:0cf1f6086b020dee18048ff3999339499f725934017ef9ae2cd5bb77f9ab5f46"}, + {file = "cssutils-2.3.0.tar.gz", hash = "sha256:b2d3b16047caae82e5c590036935bafa1b621cf45c2f38885af4be4838f0fd00"}, +] +debts = [ + {file = "debts-0.5.tar.gz", hash = "sha256:f239fa356500b0cc7d2334a6ad45dcaf542796f759ca44052c59566afca8e5f8"}, +] +defusedxml = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] +emails = [ + {file = "emails-0.6-py2.py3-none-any.whl", hash = "sha256:72c1e3198075709cc35f67e1b49e2da1a2bc087e9b444073db61a379adfb7f3c"}, + {file = "emails-0.6.tar.gz", hash = "sha256:a4c2d67ea8b8831967a750d8edc6e77040d7693143fe280e6d2a367d9c36ff88"}, +] +et-xmlfile = [ + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, +] +html5lib = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] +httptools = [ + {file = "httptools-0.2.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:79dbc21f3612a78b28384e989b21872e2e3cf3968532601544696e4ed0007ce5"}, + {file = "httptools-0.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:78d03dd39b09c99ec917d50189e6743adbfd18c15d5944392d2eabda688bf149"}, + {file = "httptools-0.2.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a23166e5ae2775709cf4f7ad4c2048755ebfb272767d244e1a96d55ac775cca7"}, + {file = "httptools-0.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3ab1f390d8867f74b3b5ee2a7ecc9b8d7f53750bd45714bf1cb72a953d7dfa77"}, + {file = "httptools-0.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a7594f9a010cdf1e16a58b3bf26c9da39bbf663e3b8d46d39176999d71816658"}, + {file = "httptools-0.2.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:01b392a166adcc8bc2f526a939a8aabf89fe079243e1543fd0e7dc1b58d737cb"}, + {file = "httptools-0.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:80ffa04fe8c8dfacf6e4cef8277347d35b0442c581f5814f3b0cf41b65c43c6e"}, + {file = "httptools-0.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d5682eeb10cca0606c4a8286a3391d4c3c5a36f0c448e71b8bd05be4e1694bfb"}, + {file = "httptools-0.2.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a289c27ccae399a70eacf32df9a44059ca2ba4ac444604b00a19a6c1f0809943"}, + {file = "httptools-0.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:813871f961edea6cb2fe312f2d9b27d12a51ba92545380126f80d0de1917ea15"}, + {file = "httptools-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:cc9be041e428c10f8b6ab358c6b393648f9457094e1dcc11b4906026d43cd380"}, + {file = "httptools-0.2.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b08d00d889a118f68f37f3c43e359aab24ee29eb2e3fe96d64c6a2ba8b9d6557"}, + {file = "httptools-0.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fd3b8905e21431ad306eeaf56644a68fdd621bf8f3097eff54d0f6bdf7262065"}, + {file = "httptools-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:200fc1cdf733a9ff554c0bb97a4047785cfaad9875307d6087001db3eb2b417f"}, + {file = "httptools-0.2.0.tar.gz", hash = "sha256:94505026be56652d7a530ab03d89474dc6021019d6b8682281977163b3471ea0"}, +] +idna = [ + {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, + {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, +] +importlib-metadata = [ + {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, + {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, +] +jdcal = [ + {file = "jdcal-1.4.1-py2.py3-none-any.whl", hash = "sha256:1abf1305fce18b4e8aa248cf8fe0c56ce2032392bc64bbd61b5dff2a19ec8bba"}, + {file = "jdcal-1.4.1.tar.gz", hash = "sha256:472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8"}, +] +jinja2 = [ + {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, + {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, +] +lxml = [ + {file = "lxml-4.6.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:df7c53783a46febb0e70f6b05df2ba104610f2fb0d27023409734a3ecbb78fb2"}, + {file = "lxml-4.6.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1b7584d421d254ab86d4f0b13ec662a9014397678a7c4265a02a6d7c2b18a75f"}, + {file = "lxml-4.6.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d"}, + {file = "lxml-4.6.3-cp27-cp27m-win32.whl", hash = "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106"}, + {file = "lxml-4.6.3-cp27-cp27m-win_amd64.whl", hash = "sha256:8157dadbb09a34a6bd95a50690595e1fa0af1a99445e2744110e3dca7831c4ee"}, + {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7728e05c35412ba36d3e9795ae8995e3c86958179c9770e65558ec3fdfd3724f"}, + {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4bff24dfeea62f2e56f5bab929b4428ae6caba2d1eea0c2d6eb618e30a71e6d4"}, + {file = "lxml-4.6.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51"}, + {file = "lxml-4.6.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f90ba11136bfdd25cae3951af8da2e95121c9b9b93727b1b896e3fa105b2f586"}, + {file = "lxml-4.6.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:4c61b3a0db43a1607d6264166b230438f85bfed02e8cff20c22e564d0faff354"}, + {file = "lxml-4.6.3-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:5c8c163396cc0df3fd151b927e74f6e4acd67160d6c33304e805b84293351d16"}, + {file = "lxml-4.6.3-cp35-cp35m-win32.whl", hash = "sha256:f2380a6376dfa090227b663f9678150ef27543483055cc327555fb592c5967e2"}, + {file = "lxml-4.6.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4"}, + {file = "lxml-4.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d2e35d7bf1c1ac8c538f88d26b396e73dd81440d59c1ef8522e1ea77b345ede4"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:289e9ca1a9287f08daaf796d96e06cb2bc2958891d7911ac7cae1c5f9e1e0ee3"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d916d31fd85b2f78c76400d625076d9124de3e4bda8b016d25a050cc7d603f24"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:820628b7b3135403540202e60551e741f9b6d3304371712521be939470b454ec"}, + {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:c47ff7e0a36d4efac9fd692cfa33fbd0636674c102e9e8d9b26e1b93a94e7617"}, + {file = "lxml-4.6.3-cp36-cp36m-win32.whl", hash = "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04"}, + {file = "lxml-4.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:92e821e43ad382332eade6812e298dc9701c75fe289f2a2d39c7960b43d1e92a"}, + {file = "lxml-4.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efd7a09678fd8b53117f6bae4fa3825e0a22b03ef0a932e070c0bdbb3a35e654"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:efac139c3f0bf4f0939f9375af4b02c5ad83a622de52d6dfa8e438e8e01d0eb0"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:36108c73739985979bf302006527cf8a20515ce444ba916281d1c43938b8bb96"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:122fba10466c7bd4178b07dba427aa516286b846b2cbd6f6169141917283aae2"}, + {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:cdaf11d2bd275bf391b5308f86731e5194a21af45fbaaaf1d9e8147b9160ea92"}, + {file = "lxml-4.6.3-cp37-cp37m-win32.whl", hash = "sha256:3439c71103ef0e904ea0a1901611863e51f50b5cd5e8654a151740fde5e1cade"}, + {file = "lxml-4.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4289728b5e2000a4ad4ab8da6e1db2e093c63c08bdc0414799ee776a3f78da4b"}, + {file = "lxml-4.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:76fa7b1362d19f8fbd3e75fe2fb7c79359b0af8747e6f7141c338f0bee2f871a"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:26e761ab5b07adf5f555ee82fb4bfc35bf93750499c6c7614bd64d12aaa67927"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:e1cbd3f19a61e27e011e02f9600837b921ac661f0c40560eefb366e4e4fb275e"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791"}, + {file = "lxml-4.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:1b38116b6e628118dea5b2186ee6820ab138dbb1e24a13e478490c7db2f326ae"}, + {file = "lxml-4.6.3-cp38-cp38-win32.whl", hash = "sha256:89b8b22a5ff72d89d48d0e62abb14340d9e99fd637d046c27b8b257a01ffbe28"}, + {file = "lxml-4.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:2a9d50e69aac3ebee695424f7dbd7b8c6d6eb7de2a2eb6b0f6c7db6aa41e02b7"}, + {file = "lxml-4.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ce256aaa50f6cc9a649c51be3cd4ff142d67295bfc4f490c9134d0f9f6d58ef0"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:7610b8c31688f0b1be0ef882889817939490a36d0ee880ea562a4e1399c447a1"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f8380c03e45cf09f8557bdaa41e1fa7c81f3ae22828e1db470ab2a6c96d8bc23"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:3082c518be8e97324390614dacd041bb1358c882d77108ca1957ba47738d9d59"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:884ab9b29feaca361f7f88d811b1eea9bfca36cf3da27768d28ad45c3ee6f969"}, + {file = "lxml-4.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:6f12e1427285008fd32a6025e38e977d44d6382cf28e7201ed10d6c1698d2a9a"}, + {file = "lxml-4.6.3-cp39-cp39-win32.whl", hash = "sha256:33bb934a044cf32157c12bfcfbb6649807da20aa92c062ef51903415c704704f"}, + {file = "lxml-4.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83"}, + {file = "lxml-4.6.3.tar.gz", hash = "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468"}, +] +markupsafe = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] +minicli = [ + {file = "minicli-0.5.0-py3-none-any.whl", hash = "sha256:c6118c0c6c5678cfc2ad7317dca9bfa8c4da2363337a0adbe526aeeb3007582e"}, + {file = "minicli-0.5.0.tar.gz", hash = "sha256:baea96017039c0eba448cd07d746eda623be3226367b3a532d3843154bb347ad"}, +] +multifruits = [ + {file = "multifruits-0.1.5.tar.gz", hash = "sha256:c5eff8b375121b96a96a0c4bd05cd817ec7e204feadc6c6a211ca16029f78a7f"}, +] +openpyxl = [ + {file = "openpyxl-3.0.5-py2.py3-none-any.whl", hash = "sha256:f7d666b569f729257082cf7ddc56262431878f602dcc2bc3980775c59439cdab"}, + {file = "openpyxl-3.0.5.tar.gz", hash = "sha256:18e11f9a650128a12580a58e3daba14e00a11d9e907c554a17ea016bf1a2c71b"}, +] +pillow = [ + {file = "Pillow-8.3.2-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:c691b26283c3a31594683217d746f1dad59a7ae1d4cfc24626d7a064a11197d4"}, + {file = "Pillow-8.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f514c2717012859ccb349c97862568fdc0479aad85b0270d6b5a6509dbc142e2"}, + {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be25cb93442c6d2f8702c599b51184bd3ccd83adebd08886b682173e09ef0c3f"}, + {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d675a876b295afa114ca8bf42d7f86b5fb1298e1b6bb9a24405a3f6c8338811c"}, + {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59697568a0455764a094585b2551fd76bfd6b959c9f92d4bdec9d0e14616303a"}, + {file = "Pillow-8.3.2-cp310-cp310-win32.whl", hash = "sha256:2d5e9dc0bf1b5d9048a94c48d0813b6c96fccfa4ccf276d9c36308840f40c228"}, + {file = "Pillow-8.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:11c27e74bab423eb3c9232d97553111cc0be81b74b47165f07ebfdd29d825875"}, + {file = "Pillow-8.3.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:11eb7f98165d56042545c9e6db3ce394ed8b45089a67124298f0473b29cb60b2"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f23b2d3079522fdf3c09de6517f625f7a964f916c956527bed805ac043799b8"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19ec4cfe4b961edc249b0e04b5618666c23a83bc35842dea2bfd5dfa0157f81b"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5a31c07cea5edbaeb4bdba6f2b87db7d3dc0f446f379d907e51cc70ea375629"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15ccb81a6ffc57ea0137f9f3ac2737ffa1d11f786244d719639df17476d399a7"}, + {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8f284dc1695caf71a74f24993b7c7473d77bc760be45f776a2c2f4e04c170550"}, + {file = "Pillow-8.3.2-cp36-cp36m-win32.whl", hash = "sha256:4abc247b31a98f29e5224f2d31ef15f86a71f79c7f4d2ac345a5d551d6393073"}, + {file = "Pillow-8.3.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a048dad5ed6ad1fad338c02c609b862dfaa921fcd065d747194a6805f91f2196"}, + {file = "Pillow-8.3.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:06d1adaa284696785375fa80a6a8eb309be722cf4ef8949518beb34487a3df71"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd24054aaf21e70a51e2a2a5ed1183560d3a69e6f9594a4bfe360a46f94eba83"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a330bf7014ee034046db43ccbb05c766aa9e70b8d6c5260bfc38d73103b0ba"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13654b521fb98abdecec105ea3fb5ba863d1548c9b58831dd5105bb3873569f1"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1bd983c565f92779be456ece2479840ec39d386007cd4ae83382646293d681b"}, + {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4326ea1e2722f3dc00ed77c36d3b5354b8fb7399fb59230249ea6d59cbed90da"}, + {file = "Pillow-8.3.2-cp37-cp37m-win32.whl", hash = "sha256:085a90a99404b859a4b6c3daa42afde17cb3ad3115e44a75f0d7b4a32f06a6c9"}, + {file = "Pillow-8.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:18a07a683805d32826c09acfce44a90bf474e6a66ce482b1c7fcd3757d588df3"}, + {file = "Pillow-8.3.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4e59e99fd680e2b8b11bbd463f3c9450ab799305d5f2bafb74fefba6ac058616"}, + {file = "Pillow-8.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d89a2e9219a526401015153c0e9dd48319ea6ab9fe3b066a20aa9aee23d9fd3"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fd98c8294f57636084f4b076b75f86c57b2a63a8410c0cd172bc93695ee979"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b11c9d310a3522b0fd3c35667914271f570576a0e387701f370eb39d45f08a4"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0412516dcc9de9b0a1e0ae25a280015809de8270f134cc2c1e32c4eeb397cf30"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bcb04ff12e79b28be6c9988f275e7ab69f01cc2ba319fb3114f87817bb7c74b6"}, + {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0b9911ec70731711c3b6ebcde26caea620cbdd9dcb73c67b0730c8817f24711b"}, + {file = "Pillow-8.3.2-cp38-cp38-win32.whl", hash = "sha256:ce2e5e04bb86da6187f96d7bab3f93a7877830981b37f0287dd6479e27a10341"}, + {file = "Pillow-8.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:35d27687f027ad25a8d0ef45dd5208ef044c588003cdcedf05afb00dbc5c2deb"}, + {file = "Pillow-8.3.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:04835e68ef12904bc3e1fd002b33eea0779320d4346082bd5b24bec12ad9c3e9"}, + {file = "Pillow-8.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:10e00f7336780ca7d3653cf3ac26f068fa11b5a96894ea29a64d3dc4b810d630"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cde7a4d3687f21cffdf5bb171172070bb95e02af448c4c8b2f223d783214056"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c3ff00110835bdda2b1e2b07f4a2548a39744bb7de5946dc8e95517c4fb2ca6"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d409030bf3bd05fa66fb5fdedc39c521b397f61ad04309c90444e893d05f7d"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bff50ba9891be0a004ef48828e012babaaf7da204d81ab9be37480b9020a82b"}, + {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7dbfbc0020aa1d9bc1b0b8bcf255a7d73f4ad0336f8fd2533fcc54a4ccfb9441"}, + {file = "Pillow-8.3.2-cp39-cp39-win32.whl", hash = "sha256:963ebdc5365d748185fdb06daf2ac758116deecb2277ec5ae98139f93844bc09"}, + {file = "Pillow-8.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:cc9d0dec711c914ed500f1d0d3822868760954dce98dfb0b7382a854aee55d19"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2c661542c6f71dfd9dc82d9d29a8386287e82813b0375b3a02983feac69ef864"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:548794f99ff52a73a156771a0402f5e1c35285bd981046a502d7e4793e8facaa"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b68f565a4175e12e68ca900af8910e8fe48aaa48fd3ca853494f384e11c8bcd"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:838eb85de6d9307c19c655c726f8d13b8b646f144ca6b3771fa62b711ebf7624"}, + {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:feb5db446e96bfecfec078b943cc07744cc759893cef045aa8b8b6d6aaa8274e"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:fc0db32f7223b094964e71729c0361f93db43664dd1ec86d3df217853cedda87"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd4fd83aa912d7b89b4b4a1580d30e2a4242f3936882a3f433586e5ab97ed0d5"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0c8ebbfd439c37624db98f3877d9ed12c137cadd99dde2d2eae0dab0bbfc355"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cb3dd7f23b044b0737317f892d399f9e2f0b3a02b22b2c692851fb8120d82c6"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a66566f8a22561fc1a88dc87606c69b84fa9ce724f99522cf922c801ec68f5c1"}, + {file = "Pillow-8.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ce651ca46d0202c302a535d3047c55a0131a720cf554a578fc1b8a2aff0e7d96"}, + {file = "Pillow-8.3.2.tar.gz", hash = "sha256:dde3f3ed8d00c72631bc19cbfff8ad3b6215062a5eed402381ad365f82f0c18c"}, +] +premailer = [ + {file = "premailer-3.10.0-py2.py3-none-any.whl", hash = "sha256:021b8196364d7df96d04f9ade51b794d0b77bcc19e998321c515633a2273be1a"}, + {file = "premailer-3.10.0.tar.gz", hash = "sha256:d1875a8411f5dc92b53ef9f193db6c0f879dc378d618e0ad292723e388bfe4c2"}, +] +pycparser = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] +pyjwt = [ + {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"}, + {file = "PyJWT-1.7.1.tar.gz", hash = "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"}, +] +pyphen = [ + {file = "pyphen-0.11.0-py3-none-any.whl", hash = "sha256:e3c1b1d05deaa31acdd78e2e24005402358feb7a4b407c4af7e5cc2e41c4d608"}, + {file = "pyphen-0.11.0.tar.gz", hash = "sha256:e2c3ed82c3a04317df5102addafe89652b0876bc6c6265f5dd4c3efaf02315e8"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] +python-slugify = [ + {file = "python-slugify-4.0.1.tar.gz", hash = "sha256:69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270"}, +] +pyyaml = [ + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, + {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"}, + {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"}, + {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, +] +requests = [ + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, +] +roll = [ + {file = "roll-0.13.0-py3-none-any.whl", hash = "sha256:a9a833c791167406599f4a234c7b244e074e9e1c796f94adf99bde2894730684"}, + {file = "roll-0.13.0.tar.gz", hash = "sha256:5847d408bc74ec495d55fe7b482b4d780f88fc6ab56c0bef49336d3fa078e050"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +text-unidecode = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] +tinycss2 = [ + {file = "tinycss2-1.1.0-py3-none-any.whl", hash = "sha256:0353b5234bcaee7b1ac7ca3dea7e02cd338a9f8dcbb8f2dcd32a5795ec1e5f9a"}, + {file = "tinycss2-1.1.0.tar.gz", hash = "sha256:fbdcac3044d60eb85fdb2aa840ece43cf7dbe798e373e6ee0be545d4d134e18a"}, +] +typing-extensions = [ + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, +] +ujson = [ + {file = "ujson-3.2.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:437e051a3e292ddbd5b4682f9b6c3e2ea4cd059d0d75bc9f8314349d63cbb015"}, + {file = "ujson-3.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a27ea44406100a97fb0fcc0b18dcdaf324824e722a00856a2992fafc65779351"}, + {file = "ujson-3.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6f7c24dabb0ff0ff43744d18211af6035ef37197f530c13edf704e627da7251d"}, + {file = "ujson-3.2.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:5ae6f599ef7c01ef626697f9e15e9d4e2a186ab4c0593ddb529b86866b562efb"}, + {file = "ujson-3.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:59048958793e0b0489449a414e2fbe54644457be1dd882b99a4fe16158632af1"}, + {file = "ujson-3.2.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a476525862a394018a7a3438c86596815b84518b2744184444fc6f8b0e3e4aee"}, + {file = "ujson-3.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:2050c7f1ce72055f1b6fba29e4694ccf4509917d3be3ed6f3543ef3ff00eec4a"}, + {file = "ujson-3.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fda324ca055e671eae46e8fc32b46fab20eb251d3e6e22beb67f71f1d240b0b4"}, + {file = "ujson-3.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:0bdc62a1543d697e9c649ac0ac41e0d076a7b886d6b45f9f21971e25b90a2b27"}, + {file = "ujson-3.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d0ad63fc88d4e4cb7630f59aacd742256804a4cee447e9589e55957107a469b7"}, + {file = "ujson-3.2.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:66d47eabb4f0e12b5784b1a49c59bc6f32e91e18e02f2a43c5e91e2f6ad9cc60"}, + {file = "ujson-3.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:253edfe274538bb1060ab8877d51fc75e416047d5fab5340454a48b971f30612"}, + {file = "ujson-3.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6ee651c0210a67e3a72367de53ccac83b623913214e7c75015caadfad2b7e0dc"}, + {file = "ujson-3.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:0784f35f2ace41ed55c435ee11f9d9877cf3e6ff03c8850f87504cb93e9a9469"}, + {file = "ujson-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:812748c8de041f1ef5e9b37f33121c0c7390055fa5f12215b3d06a63b1c055a2"}, + {file = "ujson-3.2.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:17460d88dd4b9630e449e5d29b97301e6dbbbedbf46a6f95f3b2cb7e1333e6ea"}, + {file = "ujson-3.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:2d50cb3d87d4aabe6dbeb6ef79025bf9fdf350c4355c24819dc5c5cc38bad3dc"}, + {file = "ujson-3.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7060105de892cada2f01bd072d33b2421b4eefd32536207c1c9f2ade18656139"}, + {file = "ujson-3.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7b6496b3e2bc396628f114fd96ec41655b10c84adececc0ef8cf1c2329dae36c"}, + {file = "ujson-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:782bdf016da793a3bf138e50ed973428e59006b8d73a9e1911bc6207c6b79fff"}, + {file = "ujson-3.2.0.tar.gz", hash = "sha256:abb1996ba1c1d2faf5b1e38efa97da7f64e5373a31f705b96fe0587f5f778db4"}, +] +urllib3 = [ + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, +] +weasyprint = [ + {file = "WeasyPrint-51-py3-none-any.whl", hash = "sha256:469974f6e74b1eef71dc56a9b80cc17621f319234d2a4ab656ddd0fd9e66c27f"}, + {file = "WeasyPrint-51.tar.gz", hash = "sha256:b3e971973a4f03c1430e6b838b75b5b57630415fcae8666d2be1347630ff6d6a"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +websockets = [ + {file = "websockets-8.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:3762791ab8b38948f0c4d281c8b2ddfa99b7e510e46bd8dfa942a5fff621068c"}, + {file = "websockets-8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3db87421956f1b0779a7564915875ba774295cc86e81bc671631379371af1170"}, + {file = "websockets-8.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4f9f7d28ce1d8f1295717c2c25b732c2bc0645db3215cf757551c392177d7cb8"}, + {file = "websockets-8.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:295359a2cc78736737dd88c343cd0747546b2174b5e1adc223824bcaf3e164cb"}, + {file = "websockets-8.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1d3f1bf059d04a4e0eb4985a887d49195e15ebabc42364f4eb564b1d065793f5"}, + {file = "websockets-8.1-cp36-cp36m-win32.whl", hash = "sha256:2db62a9142e88535038a6bcfea70ef9447696ea77891aebb730a333a51ed559a"}, + {file = "websockets-8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:0e4fb4de42701340bd2353bb2eee45314651caa6ccee80dbd5f5d5978888fed5"}, + {file = "websockets-8.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:9b248ba3dd8a03b1a10b19efe7d4f7fa41d158fdaa95e2cf65af5a7b95a4f989"}, + {file = "websockets-8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ce85b06a10fc65e6143518b96d3dca27b081a740bae261c2fb20375801a9d56d"}, + {file = "websockets-8.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:965889d9f0e2a75edd81a07592d0ced54daa5b0785f57dc429c378edbcffe779"}, + {file = "websockets-8.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:751a556205d8245ff94aeef23546a1113b1dd4f6e4d102ded66c39b99c2ce6c8"}, + {file = "websockets-8.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3ef56fcc7b1ff90de46ccd5a687bbd13a3180132268c4254fc0fa44ecf4fc422"}, + {file = "websockets-8.1-cp37-cp37m-win32.whl", hash = "sha256:7ff46d441db78241f4c6c27b3868c9ae71473fe03341340d2dfdbe8d79310acc"}, + {file = "websockets-8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:20891f0dddade307ffddf593c733a3fdb6b83e6f9eef85908113e628fa5a8308"}, + {file = "websockets-8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c1ec8db4fac31850286b7cd3b9c0e1b944204668b8eb721674916d4e28744092"}, + {file = "websockets-8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5c01fd846263a75bc8a2b9542606927cfad57e7282965d96b93c387622487485"}, + {file = "websockets-8.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9bef37ee224e104a413f0780e29adb3e514a5b698aabe0d969a6ba426b8435d1"}, + {file = "websockets-8.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d705f8aeecdf3262379644e4b55107a3b55860eb812b673b28d0fbc347a60c55"}, + {file = "websockets-8.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c8a116feafdb1f84607cb3b14aa1418424ae71fee131642fc568d21423b51824"}, + {file = "websockets-8.1-cp38-cp38-win32.whl", hash = "sha256:e898a0863421650f0bebac8ba40840fc02258ef4714cb7e1fd76b6a6354bda36"}, + {file = "websockets-8.1-cp38-cp38-win_amd64.whl", hash = "sha256:f8a7bff6e8664afc4e6c28b983845c5bc14965030e3fb98789734d416af77c4b"}, + {file = "websockets-8.1.tar.gz", hash = "sha256:5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f"}, +] +zipp = [ + {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, + {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, +] diff --git a/flakes/copanier/pyproject.toml b/flakes/copanier/pyproject.toml new file mode 100644 index 0000000..ba487ae --- /dev/null +++ b/flakes/copanier/pyproject.toml @@ -0,0 +1,40 @@ +[tool.poetry] +name = "copanier" +version = "0.0.4" +description = "" +authors = ["Your Name "] + +[tool.poetry.dependencies] +python = "^3.7" +Jinja2 = "2.11.2" +openpyxl = "3.0.5" +PyJWT = "1.7.1" +PyYAML = "5.3.1" +roll = "0.13.0" +ujson = "3.2.0" +minicli = "0.5.0" +python-slugify = "4.0.1" +debts = "0.5" +emails = "0.6" +Weasyprint = "51" + +#[tool.poetry.dev-dependencies] +#hupper = "1.10.2" +#minicli = "0.5.0" +#usine = "0.2.3" +# +#[tool.poetry.group.test.dependencies] +#pyquery = "1.4.1" +#pytest = "6.0.2" +#pytest-asyncio = "0.14.0" +# +#[tool.poetry.group.prod.dependencies] +#gunicorn = "20.0.4" +#uvloop = "0.14.0" + +[tool.poetry.scripts] +copanier = 'copanier:main' + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/flakes/diaspora/default.nix b/flakes/diaspora/default.nix new file mode 100644 index 0000000..f4038ad --- /dev/null +++ b/flakes/diaspora/default.nix @@ -0,0 +1,74 @@ +{ ldap ? false, varDir ? "/var/lib/diaspora", podmin_email ? null, config_dir ? "/etc/diaspora", + src, stdenv, bundlerEnv, writeText, + cacert, defaultGemConfig, perl, ruby_2_4, nodejs, which, git }: +let + diaspora_src = stdenv.mkDerivation { + inherit (src) version; + pname = "diaspora"; + inherit src; + buildPhase = '' + ${if ldap then "patch -p1 < ${./ldap.patch}" else ""} + # FIXME: bundlerEnv below doesn't take postgresql group for some + # reason + echo 'gem "pg", "1.1.3"' >> Gemfile + ''; + installPhase = '' + cp -a . $out + ''; + }; + gems = bundlerEnv { + name = "diaspora-env"; + gemfile = "${diaspora_src}/Gemfile"; + lockfile = "${diaspora_src}/Gemfile.lock"; + gemset = if ldap then ./gemset_ldap.nix else ./gemset.nix; + groups = [ "postgresql" "default" "production" ]; + gemConfig = defaultGemConfig // { + kostya-sigar = attrs: { + buildInputs = [ perl ]; + }; + }; + }; + build_config = writeText "diaspora.yml" '' + configuration: + environment: + certificate_authorities: '${cacert}/etc/ssl/certs/ca-bundle.crt' + ${if podmin_email != null then '' + # dummy comment for indentation + admins: + podmin_email: '${podmin_email}' + '' else ""} + production: + environment: + ''; + dummy_token = writeText "secret_token.rb" '' + Diaspora::Application.config.secret_key_base = 'dummy' + ''; + diaspora = stdenv.mkDerivation { + name = "diaspora"; + version = src.version; + inherit diaspora_src; + builder = writeText "build_diaspora" '' + source $stdenv/setup + cp -a $diaspora_src $out + cd $out + chmod -R u+rwX . + tar -czf public/source.tar.gz ./{app,db,lib,script,Gemfile,Gemfile.lock,Rakefile,config.ru} + ln -s database.yml.example config/database.yml + ln -s ${build_config} config/diaspora.yml + ln -s ${dummy_token} config/initializers/secret_token.rb + ln -sf ${varDir}/schedule.yml config/schedule.yml + ln -sf ${varDir}/oidc_key.pem config/oidc_key.pem + ln -sf ${varDir}/uploads public/uploads + RAILS_ENV=production ${gems}/bin/rake assets:precompile + ln -sf ${config_dir}/database.yml config/database.yml + ln -sf ${config_dir}/diaspora.yml config/diaspora.yml + ln -sf ${config_dir}/secret_token.rb config/initializers/secret_token.rb + rm -rf tmp log + ln -sf ${varDir}/tmp tmp + ln -sf ${varDir}/log log + ''; + propagatedBuildInputs = [ gems nodejs which git ]; + passthru = { inherit gems varDir; }; + }; +in + diaspora diff --git a/flakes/diaspora/flake.lock b/flakes/diaspora/flake.lock new file mode 100644 index 0000000..3af470f --- /dev/null +++ b/flakes/diaspora/flake.lock @@ -0,0 +1,75 @@ +{ + "nodes": { + "diaspora": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "nixpkgs": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "diaspora": "diaspora", + "flake-utils": "flake-utils", + "myuids": "myuids", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/diaspora/flake.nix b/flakes/diaspora/flake.nix new file mode 100644 index 0000000..21b05d6 --- /dev/null +++ b/flakes/diaspora/flake.nix @@ -0,0 +1,214 @@ +{ + description = "A privacy-aware, distributed, open source social network."; + inputs.myuids = { + url = "path:../myuids"; + }; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.diaspora = { + url = "github:diaspora/diaspora/v0.7.10.0"; + flake = false; + }; + + outputs = { self, myuids, nixpkgs, diaspora, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.diaspora.original.ref; + inherit (pkgs) callPackage; + in rec { + packages.diaspora = callPackage ./. { src = diaspora // { inherit version; }; }; + defaultPackage = packages.diaspora; + legacyPackages.diaspora = packages.diaspora; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + diaspora = final: prev: { + diaspora = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.diaspora; + nixosModule = { lib, pkgs, config, ... }: + let + name = "diaspora"; + cfg = config.services.diaspora; + + uid = config.ids.uids.diaspora; + gid = config.ids.gids.diaspora; + in + { + options.services.diaspora = { + enable = lib.mkEnableOption "Enable Diaspora’s service"; + user = lib.mkOption { + type = lib.types.str; + default = name; + description = "User account under which Diaspora runs"; + }; + group = lib.mkOption { + type = lib.types.str; + default = name; + description = "Group under which Diaspora runs"; + }; + adminEmail = lib.mkOption { + type = lib.types.str; + example = "admin@example.com"; + description = "Admin e-mail for Diaspora"; + }; + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/${name}"; + description = '' + The directory where Diaspora stores its data. + ''; + }; + socketsDir = lib.mkOption { + type = lib.types.path; + default = "/run/${name}"; + description = '' + The directory where Diaspora puts runtime files and sockets. + ''; + }; + configDir = lib.mkOption { + type = lib.types.path; + description = '' + The configuration path for Diaspora. + ''; + }; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.diaspora; + description = '' + Diaspora package to use. + ''; + }; + withLdap = lib.mkEnableOption "Add ldap patch"; + # Output variables + systemdStateDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if varDir is outside of /var/lib + default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; + lib.strings.removePrefix "/var/lib/" cfg.dataDir; + description = '' + Adjusted Diaspora data directory for systemd + ''; + readOnly = true; + }; + systemdRuntimeDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if socketsDir is outside of /run + default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; + lib.strings.removePrefix "/run/" cfg.socketsDir; + description = '' + Adjusted Diaspora sockets directory for systemd + ''; + readOnly = true; + }; + workdir = lib.mkOption { + type = lib.types.package; + default = cfg.package.override { + varDir = cfg.dataDir; + podmin_email = cfg.adminEmail; + config_dir = cfg.configDir; + ldap = cfg.withLdap; + }; + description = '' + Adjusted diaspora package with overriden values + ''; + readOnly = true; + }; + sockets = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + rails = "${cfg.socketsDir}/diaspora.sock"; + eye = "${cfg.socketsDir}/eye.sock"; + }; + readOnly = true; + description = '' + Diaspora sockets + ''; + }; + pids = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + eye = "${cfg.socketsDir}/eye.pid"; + }; + readOnly = true; + description = '' + Diaspora pids + ''; + }; + }; + + config = lib.mkIf cfg.enable { + nixpkgs.overlays = [ self.overlay ]; + users.users = lib.optionalAttrs (cfg.user == name) { + "${name}" = { + uid = myuids.lib.uids.diaspora; + group = cfg.group; + description = "Diaspora user"; + home = cfg.dataDir; + packages = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby ]; + useDefaultShell = true; + }; + }; + users.groups = lib.optionalAttrs (cfg.group == name) { + "${name}" = { + gid = myuids.lib.gids.diaspora; + }; + }; + + systemd.services.diaspora = { + description = "Diaspora"; + wantedBy = [ "multi-user.target" ]; + after = [ + "network.target" "redis.service" "postgresql.service" + ]; + wants = [ + "redis.service" "postgresql.service" + ]; + + environment.RAILS_ENV = "production"; + environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; + environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; + environment.EYE_SOCK = cfg.sockets.eye; + environment.EYE_PID = cfg.pids.eye; + + path = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby pkgs.curl pkgs.which pkgs.gawk ]; + + preStart = '' + install -m 0755 -d ${cfg.dataDir}/uploads ${cfg.dataDir}/tmp ${cfg.dataDir}/log + install -m 0700 -d ${cfg.dataDir}/tmp/pids + if [ ! -f ${cfg.dataDir}/schedule.yml ]; then + echo "{}" > ${cfg.dataDir}/schedule.yml + fi + ./bin/bundle exec rails db:migrate + ''; + + script = '' + exec ${cfg.workdir}/script/server + ''; + + serviceConfig = { + User = cfg.user; + PrivateTmp = true; + Restart = "always"; + Type = "simple"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + StandardInput = "null"; + KillMode = "control-group"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + }; + }; + }; +} + diff --git a/pkgs/webapps/diaspora/gemset.nix b/flakes/diaspora/gemset.nix similarity index 100% rename from pkgs/webapps/diaspora/gemset.nix rename to flakes/diaspora/gemset.nix diff --git a/pkgs/webapps/diaspora/gemset_ldap.nix b/flakes/diaspora/gemset_ldap.nix similarity index 100% rename from pkgs/webapps/diaspora/gemset_ldap.nix rename to flakes/diaspora/gemset_ldap.nix diff --git a/pkgs/webapps/diaspora/ldap.patch b/flakes/diaspora/ldap.patch similarity index 100% rename from pkgs/webapps/diaspora/ldap.patch rename to flakes/diaspora/ldap.patch diff --git a/pkgs/webapps/etherpad-lite/default.nix b/flakes/etherpad-lite/default.nix similarity index 77% rename from pkgs/webapps/etherpad-lite/default.nix rename to flakes/etherpad-lite/default.nix index 4327384..1dd5aa4 100644 --- a/pkgs/webapps/etherpad-lite/default.nix +++ b/flakes/etherpad-lite/default.nix @@ -1,7 +1,6 @@ { varDir ? "/var/lib/etherpad-lite" # if you override this change the StateDirectory in service file too! -, stdenv, callPackage, mylibs, lib }: +, nodeEnv, stdenv, callPackage, src, lib, nodejs }: let - nodeEnv = callPackage mylibs.nodeEnv {}; moduleNames = [ "ep_aa_file_menu_toolbar" "ep_adminpads" "ep_align" "ep_bookmark" "ep_clear_formatting" "ep_colors" "ep_comments_page" @@ -14,9 +13,9 @@ let ]; # nix files are built using node2nix -i node-packages.json allModules = lib.attrsets.genAttrs moduleNames - (name: (callPackage (./modules + "/${name}/node-packages.nix") { inherit nodeEnv; }).${name}); - toPassthru = pkg: { - inherit varDir allModules; + (name: (callPackage (./modules + "/${name}/node-packages.nix") { nodeEnv = callPackage nodeEnv {}; }).${name}); + toPassthru = pkg: moduleNames: { + inherit varDir allModules nodejs moduleNames; withModules = withModules pkg; }; withModules = pkg: toModules: @@ -29,16 +28,20 @@ let ln -s ${varDir}/ep_initialized/${n.packageName} $out/node_modules/${n.packageName}/.ep_initialized fi ''; + modulesNames = map (n: n.packageName) modules; newEtherpad = pkg.overrideAttrs(old: { installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallModule modules); - passthru = toPassthru newEtherpad; + passthru = toPassthru newEtherpad moduleNames; }); in newEtherpad; # built using node2nix -l package-lock.json # and changing "./." to "src" node-environment = (callPackage ./node-packages.nix { - inherit nodeEnv; - src = stdenv.mkDerivation (mylibs.fetchedGithub ./etherpad-lite.json // rec { + nodeEnv = callPackage nodeEnv {}; + src = stdenv.mkDerivation { + pname = "etherpad-lite"; + version = src.version; + inherit src; patches = [ ./libreoffice_patch.diff ]; buildPhase = '' touch src/.ep_initialized @@ -46,18 +49,20 @@ let installPhase = '' cp -a src/ $out ''; - }); + }; }).package; package = stdenv.mkDerivation rec { - name = (mylibs.fetchedGithub ./etherpad-lite.json).name; + name = "etherpad-lite-${src.version}"; src = node-environment; + version = src.version; installPhase = '' mkdir -p $out mkdir $out/node_modules cp -a lib/node_modules/ep_etherpad-lite $out/src chmod u+w $out/src/static/js/ ln -s ../src $out/node_modules/ep_etherpad-lite + ln -s ${varDir}/var $out/var ''; - passthru = toPassthru package; + passthru = toPassthru package []; }; in package diff --git a/flakes/etherpad-lite/etherpad_cleanup.sql b/flakes/etherpad-lite/etherpad_cleanup.sql new file mode 100644 index 0000000..4002715 --- /dev/null +++ b/flakes/etherpad-lite/etherpad_cleanup.sql @@ -0,0 +1,30 @@ +DO $$ + DECLARE todelete record; + BEGIN + FOR todelete IN + select split_part(key, ':', 4) as k from store where key like 'mypads:jobqueue:deletePad:%' + LOOP + select * from store where key in (select 'readonly2pad:' || split_part(value, '"', 2) from store where key = 'pad2readonly:' || todelete.k); + select * from store where key = 'pad2readonly:' || todelete.k; + select * from store where key like 'pad:' || todelete.k || ':revs:%'; + select * from store where key like 'pad:' || todelete.k || ':chats:%'; + END LOOP; + END $$ + +-- /nix/store/1i77431p6996lbyflpkb803zsiaj24kx-etherpad-lite-1.8.3/node_modules/ep_mypads/scripts/mypads-jobqueue-minion.js +for toDelete in + select split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%' +loop + select * from store where key in (select 'readonly2pad:' || split_part(value, '"', 2) from store where key = 'pad2readonly:' || toDelete); + select * from store where key = 'pad2readonly:' || toDelete; + select * from store where key like 'pad:' || toDelete || ':revs:%'; + select * from store where key like 'pad:' || toDelete || ':chats:%'; +end loop +--select * from store where key in (select 'pad2readonly:' || split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%'); +-- +--delete from store where key in (select 'readonly2pad:' || split_part(value, '"', 2) from store where key in (select 'pad2readonly:' || split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%')) +--delete from store where key in (select 'pad2readonly:' || split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%'); +--delete from store where key like any(select 'pad:' || split_part(key, ':', 4) || ':revs:%' from store where key like 'mypads:jobqueue:deletePad:%'); +--delete from store where key like any(select 'pad:' || split_part(key, ':', 4) || ':chats:%' from store where key like 'mypads:jobqueue:deletePad:%'); +--delete from store where key like 'mypads:jobqueue:deletePad:%'; + diff --git a/flakes/etherpad-lite/flake.lock b/flakes/etherpad-lite/flake.lock new file mode 100644 index 0000000..19d9ffa --- /dev/null +++ b/flakes/etherpad-lite/flake.lock @@ -0,0 +1,150 @@ +{ + "nodes": { + "etherpad-lite": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "etherpad-lite": "etherpad-lite", + "flake-utils": "flake-utils", + "mypackages": "mypackages", + "nixpkgs": "nixpkgs_2" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/etherpad-lite/flake.nix b/flakes/etherpad-lite/flake.nix new file mode 100644 index 0000000..6e0d7db --- /dev/null +++ b/flakes/etherpad-lite/flake.nix @@ -0,0 +1,227 @@ +{ + description = "Your self-hosted, globally interconnected microblogging community"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.etherpad-lite = { + url = "github:ether/etherpad-lite/1.8.3"; + flake = false; + }; + inputs.mypackages.url = "path:../mypackages"; + + outputs = { self, nixpkgs, etherpad-lite, flake-utils, mypackages }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.etherpad-lite.original.ref; + inherit (pkgs) callPackage; + in rec { + packages.etherpad-lite = callPackage ./. { inherit (mypackages.mylibs) nodeEnv; src = etherpad-lite // { inherit version; }; }; + defaultPackage = packages.etherpad-lite; + legacyPackages.etherpad-lite = packages.etherpad-lite; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + etherpad-lite = final: prev: { + etherpad-lite = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.etherpad-lite; + nixosModule = { lib, pkgs, config, ... }: + let + name = "etherpad-lite"; + cfg = config.services.etherpad-lite; + in + { + options.services.etherpad-lite = { + enable = lib.mkEnableOption "Enable Etherpad lite’s service"; + user = lib.mkOption { + type = lib.types.str; + default = name; + description = "User account under which Etherpad lite runs"; + }; + group = lib.mkOption { + type = lib.types.str; + default = name; + description = "Group under which Etherpad lite runs"; + }; + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/${name}"; + description = '' + The directory where Etherpad lite stores its data. + ''; + }; + socketsDir = lib.mkOption { + type = lib.types.path; + default = "/run/${name}"; + description = '' + The directory where Etherpad lite stores its sockets. + ''; + }; + configFile = lib.mkOption { + type = lib.types.path; + description = '' + The config file path for Etherpad lite. + ''; + }; + sessionKeyFile = lib.mkOption { + type = lib.types.path; + description = '' + The Session key file path for Etherpad lite. + ''; + }; + apiKeyFile = lib.mkOption { + type = lib.types.path; + description = '' + The API key file path for Etherpad lite. + ''; + }; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.etherpad-lite; + description = '' + Etherpad lite package to use. + ''; + example = lib.literalExample '' + pkgs.webapps.etherpad-lite.withModules (p: [ p.ep_align ]); + ''; + }; + modules = lib.mkOption { + type = lib.types.listOf lib.types.package; + default = []; + description = '' + Etherpad lite modules to use. + DEPRECATED: use package directly + ''; + }; + # Output variables + workdir = lib.mkOption { + type = lib.types.package; + default = cfg.package.withModules (_: cfg.modules); + description = '' + Adjusted Etherpad lite package with plugins + ''; + readOnly = true; + }; + systemdStateDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if varDir is outside of /var/lib + default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; + lib.strings.removePrefix "/var/lib/" cfg.dataDir; + description = '' + Adjusted Etherpad lite data directory for systemd + ''; + readOnly = true; + }; + systemdRuntimeDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if socketsDir is outside of /run + default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; + lib.strings.removePrefix "/run/" cfg.socketsDir; + description = '' + Adjusted Etherpad lite sockets directory for systemd + ''; + readOnly = true; + }; + sockets = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + node = "${cfg.socketsDir}/etherpad-lite.sock"; + }; + readOnly = true; + description = '' + Etherpad lite sockets + ''; + }; + }; + + config = lib.mkIf cfg.enable { + nixpkgs.overlays = [ self.overlay ]; + systemd.services.etherpad-lite-cleanup = { + description = "Etherpad-lite cleanup old mypads"; + after = [ "network.target" "postgresql.service" ]; + wants = [ "postgresql.service" ]; + + environment.NODE_ENV = "production"; + environment.HOME = cfg.workdir; + + path = [ cfg.workdir.nodejs ]; + + script = '' + exec ${cfg.workdir.nodejs}/bin/node ${cfg.workdir}/node_modules/ep_mypads/scripts/mypads-jobqueue-minion.js \ + --settings ${cfg.configFile} \ + --oneshot + ''; + + serviceConfig = { + DynamicUser = true; + User = cfg.user; + Group = cfg.group; + WorkingDirectory = "%T"; + PrivateTmp = true; + NoNewPrivileges = true; + PrivateDevices = true; + ProtectHome = true; + ProtectControlGroups = true; + ProtectKernelModules = true; + Type = "oneshot"; + }; + }; + systemd.services.etherpad-lite = { + description = "Etherpad-lite"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" "postgresql.service" ]; + wants = [ "postgresql.service" ]; + + environment.NODE_ENV = "production"; + environment.HOME = cfg.workdir; + + path = [ cfg.workdir.nodejs ]; + + script = '' + exec ${cfg.workdir.nodejs}/bin/node ${cfg.workdir}/src/node/server.js \ + --sessionkey ${cfg.sessionKeyFile} \ + --apikey ${cfg.apiKeyFile} \ + --settings ${cfg.configFile} + ''; + + postStart = '' + while [ ! -S ${cfg.sockets.node} ]; do + sleep 0.5 + done + chmod a+w ${cfg.sockets.node} + ''; + serviceConfig = { + DynamicUser = true; + User = cfg.user; + Group = cfg.group; + WorkingDirectory = cfg.workdir; + PrivateTmp = true; + NoNewPrivileges = true; + PrivateDevices = true; + ProtectHome = true; + ProtectControlGroups = true; + ProtectKernelModules = true; + Restart = "always"; + Type = "simple"; + TimeoutSec = 60; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + StateDirectory= cfg.systemdStateDirectory; + ExecStartPre = [ + "+${pkgs.coreutils}/bin/install -d -m 0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dataDir}/var ${cfg.dataDir}/ep_initialized" + "+${pkgs.coreutils}/bin/chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir} ${cfg.configFile} ${cfg.sessionKeyFile} ${cfg.apiKeyFile}" + ]; + }; + }; + + }; + }; + }; +} + + diff --git a/pkgs/webapps/etherpad-lite/libreoffice_patch.diff b/flakes/etherpad-lite/libreoffice_patch.diff similarity index 100% rename from pkgs/webapps/etherpad-lite/libreoffice_patch.diff rename to flakes/etherpad-lite/libreoffice_patch.diff diff --git a/pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json b/flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json rename to flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix b/flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix rename to flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.json b/flakes/etherpad-lite/modules/ep_adminpads/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.json rename to flakes/etherpad-lite/modules/ep_adminpads/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.nix b/flakes/etherpad-lite/modules/ep_adminpads/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.nix rename to flakes/etherpad-lite/modules/ep_adminpads/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.json b/flakes/etherpad-lite/modules/ep_align/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.json rename to flakes/etherpad-lite/modules/ep_align/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.nix b/flakes/etherpad-lite/modules/ep_align/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.nix rename to flakes/etherpad-lite/modules/ep_align/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.json b/flakes/etherpad-lite/modules/ep_bookmark/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.json rename to flakes/etherpad-lite/modules/ep_bookmark/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.nix b/flakes/etherpad-lite/modules/ep_bookmark/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.nix rename to flakes/etherpad-lite/modules/ep_bookmark/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.json b/flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.json rename to flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.nix b/flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.nix rename to flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.json b/flakes/etherpad-lite/modules/ep_colors/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.json rename to flakes/etherpad-lite/modules/ep_colors/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.nix b/flakes/etherpad-lite/modules/ep_colors/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.nix rename to flakes/etherpad-lite/modules/ep_colors/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.json b/flakes/etherpad-lite/modules/ep_comments_page/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.json rename to flakes/etherpad-lite/modules/ep_comments_page/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.nix b/flakes/etherpad-lite/modules/ep_comments_page/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.nix rename to flakes/etherpad-lite/modules/ep_comments_page/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json b/flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json rename to flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix b/flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix rename to flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.json b/flakes/etherpad-lite/modules/ep_cursortrace/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.json rename to flakes/etherpad-lite/modules/ep_cursortrace/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.nix b/flakes/etherpad-lite/modules/ep_cursortrace/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.nix rename to flakes/etherpad-lite/modules/ep_cursortrace/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json b/flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json rename to flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix b/flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix rename to flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/fix.patch b/flakes/etherpad-lite/modules/ep_embedmedia/fix.patch similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_embedmedia/fix.patch rename to flakes/etherpad-lite/modules/ep_embedmedia/fix.patch diff --git a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.json b/flakes/etherpad-lite/modules/ep_embedmedia/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.json rename to flakes/etherpad-lite/modules/ep_embedmedia/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.nix b/flakes/etherpad-lite/modules/ep_embedmedia/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.nix rename to flakes/etherpad-lite/modules/ep_embedmedia/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.json b/flakes/etherpad-lite/modules/ep_font_family/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.json rename to flakes/etherpad-lite/modules/ep_font_family/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.nix b/flakes/etherpad-lite/modules/ep_font_family/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.nix rename to flakes/etherpad-lite/modules/ep_font_family/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.json b/flakes/etherpad-lite/modules/ep_font_size/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.json rename to flakes/etherpad-lite/modules/ep_font_size/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.nix b/flakes/etherpad-lite/modules/ep_font_size/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.nix rename to flakes/etherpad-lite/modules/ep_font_size/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.json b/flakes/etherpad-lite/modules/ep_headings2/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.json rename to flakes/etherpad-lite/modules/ep_headings2/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.nix b/flakes/etherpad-lite/modules/ep_headings2/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.nix rename to flakes/etherpad-lite/modules/ep_headings2/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/ep.json b/flakes/etherpad-lite/modules/ep_immae_buttons/ep.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/ep.json rename to flakes/etherpad-lite/modules/ep_immae_buttons/ep.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/hooks.js b/flakes/etherpad-lite/modules/ep_immae_buttons/hooks.js similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/hooks.js rename to flakes/etherpad-lite/modules/ep_immae_buttons/hooks.js diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/node-packages.nix b/flakes/etherpad-lite/modules/ep_immae_buttons/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/node-packages.nix rename to flakes/etherpad-lite/modules/ep_immae_buttons/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/package.json b/flakes/etherpad-lite/modules/ep_immae_buttons/package.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/package.json rename to flakes/etherpad-lite/modules/ep_immae_buttons/package.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/static/js/main.js b/flakes/etherpad-lite/modules/ep_immae_buttons/static/js/main.js similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/static/js/main.js rename to flakes/etherpad-lite/modules/ep_immae_buttons/static/js/main.js diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs b/flakes/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs rename to flakes/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.json b/flakes/etherpad-lite/modules/ep_ldapauth/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.json rename to flakes/etherpad-lite/modules/ep_ldapauth/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.nix b/flakes/etherpad-lite/modules/ep_ldapauth/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.nix rename to flakes/etherpad-lite/modules/ep_ldapauth/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_line_height/fix.patch b/flakes/etherpad-lite/modules/ep_line_height/fix.patch similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_line_height/fix.patch rename to flakes/etherpad-lite/modules/ep_line_height/fix.patch diff --git a/pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.json b/flakes/etherpad-lite/modules/ep_line_height/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.json rename to flakes/etherpad-lite/modules/ep_line_height/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.nix b/flakes/etherpad-lite/modules/ep_line_height/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.nix rename to flakes/etherpad-lite/modules/ep_line_height/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.json b/flakes/etherpad-lite/modules/ep_markdown/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.json rename to flakes/etherpad-lite/modules/ep_markdown/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.nix b/flakes/etherpad-lite/modules/ep_markdown/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.nix rename to flakes/etherpad-lite/modules/ep_markdown/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_mypads/fix_ldap.patch b/flakes/etherpad-lite/modules/ep_mypads/fix_ldap.patch similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_mypads/fix_ldap.patch rename to flakes/etherpad-lite/modules/ep_mypads/fix_ldap.patch diff --git a/pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.json b/flakes/etherpad-lite/modules/ep_mypads/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.json rename to flakes/etherpad-lite/modules/ep_mypads/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.nix b/flakes/etherpad-lite/modules/ep_mypads/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.nix rename to flakes/etherpad-lite/modules/ep_mypads/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.json b/flakes/etherpad-lite/modules/ep_page_view/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.json rename to flakes/etherpad-lite/modules/ep_page_view/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.nix b/flakes/etherpad-lite/modules/ep_page_view/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.nix rename to flakes/etherpad-lite/modules/ep_page_view/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.json b/flakes/etherpad-lite/modules/ep_previewimages/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.json rename to flakes/etherpad-lite/modules/ep_previewimages/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.nix b/flakes/etherpad-lite/modules/ep_previewimages/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.nix rename to flakes/etherpad-lite/modules/ep_previewimages/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.json b/flakes/etherpad-lite/modules/ep_private_pad/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.json rename to flakes/etherpad-lite/modules/ep_private_pad/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.nix b/flakes/etherpad-lite/modules/ep_private_pad/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.nix rename to flakes/etherpad-lite/modules/ep_private_pad/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.json b/flakes/etherpad-lite/modules/ep_ruler/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.json rename to flakes/etherpad-lite/modules/ep_ruler/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.nix b/flakes/etherpad-lite/modules/ep_ruler/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.nix rename to flakes/etherpad-lite/modules/ep_ruler/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.json b/flakes/etherpad-lite/modules/ep_scrollto/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.json rename to flakes/etherpad-lite/modules/ep_scrollto/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.nix b/flakes/etherpad-lite/modules/ep_scrollto/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.nix rename to flakes/etherpad-lite/modules/ep_scrollto/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json b/flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json rename to flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix b/flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix rename to flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/font.patch b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/font.patch similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/font.patch rename to flakes/etherpad-lite/modules/ep_subscript_and_superscript/font.patch diff --git a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json rename to flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix rename to flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.json b/flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.json similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.json rename to flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.json diff --git a/pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix b/flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix rename to flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix diff --git a/pkgs/webapps/etherpad-lite/node-packages.nix b/flakes/etherpad-lite/node-packages.nix similarity index 100% rename from pkgs/webapps/etherpad-lite/node-packages.nix rename to flakes/etherpad-lite/node-packages.nix diff --git a/flakes/files-watcher/flake.nix b/flakes/files-watcher/flake.nix index 29ea428..3be566d 100644 --- a/flakes/files-watcher/flake.nix +++ b/flakes/files-watcher/flake.nix @@ -2,6 +2,8 @@ description = "Module to watch fo file changes to force restart systemd service"; outputs = { self }: { nixosModule = { config, lib, pkgs, ... }: let cfg = config.services.filesWatcher; in with lib; { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); options = { services.filesWatcher = with lib.types; mkOption { default = {}; diff --git a/flakes/flake.lock b/flakes/flake.lock new file mode 100644 index 0000000..c65312c --- /dev/null +++ b/flakes/flake.lock @@ -0,0 +1,9669 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_6", + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_2": { + "inputs": { + "flake-utils": "flake-utils_8", + "nixpkgs": "nixpkgs_17" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_3": { + "inputs": { + "flake-utils": "flake-utils_20", + "nixpkgs": "nixpkgs_33" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_4": { + "inputs": { + "flake-utils": "flake-utils_34", + "nixpkgs": "nixpkgs_56" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_5": { + "inputs": { + "flake-utils": "flake-utils_37", + "nixpkgs": "nixpkgs_64" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_6": { + "inputs": { + "flake-utils": "flake-utils_39", + "nixpkgs": "nixpkgs_71" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "backports_7": { + "inputs": { + "flake-utils": "flake-utils_61", + "nixpkgs": "nixpkgs_100" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "buildslist": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "buildslist_2": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "chatons": { + "inputs": { + "environment": "environment" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "chatons_2": { + "inputs": { + "environment": "environment_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_3", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_2": { + "inputs": { + "flake-compat": "flake-compat_2", + "flake-utils": "flake-utils_7", + "nixpkgs": "nixpkgs_12", + "stable": "stable_2" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_3": { + "inputs": { + "flake-compat": "flake-compat_3", + "flake-utils": "flake-utils_10", + "nixpkgs": "nixpkgs_19", + "stable": "stable_3" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_4": { + "inputs": { + "flake-compat": "flake-compat_4", + "flake-utils": "flake-utils_32", + "nixpkgs": "nixpkgs_50", + "stable": "stable_4" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_5": { + "inputs": { + "flake-compat": "flake-compat_5", + "flake-utils": "flake-utils_35", + "nixpkgs": "nixpkgs_58", + "stable": "stable_5" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_6": { + "inputs": { + "flake-compat": "flake-compat_6", + "flake-utils": "flake-utils_38", + "nixpkgs": "nixpkgs_66", + "stable": "stable_6" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "colmena_7": { + "inputs": { + "flake-compat": "flake-compat_7", + "flake-utils": "flake-utils_45", + "nixpkgs": "nixpkgs_80", + "stable": "stable_7" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "copanier": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "copanier_2": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "diaspora": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "diaspora_2": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_2": { + "inputs": { + "nixpkgs": "nixpkgs_13" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_3": { + "inputs": { + "nixpkgs": "nixpkgs_20" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_4": { + "inputs": { + "nixpkgs": "nixpkgs_51" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_5": { + "inputs": { + "nixpkgs": "nixpkgs_59" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_6": { + "inputs": { + "nixpkgs": "nixpkgs_67" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "disko_7": { + "inputs": { + "nixpkgs": "nixpkgs_81" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "dns-nix": { + "inputs": { + "flake-utils": "flake-utils_9", + "nixpkgs": [ + "n-eldiron", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1635273082, + "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=", + "owner": "kirelagin", + "repo": "dns.nix", + "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a", + "type": "github" + }, + "original": { + "owner": "kirelagin", + "repo": "dns.nix", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_27": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_28": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_29": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_30": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_31": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_32": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_33": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "etherpad-lite": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "etherpad-lite_2": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "files-watcher_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_5": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_6": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_7": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_10": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_13" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_11": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_15" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_12": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_16" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_13": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_18" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_14": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_19" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_15": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_20" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_16": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_21" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_17": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_22" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_18": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_23" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_19": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_24" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_20": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_25" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_21": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_27" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_22": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_28" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_5" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_4": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_6" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_5": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_7" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_6": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_9" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_7": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_10" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_8": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_11" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_9": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_12" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_10": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_11": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_12": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_13": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_14": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_15": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_16": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_17": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_18": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_19": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_20": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_21": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_22": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_23": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_24": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_25": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_26": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_27": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_28": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_29": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_30": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_31": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_32": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_33": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_34": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_35": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_36": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_37": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_38": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_39": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_40": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_41": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_42": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_43": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_44": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_45": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_46": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_47": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_48": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_49": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_50": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_51": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_52": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_53": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_54": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_55": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_56": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_57": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_58": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_59": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_6": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_60": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_61": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_62": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_63": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_7": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_8": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_9": { + "locked": { + "lastModified": 1614513358, + "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "grocy": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "grocy_2": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "impermanence": { + "locked": { + "lastModified": 1684264534, + "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=", + "owner": "nix-community", + "repo": "impermanence", + "rev": "89253fb1518063556edd5e54509c30ac3089d5e6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "impermanence", + "type": "github" + } + }, + "landing-page": { + "flake": false, + "locked": { + "lastModified": 1691524124, + "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=", + "ref": "main", + "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf", + "revCount": 573, + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + }, + "original": { + "ref": "main", + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + } + }, + "loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "loginctl-linger_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "loginctl-linger_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "mail-relay": { + "inputs": { + "environment": "environment_3", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "mail-relay_2": { + "inputs": { + "environment": "environment_20", + "secrets": "secrets_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "mastodon": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mastodon_2": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mediagoblin": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "mediagoblin_2": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "milters": { + "inputs": { + "environment": "environment_4", + "files-watcher": "files-watcher", + "openarc": "openarc", + "opendmarc": "opendmarc", + "secrets": "secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_5", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_2": { + "inputs": { + "environment": "environment_9", + "naemon": "naemon_2", + "nixpkgs-lib": "nixpkgs-lib_4", + "secrets": "secrets_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_3": { + "inputs": { + "environment": "environment_21", + "naemon": "naemon_4", + "nixpkgs-lib": "nixpkgs-lib_14", + "secrets": "secrets_16" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "monitoring_4": { + "inputs": { + "environment": "environment_24", + "naemon": "naemon_5", + "nixpkgs-lib": "nixpkgs-lib_17", + "secrets": "secrets_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_11", + "myuids": "myuids_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_2": { + "inputs": { + "colmena": "colmena_2", + "disko": "disko_2", + "flake-parts": "flake-parts_3", + "nixos-anywhere": "nixos-anywhere_2", + "nixpkgs": "nixpkgs_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_3": { + "inputs": { + "colmena": "colmena_3", + "disko": "disko_3", + "flake-parts": "flake-parts_5", + "nixos-anywhere": "nixos-anywhere_3", + "nixpkgs": "nixpkgs_22" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_4": { + "inputs": { + "colmena": "colmena_4", + "disko": "disko_4", + "flake-parts": "flake-parts_11", + "nixos-anywhere": "nixos-anywhere_4", + "nixpkgs": "nixpkgs_53" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_5": { + "inputs": { + "colmena": "colmena_5", + "disko": "disko_5", + "flake-parts": "flake-parts_13", + "nixos-anywhere": "nixos-anywhere_5", + "nixpkgs": "nixpkgs_61" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "my-lib_6": { + "inputs": { + "colmena": "colmena_6", + "disko": "disko_6", + "flake-parts": "flake-parts_15", + "nixos-anywhere": "nixos-anywhere_6", + "nixpkgs": "nixpkgs_69" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_11", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_10": { + "inputs": { + "flake-parts": "flake-parts_17", + "nixpkgs": "nixpkgs_76", + "webapps-ttrss": "webapps-ttrss_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_11": { + "inputs": { + "flake-parts": "flake-parts_18", + "nixpkgs": "nixpkgs_78", + "webapps-ttrss": "webapps-ttrss_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_12": { + "inputs": { + "flake-parts": "flake-parts_21", + "nixpkgs": "nixpkgs_101", + "webapps-ttrss": "webapps-ttrss_14" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_13": { + "inputs": { + "flake-parts": "flake-parts_22", + "nixpkgs": "nixpkgs_102", + "webapps-ttrss": "webapps-ttrss_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_2": { + "inputs": { + "flake-parts": "flake-parts_4", + "nixpkgs": "nixpkgs_18", + "webapps-ttrss": "webapps-ttrss_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_3": { + "inputs": { + "flake-parts": "flake-parts_6", + "nixpkgs": "nixpkgs_34", + "webapps-ttrss": "webapps-ttrss_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_4": { + "inputs": { + "flake-parts": "flake-parts_7", + "nixpkgs": "nixpkgs_37", + "webapps-ttrss": "webapps-ttrss_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_5": { + "inputs": { + "flake-parts": "flake-parts_8", + "nixpkgs": "nixpkgs_39", + "webapps-ttrss": "webapps-ttrss_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_6": { + "inputs": { + "flake-parts": "flake-parts_10", + "nixpkgs": "nixpkgs_47", + "webapps-ttrss": "webapps-ttrss_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_7": { + "inputs": { + "flake-parts": "flake-parts_12", + "nixpkgs": "nixpkgs_57", + "webapps-ttrss": "webapps-ttrss_8" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_8": { + "inputs": { + "flake-parts": "flake-parts_14", + "nixpkgs": "nixpkgs_65", + "webapps-ttrss": "webapps-ttrss_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_9": { + "inputs": { + "flake-parts": "flake-parts_16", + "nixpkgs": "nixpkgs_72", + "webapps-ttrss": "webapps-ttrss_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_27": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_28": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_29": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_30": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_31": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_32": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_33": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_34": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_35": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_36": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_37": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_38": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_39": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_40": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_41": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_42": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "n-backup-2": { + "inputs": { + "chatons": "chatons", + "environment": "environment_2", + "loginctl-linger": "loginctl-linger", + "mail-relay": "mail-relay", + "milters": "milters", + "monitoring": "monitoring", + "my-lib": "my-lib", + "myuids": "myuids_3", + "nixpkgs": "nixpkgs_7", + "openarc": "openarc_3", + "opendmarc": "opendmarc_2", + "openldap": "openldap", + "rsync_backup": "rsync_backup", + "secrets": "secrets_6", + "system": "system" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0CPGGyOWQadU9c8y+A4XtveOrmkMlFiH+WJ55RPzJnE=", + "path": "../systems/backup-2", + "type": "path" + }, + "original": { + "path": "../systems/backup-2", + "type": "path" + } + }, + "n-dilion": { + "inputs": { + "environment": "environment_8", + "files-watcher": "files-watcher_4", + "loginctl-linger": "loginctl-linger_2", + "monitoring": "monitoring_2", + "my-lib": "my-lib_2", + "myuids": "myuids_7", + "nixpkgs": "nixpkgs_16", + "secrets": "secrets_8", + "ssh": "ssh", + "system": "system_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Ctp8QY0OkGwv/YkOlipwM1ldEz7OebVDbAqg1O/tRe8=", + "path": "../systems/dilion", + "type": "path" + }, + "original": { + "path": "../systems/dilion", + "type": "path" + } + }, + "n-eldiron": { + "inputs": { + "dns-nix": "dns-nix", + "my-lib": "my-lib_3", + "nixpkgs": "nixpkgs_23", + "private-buildbot": "private-buildbot", + "private-chatons": "private-chatons", + "private-environment": "private-environment", + "private-milters": "private-milters", + "private-monitoring": "private-monitoring", + "private-openarc": "private-openarc", + "private-opendmarc": "private-opendmarc", + "private-openldap": "private-openldap", + "private-paste": "private-paste", + "private-peertube": "private-peertube", + "private-php": "private-php", + "private-ssh": "private-ssh", + "private-system": "private-system", + "public-copanier": "public-copanier", + "public-diaspora": "public-diaspora", + "public-etherpad-lite": "public-etherpad-lite", + "public-fiche": "public-fiche", + "public-files-watcher": "public-files-watcher", + "public-grocy": "public-grocy", + "public-loginctl-linger": "public-loginctl-linger", + "public-mastodon": "public-mastodon", + "public-mediagoblin": "public-mediagoblin", + "public-multi-apache-container": "public-multi-apache-container", + "public-mypackages": "public-mypackages", + "public-myuids": "public-myuids", + "public-openarc": "public-openarc", + "public-opendmarc": "public-opendmarc", + "public-peertube": "public-peertube", + "public-secrets": "public-secrets", + "public-surfer": "public-surfer", + "public-taskwarrior-web": "public-taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-g9f3SCavl9ssNr8Xw9Z8KkpeEwCYv+47dqwoIPneMSs=", + "path": "../systems/eldiron", + "type": "path" + }, + "original": { + "path": "../systems/eldiron", + "type": "path" + } + }, + "n-monitoring-1": { + "inputs": { + "chatons": "chatons_2", + "environment": "environment_19", + "files-watcher": "files-watcher_9", + "loginctl-linger": "loginctl-linger_3", + "mail-relay": "mail-relay_2", + "monitoring": "monitoring_3", + "my-lib": "my-lib_4", + "myuids": "myuids_23", + "nixpkgs": "nixpkgs_54", + "php": "php", + "secrets": "secrets_17", + "system": "system_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-kLIVhZAxEWcN3W1AaF/gmopYuRdq0U43jkA4hliY50I=", + "path": "../systems/monitoring-1", + "type": "path" + }, + "original": { + "path": "../systems/monitoring-1", + "type": "path" + } + }, + "n-quatresaisons": { + "inputs": { + "environment": "environment_23", + "files-watcher": "files-watcher_10", + "landing-page": "landing-page", + "monitoring": "monitoring_4", + "multi-apache-container": "multi-apache-container", + "my-lib": "my-lib_5", + "myuids": "myuids_26", + "nixpkgs": "nixpkgs_62", + "php": "php_2", + "secrets": "secrets_19", + "system": "system_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-FtjFgqcSXs0dTkbUggbPwaDeCoOoYZragHCUkcyq538=", + "path": "../systems/quatresaisons", + "type": "path" + }, + "original": { + "path": "../systems/quatresaisons", + "type": "path" + } + }, + "n-zoldene": { + "inputs": { + "impermanence": "impermanence", + "my-lib": "my-lib_6", + "nixpkgs": "nixpkgs_70", + "private-environment": "private-environment_2", + "private-system": "private-system_2", + "public-secrets": "public-secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-YSYLjETf7yMwdHeEisU1V7e5O3yB+YxVoIPLi00PCdo=", + "path": "../systems/zoldene", + "type": "path" + }, + "original": { + "path": "../systems/zoldene", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "naemon_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_2": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_3": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_4": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_5": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_6": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-2305_7": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "n-backup-2", + "my-lib", + "disko" + ], + "flake-parts": [ + "n-backup-2", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_5", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_2": { + "inputs": { + "disko": [ + "n-dilion", + "my-lib", + "disko" + ], + "flake-parts": [ + "n-dilion", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_2", + "nixos-images": "nixos-images_2", + "nixpkgs": "nixpkgs_14", + "treefmt-nix": "treefmt-nix_2" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_3": { + "inputs": { + "disko": [ + "n-eldiron", + "my-lib", + "disko" + ], + "flake-parts": [ + "n-eldiron", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_3", + "nixos-images": "nixos-images_3", + "nixpkgs": "nixpkgs_21", + "treefmt-nix": "treefmt-nix_3" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_4": { + "inputs": { + "disko": [ + "n-monitoring-1", + "my-lib", + "disko" + ], + "flake-parts": [ + "n-monitoring-1", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_4", + "nixos-images": "nixos-images_4", + "nixpkgs": "nixpkgs_52", + "treefmt-nix": "treefmt-nix_4" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_5": { + "inputs": { + "disko": [ + "n-quatresaisons", + "my-lib", + "disko" + ], + "flake-parts": [ + "n-quatresaisons", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_5", + "nixos-images": "nixos-images_5", + "nixpkgs": "nixpkgs_60", + "treefmt-nix": "treefmt-nix_5" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_6": { + "inputs": { + "disko": [ + "n-zoldene", + "my-lib", + "disko" + ], + "flake-parts": [ + "n-zoldene", + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_6", + "nixos-images": "nixos-images_6", + "nixpkgs": "nixpkgs_68", + "treefmt-nix": "treefmt-nix_6" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-anywhere_7": { + "inputs": { + "disko": [ + "s-lib", + "disko" + ], + "flake-parts": [ + "s-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305_7", + "nixos-images": "nixos-images_7", + "nixpkgs": "nixpkgs_82", + "treefmt-nix": "treefmt-nix_7" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_2": { + "inputs": { + "nixos-2305": [ + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_3": { + "inputs": { + "nixos-2305": [ + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_4": { + "inputs": { + "nixos-2305": [ + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_5": { + "inputs": { + "nixos-2305": [ + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_6": { + "inputs": { + "nixos-2305": [ + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixos-images_7": { + "inputs": { + "nixos-2305": [ + "s-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "s-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_2": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_3": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-4_4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_10": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_11": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_12": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_13": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_14": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_15": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_16": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_17": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_18": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_19": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_20": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_21": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_22": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_23": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_24": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_25": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_26": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_27": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_28": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_4": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_5": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_6": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_7": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_8": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_9": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_100": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_101": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_102": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_103": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_104": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_12": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_13": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_14": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_15": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_16": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_17": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_18": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_19": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_20": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_21": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_22": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_23": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_24": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_25": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_26": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_27": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_28": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_29": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_30": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_31": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_32": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_33": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_34": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_35": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_36": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_37": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_38": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_39": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_40": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_41": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_42": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_43": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_44": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_45": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_46": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_47": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_48": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_49": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_50": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_51": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_52": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_53": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_54": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_55": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_56": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_57": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_58": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_59": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_60": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_61": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_62": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_63": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_64": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_65": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_66": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_67": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_68": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_69": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_70": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_71": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_72": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_73": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_74": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_75": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_76": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_77": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_78": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_79": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_80": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_81": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_82": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_83": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_84": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_85": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_86": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_87": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_88": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_89": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_90": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_91": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_92": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_93": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_94": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_95": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_96": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_97": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_98": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_99": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "openarc": { + "inputs": { + "flake-utils": "flake-utils", + "myuids": "myuids", + "nixpkgs": "nixpkgs", + "openarc": "openarc_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_10": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_11": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_12": { + "inputs": { + "flake-utils": "flake-utils_53", + "myuids": "myuids_36", + "nixpkgs": "nixpkgs_92", + "openarc": "openarc_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_13": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_14": { + "inputs": { + "flake-utils": "flake-utils_55", + "myuids": "myuids_38", + "nixpkgs": "nixpkgs_94", + "openarc": "openarc_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_15": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_2": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_3": { + "inputs": { + "files-watcher": "files-watcher_2", + "openarc": "openarc_4", + "secrets": "secrets_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "openarc_4": { + "inputs": { + "flake-utils": "flake-utils_4", + "myuids": "myuids_4", + "nixpkgs": "nixpkgs_8", + "openarc": "openarc_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_5": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_6": { + "inputs": { + "flake-utils": "flake-utils_12", + "myuids": "myuids_9", + "nixpkgs": "nixpkgs_25", + "openarc": "openarc_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_7": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_8": { + "inputs": { + "flake-utils": "flake-utils_14", + "myuids": "myuids_11", + "nixpkgs": "nixpkgs_27", + "openarc": "openarc_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_9": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "opendmarc": { + "inputs": { + "flake-utils": "flake-utils_2", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_2": { + "inputs": { + "environment": "environment_6", + "files-watcher": "files-watcher_3", + "opendmarc": "opendmarc_3", + "secrets": "secrets_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "opendmarc_3": { + "inputs": { + "flake-utils": "flake-utils_5", + "myuids": "myuids_5", + "nixpkgs": "nixpkgs_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_4": { + "inputs": { + "flake-utils": "flake-utils_13", + "myuids": "myuids_10", + "nixpkgs": "nixpkgs_26" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_5": { + "inputs": { + "flake-utils": "flake-utils_15", + "myuids": "myuids_12", + "nixpkgs": "nixpkgs_28" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_6": { + "inputs": { + "flake-utils": "flake-utils_54", + "myuids": "myuids_37", + "nixpkgs": "nixpkgs_93" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_7": { + "inputs": { + "flake-utils": "flake-utils_56", + "myuids": "myuids_39", + "nixpkgs": "nixpkgs_95" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "paste": { + "inputs": { + "flake-utils": "flake-utils_16", + "nixpkgs": "nixpkgs_29" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "paste_2": { + "inputs": { + "flake-utils": "flake-utils_57", + "nixpkgs": "nixpkgs_96" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "peertube": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_2": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_3": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_4": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_5": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_6": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_open_instance": { + "inputs": { + "flake-utils": "flake-utils_17", + "myuids": "myuids_13", + "nixpkgs": "nixpkgs_30", + "peertube": "peertube" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_open_instance_2": { + "inputs": { + "flake-utils": "flake-utils_58", + "myuids": "myuids_40", + "nixpkgs": "nixpkgs_97", + "peertube": "peertube_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin": { + "inputs": { + "flake-utils": "flake-utils_18", + "myuids": "myuids_14", + "nixpkgs": "nixpkgs_31", + "peertube": "peertube_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin_2": { + "inputs": { + "flake-utils": "flake-utils_59", + "myuids": "myuids_41", + "nixpkgs": "nixpkgs_98", + "peertube": "peertube_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "php": { + "inputs": { + "flake-utils": "flake-utils_33", + "nixpkgs": "nixpkgs_55", + "nixpkgs-4": "nixpkgs-4_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "php_2": { + "inputs": { + "flake-utils": "flake-utils_36", + "nixpkgs": "nixpkgs_63", + "nixpkgs-4": "nixpkgs-4_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-buildbot": { + "inputs": { + "buildslist": "buildslist", + "flake-utils": "flake-utils_11", + "nixpkgs": "nixpkgs_24" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "../../flakes/private/buildbot", + "type": "path" + }, + "original": { + "path": "../../flakes/private/buildbot", + "type": "path" + } + }, + "private-chatons": { + "inputs": { + "environment": "environment_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-milters": { + "inputs": { + "environment": "environment_13", + "files-watcher": "files-watcher_5", + "openarc": "openarc_6", + "opendmarc": "opendmarc_4", + "secrets": "secrets_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "private-monitoring": { + "inputs": { + "environment": "environment_14", + "naemon": "naemon_3", + "nixpkgs-lib": "nixpkgs-lib_8", + "secrets": "secrets_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "private-openarc": { + "inputs": { + "files-watcher": "files-watcher_6", + "openarc": "openarc_8", + "secrets": "secrets_12" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "private-opendmarc": { + "inputs": { + "environment": "environment_15", + "files-watcher": "files-watcher_7", + "opendmarc": "opendmarc_5", + "secrets": "secrets_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "private-paste": { + "inputs": { + "paste": "paste" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "../../flakes/private/paste", + "type": "path" + }, + "original": { + "path": "../../flakes/private/paste", + "type": "path" + } + }, + "private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance", + "peertube_origin": "peertube_origin" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "../../flakes/private/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/private/peertube", + "type": "path" + } + }, + "private-php": { + "inputs": { + "flake-utils": "flake-utils_19", + "nixpkgs": "nixpkgs_32", + "nixpkgs-4": "nixpkgs-4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-ssh": { + "inputs": { + "environment": "environment_16", + "secrets": "secrets_14" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "private-system": { + "inputs": { + "backports": "backports_3", + "environment": "environment_17", + "mypackages": "mypackages_3", + "myuids": "myuids_15", + "secrets-public": "secrets-public_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "private-system_2": { + "inputs": { + "backports": "backports_6", + "environment": "environment_26", + "mypackages": "mypackages_9", + "myuids": "myuids_28", + "secrets-public": "secrets-public_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "public-copanier": { + "inputs": { + "copanier": "copanier", + "flake-utils": "flake-utils_21", + "nixpkgs": "nixpkgs_35" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "../../flakes/copanier", + "type": "path" + }, + "original": { + "path": "../../flakes/copanier", + "type": "path" + } + }, + "public-diaspora": { + "inputs": { + "diaspora": "diaspora", + "flake-utils": "flake-utils_22", + "myuids": "myuids_16", + "nixpkgs": "nixpkgs_36" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "../../flakes/diaspora", + "type": "path" + }, + "original": { + "path": "../../flakes/diaspora", + "type": "path" + } + }, + "public-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite", + "flake-utils": "flake-utils_23", + "mypackages": "mypackages_4", + "nixpkgs": "nixpkgs_38" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "../../flakes/etherpad-lite", + "type": "path" + }, + "original": { + "path": "../../flakes/etherpad-lite", + "type": "path" + } + }, + "public-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "../../flakes/fiche", + "type": "path" + }, + "original": { + "path": "../../flakes/fiche", + "type": "path" + } + }, + "public-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "public-grocy": { + "inputs": { + "flake-utils": "flake-utils_24", + "grocy": "grocy", + "mypackages": "mypackages_5", + "nixpkgs": "nixpkgs_40" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "../../flakes/grocy", + "type": "path" + }, + "original": { + "path": "../../flakes/grocy", + "type": "path" + } + }, + "public-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "public-mastodon": { + "inputs": { + "flake-utils": "flake-utils_25", + "mastodon": "mastodon", + "myuids": "myuids_17", + "nixpkgs": "nixpkgs_41" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "../../flakes/mastodon", + "type": "path" + }, + "original": { + "path": "../../flakes/mastodon", + "type": "path" + } + }, + "public-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_26", + "mediagoblin": "mediagoblin", + "myuids": "myuids_18", + "nixpkgs": "nixpkgs_42" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "../../flakes/mediagoblin", + "type": "path" + }, + "original": { + "path": "../../flakes/mediagoblin", + "type": "path" + } + }, + "public-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_8", + "myuids": "myuids_19" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "public-mypackages": { + "inputs": { + "flake-parts": "flake-parts_9", + "nixpkgs": "nixpkgs_43", + "webapps-ttrss": "webapps-ttrss_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../flakes/mypackages", + "type": "path" + }, + "original": { + "path": "../../flakes/mypackages", + "type": "path" + } + }, + "public-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "public-openarc": { + "inputs": { + "flake-utils": "flake-utils_27", + "myuids": "myuids_20", + "nixpkgs": "nixpkgs_44", + "openarc": "openarc_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../flakes/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/openarc", + "type": "path" + } + }, + "public-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_28", + "myuids": "myuids_21", + "nixpkgs": "nixpkgs_45" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../flakes/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/opendmarc", + "type": "path" + } + }, + "public-peertube": { + "inputs": { + "flake-utils": "flake-utils_29", + "myuids": "myuids_22", + "nixpkgs": "nixpkgs_46", + "peertube": "peertube_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "../../flakes/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/peertube", + "type": "path" + } + }, + "public-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-surfer": { + "inputs": { + "flake-utils": "flake-utils_30", + "mypackages": "mypackages_6", + "nixpkgs": "nixpkgs_48", + "surfer": "surfer" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "../../flakes/surfer", + "type": "path" + }, + "original": { + "path": "../../flakes/surfer", + "type": "path" + } + }, + "public-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_31", + "nixpkgs": "nixpkgs_49", + "taskwarrior-web": "taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "../../flakes/taskwarrior-web", + "type": "path" + }, + "original": { + "path": "../../flakes/taskwarrior-web", + "type": "path" + } + }, + "root": { + "inputs": { + "n-backup-2": "n-backup-2", + "n-dilion": "n-dilion", + "n-eldiron": "n-eldiron", + "n-monitoring-1": "n-monitoring-1", + "n-quatresaisons": "n-quatresaisons", + "n-zoldene": "n-zoldene", + "s-backports": "s-backports", + "s-copanier": "s-copanier", + "s-diaspora": "s-diaspora", + "s-etherpad-lite": "s-etherpad-lite", + "s-fiche": "s-fiche", + "s-files-watcher": "s-files-watcher", + "s-grocy": "s-grocy", + "s-lib": "s-lib", + "s-loginctl-linger": "s-loginctl-linger", + "s-mastodon": "s-mastodon", + "s-mediagoblin": "s-mediagoblin", + "s-multi-apache-container": "s-multi-apache-container", + "s-mypackages": "s-mypackages", + "s-myuids": "s-myuids", + "s-naemon": "s-naemon", + "s-openarc": "s-openarc", + "s-opendmarc": "s-opendmarc", + "s-paste": "s-paste", + "s-peertube": "s-peertube", + "s-private-buildbot": "s-private-buildbot", + "s-private-chatons": "s-private-chatons", + "s-private-environment": "s-private-environment", + "s-private-mail-relay": "s-private-mail-relay", + "s-private-milters": "s-private-milters", + "s-private-monitoring": "s-private-monitoring", + "s-private-openarc": "s-private-openarc", + "s-private-opendmarc": "s-private-opendmarc", + "s-private-openldap": "s-private-openldap", + "s-private-paste": "s-private-paste", + "s-private-peertube": "s-private-peertube", + "s-private-php": "s-private-php", + "s-private-ssh": "s-private-ssh", + "s-private-system": "s-private-system", + "s-rsync_backup": "s-rsync_backup", + "s-secrets": "s-secrets", + "s-surfer": "s-surfer", + "s-taskwarrior-web": "s-taskwarrior-web", + "secrets": "secrets_26" + } + }, + "rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "../../flakes/rsync_backup", + "type": "path" + }, + "original": { + "path": "../../flakes/rsync_backup", + "type": "path" + } + }, + "s-backports": { + "inputs": { + "flake-utils": "flake-utils_40", + "nixpkgs": "nixpkgs_73" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "./backports", + "type": "path" + }, + "original": { + "path": "./backports", + "type": "path" + } + }, + "s-copanier": { + "inputs": { + "copanier": "copanier_2", + "flake-utils": "flake-utils_41", + "nixpkgs": "nixpkgs_74" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "./copanier", + "type": "path" + }, + "original": { + "path": "./copanier", + "type": "path" + } + }, + "s-diaspora": { + "inputs": { + "diaspora": "diaspora_2", + "flake-utils": "flake-utils_42", + "myuids": "myuids_29", + "nixpkgs": "nixpkgs_75" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "./diaspora", + "type": "path" + }, + "original": { + "path": "./diaspora", + "type": "path" + } + }, + "s-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite_2", + "flake-utils": "flake-utils_43", + "mypackages": "mypackages_10", + "nixpkgs": "nixpkgs_77" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "./etherpad-lite", + "type": "path" + }, + "original": { + "path": "./etherpad-lite", + "type": "path" + } + }, + "s-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "./fiche", + "type": "path" + }, + "original": { + "path": "./fiche", + "type": "path" + } + }, + "s-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "./files-watcher", + "type": "path" + }, + "original": { + "path": "./files-watcher", + "type": "path" + } + }, + "s-grocy": { + "inputs": { + "flake-utils": "flake-utils_44", + "grocy": "grocy_2", + "mypackages": "mypackages_11", + "nixpkgs": "nixpkgs_79" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "./grocy", + "type": "path" + }, + "original": { + "path": "./grocy", + "type": "path" + } + }, + "s-lib": { + "inputs": { + "colmena": "colmena_7", + "disko": "disko_7", + "flake-parts": "flake-parts_19", + "nixos-anywhere": "nixos-anywhere_7", + "nixpkgs": "nixpkgs_83" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "./lib", + "type": "path" + }, + "original": { + "path": "./lib", + "type": "path" + } + }, + "s-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "./loginctl-linger", + "type": "path" + }, + "original": { + "path": "./loginctl-linger", + "type": "path" + } + }, + "s-mastodon": { + "inputs": { + "flake-utils": "flake-utils_46", + "mastodon": "mastodon_2", + "myuids": "myuids_30", + "nixpkgs": "nixpkgs_84" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "./mastodon", + "type": "path" + }, + "original": { + "path": "./mastodon", + "type": "path" + } + }, + "s-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_47", + "mediagoblin": "mediagoblin_2", + "myuids": "myuids_31", + "nixpkgs": "nixpkgs_85" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "./mediagoblin", + "type": "path" + }, + "original": { + "path": "./mediagoblin", + "type": "path" + } + }, + "s-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_12", + "myuids": "myuids_32" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "./multi-apache-container", + "type": "path" + }, + "original": { + "path": "./multi-apache-container", + "type": "path" + } + }, + "s-mypackages": { + "inputs": { + "flake-parts": "flake-parts_20", + "nixpkgs": "nixpkgs_86", + "webapps-ttrss": "webapps-ttrss_13" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "./mypackages", + "type": "path" + }, + "original": { + "path": "./mypackages", + "type": "path" + } + }, + "s-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "./myuids", + "type": "path" + }, + "original": { + "path": "./myuids", + "type": "path" + } + }, + "s-naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "./naemon", + "type": "path" + }, + "original": { + "path": "./naemon", + "type": "path" + } + }, + "s-openarc": { + "inputs": { + "flake-utils": "flake-utils_48", + "myuids": "myuids_33", + "nixpkgs": "nixpkgs_87", + "openarc": "openarc_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "./openarc", + "type": "path" + }, + "original": { + "path": "./openarc", + "type": "path" + } + }, + "s-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_49", + "myuids": "myuids_34", + "nixpkgs": "nixpkgs_88" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "./opendmarc", + "type": "path" + }, + "original": { + "path": "./opendmarc", + "type": "path" + } + }, + "s-paste": { + "inputs": { + "flake-utils": "flake-utils_50", + "nixpkgs": "nixpkgs_89" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "./paste", + "type": "path" + }, + "original": { + "path": "./paste", + "type": "path" + } + }, + "s-peertube": { + "inputs": { + "flake-utils": "flake-utils_51", + "myuids": "myuids_35", + "nixpkgs": "nixpkgs_90", + "peertube": "peertube_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./peertube", + "type": "path" + }, + "original": { + "path": "./peertube", + "type": "path" + } + }, + "s-private-buildbot": { + "inputs": { + "buildslist": "buildslist_2", + "flake-utils": "flake-utils_52", + "nixpkgs": "nixpkgs_91" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "./private/buildbot", + "type": "path" + }, + "original": { + "path": "./private/buildbot", + "type": "path" + } + }, + "s-private-chatons": { + "inputs": { + "environment": "environment_27" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "./private/chatons", + "type": "path" + }, + "original": { + "path": "./private/chatons", + "type": "path" + } + }, + "s-private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "./private/environment", + "type": "path" + }, + "original": { + "path": "./private/environment", + "type": "path" + } + }, + "s-private-mail-relay": { + "inputs": { + "environment": "environment_28", + "secrets": "secrets_20" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "./private/mail-relay", + "type": "path" + }, + "original": { + "path": "./private/mail-relay", + "type": "path" + } + }, + "s-private-milters": { + "inputs": { + "environment": "environment_29", + "files-watcher": "files-watcher_13", + "openarc": "openarc_12", + "opendmarc": "opendmarc_6", + "secrets": "secrets_21" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "./private/milters", + "type": "path" + }, + "original": { + "path": "./private/milters", + "type": "path" + } + }, + "s-private-monitoring": { + "inputs": { + "environment": "environment_30", + "naemon": "naemon_6", + "nixpkgs-lib": "nixpkgs-lib_26", + "secrets": "secrets_22" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "./private/monitoring", + "type": "path" + }, + "original": { + "path": "./private/monitoring", + "type": "path" + } + }, + "s-private-openarc": { + "inputs": { + "files-watcher": "files-watcher_14", + "openarc": "openarc_14", + "secrets": "secrets_23" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "./private/openarc", + "type": "path" + }, + "original": { + "path": "./private/openarc", + "type": "path" + } + }, + "s-private-opendmarc": { + "inputs": { + "environment": "environment_31", + "files-watcher": "files-watcher_15", + "opendmarc": "opendmarc_7", + "secrets": "secrets_24" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "./private/opendmarc", + "type": "path" + }, + "original": { + "path": "./private/opendmarc", + "type": "path" + } + }, + "s-private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "./private/openldap", + "type": "path" + }, + "original": { + "path": "./private/openldap", + "type": "path" + } + }, + "s-private-paste": { + "inputs": { + "paste": "paste_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "./private/paste", + "type": "path" + }, + "original": { + "path": "./private/paste", + "type": "path" + } + }, + "s-private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance_2", + "peertube_origin": "peertube_origin_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "./private/peertube", + "type": "path" + }, + "original": { + "path": "./private/peertube", + "type": "path" + } + }, + "s-private-php": { + "inputs": { + "flake-utils": "flake-utils_60", + "nixpkgs": "nixpkgs_99", + "nixpkgs-4": "nixpkgs-4_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "./private/php", + "type": "path" + }, + "original": { + "path": "./private/php", + "type": "path" + } + }, + "s-private-ssh": { + "inputs": { + "environment": "environment_32", + "secrets": "secrets_25" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "./private/ssh", + "type": "path" + }, + "original": { + "path": "./private/ssh", + "type": "path" + } + }, + "s-private-system": { + "inputs": { + "backports": "backports_7", + "environment": "environment_33", + "mypackages": "mypackages_12", + "myuids": "myuids_42", + "secrets-public": "secrets-public_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "./private/system", + "type": "path" + }, + "original": { + "path": "./private/system", + "type": "path" + } + }, + "s-rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "./rsync_backup", + "type": "path" + }, + "original": { + "path": "./rsync_backup", + "type": "path" + } + }, + "s-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "./secrets", + "type": "path" + }, + "original": { + "path": "./secrets", + "type": "path" + } + }, + "s-surfer": { + "inputs": { + "flake-utils": "flake-utils_62", + "mypackages": "mypackages_13", + "nixpkgs": "nixpkgs_103", + "surfer": "surfer_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "./surfer", + "type": "path" + }, + "original": { + "path": "./surfer", + "type": "path" + } + }, + "s-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_63", + "nixpkgs": "nixpkgs_104", + "taskwarrior-web": "taskwarrior-web_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "./taskwarrior-web", + "type": "path" + }, + "original": { + "path": "./taskwarrior-web", + "type": "path" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_15": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_16": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_17": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_18": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_19": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_20": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_21": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_22": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_23": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_24": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_25": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_26": { + "locked": { + "lastModified": 1, + "narHash": "sha256-yvhc2jxW1AQVmtrKPoYPr5DgpXKt/ua+ATuxvE3iY6c=", + "path": "./private/environment-dummy", + "type": "path" + }, + "original": { + "path": "./private/environment-dummy", + "type": "path" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "ssh": { + "inputs": { + "environment": "environment_10", + "secrets": "secrets_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_2": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_3": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_4": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_5": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_6": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "stable_7": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "surfer": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "surfer_2": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_7", + "mypackages": "mypackages", + "myuids": "myuids_6", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_2": { + "inputs": { + "backports": "backports_2", + "environment": "environment_11", + "mypackages": "mypackages_2", + "myuids": "myuids_8", + "secrets-public": "secrets-public_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_3": { + "inputs": { + "backports": "backports_4", + "environment": "environment_22", + "mypackages": "mypackages_7", + "myuids": "myuids_24", + "secrets-public": "secrets-public_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "system_4": { + "inputs": { + "backports": "backports_5", + "environment": "environment_25", + "mypackages": "mypackages_8", + "myuids": "myuids_27", + "secrets-public": "secrets-public_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "taskwarrior-web": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "taskwarrior-web_2": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "n-backup-2", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_2": { + "inputs": { + "nixpkgs": [ + "n-dilion", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_3": { + "inputs": { + "nixpkgs": [ + "n-eldiron", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_4": { + "inputs": { + "nixpkgs": [ + "n-monitoring-1", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_5": { + "inputs": { + "nixpkgs": [ + "n-quatresaisons", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_6": { + "inputs": { + "nixpkgs": [ + "n-zoldene", + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_7": { + "inputs": { + "nixpkgs": [ + "s-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_10": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_11": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_12": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_13": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_14": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_15": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_2": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_3": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_4": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_5": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_6": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_7": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_8": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_9": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/flake.nix b/flakes/flake.nix new file mode 100644 index 0000000..aecff57 --- /dev/null +++ b/flakes/flake.nix @@ -0,0 +1,67 @@ +{ + description = "immae-eu infrastructure"; + inputs = { + s-backports.url = "path:./backports"; + s-copanier.url = "path:./copanier"; + s-diaspora.url = "path:./diaspora"; + s-etherpad-lite.url = "path:./etherpad-lite"; + s-fiche.url = "path:./fiche"; + s-files-watcher.url = "path:./files-watcher"; + s-grocy.url = "path:./grocy"; + s-lib.url = "path:./lib"; + s-loginctl-linger.url = "path:./loginctl-linger"; + s-mastodon.url = "path:./mastodon"; + s-mediagoblin.url = "path:./mediagoblin"; + s-multi-apache-container.url = "path:./multi-apache-container"; + s-mypackages.url = "path:./mypackages"; + s-myuids.url = "path:./myuids"; + s-naemon.url = "path:./naemon"; + s-openarc.url = "path:./openarc"; + s-opendmarc.url = "path:./opendmarc"; + s-paste.url = "path:./paste"; + s-peertube.url = "path:./peertube"; + s-rsync_backup.url = "path:./rsync_backup"; + s-secrets.url = "path:./secrets"; + s-surfer.url = "path:./surfer"; + s-taskwarrior-web.url = "path:./taskwarrior-web"; + + s-private-buildbot.url = "path:./private/buildbot"; + s-private-chatons.url = "path:./private/chatons"; + s-private-environment.url = "path:./private/environment"; + s-private-mail-relay.url = "path:./private/mail-relay"; + s-private-milters.url = "path:./private/milters"; + s-private-monitoring.url = "path:./private/monitoring"; + s-private-openarc.url = "path:./private/openarc"; + s-private-opendmarc.url = "path:./private/opendmarc"; + s-private-openldap.url = "path:./private/openldap"; + s-private-paste.url = "path:./private/paste"; + s-private-peertube.url = "path:./private/peertube"; + s-private-php.url = "path:./private/php"; + s-private-ssh.url = "path:./private/ssh"; + s-private-system.url = "path:./private/system"; + + n-backup-2.url = "path:../systems/backup-2"; + n-dilion.url = "path:../systems/dilion"; + n-eldiron.url = "path:../systems/eldiron"; + n-monitoring-1.url = "path:../systems/monitoring-1"; + n-quatresaisons.url = "path:../systems/quatresaisons"; + n-zoldene.url = "path:../systems/zoldene"; + + secrets.url = "path:./private/environment-dummy"; + }; + outputs = inputs@{ self, secrets, ... }: { + subflakes = let + flakeNames = builtins.map (a: builtins.substring 2 (builtins.stringLength a) a) (builtins.filter (a: builtins.substring 0 2 a == "s-") (builtins.attrNames inputs)); + partitionned = builtins.partition (a: builtins.substring 0 8 a == "private-") flakeNames; + privateFlakes = builtins.map (a: builtins.substring 8 (builtins.stringLength a) a) partitionned.right; + publicFlakes = partitionned.wrong; + + nodeFlakes = builtins.map (a: builtins.substring 2 (builtins.stringLength a) a) (builtins.filter (a: builtins.substring 0 2 a == "n-") (builtins.attrNames inputs)); + in { + public = builtins.foldl' (a: b: a // { "${b}" = inputs."s-${b}"; }) {} publicFlakes; + private = builtins.foldl' (a: b: a // { "${b}" = inputs."s-private-${b}"; }) {} privateFlakes; + nodes = builtins.foldl' (a: b: a // { "${b}" = inputs."n-${b}"; }) {} nodeFlakes; + inherit secrets; + }; + }; +} diff --git a/pkgs/webapps/grocy/default.nix b/flakes/grocy/default.nix similarity index 83% rename from pkgs/webapps/grocy/default.nix rename to flakes/grocy/default.nix index f87f6ec..26b6ed8 100644 --- a/pkgs/webapps/grocy/default.nix +++ b/flakes/grocy/default.nix @@ -1,8 +1,9 @@ -{ varDir ? "/var/lib/grocy", stdenv, callPackage, composerEnv, fetchurl, mylibs, runCommand, git, which, jq, yarn2nix-moretea }: +{ varDir ? "/var/lib/grocy", stdenv, callPackage, composerEnv, fetchurl, src, runCommand, git, which, jq, yarn2nix-moretea }: let version = "2.6.1-1"; - packagesource = mylibs.fetchedGithub ./grocy.json; - patchedPackages = stdenv.mkDerivation (packagesource // rec { + patchedPackages = stdenv.mkDerivation rec { + name = "grocy"; + inherit src; buildInputs = [ jq ]; patches = [ ./yarn.patch ]; installPhase = '' @@ -10,7 +11,7 @@ let cat package.json | jq -r '.version = "${version}"' > $out/package.json cp yarn.lock $out/ ''; - }); + }; yarnModules = yarn2nix-moretea.mkYarnModules rec { name = "grocy-yarn"; pname = name; @@ -26,8 +27,9 @@ let }; app = composerEnv.buildPackage ( import ./php-packages.nix { inherit composerEnv fetchurl; } // - packagesource // { + name = "grocy"; + inherit src; noDev = true; buildInputs = [ yarnModules ]; postInstall = '' diff --git a/flakes/grocy/flake.lock b/flakes/grocy/flake.lock new file mode 100644 index 0000000..13aa4a6 --- /dev/null +++ b/flakes/grocy/flake.lock @@ -0,0 +1,150 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "grocy": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "grocy": "grocy", + "mypackages": "mypackages", + "nixpkgs": "nixpkgs_2" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/grocy/flake.nix b/flakes/grocy/flake.nix new file mode 100644 index 0000000..a08852f --- /dev/null +++ b/flakes/grocy/flake.nix @@ -0,0 +1,35 @@ +{ + description = "ERP beyond your fridge - grocy is a web-based self-hosted groceries & household management solution for your home"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.grocy = { + url = "github:grocy/grocy/d7738aa1ec330c81f11e4976681df0299d4ed35a"; + flake = false; + }; + inputs.mypackages.url = "path:../mypackages"; + outputs = { self, nixpkgs, grocy, flake-utils, mypackages }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + composerEnv = mypackages.lib."${system}".composerEnv; + version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.grocy.original.ref; + inherit (pkgs) callPackage; + in rec { + packages.grocy = callPackage ./. { inherit composerEnv; src = grocy // { inherit version; }; }; + defaultPackage = packages.grocy; + legacyPackages.grocy = packages.grocy; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + grocy = final: prev: { + grocy = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.grocy; + }; +} diff --git a/pkgs/webapps/grocy/php-packages.nix b/flakes/grocy/php-packages.nix similarity index 100% rename from pkgs/webapps/grocy/php-packages.nix rename to flakes/grocy/php-packages.nix diff --git a/pkgs/webapps/grocy/yarn-packages.nix b/flakes/grocy/yarn-packages.nix similarity index 100% rename from pkgs/webapps/grocy/yarn-packages.nix rename to flakes/grocy/yarn-packages.nix diff --git a/pkgs/webapps/grocy/yarn.patch b/flakes/grocy/yarn.patch similarity index 100% rename from pkgs/webapps/grocy/yarn.patch rename to flakes/grocy/yarn.patch diff --git a/flakes/lib/flake.lock b/flakes/lib/flake.lock index 3e0b21e..3ca158e 100644 --- a/flakes/lib/flake.lock +++ b/flakes/lib/flake.lock @@ -1,12 +1,235 @@ { "nodes": { + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "disko" + ], + "flake-parts": [ + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1631570365, - "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", "type": "github" }, "original": { @@ -17,7 +240,48 @@ }, "root": { "inputs": { - "nixpkgs": "nixpkgs" + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_4" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" } } }, diff --git a/flakes/lib/flake.nix b/flakes/lib/flake.nix index 8faa136..5b78fb6 100644 --- a/flakes/lib/flake.nix +++ b/flakes/lib/flake.nix @@ -1,28 +1,68 @@ { inputs.nixpkgs.url = "github:NixOS/nixpkgs"; + inputs.flake-parts.url = "github:hercules-ci/flake-parts"; + inputs.disko.url = "github:nix-community/disko"; + # replace with zhaofengli/colmena once https://github.com/zhaofengli/colmena/pull/161 is merged + inputs.colmena.url = "github:immae/colmena/add-lib-get-flake"; + inputs.nixos-anywhere.url = "github:numtide/nixos-anywhere"; + inputs.nixos-anywhere.inputs.disko.follows = "disko"; + inputs.nixos-anywhere.inputs.flake-parts.follows = "flake-parts"; description = "Useful libs"; - outputs = { self, nixpkgs }: { + outputs = { self, nixpkgs, flake-parts, disko, colmena, nixos-anywhere }: { lib = rec { - computeNarHash = path: - let pkgs = import nixpkgs {}; - in - builtins.readFile (pkgs.runCommand "narHash" { - buildInputs = [ pkgs.nix ]; - } "echo -n $(nix hash-path ${path}) > $out"); + mkColmenaFlake = { name, self, nixpkgs, system ? "x86_64-linux", nixosModules, moduleArgs ? {}, targetHost, targetUser ? "root" }: + flake-parts.lib.mkFlake { inputs = { inherit nixpkgs self; }; } { + systems = [ system ]; + perSystem = { pkgs, ... }: { + apps."${name}-install" = { + type = "app"; + program = pkgs.writeScriptBin "${name}-install" '' + #!${pkgs.stdenv.shell} + set -euo pipefail + : $SOPS_VARS_FILE + TEMPDIR=$(mktemp -d) + trap '[ -d "$TEMPDIR" ] && rm -rf "$TEMPDIR"' EXIT - withNarKeyCompat = flakeCompat: path: moduleAttrs: - let module = (flakeCompat path).${moduleAttrs}; - narHash = computeNarHash path; - in if builtins.isFunction module - then args@{ config, lib, pkgs, ... }: (module args // { key = narHash; }) - else module // { key = narHash; }; + password=$(sops -d $SOPS_VARS_FILE | yq -r .cryptsetup_encryption_keys.${name}) + mkdir -p $TEMPDIR/boot/initrdSecrets + chmod -R go-rwx $TEMPDIR/boot/initrdSecrets + sops -d $SOPS_VARS_FILE | yq -c '.ssh_host_keys.${name}[]' | while read -r key; do + keytype=$(echo "$key" | yq -r .type) + keyprivate=$(echo "$key" | yq -r .private) + keypublic=$(echo "$key" | yq -r .public) + echo "$keyprivate" > $TEMPDIR/boot/initrdSecrets/ssh_host_''${keytype}_key + echo "$keypublic" > $TEMPDIR/boot/initrdSecrets/ssh_host_''${keytype}_key.pub + done + chmod -R go-rwx $TEMPDIR/boot/initrdSecrets - withNarKey = dep: moduleAttrs: - let module = dep.${moduleAttrs}; - in if builtins.isFunction module - then args@{ config, lib, pkgs, ... }: (module args // { key = dep.narHash; }) - else module // { key = dep.narHash; }; + ${nixos-anywhere.packages.${system}.nixos-anywhere}/bin/nixos-anywhere \ + -f .#${name}WithEncryption ${targetUser}@${targetHost} \ + --disk-encryption-keys /run/decrypt-key <(echo -n "$password") \ + --extra-files "$TEMPDIR" + ''; + }; + + }; + flake = { + nixosConfigurations.${name} = (colmena.lib.fromRawFlake self).nodes.${name}; + nixosConfigurations."${name}WithEncryption" = let + selfWithEncryption = nixpkgs.lib.recursiveUpdate self { outputs.colmena.meta.specialArgs.cryptKeyFile = "/run/decrypt-key"; }; + in + (colmena.lib.fromRawFlake selfWithEncryption).nodes.${name}; + colmena = { + meta.nixpkgs = nixpkgs.legacyPackages.${system}; + meta.specialArgs = moduleArgs; + "${name}" = { + deployment = { inherit targetHost targetUser; }; + imports = builtins.attrValues self.nixosModules; + }; + }; + nixosModules = { + _diskoModules = disko.nixosModules.disko; + } // nixosModules; + }; + }; }; }; } diff --git a/flakes/loginctl-linger/flake.nix b/flakes/loginctl-linger/flake.nix new file mode 100644 index 0000000..4828d37 --- /dev/null +++ b/flakes/loginctl-linger/flake.nix @@ -0,0 +1,56 @@ +{ + outputs = { self }: { + nixosModule = { config, lib, pkgs, ... }: + # https://github.com/michalrus/dotfiles/commit/ebd5fa9583f82589f23531647aa677feb3f8d344#diff-4d353005ef5b3e37f33c07332b8523edR1 + # A temporary hack to `loginctl enable-linger $somebody` (for + # multiplexer sessions to last), until this one is unresolved: + # https://github.com/NixOS/nixpkgs/issues/3702 + # + # Usage: `users.extraUsers.somebody.linger = true` or slt. + + with lib; + + let + + dataDir = "/var/lib/systemd/linger"; + + lingeringUsers = map (u: u.name) (attrValues (flip filterAttrs config.users.users (n: u: u.linger))); + + lingeringUsersFile = builtins.toFile "lingering-users" + (concatStrings (map (s: "${s}\n") + (sort (a: b: a < b) lingeringUsers))); # this sorting is important for `comm` to work correctly + + updateLingering = pkgs.writeScript "update-lingering" '' + if [ ! -e ${dataDir} ]; then + install -m 0755 -o root -g root -d ${dataDir} + fi + if [ -e ${dataDir} ] ; then + ls ${dataDir} | sort | comm -3 -1 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl disable-linger + ls ${dataDir} | sort | comm -3 -2 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl enable-linger + fi + ''; + + in + + { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); + options = { + users.users = mkOption { + type = lib.types.attrsOf (lib.types.submodule { + options = { + linger = mkEnableOption "lingering for the user"; + }; + }); + }; + }; + + config = { + system.activationScripts.update-lingering = { + deps = ["users"]; + text = "${updateLingering}"; + }; + }; + }; + }; +} diff --git a/pkgs/webapps/mastodon/default.nix b/flakes/mastodon/default.nix similarity index 82% rename from pkgs/webapps/mastodon/default.nix rename to flakes/mastodon/default.nix index ce015c5..5d32c23 100644 --- a/pkgs/webapps/mastodon/default.nix +++ b/flakes/mastodon/default.nix @@ -1,23 +1,21 @@ -{ varDir ? "/var/lib/mastodon", mylibs, - stdenv, writeText, runCommand, +{ varDir ? "/var/lib/mastodon", + stdenv, src, writeText, runCommand, ruby_2_6, bundlerEnv, defaultGemConfig, jq, protobuf, protobufc, pkgconfig, libidn, pam, nodejs, yarn, yarn2nix-moretea }: let - info = mylibs.fetchedGithub ./mastodon.json // { - src = runCommand "mastodon-patched" { - source = (mylibs.fetchedGithub ./mastodon.json).src; + patched = runCommand "mastodon-patched" { + source = src; } '' cp -a $source $out chmod -R u+w $out sed -i -e "/fuubar/s/2.4.0/2.4.1/" $out/Gemfile.lock sed -i -e "s/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9#4255dc41fa7df9c3a02c1595f058e248bc37b784/" $out/yarn.lock ''; - }; gems = bundlerEnv { name = "mastodon-env"; ruby = ruby_2_6; gemset = ./gemset.nix; - gemdir = info.src; + gemdir = patched; groups = [ "default" "production" "test" "development" ]; gemConfig = defaultGemConfig // { redis-rack = attrs: { @@ -43,15 +41,15 @@ let }; yarnModules = let packagejson = runCommand "package.json" { buildInputs = [ jq ]; } '' - cat ${info.src}/package.json | jq -r '.version = "${info.version}"' > $out + cat ${patched}/package.json | jq -r '.version = "${src.version}"' > $out ''; in yarn2nix-moretea.mkYarnModules rec { name = "mastodon-yarn"; pname = name; - version = info.version; + version = src.version; packageJSON = packagejson; - yarnLock = "${info.src}/yarn.lock"; + yarnLock = "${patched}/yarn.lock"; yarnNix = ./yarn-packages.nix; pkgConfig = { uws = { @@ -61,16 +59,20 @@ let }; }; }; - mastodon_with_yarn = stdenv.mkDerivation (info // rec { + mastodon_with_yarn = stdenv.mkDerivation { + pname = "mastodon"; + version = src.version; + inherit src; installPhase = '' cp -a . $out cp -a ${yarnModules}/node_modules $out ''; buildInputs = [ yarnModules ]; - }); + }; in stdenv.mkDerivation { name = "mastodon"; + version = src.version; inherit mastodon_with_yarn; builder = writeText "build_mastodon" '' source $stdenv/setup @@ -88,5 +90,5 @@ stdenv.mkDerivation { ln -sf ${varDir}/tmp/cache tmp ''; buildInputs = [ gems gems.ruby nodejs yarn ]; - passthru = { inherit gems varDir; }; + passthru = { inherit gems varDir nodejs; }; } diff --git a/flakes/mastodon/flake.lock b/flakes/mastodon/flake.lock new file mode 100644 index 0000000..aed0925 --- /dev/null +++ b/flakes/mastodon/flake.lock @@ -0,0 +1,75 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "mastodon": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "nixpkgs": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "mastodon": "mastodon", + "myuids": "myuids", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/mastodon/flake.nix b/flakes/mastodon/flake.nix new file mode 100644 index 0000000..1d0db10 --- /dev/null +++ b/flakes/mastodon/flake.nix @@ -0,0 +1,331 @@ +{ + description = "Your self-hosted, globally interconnected microblogging community"; + inputs.myuids = { + url = "path:../myuids"; + }; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.mastodon = { + url = "github:tootsuite/mastodon/v2.9.4"; + flake = false; + }; + + outputs = { self, myuids, nixpkgs, mastodon, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.mastodon.original.ref; + inherit (pkgs) callPackage; + in rec { + packages.mastodon = callPackage ./. { src = mastodon // { inherit version; }; }; + defaultPackage = packages.mastodon; + legacyPackages.mastodon = packages.mastodon; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + mastodon = final: prev: { + mastodon = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.mastodon; + nixosModule = { lib, pkgs, config, ... }: + let + name = "mastodon"; + cfg = config.immaeServices.mastodon; + in + { + options.immaeServices.mastodon = { + enable = lib.mkEnableOption "Enable Mastodon’s service"; + user = lib.mkOption { + type = lib.types.str; + default = name; + description = "User account under which Mastodon runs"; + }; + group = lib.mkOption { + type = lib.types.str; + default = name; + description = "Group under which Mastodon runs"; + }; + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/${name}"; + description = '' + The directory where Mastodon stores its data. + ''; + }; + socketsPrefix = lib.mkOption { + type = lib.types.str; + default = "live"; + description = '' + The prefix to use for Mastodon sockets. + ''; + }; + socketsDir = lib.mkOption { + type = lib.types.path; + default = "/run/${name}"; + description = '' + The directory where Mastodon puts runtime files and sockets. + ''; + }; + configFile = lib.mkOption { + type = lib.types.path; + description = '' + The configuration file path for Mastodon. + ''; + }; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.mastodon; + description = '' + Mastodon package to use. + ''; + }; + # Output variables + workdir = lib.mkOption { + type = lib.types.package; + default = cfg.package.override { varDir = cfg.dataDir; }; + description = '' + Adjusted mastodon package with overriden varDir + ''; + readOnly = true; + }; + systemdStateDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if varDir is outside of /var/lib + default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; + lib.strings.removePrefix "/var/lib/" cfg.dataDir; + description = '' + Adjusted Mastodon data directory for systemd + ''; + readOnly = true; + }; + systemdRuntimeDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if socketsDir is outside of /run + default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; + lib.strings.removePrefix "/run/" cfg.socketsDir; + description = '' + Adjusted Mastodon sockets directory for systemd + ''; + readOnly = true; + }; + sockets = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + node = "${cfg.socketsDir}/${cfg.socketsPrefix}_node.sock"; + rails = "${cfg.socketsDir}/${cfg.socketsPrefix}_puma.sock"; + }; + readOnly = true; + description = '' + Mastodon sockets + ''; + }; + }; + + config = lib.mkIf cfg.enable { + nixpkgs.overlays = [ self.overlay ]; + users.users = lib.optionalAttrs (cfg.user == name) { + "${name}" = { + uid = myuids.lib.uids.mastodon; + group = cfg.group; + description = "Mastodon user"; + home = cfg.dataDir; + useDefaultShell = true; + }; + }; + users.groups = lib.optionalAttrs (cfg.group == name) { + "${name}" = { + gid = myuids.lib.gids.mastodon; + }; + }; + + systemd.slices.mastodon = { + description = "Mastodon slice"; + }; + + systemd.services.mastodon-streaming = { + description = "Mastodon Streaming"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" "mastodon-web.service" ]; + + environment.NODE_ENV = "production"; + environment.SOCKET = cfg.sockets.node; + + path = [ cfg.workdir.nodejs pkgs.bashInteractive ]; + + script = '' + exec npm run start + ''; + + postStart = '' + while [ ! -S $SOCKET ]; do + sleep 0.5 + done + chmod a+w $SOCKET + ''; + + postStop = '' + rm $SOCKET + ''; + + serviceConfig = { + Slice = "mastodon.slice"; + User = cfg.user; + EnvironmentFile = cfg.configFile; + PrivateTmp = true; + Restart = "always"; + TimeoutSec = 15; + Type = "simple"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + systemd.services.mastodon-web = { + description = "Mastodon Web app"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + + environment.RAILS_ENV = "production"; + environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; + environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; + environment.SOCKET = cfg.sockets.rails; + + path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file pkgs.imagemagick ]; + + preStart = '' + install -m 0755 -d ${cfg.dataDir}/tmp/cache + ./bin/bundle exec rails db:migrate + ''; + + script = '' + exec ./bin/bundle exec puma -C config/puma.rb + ''; + + postStart = '' + exec ./bin/tootctl cache clear + ''; + serviceConfig = { + Slice = "mastodon.slice"; + User = cfg.user; + EnvironmentFile = cfg.configFile; + PrivateTmp = true; + Restart = "always"; + TimeoutSec = 60; + Type = "simple"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + # To be run manually because computationnally heavy + systemd.services.mastodon-cleanup-manual = { + description = "Cleanup mastodon"; + + environment.RAILS_ENV = "production"; + environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; + environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; + environment.SOCKET = cfg.sockets.rails; + + path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ]; + + script = '' + exec ./bin/tootctl statuses remove --days 365 + ''; + + serviceConfig = { + User = cfg.user; + EnvironmentFile = cfg.configFile; + PrivateTmp = true; + Type = "oneshot"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + systemd.services.mastodon-cleanup = { + description = "Cleanup mastodon"; + startAt = "daily"; + restartIfChanged = false; + + environment.RAILS_ENV = "production"; + environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; + environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; + environment.SOCKET = cfg.sockets.rails; + + path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ]; + + script = '' + exec ./bin/tootctl media remove --days 30 + ''; + + serviceConfig = { + User = cfg.user; + EnvironmentFile = cfg.configFile; + PrivateTmp = true; + Type = "oneshot"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + systemd.services.mastodon-sidekiq = { + description = "Mastodon Sidekiq"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" "mastodon-web.service" ]; + + environment.RAILS_ENV="production"; + environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; + environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; + environment.DB_POOL="5"; + + path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.imagemagick pkgs.ffmpeg pkgs.file ]; + + script = '' + exec ./bin/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push + ''; + + serviceConfig = { + Slice = "mastodon.slice"; + User = cfg.user; + EnvironmentFile = cfg.configFile; + PrivateTmp = true; + Restart = "always"; + TimeoutSec = 15; + Type = "simple"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + }; + }; + }; +} + + diff --git a/pkgs/webapps/mastodon/gemset.nix b/flakes/mastodon/gemset.nix similarity index 100% rename from pkgs/webapps/mastodon/gemset.nix rename to flakes/mastodon/gemset.nix diff --git a/pkgs/webapps/mastodon/yarn-packages.nix b/flakes/mastodon/yarn-packages.nix similarity index 100% rename from pkgs/webapps/mastodon/yarn-packages.nix rename to flakes/mastodon/yarn-packages.nix diff --git a/pkgs/webapps/mediagoblin/bower-packages.nix b/flakes/mediagoblin/bower-packages.nix similarity index 100% rename from pkgs/webapps/mediagoblin/bower-packages.nix rename to flakes/mediagoblin/bower-packages.nix diff --git a/pkgs/webapps/mediagoblin/default.nix b/flakes/mediagoblin/default.nix similarity index 89% rename from pkgs/webapps/mediagoblin/default.nix rename to flakes/mediagoblin/default.nix index 22cb292..47cc628 100644 --- a/pkgs/webapps/mediagoblin/default.nix +++ b/flakes/mediagoblin/default.nix @@ -1,4 +1,4 @@ -{ makeWrapper, stdenv, writeScript, fetchurl, buildBowerComponents, mylibs, which, python36, gst_all_1, automake, autoconf, nodejs, nodePackages, lib, callPackage, fetchgit }: +{ src, makeWrapper, stdenv, writeScript, fetchurl, buildBowerComponents, which, python36, gst_all_1, automake, autoconf, nodejs, nodePackages, lib, callPackage, fetchgit, fetchFromGitHub }: let overridePython = let packageOverrides = self: super: { @@ -67,10 +67,20 @@ let }; doCheck = false; }); - tempita_5_3_dev = super.buildPythonPackage (mylibs.fetchedGithub ./tempita.json // rec { + tempita_5_3_dev = super.buildPythonPackage rec { + version = "47414a7-master"; + pname = "tempita"; + name = "${pname}-${version}"; + src = fetchFromGitHub { + owner = "gjhiggins"; + repo = "tempita"; + rev = "47414a7c6e46a9a9afe78f0bce2ea299fa84d10d"; + sha256 = "0f33jjjs5rvp7ar2j6ggyfykcrsrn04jaqcq71qfvycf6b7nw3rn"; + fetchSubmodules = true; + }; buildInputs = with self; [ nose ]; disabled = false; - }); + }; sqlalchemy_migrate = super.sqlalchemy_migrate.overridePythonAttrs(old: rec { propagatedBuildInputs = with self; [ pbr tempita_5_3_dev decorator sqlalchemy six sqlparse ]; }); @@ -125,23 +135,16 @@ let load_entry_point('mediagoblin', 'console_scripts', 'gmg')() ) ''; - mediagoblinSrc = fetchgit { - name = "mediagoblin"; - url = "git://git.savannah.gnu.org/mediagoblin.git"; - rev = "cd465ebfec837a75a44c4ebd727dffe2fff6d850"; - sha256 = "1yz4i4i97z3rxl534a6psaybyjbyp5nnc52v3nvbpzc4pd2s69mx"; - fetchSubmodules = true; # important! - }; bowerComponents = buildBowerComponents { name = "mediagoblin-bower-components"; generated = ./bower-packages.nix; - src = mediagoblinSrc; + inherit src; }; pluginNames = [ "basicsearch" ]; allPlugins = lib.attrsets.genAttrs pluginNames (name: callPackage (./plugins + "/${name}") {}); - toPassthru = pkg: { - inherit allPlugins; + toPassthru = pkg: plugins: { + inherit allPlugins plugins; withPlugins = withPlugins pkg; }; withPlugins = pkg: toPlugins: @@ -150,14 +153,14 @@ let toBuildPlugin = n: "ln -s ${n} mediagoblin/plugins/${n.pluginName}"; newMediagoblin = pkg.overrideAttrs(old: { postBuild = old.postBuild + "\n" + builtins.concatStringsSep "\n" (map toBuildPlugin plugins); - passthru = toPassthru newMediagoblin; + passthru = toPassthru newMediagoblin plugins; }); in newMediagoblin; package = stdenv.mkDerivation rec { pname = "mediagoblin"; name = "${pname}-${version}"; version = "cd465eb-stable"; - src = mediagoblinSrc; + inherit src; preConfigure = '' # ./bootstrap.sh aclocal -I m4 --install @@ -205,6 +208,6 @@ let ''; buildInputs = [ makeWrapper automake autoconf which nodePackages.bower nodejs python ]; propagatedBuildInputs = with gst_all_1; [ python gst-libav gst-plugins-good gst-plugins-bad gst-plugins-ugly gstreamer ]; - passthru = toPassthru package; + passthru = toPassthru package []; }; in package diff --git a/flakes/mediagoblin/flake.lock b/flakes/mediagoblin/flake.lock new file mode 100644 index 0000000..bba6479 --- /dev/null +++ b/flakes/mediagoblin/flake.lock @@ -0,0 +1,78 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "mediagoblin": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "nixpkgs": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "mediagoblin": "mediagoblin", + "myuids": "myuids", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/mediagoblin/flake.nix b/flakes/mediagoblin/flake.nix new file mode 100644 index 0000000..2e821d5 --- /dev/null +++ b/flakes/mediagoblin/flake.nix @@ -0,0 +1,271 @@ +{ + description = "a free software media publishing platform that anyone can run."; + inputs.myuids = { + url = "path:../myuids"; + }; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.mediagoblin = { + url = "git+https://git.savannah.gnu.org/git/mediagoblin.git?submodules=1&ref=stable&rev=cd465ebfec837a75a44c4ebd727dffe2fff6d850"; + flake = false; + }; + + outputs = { self, myuids, nixpkgs, mediagoblin, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.mediagoblin.original.ref; + inherit (pkgs) callPackage; + in rec { + packages.mediagoblin = callPackage ./. { src = mediagoblin // { inherit version; }; }; + defaultPackage = packages.mediagoblin; + legacyPackages.mediagoblin = packages.mediagoblin; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + mediagoblin = final: prev: { + mediagoblin = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.mediagoblin; + nixosModule = { lib, pkgs, config, ... }: + let + name = "mediagoblin"; + cfg = config.services.mediagoblin; + + uid = config.ids.uids.mediagoblin; + gid = config.ids.gids.mediagoblin; + + paste_local = pkgs.writeText "paste_local.ini" '' + [DEFAULT] + debug = false + + [pipeline:main] + pipeline = mediagoblin + + [app:mediagoblin] + use = egg:mediagoblin#app + config = ${cfg.configFile} ${cfg.package}/mediagoblin.ini + /mgoblin_static = ${cfg.package}/mediagoblin/static + + [loggers] + keys = root + + [handlers] + keys = console + + [formatters] + keys = generic + + [logger_root] + level = INFO + handlers = console + + [handler_console] + class = StreamHandler + args = (sys.stderr,) + level = NOTSET + formatter = generic + + [formatter_generic] + format = %(levelname)-7.7s [%(name)s] %(message)s + + [filter:errors] + use = egg:mediagoblin#errors + debug = false + + [server:main] + use = egg:waitress#main + unix_socket = ${cfg.sockets.paster} + unix_socket_perms = 777 + url_scheme = https + ''; + in + { + options.services.mediagoblin = { + enable = lib.mkEnableOption "Enable Mediagoblin’s service"; + user = lib.mkOption { + type = lib.types.str; + default = name; + description = "User account under which Mediagoblin runs"; + }; + group = lib.mkOption { + type = lib.types.str; + default = name; + description = "Group under which Mediagoblin runs"; + }; + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/${name}"; + description = '' + The directory where Mediagoblin stores its data. + ''; + }; + socketsDir = lib.mkOption { + type = lib.types.path; + default = "/run/${name}"; + description = '' + The directory where Mediagoblin puts runtime files and sockets. + ''; + }; + configFile = lib.mkOption { + type = lib.types.path; + description = '' + The configuration file path for Mediagoblin. + ''; + }; + package = lib.mkOption { + type = lib.types.package; + default = pkgs.mediagoblin; + example = lib.literalExample '' + pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch]) + ''; + description = '' + Mediagoblin package to use. + ''; + }; + systemdStateDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if varDir is outside of /var/lib + default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; + lib.strings.removePrefix "/var/lib/" cfg.dataDir; + description = '' + Adjusted Mediagoblin data directory for systemd + ''; + readOnly = true; + }; + systemdRuntimeDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if socketsDir is outside of /run + default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; + lib.strings.removePrefix "/run/" cfg.socketsDir; + description = '' + Adjusted Mediagoblin sockets directory for systemd + ''; + readOnly = true; + }; + sockets = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + paster = "${cfg.socketsDir}/mediagoblin.sock"; + }; + readOnly = true; + description = '' + Mediagoblin sockets + ''; + }; + pids = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + paster = "${cfg.socketsDir}/mediagoblin.pid"; + celery = "${cfg.socketsDir}/mediagoblin-celeryd.pid"; + }; + readOnly = true; + description = '' + Mediagoblin pid files + ''; + }; + }; + + config = lib.mkIf cfg.enable { + nixpkgs.overlays = [ self.overlay ]; + users.users = lib.optionalAttrs (cfg.user == name) { + "${name}" = { + inherit uid; + group = cfg.group; + description = "Mediagoblin user"; + home = cfg.dataDir; + useDefaultShell = true; + }; + }; + users.groups = lib.optionalAttrs (cfg.group == name) { + "${name}" = { + inherit gid; + }; + }; + + systemd.slices.mediagoblin = { + description = "Mediagoblin slice"; + }; + systemd.services.mediagoblin-web = { + description = "Mediagoblin service"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + wants = [ "postgresql.service" "redis.service" ]; + + environment.SCRIPT_NAME = "/mediagoblin/"; + + script = '' + exec ./bin/paster serve \ + ${paste_local} \ + --pid-file=${cfg.pids.paster} + ''; + preStop = '' + exec ./bin/paster serve \ + --pid-file=${cfg.pids.paster} \ + ${paste_local} stop + ''; + preStart = '' + if [ -d ${cfg.dataDir}/plugin_static/ ]; then + rm ${cfg.dataDir}/plugin_static/coreplugin_basic_auth + ln -sf ${cfg.package}/mediagoblin/plugins/basic_auth/static ${cfg.dataDir}/plugin_static/coreplugin_basic_auth + fi + ./bin/gmg -cf ${cfg.configFile} dbupdate + ''; + + serviceConfig = { + Slice = "mediagoblin.slice"; + User = cfg.user; + PrivateTmp = true; + Restart = "always"; + TimeoutSec = 15; + Type = "simple"; + WorkingDirectory = cfg.package; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + StateDirectory= cfg.systemdStateDirectory; + PIDFile = cfg.pids.paster; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + systemd.services.mediagoblin-celeryd = { + description = "Mediagoblin service"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" "mediagoblin-web.service" ]; + + environment.MEDIAGOBLIN_CONFIG = cfg.configFile; + environment.CELERY_CONFIG_MODULE = "mediagoblin.init.celery.from_celery"; + + script = '' + exec ./bin/celery worker \ + --logfile=${cfg.dataDir}/celery.log \ + --loglevel=INFO + ''; + + serviceConfig = { + Slice = "mediagoblin.slice"; + User = cfg.user; + PrivateTmp = true; + Restart = "always"; + TimeoutSec = 60; + Type = "simple"; + WorkingDirectory = cfg.package; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + StateDirectory= cfg.systemdStateDirectory; + PIDFile = cfg.pids.celery; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + }; + }; + }; +} + + diff --git a/pkgs/webapps/mediagoblin/ldap_fix.py b/flakes/mediagoblin/ldap_fix.py similarity index 100% rename from pkgs/webapps/mediagoblin/ldap_fix.py rename to flakes/mediagoblin/ldap_fix.py diff --git a/pkgs/webapps/mediagoblin/plugins/basicsearch/default.nix b/flakes/mediagoblin/plugins/basicsearch/default.nix similarity index 100% rename from pkgs/webapps/mediagoblin/plugins/basicsearch/default.nix rename to flakes/mediagoblin/plugins/basicsearch/default.nix diff --git a/flakes/multi-apache-container/flake.lock b/flakes/multi-apache-container/flake.lock new file mode 100644 index 0000000..f8dda19 --- /dev/null +++ b/flakes/multi-apache-container/flake.lock @@ -0,0 +1,36 @@ +{ + "nodes": { + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "root": { + "inputs": { + "files-watcher": "files-watcher", + "myuids": "myuids" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/multi-apache-container/flake.nix b/flakes/multi-apache-container/flake.nix new file mode 100644 index 0000000..fd788f7 --- /dev/null +++ b/flakes/multi-apache-container/flake.nix @@ -0,0 +1,389 @@ +{ + description = "Module to handle multiple separate apache instances (using containers)"; + inputs.myuids = { + url = "path:../myuids"; + }; + inputs.files-watcher = { + url = "path:../files-watcher"; + }; + + outputs = { self, myuids, files-watcher }: { + nixosModule = { lib, config, pkgs, options, ... }: + with lib; + let + cfg = config.services.websites; + hostConfig = config; + toHttpdConfig = icfg: + let + nosslVhost = ips: cfg: { + listen = map (ip: { inherit ip; port = 80; }) ips; + hostName = cfg.host; + logFormat = "combinedVhost"; + documentRoot = cfg.root; + extraConfig = '' + + DirectoryIndex ${cfg.indexFile} + AllowOverride None + Require all granted + + RewriteEngine on + RewriteRule ^/(.+) / [L] + + ''; + }; + toVhost = ips: vhostConf: { + acmeRoot = hostConfig.security.acme.certs.${vhostConf.certName}.webroot; + forceSSL = vhostConf.forceSSL or true; + useACMEHost = vhostConf.certName; + logFormat = "combinedVhost"; + listen = if vhostConf.forceSSL + then lists.flatten (map (ip: [{ inherit ip; port = 443; ssl = true; } { inherit ip; port = 80; }]) ips) + else map (ip: { inherit ip; port = 443; ssl = true; }) ips; + hostName = builtins.head vhostConf.hosts; + serverAliases = builtins.tail vhostConf.hosts or []; + documentRoot = vhostConf.root; + extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig; + }; + toVhostNoSSL = ips: vhostConf: { + logFormat = "combinedVhost"; + listen = map (ip: { inherit ip; port = 80; }) ips; + hostName = builtins.head vhostConf.hosts; + serverAliases = builtins.tail vhostConf.hosts or []; + documentRoot = vhostConf.root; + extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig; + }; + in { + enable = true; + logPerVirtualHost = true; + mpm = "event"; + # https://ssl-config.mozilla.org/#server=apache&version=2.4.41&config=intermediate&openssl=1.0.2t&guideline=5.4 + # test with https://www.ssllabs.com/ssltest/analyze.html?d=www.immae.eu&s=176.9.151.154&latest + sslProtocols = "all -SSLv3 -TLSv1 -TLSv1.1"; + sslCiphers = builtins.concatStringsSep ":" [ + "ECDHE-ECDSA-AES128-GCM-SHA256" "ECDHE-RSA-AES128-GCM-SHA256" + "ECDHE-ECDSA-AES256-GCM-SHA384" "ECDHE-RSA-AES256-GCM-SHA384" + "ECDHE-ECDSA-CHACHA20-POLY1305" "ECDHE-RSA-CHACHA20-POLY1305" + "DHE-RSA-AES128-GCM-SHA256" "DHE-RSA-AES256-GCM-SHA384" + ]; + inherit (icfg) adminAddr; + logFormat = "combinedVhost"; + extraModules = lists.unique icfg.modules; + extraConfig = builtins.concatStringsSep "\n" icfg.extraConfig; + + virtualHosts = with attrsets; { + ___fallbackVhost = toVhost icfg.ips icfg.fallbackVhost; + } // (optionalAttrs icfg.nosslVhost.enable { + nosslVhost = nosslVhost icfg.ips icfg.nosslVhost; + }) // (mapAttrs' (n: v: nameValuePair ("nossl_" + n) (toVhostNoSSL icfg.ips v)) icfg.vhostNoSSLConfs) + // (mapAttrs' (n: v: nameValuePair ("ssl_" + n) (toVhost icfg.ips v)) icfg.vhostConfs); + }; + in + { + options.services.websites = with types; { + env = mkOption { + default = {}; + description = "Each type of website to enable will target a distinct httpd server"; + type = attrsOf (submodule ({ name, config, ... }: { + options = { + enable = mkEnableOption "Enable websites of this type"; + moduleType = mkOption { + type = enum [ "container" "main" ]; + default = "container"; + description = '' + How to deploy the web environment: + - container -> inside a dedicated container (running only httpd) + - main -> as main services.httpd module + ''; + }; + adminAddr = mkOption { + type = str; + description = "Admin e-mail address of the instance"; + }; + user = mkOption { + type = str; + description = "Username of httpd service"; + readOnly = true; + default = if config.moduleType == "container" + then hostConfig.containers."httpd-${name}".config.services.httpd.user + else hostConfig.services.httpd.user; + }; + group = mkOption { + type = str; + description = "Group of httpd service"; + readOnly = true; + default = if config.moduleType == "container" + then hostConfig.containers."httpd-${name}".config.services.httpd.group + else hostConfig.services.httpd.group; + }; + httpdName = mkOption { + type = str; + description = "Name of the httpd instance to assign this type to"; + }; + ips = mkOption { + type = listOf str; + default = []; + description = "ips to listen to"; + }; + bindMounts = mkOption { + type = attrsOf unspecified; + default = {}; + description = "bind mounts to add to container"; + }; + modules = mkOption { + type = listOf str; + default = []; + description = "Additional modules to load in Apache"; + }; + extraConfig = mkOption { + type = listOf lines; + default = []; + description = "Additional configuration to append to Apache"; + }; + nosslVhost = mkOption { + description = "A default nossl vhost for captive portals"; + default = {}; + type = submodule { + options = { + enable = mkEnableOption "Add default no-ssl vhost for this instance"; + host = mkOption { + type = str; + description = "The hostname to use for this vhost"; + }; + root = mkOption { + type = path; + description = "The root folder to serve"; + }; + indexFile = mkOption { + type = str; + default = "index.html"; + description = "The index file to show."; + }; + }; + }; + }; + fallbackVhost = mkOption { + description = "The fallback vhost that will be defined as first vhost in Apache"; + type = submodule { + options = { + certName = mkOption { type = str; }; + hosts = mkOption { type = listOf str; }; + root = mkOption { type = nullOr path; }; + forceSSL = mkOption { + type = bool; + default = true; + description = '' + Automatically create a corresponding non-ssl vhost + that will only redirect to the ssl version + ''; + }; + extraConfig = mkOption { type = listOf lines; default = []; }; + }; + }; + }; + vhostNoSSLConfs = mkOption { + default = {}; + description = "List of no ssl vhosts to define for Apache"; + type = attrsOf (submodule { + options = { + hosts = mkOption { type = listOf str; }; + root = mkOption { type = nullOr path; }; + extraConfig = mkOption { type = listOf lines; default = []; }; + }; + }); + }; + vhostConfs = mkOption { + default = {}; + description = "List of vhosts to define for Apache"; + type = attrsOf (submodule { + options = { + certName = mkOption { type = str; }; + hosts = mkOption { type = listOf str; }; + root = mkOption { type = nullOr path; }; + forceSSL = mkOption { + type = bool; + default = true; + description = '' + Automatically create a corresponding non-ssl vhost + that will only redirect to the ssl version + ''; + }; + extraConfig = mkOption { type = listOf lines; default = []; }; + }; + }); + }; + watchPaths = mkOption { + type = listOf str; + default = []; + description = '' + Paths to watch that should trigger a reload of httpd + ''; + }; + }; + })); + }; + }; + + config = lib.mkMerge [ + { + assertions = [ + { + assertion = builtins.length (builtins.attrNames (lib.filterAttrs (k: v: v.enable && v.moduleType == "main") cfg.env)) <= 1; + message = '' + Only one enabled environment can have moduleType = "main" + ''; + } + ]; + } + + { + environment.etc = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair + "httpd/${name}/httpd.conf" { source = (pkgs.nixos { + imports = [ + { + config.security.acme.acceptTerms = true; + config.security.acme.preliminarySelfsigned = false; + config.security.acme.certs = + lib.mapAttrs (n: lib.filterAttrs (n': v': n' != "directory")) config.security.acme.certs; + config.security.acme.defaults = config.security.acme.defaults; + config.networking.hostName = "${hostConfig.networking.hostName}-${name}"; + config.services.httpd = toHttpdConfig icfg; + } + ]; + }).config.services.httpd.configFile; + }) (lib.filterAttrs (k: v: v.moduleType == "container" && v.enable) cfg.env); + + system.activationScripts.httpd-containers = { + deps = [ "etc" ]; + text = builtins.concatStringsSep "\n" ( + lib.mapAttrsToList (n: v: '' + install -d -m 0750 -o ${v.user} -g ${v.group} /var/log/httpd/${n} /var/lib/nixos-containers/httpd-${n}-mounts/conf + install -Dm644 -o ${v.user} -g ${v.group} /etc/httpd/${n}/httpd.conf /var/lib/nixos-containers/httpd-${n}-mounts/conf/ + '') (lib.filterAttrs (k: v: v.moduleType == "container" && v.enable) cfg.env) + ); + }; + + security.acme.certs = lib.mkMerge (lib.mapAttrsToList (name: icfg: + let + containerCertNames = lib.unique (lib.mapAttrsToList (n: v: v.certName) icfg.vhostConfs + ++ [ icfg.fallbackVhost.certName ]); + in + lib.genAttrs containerCertNames (n: + { postRun = "machinectl shell httpd-${name} /run/current-system/sw/bin/systemctl reload httpd.service"; } + ) + ) (lib.filterAttrs (k: v: v.moduleType == "container" && v.enable) cfg.env) + ); + containers = let hostConfig = config; in attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair + "httpd-${name}" { + autoStart = true; + privateNetwork = false; + bindMounts = { + "/var/log/httpd" = { + hostPath = "/var/log/httpd/${name}"; + isReadOnly = false; + }; + "/etc/httpd" = { + hostPath = "/var/lib/nixos-containers/httpd-${name}-mounts/conf"; + }; + } // icfg.bindMounts; + + config = { config, options, ... }: { + imports = [ + myuids.nixosModule + files-watcher.nixosModule + ]; + config = lib.mkMerge [ + { + # This value determines the NixOS release with which your system is + # to be compatible, in order to avoid breaking some software such as + # database servers. You should change this only after NixOS release + # notes say you should. + # https://nixos.org/nixos/manual/release-notes.html + system.stateVersion = "23.05"; # Did you read the comment? + } + { + users.mutableUsers = false; + users.allowNoPasswordLogin = true; + users.users.acme.uid = config.ids.uids.acme; + users.users.acme.group = "acme"; + users.groups.acme.gid = config.ids.gids.acme; + } + { + services.logrotate.settings.httpd.enable = false; + } + { + environment.etc."httpd/httpd.conf".enable = false; + services.httpd = { + enable = true; + configFile = "/etc/httpd/httpd.conf"; + }; + + services.filesWatcher.http-config-reload = { + paths = [ "/etc/httpd/httpd.conf" ]; + waitTime = 2; + restart = true; + }; + services.filesWatcher.httpd = { + paths = icfg.watchPaths; + waitTime = 5; + }; + + users.users.${icfg.user}.extraGroups = [ "acme" "keys" ]; + systemd.services.http-config-reload = { + wants = [ "httpd.service" ]; + wantedBy = [ "multi-user.target" ]; + restartTriggers = [ config.services.httpd.configFile ]; + serviceConfig.Type = "oneshot"; + serviceConfig.TimeoutSec = 60; + serviceConfig.RemainAfterExit = true; + script = '' + if ${pkgs.systemd}/bin/systemctl -q is-active httpd.service ; then + ${config.services.httpd.package.out}/bin/httpd -f ${config.services.httpd.configFile} -t && \ + ${pkgs.systemd}/bin/systemctl reload httpd.service + fi + ''; + }; + } + ]; + }; + }) (lib.filterAttrs (k: v: v.moduleType == "container" && v.enable) cfg.env); + } + + { + services.httpd = lib.concatMapAttrs (name: toHttpdConfig) + (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env); + + users.users = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair + config.services.httpd.user { extraGroups = [ "acme" ]; } + ) (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env); + + services.filesWatcher = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair + "httpd" { + paths = icfg.watchPaths; + waitTime = 5; + } + ) (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env); + + services.logrotate.settings.httpd.enable = false; + systemd.services = lib.concatMapAttrs (name: v: { + httpd.restartTriggers = lib.mkForce []; + }) + (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env); + + security.acme.certs = lib.mkMerge (lib.mapAttrsToList (name: icfg: + let + containerCertNames = lib.unique (lib.mapAttrsToList (n: v: v.certName) icfg.vhostConfs + ++ [ icfg.fallbackVhost.certName ]); + in + lib.genAttrs containerCertNames (n: + { postRun = "systemctl reload httpd.service"; } + ) + ) (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env) + ); + + } + ]; + }; + }; +} + + diff --git a/flakes/mypackages/flake.lock b/flakes/mypackages/flake.lock new file mode 100644 index 0000000..f11f6c5 --- /dev/null +++ b/flakes/mypackages/flake.lock @@ -0,0 +1,83 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs", + "webapps-ttrss": "webapps-ttrss" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/mypackages/flake.nix b/flakes/mypackages/flake.nix new file mode 100644 index 0000000..adad96f --- /dev/null +++ b/flakes/mypackages/flake.nix @@ -0,0 +1,43 @@ +{ + description = "immae-eu infrastructure"; + inputs = { + flake-parts.url = "github:hercules-ci/flake-parts"; + # TODO: use nixos-unstable branch at some point and use the lock to keep the actual commit + nixpkgs.url = "github:nixos/nixpkgs/062a0c5437b68f950b081bbfc8a699d57a4ee026"; + webapps-ttrss = { + url = "https://git.tt-rss.org/fox/tt-rss.git"; + ref = "master"; + rev = "986ca251f995f7754a0470d3e0c44538a545081f"; + type = "git"; + flake = false; + }; + }; + outputs = inputs@{ self, flake-parts, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ + (import ./lib/flake-parts-lib.nix { name = "lib"; type = "unspecified"; }) + ]; + systems = [ "x86_64-linux" ]; + perSystem = { config, inputs', pkgs, ... }: + let + mypkgs = import ./pkgs/default.nix { inherit pkgs; inherit (self) mylibs sources; }; + in { + packages = builtins.removeAttrs mypkgs [ "composerEnv" "webapps-apache-theme" ]; + lib = { + inherit (self) sources; + inherit (mypkgs) composerEnv; + inherit (self.mylibs) postfixScript; + apache-theme = mypkgs.webapps-apache-theme; + }; + }; + flake = { + mylibs = import ./lib/default.nix; + sources.tools.ttrss = inputs.webapps-ttrss; + # We want overlays to be infected (in contrary to "packages" + # above): if someone imports an overlay here, we want his own + # overlays to be taken into account in every package, even new + # ones. + overlays = import ./overlays/default.nix { inherit (self) sources mylibs; }; + }; + }; +} diff --git a/flakes/mypackages/lib/default.nix b/flakes/mypackages/lib/default.nix new file mode 100644 index 0000000..972ace0 --- /dev/null +++ b/flakes/mypackages/lib/default.nix @@ -0,0 +1,37 @@ +{ + flakePartsAddPerSystem = import ./flake-parts-lib.nix; + nodeEnv = import ./node-env.nix; + postfixScript = pkgs: name: script: pkgs.writeScript name '' + #! ${pkgs.stdenv.shell} + mail=$(${pkgs.coreutils}/bin/cat -) + output=$(echo "$mail" | ${script} 2>&1) + ret=$? + + if [ "$ret" != "0" ]; then + echo "$mail" \ + | ${pkgs.procmail}/bin/formail -i "X-Return-Code: $ret" \ + | /run/wrappers/bin/sendmail -i scripts_error+${name}@mail.immae.eu + + messageId=$(echo "$mail" | ${pkgs.procmail}/bin/formail -x "Message-Id:") + repeat=$(echo "$mail" | ${pkgs.procmail}/bin/formail -X "From:" -X "Received:") + + ${pkgs.coreutils}/bin/cat < $out/bin/shell < $out/nix-support/propagated-build-inputs + cp $src/man/* $out/share/doc/bash-libs + ''; +} diff --git a/pkgs/boinctui/default.nix b/flakes/mypackages/pkgs/boinctui/default.nix similarity index 63% rename from pkgs/boinctui/default.nix rename to flakes/mypackages/pkgs/boinctui/default.nix index d8b106a..565840c 100644 --- a/pkgs/boinctui/default.nix +++ b/flakes/mypackages/pkgs/boinctui/default.nix @@ -1,10 +1,10 @@ -{ stdenv, fetchurl, expat, openssl, autoconf, ncurses }: +{ stdenv, fetchurl, expat, openssl, autoconf269, ncurses }: stdenv.mkDerivation rec { name = "boinctui-${version}"; - version = "2.5.0"; + version = "2.6.0"; src = fetchurl { url = "http://sourceforge.net/projects/boinctui/files/boinctui_${version}.tar.gz"; - sha256 = "16zxp8r4z6pllacdacg681y56cg2phnn3pm5gwszbsi93cix2g8p"; + sha256 = "1c6hc4x28z8hjncxcwxhb0r3980f72i6480569a0hd9y7vcgf3d0"; }; configureFlags = [ "--without-gnutls" ]; @@ -12,9 +12,10 @@ stdenv.mkDerivation rec { autoconf ''; + makeFlags = [ "DESTDIR=$(out)" ]; preBuild = '' sed -i -e 's/"HOME"/"XDG_CONFIG_HOME"/' src/cfg.cpp sed -i -e 's@\.boinctui\.cfg@boinctui/boinctui.cfg@' src/mainprog.cpp ''; - buildInputs = [ expat openssl autoconf ncurses ]; + buildInputs = [ expat openssl autoconf269 ncurses ]; } diff --git a/pkgs/cnagios/default.nix b/flakes/mypackages/pkgs/cnagios/default.nix similarity index 60% rename from pkgs/cnagios/default.nix rename to flakes/mypackages/pkgs/cnagios/default.nix index d5b52f3..2b8b0da 100644 --- a/pkgs/cnagios/default.nix +++ b/flakes/mypackages/pkgs/cnagios/default.nix @@ -1,5 +1,15 @@ -{ stdenv, mylibs, perl, ncurses }: -stdenv.mkDerivation (mylibs.fetchedGithub ./cnagios.json // { +{ stdenv, fetchFromGitHub, perl, ncurses }: +stdenv.mkDerivation (rec { + version = "3bd27fb-master"; + pname = "cnagios"; + name = "${pname}-${version}"; + src = fetchFromGitHub { + owner = "dannywarren"; + repo = "cnagios"; + rev = "3bd27fb40e68f61ffd01bea6234b919a667b6fe4"; + sha256 = "0iy5pmlcz6y3if72nav22xqxniiv1v8ywi0927m6s459hkw5n2rb"; + fetchSubmodules = true; + }; configureFlags = [ "--with-etc-dir=/etc/cnagios" "--with-var-dir=/var/lib/naemon" diff --git a/pkgs/commento/default.nix b/flakes/mypackages/pkgs/commento/default.nix similarity index 100% rename from pkgs/commento/default.nix rename to flakes/mypackages/pkgs/commento/default.nix diff --git a/pkgs/composer-env/default.nix b/flakes/mypackages/pkgs/composer-env/default.nix similarity index 80% rename from pkgs/composer-env/default.nix rename to flakes/mypackages/pkgs/composer-env/default.nix index 416a61c..772ed73 100644 --- a/pkgs/composer-env/default.nix +++ b/flakes/mypackages/pkgs/composer-env/default.nix @@ -1,41 +1,8 @@ # This file originates from composer2nix -{ stdenv, writeTextFile, fetchurl, php, unzip }: +{ stdenv, lib, writeTextFile, fetchurl, php, unzip, composer ? php.packages.composer }: let - composer = stdenv.mkDerivation { - name = "composer-1.8.0"; - src = fetchurl { - url = https://github.com/composer/composer/releases/download/1.8.0/composer.phar; - sha256 = "19pg9ip2mpyf5cyq34fld7qwl77mshqw3c4nif7sxmpnar6sh089"; - }; - buildInputs = [ php ]; - - # We must wrap the composer.phar because of the impure shebang. - # We cannot use patchShebangs because the executable verifies its own integrity and will detect that somebody has tampered with it. - - buildCommand = '' - # Copy phar file - mkdir -p $out/share/php - cp $src $out/share/php/composer.phar - chmod 755 $out/share/php/composer.phar - - # Create wrapper executable - mkdir -p $out/bin - cat > $out/bin/composer <= 1.4.5, < 2.0.0) + http_parser.rb (>= 0.5.1, < 0.8.0) + msgpack (>= 1.3.1, < 2.0.0) + serverengine (>= 2.2.2, < 3.0.0) + sigdump (~> 0.2.2) + strptime (>= 0.2.2, < 1.0.0) + tzinfo (>= 1.0, < 3.0) + tzinfo-data (~> 1.0) + webrick (>= 1.4.2, < 1.8.0) + yajl-ruby (~> 1.0) + http_parser.rb (0.7.0) + msgpack (1.4.2) + serverengine (2.2.4) + sigdump (~> 0.2.2) + sigdump (0.2.4) + strptime (0.2.5) + tzinfo (2.0.4) + concurrent-ruby (~> 1.0) + tzinfo-data (1.2021.1) + tzinfo (>= 1.0.0) + webrick (1.7.0) + yajl-ruby (1.4.1) + +PLATFORMS + x86_64-linux + +DEPENDENCIES + fluentd + +BUNDLED WITH + 2.2.20 diff --git a/flakes/mypackages/pkgs/fluentd/default.nix b/flakes/mypackages/pkgs/fluentd/default.nix new file mode 100644 index 0000000..f6a22f0 --- /dev/null +++ b/flakes/mypackages/pkgs/fluentd/default.nix @@ -0,0 +1,20 @@ +{ ruby, bundlerEnv, bundlerUpdateScript, lib }: + +bundlerEnv { + inherit ruby; + + pname = "fluentd"; + gemdir = ./.; + + passthru.updateScript = bundlerUpdateScript "fluentd"; + + copyGemFiles = true; + + meta = with lib; { + description = "A data collector"; + homepage = "https://www.fluentd.org/"; + license = licenses.asl20; + maintainers = with maintainers; [ offline nicknovitski ]; + platforms = platforms.unix; + }; +} diff --git a/flakes/mypackages/pkgs/fluentd/gemset.nix b/flakes/mypackages/pkgs/fluentd/gemset.nix new file mode 100644 index 0000000..8ee42b6 --- /dev/null +++ b/flakes/mypackages/pkgs/fluentd/gemset.nix @@ -0,0 +1,126 @@ +{ + concurrent-ruby = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0nwad3211p7yv9sda31jmbyw6sdafzmdi2i2niaz6f0wk5nq9h0f"; + type = "gem"; + }; + version = "1.1.9"; + }; + "cool.io" = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dfq4h168wzvs9cvn2mm8648ynkl936pgjva2p8ik34p6d620537"; + type = "gem"; + }; + version = "1.7.1"; + }; + fluentd = { + dependencies = ["cool.io" "http_parser.rb" "msgpack" "serverengine" "sigdump" "strptime" "tzinfo" "tzinfo-data" "webrick" "yajl-ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "12k9b9903x5fi3lqb41h20qx8s0fwx7chjldbxmyi7j1x6xdm7cv"; + type = "gem"; + }; + version = "1.13.3"; + }; + "http_parser.rb" = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xha614fi6l04wryqjj1xmpalzlmhb6lb9qmlh8mmliycdhvcshp"; + type = "gem"; + }; + version = "0.7.0"; + }; + msgpack = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06iajjyhx0rvpn4yr3h1hc4w4w3k59bdmfhxnjzzh76wsrdxxrc6"; + type = "gem"; + }; + version = "1.4.2"; + }; + serverengine = { + dependencies = ["sigdump"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1gzhggx40a53mnv4f32xag4h6ai0s5m3w06s59b0h6ih7rqvwns9"; + type = "gem"; + }; + version = "2.2.4"; + }; + sigdump = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1mqf06iw7rymv54y7rgbmfi6ppddgjjmxzi3hrw658n1amp1gwhb"; + type = "gem"; + }; + version = "0.2.4"; + }; + strptime = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ycs0xz58kymf7yp4h56f0nid2z7g3s18dj7pa3p790pfzzpgvcq"; + type = "gem"; + }; + version = "0.2.5"; + }; + tzinfo = { + dependencies = ["concurrent-ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10qp5x7f9hvlc0psv9gsfbxg4a7s0485wsbq1kljkxq94in91l4z"; + type = "gem"; + }; + version = "2.0.4"; + }; + tzinfo-data = { + dependencies = ["tzinfo"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ik16lnsyr2739jzwl4r5sz8q639lqw8f9s68iszwhm2pcq8p4w2"; + type = "gem"; + }; + version = "1.2021.1"; + }; + webrick = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1d4cvgmxhfczxiq5fr534lmizkhigd15bsx5719r5ds7k7ivisc7"; + type = "gem"; + }; + version = "1.7.0"; + }; + yajl-ruby = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16v0w5749qjp13xhjgr2gcsvjv6mf35br7iqwycix1n2h7kfcckf"; + type = "gem"; + }; + version = "1.4.1"; + }; +} \ No newline at end of file diff --git a/pkgs/gearmand/default.nix b/flakes/mypackages/pkgs/gearmand/default.nix similarity index 77% rename from pkgs/gearmand/default.nix rename to flakes/mypackages/pkgs/gearmand/default.nix index bb3be89..14ef8c2 100644 --- a/pkgs/gearmand/default.nix +++ b/flakes/mypackages/pkgs/gearmand/default.nix @@ -1,10 +1,10 @@ -{ stdenv, fetchurl, boost, gperf, libevent, libmysqlclient, libuuid, python3, sqlite, hiredis, postgresql, openssl }: +{ stdenv, fetchurl, boost, gperf, libevent, libmysqlclient, libuuid, sqlite, hiredis, postgresql, openssl }: stdenv.mkDerivation rec { pname = "gearmand"; - version = "1.1.19.1"; + version = "1.1.20"; src = fetchurl { url = "https://github.com/gearman/${pname}/releases/download/${version}/${pname}-${version}.tar.gz"; - sha256 = "1yvb2r3n89p43nchsi3d4nwl0f4xsiy8msnacmm4x4hcdb8y19lf"; + sha256 = "sha256-L2D6IH3NcwWV75ap3DyomVZnB8gXYQazxj7PR+3BR6Y="; }; buildInputs = [ boost gperf libevent openssl libmysqlclient libuuid sqlite hiredis postgresql ]; configureFlags = [ diff --git a/pkgs/genius/default.nix b/flakes/mypackages/pkgs/genius/default.nix similarity index 82% rename from pkgs/genius/default.nix rename to flakes/mypackages/pkgs/genius/default.nix index b40d1d0..54a7957 100644 --- a/pkgs/genius/default.nix +++ b/flakes/mypackages/pkgs/genius/default.nix @@ -1,4 +1,4 @@ -{ stdenv, fetchurl, mpfr, glib, hicolor-icon-theme, gtk2, intltool, gnome-doc-utils, python3, gnome2, autoconf, automake, libtool, ncurses, readline, pkg-config, }: +{ stdenv, fetchurl, mpfr, glib, hicolor-icon-theme, gtk2, intltool, gnome-doc-utils, python38, gnome2, autoconf, automake, libtool, ncurses, readline, pkg-config, }: stdenv.mkDerivation rec { name = "genius-${version}"; version = "1.0.24"; @@ -7,7 +7,7 @@ stdenv.mkDerivation rec { sha256 = "772f95f6ae4716d39bb180cd50e8b6b9b074107bee0cd083b825e1e6e55916b6"; }; buildInputs = [ - mpfr glib hicolor-icon-theme gtk2 intltool gnome-doc-utils python3 gnome2.gtksourceview + mpfr glib hicolor-icon-theme gtk2 intltool gnome-doc-utils python38 gnome2.gtksourceview autoconf automake libtool ncurses readline pkg-config ]; preConfigure = '' diff --git a/flakes/mypackages/pkgs/ical2html/default.nix b/flakes/mypackages/pkgs/ical2html/default.nix new file mode 100644 index 0000000..62e0b95 --- /dev/null +++ b/flakes/mypackages/pkgs/ical2html/default.nix @@ -0,0 +1,11 @@ +{ stdenv, fetchurl, libical }: +stdenv.mkDerivation rec { + pname = "ical2html"; + version = "3.0"; + src= fetchurl { + url = "https://www.w3.org/Tools/Ical2html/${pname}-${version}.tar.gz"; + sha256 = "sha256-1QhE04cmohhPgZ3I8jz28Z7ZnSJkH2aPnRse5/pReEA="; + }; + buildInputs = [ libical ]; + +} diff --git a/pkgs/monitoring-plugins/default.nix b/flakes/mypackages/pkgs/monitoring-plugins/default.nix similarity index 94% rename from pkgs/monitoring-plugins/default.nix rename to flakes/mypackages/pkgs/monitoring-plugins/default.nix index 852d29b..b09d7a4 100644 --- a/pkgs/monitoring-plugins/default.nix +++ b/flakes/mypackages/pkgs/monitoring-plugins/default.nix @@ -1,5 +1,5 @@ { stdenv, iputils, fetchpatch, fetchurl, file, hostname, perl, openssl, - bind, openldap, procps-ng, postfix, + bind, openldap, procps, postfix, wrapperDir ? "/run/wrappers/bin" }: stdenv.mkDerivation rec { @@ -29,5 +29,5 @@ stdenv.mkDerivation rec { --with-sudo-command="${wrapperDir}/sudo" ''; - buildInputs = [ perl file hostname iputils openssl openldap procps-ng bind.dnsutils postfix ]; + buildInputs = [ perl file hostname iputils openssl openldap procps bind.dnsutils postfix ]; } diff --git a/pkgs/mtop/default.nix b/flakes/mypackages/pkgs/mtop/default.nix similarity index 90% rename from pkgs/mtop/default.nix rename to flakes/mypackages/pkgs/mtop/default.nix index 3f6b6bc..ca9be2c 100644 --- a/pkgs/mtop/default.nix +++ b/flakes/mypackages/pkgs/mtop/default.nix @@ -1,5 +1,5 @@ -{ buildPerlPackage, fetchurl, perlPackages, lib }: -buildPerlPackage rec { +{ fetchurl, perlPackages, lib }: +perlPackages.buildPerlPackage rec { pname = "mtop"; version = "0.6.6"; src = fetchurl { diff --git a/flakes/mypackages/pkgs/mutt-ics/default.nix b/flakes/mypackages/pkgs/mutt-ics/default.nix new file mode 100644 index 0000000..2d50475 --- /dev/null +++ b/flakes/mypackages/pkgs/mutt-ics/default.nix @@ -0,0 +1,15 @@ +{ python3Packages, fetchFromGitHub }: +with python3Packages; +buildPythonApplication (rec { + version = "d291187-master"; + pname = "mutt-ics"; + name = "${pname}-${version}"; + src = fetchFromGitHub { + owner = "dmedvinsky"; + repo = "mutt-ics"; + rev = "d29118788f291f67d34fefa6eda9f95846a2fe34"; + sha256 = "0kqzngsvzjq5gpf60jhfmb2xzjznvk172khf4dlcb72n3ak4rb92"; + fetchSubmodules = true; + }; + propagatedBuildInputs = [ icalendar ]; +}) diff --git a/pkgs/muttprint/0.73-4.diff.gz b/flakes/mypackages/pkgs/muttprint/0.73-4.diff.gz similarity index 100% rename from pkgs/muttprint/0.73-4.diff.gz rename to flakes/mypackages/pkgs/muttprint/0.73-4.diff.gz diff --git a/pkgs/muttprint/default.nix b/flakes/mypackages/pkgs/muttprint/default.nix similarity index 100% rename from pkgs/muttprint/default.nix rename to flakes/mypackages/pkgs/muttprint/default.nix diff --git a/pkgs/muttprint/regex.patch b/flakes/mypackages/pkgs/muttprint/regex.patch similarity index 100% rename from pkgs/muttprint/regex.patch rename to flakes/mypackages/pkgs/muttprint/regex.patch diff --git a/pkgs/muttprint/two_edge.patch b/flakes/mypackages/pkgs/muttprint/two_edge.patch similarity index 100% rename from pkgs/muttprint/two_edge.patch rename to flakes/mypackages/pkgs/muttprint/two_edge.patch diff --git a/pkgs/naemon-livestatus/default.nix b/flakes/mypackages/pkgs/naemon-livestatus/default.nix similarity index 56% rename from pkgs/naemon-livestatus/default.nix rename to flakes/mypackages/pkgs/naemon-livestatus/default.nix index 46ef51a..623230a 100644 --- a/pkgs/naemon-livestatus/default.nix +++ b/flakes/mypackages/pkgs/naemon-livestatus/default.nix @@ -1,9 +1,18 @@ -{ stdenv, mylibs, autoconf, automake, +{ stdenv, fetchFromGitHub, autoconf, automake, libtool, pkg-config, naemon, varDir ? "/var/lib/naemon", etcDir ? "/etc/naemon" }: -stdenv.mkDerivation (mylibs.fetchedGithub ./naemon-livestatus.json // { +stdenv.mkDerivation ({ + pname = "naemon-livestatus"; + version = "33dbcfe-master"; + src = fetchFromGitHub { + owner = "naemon"; + repo = "naemon-livestatus"; + rev = "33dbcfe18e42158f25c27cff95a1e07b73be53b0"; + sha256 = "16jk0c6pwr7ck0g6s12hj6czbhgdr7c7f74zzsp5279af86y8fd6"; + fetchSubmodules = true; + }; preConfigure = '' ./autogen.sh || true ''; diff --git a/pkgs/naemon/default.nix b/flakes/mypackages/pkgs/naemon/default.nix similarity index 70% rename from pkgs/naemon/default.nix rename to flakes/mypackages/pkgs/naemon/default.nix index 0341296..2a29bdc 100644 --- a/pkgs/naemon/default.nix +++ b/flakes/mypackages/pkgs/naemon/default.nix @@ -1,4 +1,4 @@ -{ stdenv, mylibs, help2man, monitoring-plugins, autoconf, automake, +{ stdenv, fetchFromGitHub, help2man, monitoring-plugins, autoconf, automake, libtool, glib, pkg-config, gperf, varDir ? "/var/lib/naemon", etcDir ? "/etc/naemon", @@ -8,7 +8,16 @@ user ? "naemon", group ? "naemon" }: -stdenv.mkDerivation (mylibs.fetchedGithub ./naemon.json // { +stdenv.mkDerivation ({ + pname = "naemon"; + version = "d7ac1c8-master"; + src = fetchFromGitHub { + owner = "naemon"; + repo = "naemon-core"; + rev = "d7ac1c824e01dbb1c4a6bd0550b324e7cf165d54"; + sha256 = "003grwciplnqfn9jh2km2pm6xxp8fxvmwihg3vmch8f0vfwcmv1m"; + fetchSubmodules = true; + }; passthru.status_engine_version = "1-1-0"; preConfigure = '' ./autogen.sh || true diff --git a/flakes/mypackages/pkgs/nagios-cli/default.nix b/flakes/mypackages/pkgs/nagios-cli/default.nix new file mode 100644 index 0000000..99ae843 --- /dev/null +++ b/flakes/mypackages/pkgs/nagios-cli/default.nix @@ -0,0 +1,12 @@ +{ python2Packages, fetchFromGitHub }: +python2Packages.buildPythonApplication rec { + version = "edc51ea-master"; + pname = "nagios-cli"; + src = fetchFromGitHub { + owner = "tehmaze"; + repo = "nagios-cli"; + rev = "edc51eaccf1086bb4469ce45c5e5155f2d71a2f9"; + sha256 = "1qw5fv4niz079zqwmfr3kzjv8cc31rbhi9whdbv9c32qdi3h7vsp"; + fetchSubmodules = true; + }; +} diff --git a/flakes/mypackages/pkgs/nagnu/default.nix b/flakes/mypackages/pkgs/nagnu/default.nix new file mode 100644 index 0000000..c7a1162 --- /dev/null +++ b/flakes/mypackages/pkgs/nagnu/default.nix @@ -0,0 +1,21 @@ +{ stdenv, fetchFromGitHub, ncurses, curl }: +stdenv.mkDerivation (rec { + pname = "nagnu"; + version = "c7e65fc-master"; + src = fetchFromGitHub { + owner = "frlen"; + repo = "nagnu"; + rev = "c7e65fc02f46a3756a4cc47953ea2f3e57a84728"; + sha256 = "1i2jm8ibvqcc734daamnzc3hx8q0nsry1x12q0kr5yvcsdjjgyy3"; + fetchSubmodules = true; + }; + buildInputs = [ ncurses curl ]; + installPhase = '' + mkdir -p $out/bin + cp nagnu $out/bin + mkdir -p $out/share/doc/nagnu + cp nagnu.conf.sample $out/share/doc/nagnu + mkdir -p $out/share/man/man8 + cp docs/nagnu.8 $out/share/man/man8 + ''; +}) diff --git a/pkgs/nb/default.nix b/flakes/mypackages/pkgs/nb/default.nix similarity index 80% rename from pkgs/nb/default.nix rename to flakes/mypackages/pkgs/nb/default.nix index 37cc89f..337c286 100644 --- a/pkgs/nb/default.nix +++ b/flakes/mypackages/pkgs/nb/default.nix @@ -1,4 +1,4 @@ -{ pkgs ? import {} }: with pkgs; +{ fetchFromGitHub, stdenv, makeWrapper, lib, file }: stdenv.mkDerivation { pname = "nb"; version = "e0d4e24-master"; @@ -9,11 +9,13 @@ stdenv.mkDerivation { sha256 = "0gpnlzxjlfn3bagw74lsrmfhxj2xzvk6sjj24wp9rjpk42d9mfml"; }; phases = "installPhase"; + buildInputs = [ makeWrapper ]; installPhase = '' mkdir -p $out/bin $out/share/zsh/vendor-completions $out/share/bash-completion/completions cp $src/nb $out/bin/nb chmod +x $out/bin/nb patchShebangs $out/bin/nb + wrapProgram $out/bin/nb --prefix PATH : ${lib.makeBinPath [ file ]} cp $src/etc/nb-completion.zsh $out/share/zsh/vendor-completions/_nb cp $src/etc/nb-completion.bash $out/share/bash-completion/completions/nb ''; diff --git a/pkgs/note/default.nix b/flakes/mypackages/pkgs/note/default.nix similarity index 88% rename from pkgs/note/default.nix rename to flakes/mypackages/pkgs/note/default.nix index d5fcccd..b3b03ef 100644 --- a/pkgs/note/default.nix +++ b/flakes/mypackages/pkgs/note/default.nix @@ -1,5 +1,5 @@ -{ lib, buildPerlPackage, fetchurl, perlPackages }: -buildPerlPackage rec { +{ lib, fetchurl, perlPackages }: +perlPackages.buildPerlPackage rec { pname = "note"; version = "1.3.26"; src = fetchurl { diff --git a/pkgs/notmuch/notmuch-python/default.nix b/flakes/mypackages/pkgs/notmuch/notmuch-python/default.nix similarity index 100% rename from pkgs/notmuch/notmuch-python/default.nix rename to flakes/mypackages/pkgs/notmuch/notmuch-python/default.nix diff --git a/pkgs/notmuch/notmuch-vim/default.nix b/flakes/mypackages/pkgs/notmuch/notmuch-vim/default.nix similarity index 100% rename from pkgs/notmuch/notmuch-vim/default.nix rename to flakes/mypackages/pkgs/notmuch/notmuch-vim/default.nix diff --git a/flakes/mypackages/pkgs/perl-ical-parser-html/default.nix b/flakes/mypackages/pkgs/perl-ical-parser-html/default.nix new file mode 100644 index 0000000..96e9abc --- /dev/null +++ b/flakes/mypackages/pkgs/perl-ical-parser-html/default.nix @@ -0,0 +1,48 @@ +{ perlPackages, fetchurl }: +let + TestXML = perlPackages.buildPerlPackage rec { + pname = "Test-XML"; + version = "0.08"; + src = fetchurl { + url = "mirror://cpan/authors/id/S/SE/SEMANTICO/Test-XML-0.08.tar.gz"; + sha256 = "sha256-61TMI83shg062KyKaXy/A40N7JUimRLZdcMBiQyoPuI="; + }; + propagatedBuildInputs = with perlPackages; [ + ModuleBuild XMLSemanticDiff XMLParser + ]; + }; + iCalParserSAX = perlPackages.buildPerlPackage rec { + pname = "iCal-Parser-SAX"; + version = "1.09"; + src = fetchurl { + url = "mirror://cpan/authors/id/R/RF/RFRANKEL/iCal-Parser-SAX-1.09.tar.gz"; + sha256 = "sha256-fouAjQ+MTUgwZ/j3dIarOK0rVBZcZy6aOJFor4pLql0="; + }; + propagatedBuildInputs = with perlPackages; [ + ModuleBuild DateTime IOString XMLSAXBase XMLSAXWriter iCalParser + LWPUserAgent + ]; + buildInputs = [ TestXML ]; + doCheck = false; + }; +in +perlPackages.buildPerlPackage rec { + pname = "iCal-Parser-HTML"; + version = "1.07"; + src = fetchurl { + url = "mirror://cpan/authors/id/R/RF/RFRANKEL/${pname}-${version}.tar.gz"; + sha256 = "sha256-cxRS2M6aVrCtAXHQae0Y6EtEfGnGx41UuB7z442NSrU="; + }; + patchPhase = '' + sed -i -e "s/qw(week month year)/(qw(week month year))/" lib/iCal/Parser/HTML.pm + ''; + doCheck = false; + postInstall = '' + mkdir -p $out/bin + cp scripts/ical2html $out/bin + chmod +x $out/bin/ical2html + ''; + propagatedBuildInputs = with perlPackages; [ + ModuleBuild XMLLibXML XMLLibXSLT iCalParser iCalParserSAX + ]; +} diff --git a/flakes/mypackages/pkgs/pgpid/default.nix b/flakes/mypackages/pkgs/pgpid/default.nix new file mode 100644 index 0000000..a1fb9c2 --- /dev/null +++ b/flakes/mypackages/pkgs/pgpid/default.nix @@ -0,0 +1,33 @@ +{ lib, stdenv, fetchFromGitHub, makeWrapper, bashInteractive, bash-libs, coreutils, file, gnugrep, texlive, pandoc, aspell, util-linux, findutils, gnused, gnupg, gawk, facedetect, graphicsmagick, qrencode, tesseract4, zbar, cups, vim }: +stdenv.mkDerivation { + pname = "pgpid"; + version = "master"; + src = fetchFromGitHub { + owner = "foopgp"; + repo = "pgpid"; + rev = "26c2137951775652e9e774977639ecaea5845cf7"; + sha256 = "sha256-noXDYWWxUryFnV99pyl0eV7hJLUkSy97Vqylx5dKN9g="; + }; + + buildInputs = [ makeWrapper ]; + phases = [ "installPhase" ]; + installPhase = '' + mkdir -p $out/bin $out/share/pgpid $out/share/doc/pgpid + + cp $src/pgpid-gen $src/pgpid-qrscan $out/bin + cp -r $src/doc $out/share/doc/pgpid + cp -r $src/data $out/share/pgpid + cp -r $src/imgsamples $out/share/pgpid + for i in $out/bin/*; do + patchShebangs $i + sed -i -e "/^TESSDATADIR/d" -e "/^GEOLIST_CENTROID/d" $i + sed -i -e 's@"$(dirname "$BASH_SOURCE")"@${bash-libs}/share/bash-libs/include@' $i + wrapProgram $i --set PATH ${lib.makeBinPath [ + facedetect graphicsmagick qrencode tesseract4 zbar cups gnugrep vim gnupg findutils + pandoc (texlive.combine { scheme-small = texlive.scheme-small; pdfcrop = texlive.pdfcrop; }) + ]}:$(cat ${bash-libs}/nix-support/propagated-build-inputs) \ + --set TESSDATADIR $out/share/pgpid/data \ + --set GEOLIST_CENTROID $out/share/pgpid/data/geolist_centroid.txt + done + ''; +} diff --git a/flakes/mypackages/pkgs/predixy/default.nix b/flakes/mypackages/pkgs/predixy/default.nix new file mode 100644 index 0000000..259d7fd --- /dev/null +++ b/flakes/mypackages/pkgs/predixy/default.nix @@ -0,0 +1,19 @@ +{ stdenv, fetchFromGitHub }: +stdenv.mkDerivation ({ + pname = "predixy"; + version = "dacf3fb-master"; + src = fetchFromGitHub { + owner = "joyieldInc"; + repo = "predixy"; + rev = "dacf3fb30c2602dc044040df04e194d44b49c1be"; + sha256 = "0sbvy0jg551lwkfq8qh0a49cl9mhfnkhi3cnk25l8pz4jcdrr9k9"; + fetchSubmodules = true; + }; + installPhase = '' + mkdir -p $out/bin + cp src/predixy $out/bin + mkdir -p $out/share + cp -r doc $out/share + cp -r conf $out/share/doc + ''; +}) diff --git a/pkgs/proftpd/default.nix b/flakes/mypackages/pkgs/proftpd/default.nix similarity index 56% rename from pkgs/proftpd/default.nix rename to flakes/mypackages/pkgs/proftpd/default.nix index af9d6c6..8bdf531 100644 --- a/pkgs/proftpd/default.nix +++ b/flakes/mypackages/pkgs/proftpd/default.nix @@ -1,22 +1,21 @@ -{ pkgs ? import {} }: -with pkgs; +{ stdenv, fetchurl, file, openssl, libsodium, ncurses, cyrus_sasl, openldap, pkg-config, libxcrypt }: stdenv.mkDerivation rec { pname = "proftpd"; - version = "1.3.7c"; + version = "1.3.8"; src = fetchurl { url = "https://github.com/proftpd/proftpd/archive/refs/tags/v${version}.tar.gz"; - sha256 = "1nh02j00ly814fk885wn9zx1lb63cqd8qv3mgz719xkckf5rcw3h"; + sha256 = "sha256-9xOec3eiywWbi5sU12pt9fRA4xgcsVrokNQ7vK5XR0g="; }; postPatch = '' sed -i -e "s@/usr/bin/file@${file}/bin/file@" configure ''; dontDisableStatic = 1; - configureFlags = "--enable-openssl --with-modules=mod_ldap:mod_sftp:mod_tls --with-includes=${libsodium.dev}/include --with-libraries=${libsodium}/lib"; + configureFlags = [ "--enable-openssl" "--with-modules=mod_ldap:mod_sftp:mod_tls:mod_site_misc" "--with-includes=${libsodium.dev}/include" "--with-libraries=${libsodium}/lib" ]; preInstall = '' installFlagsArray=(INSTALL_USER=$(id -u) INSTALL_GROUP=$(id -g)) ''; - buildInputs = [ openssl libsodium ncurses cyrus_sasl openldap pkg-config ]; + buildInputs = [ openssl libsodium ncurses cyrus_sasl openldap pkg-config libxcrypt ]; postInstall = '' rmdir $out/var $out/libexec $out/lib/proftpd $out/share/locale ''; diff --git a/pkgs/pure-ftpd/default.nix b/flakes/mypackages/pkgs/pure-ftpd/default.nix similarity index 92% rename from pkgs/pure-ftpd/default.nix rename to flakes/mypackages/pkgs/pure-ftpd/default.nix index 32a7a91..55c698f 100644 --- a/pkgs/pure-ftpd/default.nix +++ b/flakes/mypackages/pkgs/pure-ftpd/default.nix @@ -1,5 +1,5 @@ { ldapFtpId ? null -, stdenv, fetchurl, openssl, postgresql, openldap }: +, stdenv, lib, fetchurl, openssl, postgresql, openldap }: stdenv.mkDerivation rec { name = "pure-ftpd-1.0.47"; @@ -20,7 +20,7 @@ stdenv.mkDerivation rec { configureFlags = [ "--with-everything" "--with-tls" "--with-pgsql" "--with-ldap" ]; - meta = with stdenv.lib; { + meta = with lib; { description = "A free, secure, production-quality and standard-conformant FTP server"; homepage = https://www.pureftpd.org; license = licenses.isc; # with some parts covered by BSD3(?) diff --git a/flakes/mypackages/pkgs/riotkit-do/default.nix b/flakes/mypackages/pkgs/riotkit-do/default.nix new file mode 100644 index 0000000..3ddb1ab --- /dev/null +++ b/flakes/mypackages/pkgs/riotkit-do/default.nix @@ -0,0 +1,60 @@ +{ python3Packages }: +let + tabulate = python3Packages.buildPythonPackage rec { + version = "0.8.7"; + pname = "tabulate"; + + src = python3Packages.fetchPypi { + inherit pname version; + sha256 = "sha256-2ycjog0EvNqFIhZcc+6nwwDtp04M6FLZAi4BWdeJUAc="; + }; + + checkInputs = with python3Packages; [ nose ]; + + doCheck = false; + }; + + python-dotenv = python3Packages.buildPythonPackage rec { + pname = "python-dotenv"; + version = "0.13.0"; + + src = python3Packages.fetchPypi { + inherit pname version; + sha256 = "sha256-O5kJvJaw7cawFYbh7tBecRdO9OBMcdpXhjcM6+pTrXQ="; + }; + + propagatedBuildInputs = with python3Packages; [ click ]; + + checkInputs = with python3Packages; [ + ipython + mock + pytestCheckHook + sh + ]; + + disabledTests = [ + "cli" + ]; + + pythonImportsCheck = [ "dotenv" ]; + }; +in +python3Packages.buildPythonApplication rec { + pname = "rkd"; + version = "2.4.0"; + src = python3Packages.fetchPypi { + inherit pname version; + sha256 = "sha256-WC0FmUYGkV9PFvRtiFW6w6RtP+9Zf6kizl8jGiRb4HQ="; + }; + + propagatedBuildInputs = with python3Packages; [ + pbr + jinja2 + pyyaml + tabulate + psutil + pytest + python-dotenv + jsonschema + ]; +} diff --git a/pkgs/rrsync_sudo/default.nix b/flakes/mypackages/pkgs/rrsync_sudo/default.nix similarity index 100% rename from pkgs/rrsync_sudo/default.nix rename to flakes/mypackages/pkgs/rrsync_sudo/default.nix diff --git a/pkgs/rrsync_sudo/sudo.patch b/flakes/mypackages/pkgs/rrsync_sudo/sudo.patch similarity index 100% rename from pkgs/rrsync_sudo/sudo.patch rename to flakes/mypackages/pkgs/rrsync_sudo/sudo.patch diff --git a/flakes/mypackages/pkgs/shaarli/default.nix b/flakes/mypackages/pkgs/shaarli/default.nix new file mode 100644 index 0000000..23f9937 --- /dev/null +++ b/flakes/mypackages/pkgs/shaarli/default.nix @@ -0,0 +1,24 @@ +{ varDir ? "/var/lib/shaarli", stdenv, fetchurl }: + +stdenv.mkDerivation rec { + pname = "shaarli"; + version = "0.10.2"; + src = fetchurl { + url = "https://github.com/shaarli/Shaarli/releases/download/v${version}/shaarli-v${version}-full.tar.gz"; + sha256 = "0h8sspj7siy3vgpi2i3gdrjcr5935fr4dfwq2zwd70sjx2sh9s78"; + }; + patchPhase = ""; + + outputs = [ "out" "doc" ]; + + patches = [ ./shaarli_ldap.patch ]; + installPhase = '' + rm -r {cache,pagecache,tmp,data}/ + mkdir -p $doc/share/doc + mv doc/ $doc/share/doc/shaarli + mkdir $out/ + cp -R ./* $out + cp .htaccess $out/ + ln -sf ${varDir}/{cache,pagecache,tmp,data} $out/ + ''; +} diff --git a/overlays/shaarli/shaarli_ldap.patch b/flakes/mypackages/pkgs/shaarli/shaarli_ldap.patch similarity index 100% rename from overlays/shaarli/shaarli_ldap.patch rename to flakes/mypackages/pkgs/shaarli/shaarli_ldap.patch diff --git a/pkgs/signaldctl/default.nix b/flakes/mypackages/pkgs/signaldctl/default.nix similarity index 100% rename from pkgs/signaldctl/default.nix rename to flakes/mypackages/pkgs/signaldctl/default.nix diff --git a/pkgs/slang_1/default.nix b/flakes/mypackages/pkgs/slang_1/default.nix similarity index 100% rename from pkgs/slang_1/default.nix rename to flakes/mypackages/pkgs/slang_1/default.nix diff --git a/pkgs/status_engine/host_perfdata.patch b/flakes/mypackages/pkgs/status_engine/host_perfdata.patch similarity index 100% rename from pkgs/status_engine/host_perfdata.patch rename to flakes/mypackages/pkgs/status_engine/host_perfdata.patch diff --git a/pkgs/status_engine/interface.nix b/flakes/mypackages/pkgs/status_engine/interface.nix similarity index 63% rename from pkgs/status_engine/interface.nix rename to flakes/mypackages/pkgs/status_engine/interface.nix index 7ee4889..9c8ff5e 100644 --- a/pkgs/status_engine/interface.nix +++ b/flakes/mypackages/pkgs/status_engine/interface.nix @@ -1,6 +1,9 @@ -{ stdenv, composerEnv, fetchurl, callPackage, config_file ? "/var/lib/status_engine/interface.yml" }: -composerEnv.buildPackage ( - import ./interface_php_packages.nix { inherit composerEnv fetchurl; } // rec { +{ stdenv, composerEnv, php73, fetchurl, callPackage, config_file ? "/var/lib/status_engine/interface.yml" }: +let + composerEnv' = composerEnv.override { php = php73; }; +in +composerEnv'.buildPackage ( + import ./interface_php_packages.nix { composerEnv = composerEnv'; inherit fetchurl; } // rec { pname = "interface"; version = "3.4.0"; name = "${pname}-${version}"; diff --git a/pkgs/status_engine/interface_composer.lock b/flakes/mypackages/pkgs/status_engine/interface_composer.lock similarity index 100% rename from pkgs/status_engine/interface_composer.lock rename to flakes/mypackages/pkgs/status_engine/interface_composer.lock diff --git a/pkgs/status_engine/interface_php_packages.nix b/flakes/mypackages/pkgs/status_engine/interface_php_packages.nix similarity index 100% rename from pkgs/status_engine/interface_php_packages.nix rename to flakes/mypackages/pkgs/status_engine/interface_php_packages.nix diff --git a/flakes/mypackages/pkgs/status_engine/module.nix b/flakes/mypackages/pkgs/status_engine/module.nix new file mode 100644 index 0000000..d3ac03e --- /dev/null +++ b/flakes/mypackages/pkgs/status_engine/module.nix @@ -0,0 +1,19 @@ +{ stdenv, fetchFromGitHub, gearmand, json_c, libuuid, libevent, pkgconfig, glib }: +stdenv.mkDerivation ({ + pname = "statusengine-module"; + version = "d461e95-master"; + src = fetchFromGitHub { + owner = "statusengine"; + repo = "module"; + rev = "d461e95a11fffaac604d11ac42d237b5e13071bc"; + sha256 = "1awmq9rck9xy82pambnd2wh66ndif8x8jpk4qbbghs9f2sd48x1n"; + fetchSubmodules = true; + }; + patches = [ ./host_perfdata.patch ]; + buildInputs = [ gearmand json_c libuuid libevent pkgconfig glib ]; + makeFlags = "all"; + installPhase = '' + mkdir -p $out/lib/status-engine + cp -a src/bin/* $out/lib/status-engine + ''; +}) diff --git a/flakes/mypackages/pkgs/status_engine/worker.nix b/flakes/mypackages/pkgs/status_engine/worker.nix new file mode 100644 index 0000000..d8425e1 --- /dev/null +++ b/flakes/mypackages/pkgs/status_engine/worker.nix @@ -0,0 +1,37 @@ +{ stdenv, fetchFromGitHub, composerEnv, fetchurl, gearmand, callPackage, php81, config_file ? "/var/lib/status_engine/ui.yml" }: +let + gearman = php81.buildPecl rec { + # git describe + version = "2.1.0-12-g8fb88d5"; + pname = "gearman"; + src = fetchFromGitHub { + owner = "php"; + repo = "pecl-networking-gearman"; + rev = "8fb88d5a97111a7e8f0dc67553c387b49f047e53"; + sha256 = "sha256-VPJX29JfNjh0mHlYY+iYKBHSJGUINbWHvojyYBSkSho="; + }; + configureFlags = [ "--with-gearman=${gearmand}" ]; + nativeBuildInputs = [ gearmand ]; + }; + php = php81.withExtensions({ enabled, all }: enabled ++ (with all; [gearman redis mbstring bcmath iconv])); +in +(composerEnv.override { inherit php; }).buildPackage ( + import ./worker_php_packages.nix { inherit composerEnv fetchurl; } // rec { + name = "${pname}-${version}"; + pname = "worker"; + version = "master"; + src = fetchFromGitHub { + owner = "statusengine"; + repo = "worker"; + rev = "e20d6b5c83c6b3c6a2030c9506542fa59dcbb551"; + sha256 = "sha256-dcC+SLEqMUubp4JQFSuKNpd6U4VYvGR38Vn1jf6ZvTU="; + fetchSubmodules = true; + }; + passthru.php = php; + postInstall = '' + ln -s ${config_file} $out/etc/config.yml + ''; + preInstall = '' + cp ${./worker_composer.lock} $out/composer.lock + ''; +}) diff --git a/flakes/mypackages/pkgs/status_engine/worker_composer.lock b/flakes/mypackages/pkgs/status_engine/worker_composer.lock new file mode 100644 index 0000000..bba0d2d --- /dev/null +++ b/flakes/mypackages/pkgs/status_engine/worker_composer.lock @@ -0,0 +1,2072 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "f61ef94b19969eb2446f52577078d701", + "packages": [ + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99.5", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-01-17T14:14:24+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/dbal", + "version": "2.13.9", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.0|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.1 || ^8" + }, + "require-dev": { + "doctrine/coding-standard": "9.0.0", + "jetbrains/phpstorm-stubs": "2021.1", + "phpstan/phpstan": "1.4.6", + "phpunit/phpunit": "^7.5.20|^8.5|9.5.16", + "psalm/plugin-phpunit": "0.16.1", + "squizlabs/php_codesniffer": "3.6.2", + "symfony/cache": "^4.4", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", + "vimeo/psalm": "4.22.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlanywhere", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/2.13.9" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2022-05-02T20:28:55+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" + }, + "time": "2023-06-03T09:27:29+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^0.5.3 || ^1", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.8", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2022-10-12T20:51:15+00:00" + }, + { + "name": "doctrine/migrations", + "version": "2.3.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/migrations.git", + "reference": "28d92a34348fee5daeb80879e56461b2e862fc05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/28d92a34348fee5daeb80879e56461b2e862fc05", + "reference": "28d92a34348fee5daeb80879e56461b2e862fc05", + "shasum": "" + }, + "require": { + "composer/package-versions-deprecated": "^1.8", + "doctrine/dbal": "^2.9", + "friendsofphp/proxy-manager-lts": "^1.0", + "php": "^7.1 || ^8.0", + "symfony/console": "^3.4||^4.4.16||^5.0", + "symfony/stopwatch": "^3.4||^4.0||^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "doctrine/orm": "^2.6", + "ext-pdo_sqlite": "*", + "jdorn/sql-formatter": "^1.1", + "mikey179/vfsstream": "^1.6", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/cache": "^4.4. || ^5.3", + "symfony/process": "^3.4||^4.0||^5.0", + "symfony/yaml": "^3.4||^4.0||^5.0" + }, + "suggest": { + "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command.", + "symfony/yaml": "Allows the use of yaml for migration configuration files." + }, + "bin": [ + "bin/doctrine-migrations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Michael Simonson", + "email": "contact@mikesimonson.com" + } + ], + "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", + "homepage": "https://www.doctrine-project.org/projects/migrations.html", + "keywords": [ + "database", + "dbal", + "migrations", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/migrations/issues", + "source": "https://github.com/doctrine/migrations/tree/2.3.5" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations", + "type": "tidelift" + } + ], + "time": "2021-10-19T19:55:20+00:00" + }, + { + "name": "friendsofphp/proxy-manager-lts", + "version": "v1.0.16", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", + "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c", + "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c", + "shasum": "" + }, + "require": { + "laminas/laminas-code": "~3.4.1|^4.0", + "php": ">=7.1", + "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0" + }, + "conflict": { + "laminas/laminas-stdlib": "<3.2.1", + "zendframework/zend-stdlib": "<3.2.1" + }, + "replace": { + "ocramius/proxy-manager": "^2.1" + }, + "require-dev": { + "ext-phar": "*", + "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" + }, + "type": "library", + "extra": { + "thanks": { + "name": "ocramius/proxy-manager", + "url": "https://github.com/Ocramius/ProxyManager" + } + }, + "autoload": { + "psr-4": { + "ProxyManager\\": "src/ProxyManager" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + } + ], + "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", + "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "support": { + "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.16" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2023-05-24T07:17:17+00:00" + }, + { + "name": "laminas/laminas-code", + "version": "4.7.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-code.git", + "reference": "91aabc066d5620428120800c0eafc0411e441a62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/91aabc066d5620428120800c0eafc0411e441a62", + "reference": "91aabc066d5620428120800c0eafc0411e441a62", + "shasum": "" + }, + "require": { + "php": ">=7.4, <8.2" + }, + "require-dev": { + "doctrine/annotations": "^1.13.2", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^2.3.0", + "laminas/laminas-stdlib": "^3.6.1", + "phpunit/phpunit": "^9.5.10", + "psalm/plugin-phpunit": "^0.17.0", + "vimeo/psalm": "^4.13.1" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" + }, + "type": "library", + "autoload": { + "files": [ + "polyfill/ReflectionEnumPolyfill.php" + ], + "psr-4": { + "Laminas\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", + "keywords": [ + "code", + "laminas", + "laminasframework" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2022-11-21T01:32:31+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "58c3f47f650c94ec05a151692652a868995d2938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2022-06-14T06:56:20+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "php-amqplib/php-amqplib", + "version": "v3.5.4", + "source": { + "type": "git", + "url": "https://github.com/php-amqplib/php-amqplib.git", + "reference": "1aecbd182b35eb039667c50d7d92d71f105be779" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/1aecbd182b35eb039667c50d7d92d71f105be779", + "reference": "1aecbd182b35eb039667c50d7d92d71f105be779", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-sockets": "*", + "php": "^7.1||^8.0", + "phpseclib/phpseclib": "^2.0|^3.0" + }, + "conflict": { + "php": "7.4.0 - 7.4.1" + }, + "replace": { + "videlalvaro/php-amqplib": "self.version" + }, + "require-dev": { + "ext-curl": "*", + "nategood/httpful": "^0.2.20", + "phpunit/phpunit": "^7.5|^9.5", + "squizlabs/php_codesniffer": "^3.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpAmqpLib\\": "PhpAmqpLib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Alvaro Videla", + "role": "Original Maintainer" + }, + { + "name": "Raúl Araya", + "email": "nubeiro@gmail.com", + "role": "Maintainer" + }, + { + "name": "Luke Bakken", + "email": "luke@bakken.io", + "role": "Maintainer" + }, + { + "name": "RamÅ«nas Dronga", + "email": "github@ramuno.lt", + "role": "Maintainer" + } + ], + "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", + "homepage": "https://github.com/php-amqplib/php-amqplib/", + "keywords": [ + "message", + "queue", + "rabbitmq" + ], + "support": { + "issues": "https://github.com/php-amqplib/php-amqplib/issues", + "source": "https://github.com/php-amqplib/php-amqplib/tree/v3.5.4" + }, + "time": "2023-07-01T11:25:08+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.21", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "4580645d3fc05c189024eb3b834c6c1e4f0f30a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/4580645d3fc05c189024eb3b834c6c1e4f0f30a1", + "reference": "4580645d3fc05c189024eb3b834c6c1e4f0f30a1", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.21" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2023-07-09T15:24:48+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273", + "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-19T20:11:33+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:55:41+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214", + "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-20T17:44:14+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:17:58+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f83692cd869a6f2391691d40a01e8acb89e76fee", + "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.4.21" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:03:56+00:00" + }, + { + "name": "symfony/string", + "version": "v6.0.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a", + "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.0.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-01T08:36:10+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.23", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.23" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-23T19:33:36+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.2.0", + "ext-redis": "*", + "ext-gearman": "*", + "ext-mbstring": "*", + "ext-bcmath": "*", + "ext-json": "*", + "ext-iconv": "*", + "ext-pdo": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.2.0" +} diff --git a/flakes/mypackages/pkgs/status_engine/worker_php_packages.nix b/flakes/mypackages/pkgs/status_engine/worker_php_packages.nix new file mode 100644 index 0000000..47291d2 --- /dev/null +++ b/flakes/mypackages/pkgs/status_engine/worker_php_packages.nix @@ -0,0 +1,266 @@ +{composerEnv, fetchurl, fetchgit ? null, fetchhg ? null, fetchsvn ? null, noDev ? false}: +{ + packages = + { + "composer/package-versions-deprecated" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "composer-package-versions-deprecated-b4f54f74ef3453349c24a845d22392cd31e65f1d"; + src = fetchurl { + url = "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d"; + sha256 = "1hrjxvk8i14pw9gi7j3qc0gljjy74hwdkv8zwsrg5brgyzhqfwam"; + }; + }; + }; + "doctrine/cache" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "doctrine-cache-1ca8f21980e770095a31456042471a57bc4c68fb"; + src = fetchurl { + url = "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb"; + sha256 = "1p8ia9g3mqz71bv4x8q1ng1fgcidmyksbsli1fjbialpgjk9k1ss"; + }; + }; + }; + "doctrine/dbal" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "doctrine-dbal-c480849ca3ad6706a39c970cdfe6888fa8a058b8"; + src = fetchurl { + url = "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8"; + sha256 = "15j98h80li6m1aj53p8ddy0lkbkanc5kdy6xrikpdd6zhmsfgq9k"; + }; + }; + }; + "doctrine/deprecations" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "doctrine-deprecations-612a3ee5ab0d5dd97b7cf3874a6efe24325efac3"; + src = fetchurl { + url = "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3"; + sha256 = "078w4k0xdywyb44caz5grbcbxsi87iy13g7a270rs9g5f0p245fi"; + }; + }; + }; + "doctrine/event-manager" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "doctrine-event-manager-95aa4cb529f1e96576f3fda9f5705ada4056a520"; + src = fetchurl { + url = "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520"; + sha256 = "0xi2s28jmmvrndg1yd0r5s10d9a0q6j2dxdbazvcbws9waf0yrvj"; + }; + }; + }; + "doctrine/migrations" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "doctrine-migrations-28d92a34348fee5daeb80879e56461b2e862fc05"; + src = fetchurl { + url = "https://api.github.com/repos/doctrine/migrations/zipball/28d92a34348fee5daeb80879e56461b2e862fc05"; + sha256 = "0j5snc96r03vcjlb3k94cx871f69xaq53bza8mm8xs4jk85gr5jg"; + }; + }; + }; + "friendsofphp/proxy-manager-lts" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "friendsofphp-proxy-manager-lts-ecadbdc9052e4ad08c60c8a02268712e50427f7c"; + src = fetchurl { + url = "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c"; + sha256 = "15ch54cm3rvjyvsvqs9ixfn3vnydfxa0knd4g6myapsryirrskvi"; + }; + }; + }; + "laminas/laminas-code" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "laminas-laminas-code-91aabc066d5620428120800c0eafc0411e441a62"; + src = fetchurl { + url = "https://api.github.com/repos/laminas/laminas-code/zipball/91aabc066d5620428120800c0eafc0411e441a62"; + sha256 = "01wsb6ph5h8ga9rnlr0lxd3qwn897ccxqxpbz540lfgz7a1prpb0"; + }; + }; + }; + "paragonie/constant_time_encoding" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "paragonie-constant_time_encoding-58c3f47f650c94ec05a151692652a868995d2938"; + src = fetchurl { + url = "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938"; + sha256 = "0i9km0lzvc7df9758fm1p3y0679pzvr5m9x3mrz0d2hxlppsm764"; + }; + }; + }; + "paragonie/random_compat" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "paragonie-random_compat-996434e5492cb4c3edcb9168db6fbb1359ef965a"; + src = fetchurl { + url = "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a"; + sha256 = "0ky7lal59dihf969r1k3pb96ql8zzdc5062jdbg69j6rj0scgkyx"; + }; + }; + }; + "php-amqplib/php-amqplib" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "php-amqplib-php-amqplib-1aecbd182b35eb039667c50d7d92d71f105be779"; + src = fetchurl { + url = "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/1aecbd182b35eb039667c50d7d92d71f105be779"; + sha256 = "0wwzlf2yhjrc523n0y7qh23pxgn4f2qhkbr0jnxzq9j6mm75hnjm"; + }; + }; + }; + "phpseclib/phpseclib" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "phpseclib-phpseclib-4580645d3fc05c189024eb3b834c6c1e4f0f30a1"; + src = fetchurl { + url = "https://api.github.com/repos/phpseclib/phpseclib/zipball/4580645d3fc05c189024eb3b834c6c1e4f0f30a1"; + sha256 = "0v3c7n9h99pw4f03bfxjsgni7wpq7xr47nw2hf2hq8yjndw19n3p"; + }; + }; + }; + "psr/container" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "psr-container-c71ecc56dfe541dbd90c5360474fbc405f8d5963"; + src = fetchurl { + url = "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963"; + sha256 = "1mvan38yb65hwk68hl0p7jymwzr4zfnaxmwjbw7nj3rsknvga49i"; + }; + }; + }; + "symfony/console" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-console-b504a3d266ad2bb632f196c0936ef2af5ff6e273"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273"; + sha256 = "0na3lpgzvrsxngyzv2w90k3ykw1y5j4p6v965v3sal03y6rr2w2i"; + }; + }; + }; + "symfony/deprecation-contracts" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-deprecation-contracts-26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"; + sha256 = "1wlaj9ngbyjmgr92gjyf7lsmjfswyh8vpbzq5rdzaxjb6bcsj3dp"; + }; + }; + }; + "symfony/filesystem" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-filesystem-3d49eec03fda1f0fc19b7349fbbe55ebc1004214"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214"; + sha256 = "0dhnyj6m9n6359z5c0xh4pz38n89i9x5c9r1s2dlgxz0daysbbyy"; + }; + }; + }; + "symfony/polyfill-ctype" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-polyfill-ctype-5bbc823adecdae860bb64756d639ecfec17b050a"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a"; + sha256 = "0vyv70z1yi2is727d1mkb961w5r1pb1v3wy1pvdp30h8ffy15wk6"; + }; + }; + }; + "symfony/polyfill-intl-grapheme" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-polyfill-intl-grapheme-511a08c03c1960e08a883f4cffcacd219b758354"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354"; + sha256 = "0ifsgsyxf0z0nkynqvr5259dm5dsmbgdpvyi5zfvy8935mi0ki0i"; + }; + }; + }; + "symfony/polyfill-intl-normalizer" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-polyfill-intl-normalizer-19bd1e4fcd5b91116f14d8533c57831ed00571b6"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6"; + sha256 = "1d80jph5ykiw6ydv8fwd43s0aglh24qc1yrzds2f3aqanpbk1gr2"; + }; + }; + }; + "symfony/polyfill-mbstring" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-polyfill-mbstring-8ad114f6b39e2c98a8b0e3bd907732c207c2b534"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534"; + sha256 = "1ym84qp609i50lv4vkd4yz99y19kaxd5kmpdnh66mxx1a4a104mi"; + }; + }; + }; + "symfony/polyfill-php73" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-polyfill-php73-9e8ecb5f92152187c4799efd3c96b78ccab18ff9"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9"; + sha256 = "1p0jr92x323pl4frjbhmziyk5g1zig1g30i1v1p0wfli2sq8h5mb"; + }; + }; + }; + "symfony/polyfill-php80" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-polyfill-php80-7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"; + sha256 = "16yydk7rsknlasrpn47n4b4js8svvp4rxzw99dkav52wr3cqmcwd"; + }; + }; + }; + "symfony/service-contracts" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-service-contracts-d78d39c1599bd1188b8e26bb341da52c3c6d8a66"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66"; + sha256 = "1cgbn2yx2fyrc3c1d85vdriiwwifr1sdg868f3rhq9bh78f03z99"; + }; + }; + }; + "symfony/stopwatch" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-stopwatch-f83692cd869a6f2391691d40a01e8acb89e76fee"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/stopwatch/zipball/f83692cd869a6f2391691d40a01e8acb89e76fee"; + sha256 = "1qh49p2jfca5kpcmlcbjx5izgqqvjd91385zy5mipyslsdik2lwg"; + }; + }; + }; + "symfony/string" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-string-d9e72497367c23e08bf94176d2be45b00a9d232a"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a"; + sha256 = "0k4vvcjfdp2dni8gzq4rn8d6n0ivd38sfna70lgsh8vlc8rrlhpf"; + }; + }; + }; + "symfony/yaml" = { + targetDir = ""; + src = composerEnv.buildZipPackage { + name = "symfony-yaml-4cd2e3ea301aadd76a4172756296fe552fb45b0b"; + src = fetchurl { + url = "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b"; + sha256 = "18yirwiqbh11fwlpqypm0wlc0lnx7prgk68xrn607zcg6cxnfhiz"; + }; + }; + }; + }; +} diff --git a/flakes/mypackages/pkgs/telegram-history-dump/default.nix b/flakes/mypackages/pkgs/telegram-history-dump/default.nix new file mode 100644 index 0000000..492e265 --- /dev/null +++ b/flakes/mypackages/pkgs/telegram-history-dump/default.nix @@ -0,0 +1,18 @@ +{ stdenv, ruby, fetchFromGitHub }: +stdenv.mkDerivation ({ + pname = "telegram-history-dump"; + version = "468ea91-master"; + src = fetchFromGitHub { + owner = "tvdstaaij"; + repo = "telegram-history-dump"; + rev = "468ea91e543529b54bc2c5ea28b1ea17f362fd3e"; + sha256 = "1wmwiqacfa56bmwx50njnb15cg0fy6rbdrmrjd4xfbh8bs6yp0gh"; + fetchSubmodules = true; + }; + installPhase = '' + mkdir -p $out/lib $out/bin + cp -a $src $out/lib/telegram-history-dump + ln -s $out/lib/telegram-history-dump/telegram-history-dump.rb $out/bin/telegram-history-dump + ''; + buildInputs = [ ruby ]; +}) diff --git a/pkgs/telegramircd/default.nix b/flakes/mypackages/pkgs/telegramircd/default.nix similarity index 62% rename from pkgs/telegramircd/default.nix rename to flakes/mypackages/pkgs/telegramircd/default.nix index 2f1d7ca..d9196a2 100644 --- a/pkgs/telegramircd/default.nix +++ b/flakes/mypackages/pkgs/telegramircd/default.nix @@ -1,11 +1,17 @@ -{ openssl, telethon, python3Packages, mylibs }: +{ openssl, telethon, python3Packages, fetchFromGitHub }: with python3Packages; buildPythonApplication rec { format = "other"; pname = "telegramircd"; version = "master"; propagatedBuildInputs = [ telethon aiohttp ConfigArgParse openssl ]; - src = (mylibs.fetchedGithub ./telegramircd.json).src; + src = fetchFromGitHub { + owner = "MaskRay"; + repo = "telegramircd"; + rev = "40a0c7cf60492bde3f44d43f06f62e3792480139"; + sha256 = "123fjhgxq2fzn0ar8274jv7jjbxnlpidrj5333kbch7rpcipks0y"; + fetchSubmodules = true; + }; LD_LIBRARY_PATH = "${openssl.out}/lib"; installPhase = '' install -D $src/telegramircd.py $out/bin/telegramircd diff --git a/pkgs/telethon_sync/default.nix b/flakes/mypackages/pkgs/telethon_sync/default.nix similarity index 100% rename from pkgs/telethon_sync/default.nix rename to flakes/mypackages/pkgs/telethon_sync/default.nix diff --git a/pkgs/terminal-velocity/default.nix b/flakes/mypackages/pkgs/terminal-velocity/default.nix similarity index 94% rename from pkgs/terminal-velocity/default.nix rename to flakes/mypackages/pkgs/terminal-velocity/default.nix index 1a015c0..3ccfcd3 100644 --- a/pkgs/terminal-velocity/default.nix +++ b/flakes/mypackages/pkgs/terminal-velocity/default.nix @@ -1,5 +1,5 @@ -{ python36Packages }: -with python36Packages; +{ python37Packages }: +with python37Packages; buildPythonApplication rec { pname = "terminal-velocity-git"; version = "0.2.0"; diff --git a/pkgs/terminal-velocity/fix_build.patch b/flakes/mypackages/pkgs/terminal-velocity/fix_build.patch similarity index 100% rename from pkgs/terminal-velocity/fix_build.patch rename to flakes/mypackages/pkgs/terminal-velocity/fix_build.patch diff --git a/pkgs/terminal-velocity/python3_support.patch b/flakes/mypackages/pkgs/terminal-velocity/python3_support.patch similarity index 100% rename from pkgs/terminal-velocity/python3_support.patch rename to flakes/mypackages/pkgs/terminal-velocity/python3_support.patch diff --git a/pkgs/terminal-velocity/sort_found_notes.patch b/flakes/mypackages/pkgs/terminal-velocity/sort_found_notes.patch similarity index 100% rename from pkgs/terminal-velocity/sort_found_notes.patch rename to flakes/mypackages/pkgs/terminal-velocity/sort_found_notes.patch diff --git a/pkgs/tiv/default.nix b/flakes/mypackages/pkgs/tiv/default.nix similarity index 86% rename from pkgs/tiv/default.nix rename to flakes/mypackages/pkgs/tiv/default.nix index 3e7a56c..2415db9 100644 --- a/pkgs/tiv/default.nix +++ b/flakes/mypackages/pkgs/tiv/default.nix @@ -1,5 +1,5 @@ -{ buildPerlPackage, fetchurl, perlPackages }: -buildPerlPackage rec { +{ fetchurl, perlPackages }: +perlPackages.buildPerlPackage rec { pname = "tiv"; version = "2015"; src = fetchurl { diff --git a/pkgs/tiv/tiv_builder.sh b/flakes/mypackages/pkgs/tiv/tiv_builder.sh similarity index 100% rename from pkgs/tiv/tiv_builder.sh rename to flakes/mypackages/pkgs/tiv/tiv_builder.sh diff --git a/pkgs/twins/default.nix b/flakes/mypackages/pkgs/twins/default.nix similarity index 100% rename from pkgs/twins/default.nix rename to flakes/mypackages/pkgs/twins/default.nix diff --git a/pkgs/umami/build-geo.patch b/flakes/mypackages/pkgs/umami/build-geo.patch similarity index 100% rename from pkgs/umami/build-geo.patch rename to flakes/mypackages/pkgs/umami/build-geo.patch diff --git a/pkgs/umami/default.nix b/flakes/mypackages/pkgs/umami/default.nix similarity index 100% rename from pkgs/umami/default.nix rename to flakes/mypackages/pkgs/umami/default.nix diff --git a/pkgs/unicode/default.nix b/flakes/mypackages/pkgs/unicode/default.nix similarity index 100% rename from pkgs/unicode/default.nix rename to flakes/mypackages/pkgs/unicode/default.nix diff --git a/flakes/mypackages/pkgs/upcmd/default.nix b/flakes/mypackages/pkgs/upcmd/default.nix new file mode 100644 index 0000000..614ae2b --- /dev/null +++ b/flakes/mypackages/pkgs/upcmd/default.nix @@ -0,0 +1,13 @@ +{ buildGoModule, fetchFromGitHub }: +buildGoModule rec { + pname = "upcmd"; + version = "20220112"; + src = fetchFromGitHub { + owner = pname; + repo = "up"; + rev = "rolling-${version}"; + sha256 = "sha256-dCi8p0oqLjEhEazbT4sgH7Sku3f/N79VWj5CO7LbvVA="; + }; + doCheck = false; + vendorSha256 = "sha256-Ve+lEVrxv4rwymrqHSc1V4SL7BWP4wsIHF8ObBWyHE4="; +} diff --git a/flakes/mypackages/pkgs/webapps/adminer/default.nix b/flakes/mypackages/pkgs/webapps/adminer/default.nix new file mode 100644 index 0000000..cd01080 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/adminer/default.nix @@ -0,0 +1,14 @@ +{ stdenv, fetchurl }: +stdenv.mkDerivation rec { + version = "4.8.2"; + pname = "adminer"; + src = fetchurl { + url = "https://github.com/adminerevo/adminerevo/releases/download/v${version}/${pname}-${version}.php"; + sha256 = "sha256-jXcnGLyNQZqJKS0Rs+UY1SxzknBEZwBhcbD0BmJVFKs="; + }; + phases = "installPhase"; + installPhase = '' + mkdir -p $out + cp $src $out/index.php + ''; +} diff --git a/pkgs/webapps/apache-theme/default.nix b/flakes/mypackages/pkgs/webapps/apache-theme/default.nix similarity index 100% rename from pkgs/webapps/apache-theme/default.nix rename to flakes/mypackages/pkgs/webapps/apache-theme/default.nix diff --git a/pkgs/webapps/apache-theme/theme/.htaccess b/flakes/mypackages/pkgs/webapps/apache-theme/theme/.htaccess similarity index 100% rename from pkgs/webapps/apache-theme/theme/.htaccess rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/.htaccess diff --git a/pkgs/webapps/apache-theme/theme/footer.html b/flakes/mypackages/pkgs/webapps/apache-theme/theme/footer.html similarity index 100% rename from pkgs/webapps/apache-theme/theme/footer.html rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/footer.html diff --git a/pkgs/webapps/apache-theme/theme/header.html b/flakes/mypackages/pkgs/webapps/apache-theme/theme/header.html similarity index 100% rename from pkgs/webapps/apache-theme/theme/header.html rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/header.html diff --git a/pkgs/webapps/apache-theme/theme/icons/archive.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/archive.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/archive.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/archive.png diff --git a/pkgs/webapps/apache-theme/theme/icons/audio.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/audio.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/audio.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/audio.png diff --git a/pkgs/webapps/apache-theme/theme/icons/authors.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/authors.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/authors.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/authors.png diff --git a/pkgs/webapps/apache-theme/theme/icons/bin.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bin.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/bin.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bin.png diff --git a/pkgs/webapps/apache-theme/theme/icons/blank.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/blank.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/blank.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/blank.png diff --git a/pkgs/webapps/apache-theme/theme/icons/bmp.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bmp.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/bmp.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bmp.png diff --git a/pkgs/webapps/apache-theme/theme/icons/c.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/c.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/c.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/c.png diff --git a/pkgs/webapps/apache-theme/theme/icons/calc.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/calc.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/calc.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/calc.png diff --git a/pkgs/webapps/apache-theme/theme/icons/cd.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cd.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/cd.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cd.png diff --git a/pkgs/webapps/apache-theme/theme/icons/copying.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/copying.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/copying.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/copying.png diff --git a/pkgs/webapps/apache-theme/theme/icons/cpp.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cpp.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/cpp.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cpp.png diff --git a/pkgs/webapps/apache-theme/theme/icons/css.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/css.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/css.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/css.png diff --git a/pkgs/webapps/apache-theme/theme/icons/deb.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/deb.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/deb.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/deb.png diff --git a/pkgs/webapps/apache-theme/theme/icons/default.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/default.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/default.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/default.png diff --git a/pkgs/webapps/apache-theme/theme/icons/diff.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/diff.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/diff.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/diff.png diff --git a/pkgs/webapps/apache-theme/theme/icons/doc.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/doc.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/doc.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/doc.png diff --git a/pkgs/webapps/apache-theme/theme/icons/draw.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/draw.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/draw.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/draw.png diff --git a/pkgs/webapps/apache-theme/theme/icons/eps.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/eps.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/eps.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/eps.png diff --git a/pkgs/webapps/apache-theme/theme/icons/exe.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/exe.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/exe.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/exe.png diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-home.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-home.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/folder-home.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-home.png diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-open.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-open.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/folder-open.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-open.png diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-page.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-page.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/folder-page.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-page.png diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-parent.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/folder-parent.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent.png diff --git a/pkgs/webapps/apache-theme/theme/icons/folder.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/folder.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder.png diff --git a/pkgs/webapps/apache-theme/theme/icons/gif.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gif.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/gif.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gif.png diff --git a/pkgs/webapps/apache-theme/theme/icons/gzip.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gzip.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/gzip.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gzip.png diff --git a/pkgs/webapps/apache-theme/theme/icons/h.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/h.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/h.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/h.png diff --git a/pkgs/webapps/apache-theme/theme/icons/hpp.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/hpp.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/hpp.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/hpp.png diff --git a/pkgs/webapps/apache-theme/theme/icons/html.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/html.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/html.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/html.png diff --git a/pkgs/webapps/apache-theme/theme/icons/ico.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ico.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/ico.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ico.png diff --git a/pkgs/webapps/apache-theme/theme/icons/image.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/image.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/image.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/image.png diff --git a/pkgs/webapps/apache-theme/theme/icons/install.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/install.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/install.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/install.png diff --git a/pkgs/webapps/apache-theme/theme/icons/java.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/java.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/java.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/java.png diff --git a/pkgs/webapps/apache-theme/theme/icons/jpg.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/jpg.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/jpg.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/jpg.png diff --git a/pkgs/webapps/apache-theme/theme/icons/js.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/js.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/js.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/js.png diff --git a/pkgs/webapps/apache-theme/theme/icons/json.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/json.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/json.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/json.png diff --git a/pkgs/webapps/apache-theme/theme/icons/log.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/log.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/log.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/log.png diff --git a/pkgs/webapps/apache-theme/theme/icons/makefile.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/makefile.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/makefile.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/makefile.png diff --git a/pkgs/webapps/apache-theme/theme/icons/markdown.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/markdown.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/markdown.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/markdown.png diff --git a/pkgs/webapps/apache-theme/theme/icons/package.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/package.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/package.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/package.png diff --git a/pkgs/webapps/apache-theme/theme/icons/pdf.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pdf.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/pdf.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pdf.png diff --git a/pkgs/webapps/apache-theme/theme/icons/php.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/php.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/php.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/php.png diff --git a/pkgs/webapps/apache-theme/theme/icons/playlist.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/playlist.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/playlist.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/playlist.png diff --git a/pkgs/webapps/apache-theme/theme/icons/png.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/png.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/png.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/png.png diff --git a/pkgs/webapps/apache-theme/theme/icons/pres.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pres.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/pres.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pres.png diff --git a/pkgs/webapps/apache-theme/theme/icons/ps.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ps.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/ps.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ps.png diff --git a/pkgs/webapps/apache-theme/theme/icons/psd.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/psd.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/psd.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/psd.png diff --git a/pkgs/webapps/apache-theme/theme/icons/py.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/py.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/py.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/py.png diff --git a/pkgs/webapps/apache-theme/theme/icons/rar.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rar.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/rar.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rar.png diff --git a/pkgs/webapps/apache-theme/theme/icons/rb.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rb.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/rb.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rb.png diff --git a/pkgs/webapps/apache-theme/theme/icons/readme.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/readme.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/readme.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/readme.png diff --git a/pkgs/webapps/apache-theme/theme/icons/rpm.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rpm.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/rpm.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rpm.png diff --git a/pkgs/webapps/apache-theme/theme/icons/rss.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rss.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/rss.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rss.png diff --git a/pkgs/webapps/apache-theme/theme/icons/rtf.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rtf.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/rtf.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rtf.png diff --git a/pkgs/webapps/apache-theme/theme/icons/script.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/script.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/script.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/script.png diff --git a/pkgs/webapps/apache-theme/theme/icons/source.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/source.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/source.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/source.png diff --git a/pkgs/webapps/apache-theme/theme/icons/sql.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/sql.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/sql.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/sql.png diff --git a/pkgs/webapps/apache-theme/theme/icons/tar.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tar.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/tar.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tar.png diff --git a/pkgs/webapps/apache-theme/theme/icons/tex.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tex.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/tex.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tex.png diff --git a/pkgs/webapps/apache-theme/theme/icons/text.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/text.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/text.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/text.png diff --git a/pkgs/webapps/apache-theme/theme/icons/tiff.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tiff.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/tiff.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tiff.png diff --git a/pkgs/webapps/apache-theme/theme/icons/unknown.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/unknown.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/unknown.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/unknown.png diff --git a/pkgs/webapps/apache-theme/theme/icons/vcal.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/vcal.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/vcal.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/vcal.png diff --git a/pkgs/webapps/apache-theme/theme/icons/video.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/video.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/video.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/video.png diff --git a/pkgs/webapps/apache-theme/theme/icons/xml.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/xml.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/xml.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/xml.png diff --git a/pkgs/webapps/apache-theme/theme/icons/zip.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/zip.png similarity index 100% rename from pkgs/webapps/apache-theme/theme/icons/zip.png rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/zip.png diff --git a/pkgs/webapps/apache-theme/theme/style.css b/flakes/mypackages/pkgs/webapps/apache-theme/theme/style.css similarity index 97% rename from pkgs/webapps/apache-theme/theme/style.css rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/style.css index 4d25c9f..e46139f 100644 --- a/pkgs/webapps/apache-theme/theme/style.css +++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/style.css @@ -5,7 +5,7 @@ Theme name: Apaxy Theme author: @adamwhitcroft \*------------------------------------*/ -@import url('//fonts.googleapis.com/css?family=Open+Sans'); +@import url('//assets.immae.eu/fonts/OpenSans/font.css'); /* Have to use @import for the font, as you can only specify a single stylesheet */ * { margin:0; diff --git a/pkgs/webapps/awl/default.nix b/flakes/mypackages/pkgs/webapps/awl/default.nix similarity index 100% rename from pkgs/webapps/awl/default.nix rename to flakes/mypackages/pkgs/webapps/awl/default.nix diff --git a/pkgs/webapps/davical/default.nix b/flakes/mypackages/pkgs/webapps/davical/default.nix similarity index 100% rename from pkgs/webapps/davical/default.nix rename to flakes/mypackages/pkgs/webapps/davical/default.nix diff --git a/flakes/mypackages/pkgs/webapps/default.nix b/flakes/mypackages/pkgs/webapps/default.nix new file mode 100644 index 0000000..18a724d --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/default.nix @@ -0,0 +1,24 @@ +{ callPackage, mylibs, composerEnv, sources }: +rec { + adminer = callPackage ./adminer {}; + apache-theme = import ./apache-theme; + awl = callPackage ./awl {}; + davical = callPackage ./davical {}; + dokuwiki = callPackage ./dokuwiki {}; + infcloud = callPackage ./infcloud {}; + mantisbt_2 = callPackage ./mantisbt_2 {}; + nextcloud_25 = callPackage ./nextcloud { nextcloudVersion = 25; }; + nextcloud_26 = callPackage ./nextcloud { nextcloudVersion = 26; }; + nextcloud_27 = callPackage ./nextcloud { nextcloudVersion = 27; }; + nextcloud_25-all = nextcloud_25.withApps (a: builtins.attrValues nextcloud_25.allSupportedApps); + nextcloud_26-all = nextcloud_26.withApps (a: builtins.attrValues nextcloud_26.allSupportedApps); + nextcloud_27-all = nextcloud_27.withApps (a: builtins.attrValues nextcloud_27.allSupportedApps); + phpbb = callPackage ./phpbb {}; + phpldapadmin = callPackage ./phpldapadmin {}; + rompr = callPackage ./rompr {}; + roundcubemail = callPackage ./roundcubemail {}; + spip = callPackage ./spip {}; + ttrss = callPackage ./ttrss { inherit sources; }; + wallabag = callPackage ./wallabag { inherit composerEnv; }; + yourls = callPackage ./yourls {}; +} diff --git a/pkgs/webapps/dokuwiki/default.nix b/flakes/mypackages/pkgs/webapps/dokuwiki/default.nix similarity index 79% rename from pkgs/webapps/dokuwiki/default.nix rename to flakes/mypackages/pkgs/webapps/dokuwiki/default.nix index 874f0d8..db8be30 100644 --- a/pkgs/webapps/dokuwiki/default.nix +++ b/flakes/mypackages/pkgs/webapps/dokuwiki/default.nix @@ -1,4 +1,4 @@ -{ varDir ? "/var/lib/dokuwiki", preload ? "", lib, callPackage, stdenv, mylibs, writeText }: +{ varDir ? "/var/lib/dokuwiki", preload ? "", lib, callPackage, stdenv, fetchFromGitHub, writeText }: let preloadFile = plugins: let preloads = [preload] ++ builtins.concatMap (p: lib.optional (lib.hasAttr "preload" p) (p.preload p)) plugins; @@ -26,7 +26,16 @@ let passthru = toPassthru newDokuwiki (pkg.plugins ++ plugins); }); in newDokuwiki; - package = stdenv.mkDerivation (mylibs.fetchedGithub ./dokuwiki.json // rec { + package = stdenv.mkDerivation (rec { + pname = "dokuwiki"; + version = "release_stable_2018-04-22b"; + src = fetchFromGitHub { + owner = "splitbrain"; + repo = "dokuwiki"; + rev = "871dae1320b40211626c7ec665f5e6d5290aca95"; + sha256 = "1syvd5dvv3v75swf8ig7dxqs0g5xikb0f6vlcy7g4c4ghldkw7nz"; + fetchSubmodules = true; + }; phases = "unpackPhase buildPhase installPhase installPreloadPhase fixupPhase"; buildPhase = '' mv conf conf.dist diff --git a/pkgs/webapps/dokuwiki/plugins/farmer.nix b/flakes/mypackages/pkgs/webapps/dokuwiki/plugins/farmer.nix similarity index 100% rename from pkgs/webapps/dokuwiki/plugins/farmer.nix rename to flakes/mypackages/pkgs/webapps/dokuwiki/plugins/farmer.nix diff --git a/pkgs/webapps/dokuwiki/plugins/todo.nix b/flakes/mypackages/pkgs/webapps/dokuwiki/plugins/todo.nix similarity index 100% rename from pkgs/webapps/dokuwiki/plugins/todo.nix rename to flakes/mypackages/pkgs/webapps/dokuwiki/plugins/todo.nix diff --git a/pkgs/webapps/infcloud/default.nix b/flakes/mypackages/pkgs/webapps/infcloud/default.nix similarity index 100% rename from pkgs/webapps/infcloud/default.nix rename to flakes/mypackages/pkgs/webapps/infcloud/default.nix diff --git a/pkgs/webapps/infcloud/infcloud_config.js b/flakes/mypackages/pkgs/webapps/infcloud/infcloud_config.js similarity index 100% rename from pkgs/webapps/infcloud/infcloud_config.js rename to flakes/mypackages/pkgs/webapps/infcloud/infcloud_config.js diff --git a/pkgs/webapps/mantisbt_2/bug_report.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report.php.diff similarity index 100% rename from pkgs/webapps/mantisbt_2/bug_report.php.diff rename to flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report.php.diff diff --git a/pkgs/webapps/mantisbt_2/bug_report_page.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report_page.php.diff similarity index 100% rename from pkgs/webapps/mantisbt_2/bug_report_page.php.diff rename to flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report_page.php.diff diff --git a/pkgs/webapps/mantisbt_2/bugnote_add.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add.php.diff similarity index 100% rename from pkgs/webapps/mantisbt_2/bugnote_add.php.diff rename to flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add.php.diff diff --git a/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff similarity index 100% rename from pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff rename to flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff diff --git a/pkgs/webapps/mantisbt_2/default.nix b/flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix similarity index 96% rename from pkgs/webapps/mantisbt_2/default.nix rename to flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix index 5aa04d1..466595d 100644 --- a/pkgs/webapps/mantisbt_2/default.nix +++ b/flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix @@ -5,6 +5,7 @@ let (name: callPackage (./plugins + "/${name}") {}); toPassthru = pkg: plugins: { inherit plugins allPlugins; + pluginNames = map (n: n.pluginName) plugins; withPlugins = withPlugins pkg; }; withPlugins = pkg: toPlugins: diff --git a/pkgs/webapps/mantisbt_2/plugins/slack/default.nix b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/slack/default.nix similarity index 100% rename from pkgs/webapps/mantisbt_2/plugins/slack/default.nix rename to flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/slack/default.nix diff --git a/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff similarity index 100% rename from pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff rename to flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff diff --git a/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix similarity index 92% rename from pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix rename to flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix index dc6c7de..1ab00c5 100644 --- a/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix +++ b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix @@ -16,6 +16,7 @@ stdenv.mkDerivation rec { cp -a Source* $out/ ''; passthru = { + pluginName = "source-integration"; selector = "Source*"; }; } diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix new file mode 100644 index 0000000..6e7380c --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + audioplayer_3_4_0 = buildApp rec { + appName = "audioplayer"; + version = "3.4.0"; + url = "https://github.com/Rello/${appName}/releases/download/${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-pog9cll02+AbYHG/jiUztO9odqu7PSEWBUieK32Eqf4="; + }; + versions = { + "25" = audioplayer_3_4_0; + "26" = audioplayer_3_4_0; + "27" = audioplayer_3_4_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app audioplayer") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix new file mode 100644 index 0000000..0503e5b --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix @@ -0,0 +1,21 @@ +{ buildApp, nextcloudVersion }: +let + bookmarks_12_1_0 = buildApp rec { + appName = "bookmarks"; + version = "12.1.0"; + url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-NVyaVeg/UPgFaW/iCZiJkw1l5Vqc+S/4FMfFhHCBUTo="; + }; + bookmarks_13_0_1 = buildApp rec { + appName = "bookmarks"; + version = "13.0.1"; + url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-7Gx8e8C2dDkB/39eAGKOLrP3YkVbGkfPKpQBeCaV/cE="; + }; + versions = { + "25" = bookmarks_12_1_0; + "26" = bookmarks_13_0_1; + "27" = bookmarks_13_0_1; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app bookmarks") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix new file mode 100644 index 0000000..497d4ba --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + calendar_4_4_4 = buildApp rec { + appName = "calendar"; + version = "4.4.4"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-8UeHOpgbUf2oHHOvLN58v68QvyDYQXkSjsVKn6UGrGU="; + }; + versions = { + "25" = calendar_4_4_4; + "26" = calendar_4_4_4; + "27" = calendar_4_4_4; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app calendar") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix new file mode 100644 index 0000000..05f0928 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + carnet_0_25_2 = buildApp rec { + appName = "carnet"; + version = "0.25.2"; + url = "https://github.com/PhieF/CarnetNextcloud/releases/download/v${version}/${appName}-nc-v${version}.tar.gz"; + sha256 = "sha256-HArD+M6UA9BhSsrlpp/gsKWkUTWAoNHl/gr0S3AlKzg="; + }; + versions = { + "25" = carnet_0_25_2; + "26" = carnet_0_25_2; + "27" = carnet_0_25_2; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app carnet") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix new file mode 100644 index 0000000..f8931b7 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + contacts_5_3_2 = buildApp rec { + appName = "contacts"; + version = "5.3.2"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-1jQ+pyLBPU7I4wSPkmezJq7ukrQh8WPErG4J6Ps3LR4="; + }; + versions = { + "25" = contacts_5_3_2; + "26" = contacts_5_3_2; + "27" = contacts_5_3_2; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app contacts") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix new file mode 100644 index 0000000..32fdcc0 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + cookbook_0_10_2 = buildApp rec { + appName = "cookbook"; + version = "0.10.2"; + url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/Cookbook-${version}.tar.gz"; + sha256 = "sha256-H7KVeISBnu0/4Q31ihhiXvRtkXz4yLGOAsAj5ERgeCM="; + }; + versions = { + "25" = cookbook_0_10_2; + "26" = cookbook_0_10_2; + "27" = cookbook_0_10_2; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app cookbook") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix new file mode 100644 index 0000000..c5dd2d3 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix @@ -0,0 +1,27 @@ +{ buildApp, nextcloudVersion }: +let + deck_1_8_5 = buildApp rec { + appName = "deck"; + version = "1.8.5"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-KsSSl9orqMEKJlBftHwCi/dh+aMCxZqjS7kPT0uDZlE="; + }; + deck_1_9_2 = buildApp rec { + appName = "deck"; + version = "1.9.2"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-h1fmT4CCEFDZPBwFDIBLmFGJmO1Wt3a5nVXX5xCk0o0="; + }; + deck_1_10_0 = buildApp rec { + appName = "deck"; + version = "1.10.0"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-W0XVvhTQoCjoK7S2tEd7bvU0MTWtqYt7QiB9H1p1UP8="; + }; + versions = { + "25" = deck_1_8_5; + "26" = deck_1_9_2; + "27" = deck_1_10_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app deck") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix new file mode 100644 index 0000000..c03c479 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix @@ -0,0 +1,24 @@ +{ buildApp, nextcloudVersion }: +let + otherConfig = { + mimetypealiases = { + "application/x-drawio" = "drawio"; + }; + mimetypemapping = { + "drawio" = ["application/x-drawio"]; + }; + }; + drawio_2_1_2 = buildApp rec { + appName = "drawio"; + version = "2.1.2"; + url = "https://github.com/jgraph/drawio-nextcloud/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-5BrEnS2cMk/vwkAr1lXKtfocqReZAj1+pbDqmi/uG0A="; + inherit otherConfig; + }; + versions = { + "25" = drawio_2_1_2; + "26" = drawio_2_1_2; + "27" = drawio_2_1_2; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app drawio") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix new file mode 100644 index 0000000..941304a --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix @@ -0,0 +1,27 @@ +{ buildApp, nextcloudVersion }: +let + external_5_0_2 = buildApp rec { + appName = "external"; + version = "5.0.2"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-Bkk9X1tVonKsiA3YlKux2y8K7HdJv4qM/eJ9TP+i17I="; + }; + external_5_1_0 = buildApp rec { + appName = "external"; + version = "5.1.0"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-EMKWSXufw4FMyaN2f37yifrpUm6QBqqpPPFmvLvYYmY="; + }; + external_5_2_0 = buildApp rec { + appName = "external"; + version = "5.2.0"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-XqeJCWS8mncS7CfrnXdhtzdgkFTib/RnursJ/AqyvD8="; + }; + versions = { + "25" = external_5_0_2; + "26" = external_5_1_0; + "27" = external_5_2_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app external") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix new file mode 100644 index 0000000..589115e --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + extract_1_3_6 = buildApp rec { + appName = "extract"; + version = "1.3.6"; + url = "https://github.com/PaulLereverend/NextcloudExtract/releases/download/${version}/${appName}.tar.gz"; + sha256 = "sha256-y1NacOWnCd/f5sOeEOLeZrWnqwi8q/XezOrhT7AzV/o="; + }; + versions = { + "25" = extract_1_3_6; + "26" = extract_1_3_6; + "27" = extract_1_3_6; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app extract") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix new file mode 100644 index 0000000..cf8e179 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + files_markdown_2_4_1 = buildApp rec { + appName = "files_markdown"; + version = "2.4.1"; + url = "https://github.com/icewind1991/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-6A9IMfRbKcF1+et7pzFF4zlZDmegx562cnyYsOFsVzU="; + }; + versions = { + "25" = files_markdown_2_4_1; + "26" = files_markdown_2_4_1; + "27" = files_markdown_2_4_1; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_markdown") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix new file mode 100644 index 0000000..fff85d7 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + files_mindmap_0_0_28 = buildApp rec { + appName = "files_mindmap"; + version = "0.0.28"; + url = "https://github.com/ACTom/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-VlzqstlsdinaqkbK32NvS1oFoQcFasJGHSlcKxdQwIM="; + }; + versions = { + "25" = files_mindmap_0_0_28; + "26" = files_mindmap_0_0_28; + "27" = files_mindmap_0_0_28; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_mindmap") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix new file mode 100644 index 0000000..97aeaf7 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix @@ -0,0 +1,14 @@ +{ buildApp, nextcloudVersion }: +let + files_readmemd_2_0_0 = buildApp rec { + appName = "files_readmemd"; + version = "2.0.0"; + url = "https://github.com/mamatt/files_readmemd/releases/download/V${version}/${appName}.tar.gz"; + sha256 = "sha256-vUoSK+b4gj51eJcocrXINO/eFKPRZQoj0q6l0gVBqgw="; + }; + versions = { + "25" = files_readmemd_2_0_0; + "26" = files_readmemd_2_0_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_readmemd") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix new file mode 100644 index 0000000..55f4ba7 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix @@ -0,0 +1,14 @@ +{ buildApp, nextcloudVersion }: +let + flowupload_1_1_3 = buildApp rec { + appName = "flowupload"; + version = "1.1.3"; + url = "https://github.com/e-alfred/${appName}/releases/download/${version}/${appName}-${version}.tar.gz"; + sha256 = "0d1xvimd4hzd0jpvv1h89zfqv3ajlrrm1xdbggvjhk9bllwqgxng"; + }; + versions = { + "22" = flowupload_1_1_3; + "23" = flowupload_1_1_3; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app flowupload") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix new file mode 100644 index 0000000..be230fd --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix @@ -0,0 +1,22 @@ +{ buildApp, nextcloudVersion }: +let + gpxedit_0_0_14 = buildApp rec { + appName = "gpxedit"; + version = "0.0.14"; + url = "https://gitlab.com/eneiluj/gpxedit-oc/wikis/uploads/5b184c24f9e767ad19a84e177a9b473c/${appName}-${version}.tar.gz"; + sha256 = "1kgpcxps73l83krrjxdzh4vzacja4m3vwidf9kidgqq505cgzq90"; + otherConfig = { + mimetypealiases = { + "application/gpx+xml" = "gpx"; + }; + mimetypemapping = { + "gpx" = ["application/gpx+xml"]; + }; + }; + }; + versions = { + "22" = gpxedit_0_0_14; + "23" = gpxedit_0_0_14; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app gpxedit") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix new file mode 100644 index 0000000..5a3b7e7 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix @@ -0,0 +1,31 @@ +{ buildApp, nextcloudVersion }: +let + otherConfig = { + mimetypealiases = { + "application/gpx+xml" = "gpx"; + }; + mimetypemapping = { + "gpx" = ["application/gpx+xml"]; + }; + }; + gpxpod_5_0_10 = buildApp rec { + appName = "gpxpod"; + version = "5.0.10"; + url = "https://github.com/julien-nc/gpxpod/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-Ylhl9jdOxG+Qfk5zgNO8FwOtAzrjGHS66y59qmorXPU="; + inherit otherConfig; + }; + gpxpod_5_0_12 = buildApp rec { + appName = "gpxpod"; + version = "5.0.12"; + url = "https://github.com/julien-nc/gpxpod/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-uhz6AC8opDQkFQDpG4u8H4vkFtzbFAZvb8r32QHj/8I="; + inherit otherConfig; + }; + versions = { + "25" = gpxpod_5_0_10; + "26" = gpxpod_5_0_12; + "27" = gpxpod_5_0_12; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app gpxpod") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix new file mode 100644 index 0000000..b966d3d --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix @@ -0,0 +1,27 @@ +{ buildApp, nextcloudVersion }: +let + groupfolders_13_1_5 = buildApp rec { + appName = "groupfolders"; + version = "13.1.5"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-1yf/uSN8TRsYvK3m2pxGaXo9xxHNrI/NjyWJ8rLPQfg="; + }; + groupfolders_14_0_4 = buildApp rec { + appName = "groupfolders"; + version = "14.0.4"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-QzlD8dLI6T7Sex75ZsO2F40nTrg2Ig6tHTG8cslnNME="; + }; + groupfolders_15_0_2 = buildApp rec { + appName = "groupfolders"; + version = "15.0.2"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-NsTZhmY1XBKHn/1IcIp2Al7BwJzE2xoBzgyBXnmuWls="; + }; + versions = { + "25" = groupfolders_13_1_5; + "26" = groupfolders_14_0_4; + "27" = groupfolders_15_0_2; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app groupfolders") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix new file mode 100644 index 0000000..afae917 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix @@ -0,0 +1,27 @@ +{ buildApp, nextcloudVersion }: +let + impersonate_1_12_1 = buildApp rec { + appName = "impersonate"; + version = "1.12.1"; + url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-xhlWGbLm1CtW4BSa/yQhv05Kn2r1DZJDUoDXQOLpEeQ="; + }; + impersonate_1_13_1 = buildApp rec { + appName = "impersonate"; + version = "1.13.1"; + url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-+tFWW5wQnbHxbgGdnp2GAFzfXnrW+e3eECY4O6ZckCU="; + }; + impersonate_1_14_0 = buildApp rec { + appName = "impersonate"; + version = "1.14.0"; + url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-A1rGJJLaWhiNf9l0YUh6WOB+fKRBRDckE890hq5OB4k="; + }; + versions = { + "25" = impersonate_1_12_1; + "26" = impersonate_1_13_1; + "27" = impersonate_1_14_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app impersonate") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix new file mode 100644 index 0000000..d3834ad --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix @@ -0,0 +1,13 @@ +{ buildApp, nextcloudVersion }: +let + integration_dropbox_2_0_1 = buildApp rec { + appName = "integration_dropbox"; + version = "2.0.1"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-RPCd8+/yKNlIGfEU+ITS8DBIxJDfc//8MGHaIjfYxdQ="; + }; + versions = { + "27" = integration_dropbox_2_0_1; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app integration_dropbox") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix new file mode 100644 index 0000000..7be8c6b --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix @@ -0,0 +1,24 @@ +{ buildApp, nextcloudVersion }: +let + keeweb_0_6_13 = buildApp rec { + appName = "keeweb"; + version = "0.6.13"; + url = "https://github.com/jhass/nextcloud-keeweb/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-J9jFVXpmoeAjDI/crsXHVJvPvxCYaimWVuq473nLsNM="; + installPhase = '' + mkdir -p $out + cp -R . $out/ + ''; + otherConfig = { + mimetypemapping = { + "kdbx" = ["application/x-kdbx"]; + }; + }; + }; + versions = { + "25" = keeweb_0_6_13; + "26" = keeweb_0_6_13; + "27" = keeweb_0_6_13; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app keeweb") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix new file mode 100644 index 0000000..1b29173 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + maps_1_1_0 = buildApp rec { + appName = "maps"; + version = "1.1.0"; + url = "https://github.com/nextcloud/maps/releases/download/v${version}/${appName}-${version}.tar.gz"; + sha256 = "sha256-Me/V+9wXZyq3UEVx9Nqim6pfPFJaALjKv9f7iUjill8="; + }; + versions = { + "25" = maps_1_1_0; + "26" = maps_1_1_0; + "27" = maps_1_1_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app maps") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix new file mode 100644 index 0000000..0fe7409 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + metadata_0_19_0 = buildApp rec { + appName = "metadata"; + version = "0.19.0"; + url = "https://github.com/gino0631/nextcloud-metadata/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-XfFxCwRFO0WnBPU4CIejNXySRQdguvzauu62bzUKD44="; + }; + versions = { + "25" = metadata_0_19_0; + "26" = metadata_0_19_0; + "27" = metadata_0_19_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app metadata") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix new file mode 100644 index 0000000..fc96224 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + music_1_8_4 = buildApp rec { + appName = "music"; + version = "1.8.4"; + url = "https://github.com/owncloud/music/releases/download/v${version}/${appName}_${version}_for_nextcloud.tar.gz"; + sha256 = "sha256-WWXMpOyTRxykAVeUj/h6QP5ENqaMvTcPIqPQjhY68KA="; + }; + versions = { + "25" = music_1_8_4; + "26" = music_1_8_4; + "27" = music_1_8_4; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app music") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix new file mode 100644 index 0000000..7677c6c --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + notes_4_8_1 = buildApp rec { + appName = "notes"; + version = "4.8.1"; + url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-BfH1W+7TWKZRuAAhKQEQtlv8ePTtJQvZQVMMu3zULR4="; + }; + versions = { + "25" = notes_4_8_1; + "26" = notes_4_8_1; + "27" = notes_4_8_1; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app notes") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix new file mode 100644 index 0000000..dcdaad2 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix @@ -0,0 +1,21 @@ +{ buildApp, nextcloudVersion }: +let + ocsms_2_2_0 = buildApp rec { + appName = "ocsms"; + version = "2.2.0"; + url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}-${version}.tar.gz"; + sha256 = "1hjl11lxdflk4w0l8prcjr3jvmsm8njldbrmnqm7yhdy6qcfli28"; + installPhase = '' + mkdir -p $out + cp -R . $out/ + ''; + }; + versions = { + "18" = ocsms_2_2_0; + "19" = ocsms_2_2_0; + "20" = ocsms_2_2_0; + # Beware, 1.10.1 has a too wide range of versions and is not + # compatible with nextcloud > 20! + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app ocsms") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix new file mode 100644 index 0000000..e93df00 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix @@ -0,0 +1,21 @@ +{ buildApp, nextcloudVersion }: +let + onlyoffice_7_9_0 = buildApp rec { + appName = "onlyoffice"; + version = "7.9.0"; + url = "https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-GN0edA/aVdOEDR0LF6PgG2vTcULaG9RMj2gIAoxSVAM="; + }; + onlyoffice_8_2_0 = buildApp rec { + appName = "onlyoffice"; + version = "8.2.0"; + url = "https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-DfZKgpkpcogy9I3A3ru0V/WR5wYWBr+wrHe+mQJBPYk="; + }; + versions = { + "25" = onlyoffice_7_9_0; + "26" = onlyoffice_7_9_0; + "27" = onlyoffice_8_2_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app onlyoffice") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix new file mode 100644 index 0000000..5559b22 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix @@ -0,0 +1,21 @@ +{ buildApp, nextcloudVersion }: +let + passman_2_4_5 = buildApp rec { + appName = "passman"; + version = "2.4.5"; + url = "https://releases.passman.cc/${appName}_${version}.tar.gz"; + sha256 = "sha256-wcRx1lUEHbJBJBBSKOScGljOgHM7Vpf69OymJoI8S2Y="; + }; + passman_2_4_7 = buildApp rec { + appName = "passman"; + version = "2.4.7"; + url = "https://releases.passman.cc/${appName}_${version}.tar.gz"; + sha256 = "sha256-CeNaN0cioVjcW6ILB//BIvmjQWcbvfK3m8jVQ8LGtyM="; + }; + versions = { + "25" = passman_2_4_5; + "26" = passman_2_4_7; + "27" = passman_2_4_7; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app passman") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix new file mode 100644 index 0000000..a50ac43 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + polls_5_2_0 = buildApp rec { + appName = "polls"; + version = "5.2.0"; + url = "https://github.com/nextcloud/polls/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-45YNcSeFG9v3mfk7eLbDiy6hFgmfePY0j86JiVS0k14="; + }; + versions = { + "25" = polls_5_2_0; + "26" = polls_5_2_0; + "27" = polls_5_2_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app polls") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix new file mode 100644 index 0000000..da48f91 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix @@ -0,0 +1,16 @@ +{ buildApp, nextcloudVersion }: +let + side_menu_3_10_3 = buildApp rec { + appName = "side_menu"; + version = "3.10.3"; + url = "https://gitnet.fr/attachments/9c9be610-5d3b-414d-a523-396c237c15ef"; + filename = "${appName}-${version}.tar.gz"; + sha256 = "sha256-WKbc6Ln6v3LYyRzwy0xAOmXilbqrWGS8XGWIT+TajdM="; + }; + versions = { + "25" = side_menu_3_10_3; + "26" = side_menu_3_10_3; + "27" = side_menu_3_10_3; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app side_menu") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix new file mode 100644 index 0000000..912b5bf --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix @@ -0,0 +1,14 @@ +{ buildApp, nextcloudVersion }: +let + social_0_6_1 = buildApp rec { + appName = "social"; + version = "0.6.1"; + url = "https://github.com/nextcloud-releases/social/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-5mww31ibwgnSiTuTaKo5MngbhPIw8lwLt1tkQySmerY="; + }; + versions = { + "26" = social_0_6_1; + "27" = social_0_6_1; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app social") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix new file mode 100644 index 0000000..d8a20b9 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix @@ -0,0 +1,27 @@ +{ buildApp, nextcloudVersion }: +let + spreed_15_0_7 = buildApp rec { + appName = "spreed"; + version = "15.0.7"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-J9udO7qlRL+TDwTPTbBpYeZLUi4oco42LoqYoHJbIyE="; + }; + spreed_16_0_5 = buildApp rec { + appName = "spreed"; + version = "16.0.5"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-tTDnWqNkP6fMSdCP1c0vPh8f0K7sTFBvRwws5Gln9Mg="; + }; + spreed_17_0_3 = buildApp rec { + appName = "spreed"; + version = "17.0.3"; + url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz"; + sha256 = "sha256-vb08DI+q+5f87zz2UguE1y6b0NV2EoICYpaKUGmyF5w="; + }; + versions = { + "25" = spreed_15_0_7; + "26" = spreed_16_0_5; + "27" = spreed_17_0_3; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app spreed") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix new file mode 100644 index 0000000..906719d --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix @@ -0,0 +1,14 @@ +{ buildApp, nextcloudVersion }: +let + talk_matterbridge_1_26_0 = buildApp rec { + appName = "talk_matterbridge"; + version = "1.26.0"; + url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-gD5lfLWBjWOiy2ULf31ngQVIQbMZj3iwu3zuVrEDSks="; + }; + versions = { + "25" = talk_matterbridge_1_26_0; + "26" = talk_matterbridge_1_26_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app talk_matterbridge") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix new file mode 100644 index 0000000..aee7650 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix @@ -0,0 +1,15 @@ +{ buildApp, nextcloudVersion }: +let + tasks_0_15_0 = buildApp rec { + appName = "tasks"; + version = "0.15.0"; + url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; + sha256 = "sha256-nizJUFByK78FZ6KPJ4zfOU5Z9ClAxhwgQ7d+X5TGnM8="; + }; + versions = { + "25" = tasks_0_15_0; + "26" = tasks_0_15_0; + "27" = tasks_0_15_0; + }; +in + versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app tasks") diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/default.nix b/flakes/mypackages/pkgs/webapps/nextcloud/default.nix new file mode 100644 index 0000000..6aeeaed --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/nextcloud/default.nix @@ -0,0 +1,84 @@ +{ nextcloudVersion, otherConfig ? {}, lib, stdenv, callPackage, fetchzip, fetchurl, postInstall ? null }: +let + shasumsAndVersion = { + "25" = { sum = "sha256-alvh0fWESSS5KbfiKI1gaoahisDWnfT/bUhsSEEXfQI="; fullVersion = "25.0.10"; }; # php 7.4 - 8.2 + "26" = { sum = "sha256-nhq0aAY4T1hUZdKJY66ZSlirCSgPQet8YJpciwJw1b4="; fullVersion = "26.0.5"; }; # php 8.0 - 8.2 + "27" = { sum = "sha256-ei3OpDqjuPswM0fv2kxvN3M8yhE8juFt2fDl+2jHIS8="; fullVersion = "27.0.2"; }; # php 8.0 - 8.2 + }; + appNames = [ + "audioplayer" "bookmarks" "calendar" "carnet" + "contacts" "cookbook" "deck" "external" "extract" "files_markdown" "files_mindmap" + "files_readmemd" "flowupload" "gpxedit" "gpxpod" "groupfolders" "impersonate" + "keeweb" "maps" "metadata" "music" "notes" "ocsms" "onlyoffice" "passman" "polls" + "social" "spreed" "talk_matterbridge" "tasks" "drawio" "side_menu" + "integration_dropbox" + ]; + toApp = name: callPackage (./apps + "/${name}.nix") { inherit buildApp nextcloudVersion; }; + allSupportedApps = lib.mapAttrs (n: v: v.value) (lib.filterAttrs (n: v: v.success) (lib.genAttrs appNames (name: builtins.tryEval (toApp name)))); + allApps = lib.genAttrs appNames toApp; + buildApp = { appName, version, filename ? null, url, sha256, installHook ? (n: ""), otherConfig ? {}, installPhase ? "mkdir -p $out && cp -R . $out/" }: + stdenv.mkDerivation rec { + name = "nextcloud-app-${appName}-${version}"; + inherit version; + phases = "unpackPhase installPhase"; + inherit installPhase; + src = fetchurl ({ inherit url sha256; } // lib.optionalAttrs (filename != null) { name = filename; }); + passthru = { + inherit appName otherConfig installHook; + }; + }; + toPassthru = pkg: apps: otherConfig: { + inherit apps otherConfig allApps allSupportedApps buildApp; + withApps = withApps pkg; + }; + withApps = pkg: toApps: + let + apps = toApps allApps; + toInstallApp = n: '' + if [ -e $out/apps/${n.appName} ]; then + echo "${n.appName} already exists" + false + fi + ln -sf ${n} $out/apps/${n.appName} + '' + (n.installHook n); + zipped = lib.attrsets.zipAttrs ([pkg.otherConfig or {}] ++ map (v: v.otherConfig) apps); + appConfigs = with lib.attrsets; with lib.lists; { + mimetypealiases = foldr (h: prev: prev // h) {} (zipped.mimetypealiases or []); + mimetypemapping = mapAttrs (_: v: unique (flatten v)) (zipAttrs (zipped.mimetypemapping or [])); + }; + newNextcloud = pkg.overrideAttrs(old: { + installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallApp apps); + passthru = toPassthru newNextcloud (pkg.apps ++ apps) appConfigs; + }); + in newNextcloud; + package = stdenv.mkDerivation rec { + name = "nextcloud-${version}"; + version = shasumsAndVersion."${builtins.toString nextcloudVersion}".fullVersion; + + src = fetchurl { + url = "https://download.nextcloud.com/server/releases/${name}.tar.bz2"; + sha256 = shasumsAndVersion."${builtins.toString nextcloudVersion}".sum; + }; + + inherit postInstall; + installPhase = '' + mkdir -p $out/ + cp -R . $out/ + sed -i -e "/'appDirsWithDifferentOwner'/d" $out/apps/settings/lib/Controller/CheckSetupController.php + mv $out/config $out/config.example + runHook postInstall + ''; + + noAuditTmpdir = true; + dontPatchELF = true; + dontStrip = true; + passthru = toPassthru package [] otherConfig; + meta = { + description = "Sharing solution for files, calendars, contacts and more"; + homepage = https://nextcloud.com; + maintainers = with lib.maintainers; [ schneefux bachp globin fpletz ]; + license = lib.licenses.agpl3Plus; + platforms = with lib.platforms; unix; + }; + }; +in package diff --git a/pkgs/webapps/phpbb/default.nix b/flakes/mypackages/pkgs/webapps/phpbb/default.nix similarity index 100% rename from pkgs/webapps/phpbb/default.nix rename to flakes/mypackages/pkgs/webapps/phpbb/default.nix diff --git a/pkgs/webapps/phpbb/extensions/adduser.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/adduser.nix similarity index 100% rename from pkgs/webapps/phpbb/extensions/adduser.nix rename to flakes/mypackages/pkgs/webapps/phpbb/extensions/adduser.nix diff --git a/pkgs/webapps/phpbb/extensions/autosubscribe.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/autosubscribe.nix similarity index 100% rename from pkgs/webapps/phpbb/extensions/autosubscribe.nix rename to flakes/mypackages/pkgs/webapps/phpbb/extensions/autosubscribe.nix diff --git a/pkgs/webapps/phpbb/extensions/mailinglist.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/mailinglist.nix similarity index 100% rename from pkgs/webapps/phpbb/extensions/mailinglist.nix rename to flakes/mypackages/pkgs/webapps/phpbb/extensions/mailinglist.nix diff --git a/pkgs/webapps/phpbb/extensions/markdown.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/markdown.nix similarity index 100% rename from pkgs/webapps/phpbb/extensions/markdown.nix rename to flakes/mypackages/pkgs/webapps/phpbb/extensions/markdown.nix diff --git a/pkgs/webapps/phpbb/extensions/mchat.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/mchat.nix similarity index 100% rename from pkgs/webapps/phpbb/extensions/mchat.nix rename to flakes/mypackages/pkgs/webapps/phpbb/extensions/mchat.nix diff --git a/pkgs/webapps/phpbb/extensions/monitoranswers.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/monitoranswers.nix similarity index 100% rename from pkgs/webapps/phpbb/extensions/monitoranswers.nix rename to flakes/mypackages/pkgs/webapps/phpbb/extensions/monitoranswers.nix diff --git a/pkgs/webapps/phpbb/langs/fr.nix b/flakes/mypackages/pkgs/webapps/phpbb/langs/fr.nix similarity index 100% rename from pkgs/webapps/phpbb/langs/fr.nix rename to flakes/mypackages/pkgs/webapps/phpbb/langs/fr.nix diff --git a/pkgs/webapps/phpldapadmin/default.nix b/flakes/mypackages/pkgs/webapps/phpldapadmin/default.nix similarity index 100% rename from pkgs/webapps/phpldapadmin/default.nix rename to flakes/mypackages/pkgs/webapps/phpldapadmin/default.nix diff --git a/pkgs/webapps/phpldapadmin/ldap-align-button.patch b/flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-align-button.patch similarity index 100% rename from pkgs/webapps/phpldapadmin/ldap-align-button.patch rename to flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-align-button.patch diff --git a/pkgs/webapps/phpldapadmin/ldap-fix-password.patch b/flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-fix-password.patch similarity index 100% rename from pkgs/webapps/phpldapadmin/ldap-fix-password.patch rename to flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-fix-password.patch diff --git a/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch b/flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch similarity index 100% rename from pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch rename to flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch diff --git a/flakes/mypackages/pkgs/webapps/rompr/default.nix b/flakes/mypackages/pkgs/webapps/rompr/default.nix new file mode 100644 index 0000000..5b3e7e0 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/rompr/default.nix @@ -0,0 +1,17 @@ +{ varDir ? "/var/lib/rompr", stdenv, fetchFromGitHub }: +stdenv.mkDerivation ({ + pname = "rompr"; + version = "1.24"; + src = fetchFromGitHub { + owner = "fatg3erman"; + repo = "RompR"; + rev = "0d8f597027ac71b320963fe3f33f461a136312ad"; + sha256 = "13p3c4whhmvz1vvh9fva5gdx4xji288k108hjdi8b1yn506lzix2"; + fetchSubmodules = true; + }; + installPhase = '' + cp -a . $out + ln -sf ${varDir}/prefs $out/prefs + ln -sf ${varDir}/albumart $out/albumart + ''; +}) diff --git a/pkgs/webapps/roundcubemail/add_all.patch b/flakes/mypackages/pkgs/webapps/roundcubemail/add_all.patch similarity index 100% rename from pkgs/webapps/roundcubemail/add_all.patch rename to flakes/mypackages/pkgs/webapps/roundcubemail/add_all.patch diff --git a/pkgs/webapps/roundcubemail/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/carddav/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/carddav/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/carddav/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/carddav/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix diff --git a/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix similarity index 100% rename from pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix rename to flakes/mypackages/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix diff --git a/pkgs/webapps/spip/default.nix b/flakes/mypackages/pkgs/webapps/spip/default.nix similarity index 100% rename from pkgs/webapps/spip/default.nix rename to flakes/mypackages/pkgs/webapps/spip/default.nix diff --git a/pkgs/webapps/spip/spip_ldap_patch.patch b/flakes/mypackages/pkgs/webapps/spip/spip_ldap_patch.patch similarity index 100% rename from pkgs/webapps/spip/spip_ldap_patch.patch rename to flakes/mypackages/pkgs/webapps/spip/spip_ldap_patch.patch diff --git a/pkgs/webapps/spip/spip_mes_options.php b/flakes/mypackages/pkgs/webapps/spip/spip_mes_options.php similarity index 100% rename from pkgs/webapps/spip/spip_mes_options.php rename to flakes/mypackages/pkgs/webapps/spip/spip_mes_options.php diff --git a/pkgs/webapps/ttrss/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/default.nix similarity index 93% rename from pkgs/webapps/ttrss/default.nix rename to flakes/mypackages/pkgs/webapps/ttrss/default.nix index aeb573c..fa2453e 100644 --- a/pkgs/webapps/ttrss/default.nix +++ b/flakes/mypackages/pkgs/webapps/ttrss/default.nix @@ -21,9 +21,9 @@ let in newTtrss; package = stdenv.mkDerivation rec { pname = "tt-rss"; - version = sources.webapps-ttrss.version; + version = "${sources.tools.ttrss.shortRev}-master"; name = "${pname}-${version}"; - src = sources.webapps-ttrss; + src = sources.tools.ttrss; buildPhase = '' rm -rf lock feed-icons cache ln -sf ${varDir}/{lock,feed-icons,cache} . diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix new file mode 100644 index 0000000..39f9e0e --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix @@ -0,0 +1,18 @@ +{ patched ? false, stdenv, fetchFromGitHub, lib }: +stdenv.mkDerivation ({ + pname = "ttrss-af_feedmod"; + version = "0ea2092-master"; + src = fetchFromGitHub { + owner = "mbirth"; + repo = "ttrss_plugin-af_feedmod"; + rev = "0ea2092dd34067ecd898802cfca3570023d1ecfe"; + sha256 = "02ibf47zcrsc2rr45wsix8gxyyf371davj8n8i0gj1zdq95klvnv"; + fetchSubmodules = true; + }; + patches = lib.optionals patched [ ./type_replace.patch ]; + installPhase = '' + mkdir $out + cp init.php $out + ''; + passthru.pluginName = "af_feedmod"; +}) diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch b/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch similarity index 100% rename from pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch rename to flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix new file mode 100644 index 0000000..d283160 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix @@ -0,0 +1,17 @@ +{ stdenv, fetchFromGitHub }: +stdenv.mkDerivation ({ + pname = "ttrss-auth-ldap"; + version = "4d751b0-master"; + src = fetchFromGitHub { + owner = "hydrian"; + repo = "TTRSS-Auth-LDAP"; + rev = "4d751b095c29a8dbe2dc7bb07777742956136e94"; + sha256 = "0b9fl86acrzpcv41r7pj3bl8b3n72hpkdywzx9zjyfqv5pskxyim"; + fetchSubmodules = true; + }; + installPhase = '' + mkdir $out + cp plugins/auth_ldap/init.php $out + ''; + passthru.pluginName = "auth_ldap"; +}) diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix new file mode 100644 index 0000000..2f86416 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix @@ -0,0 +1,18 @@ +{ patched ? false, stdenv, fetchFromGitHub, lib }: +stdenv.mkDerivation ({ + pname = "ttrss-feediron"; + version = "407168c-master"; + src = fetchFromGitHub { + owner = "m42e"; + repo = "ttrss_plugin-feediron"; + rev = "407168c628880b5ced572cc549db6d50e866d3c8"; + sha256 = "17b95ifpcph6m03hjd1mhi8gi1hw9yd3fnffmw66fqr5c9l3zd9r"; + fetchSubmodules = true; + }; + patches = lib.optionals patched [ ./json_reformat.patch ]; + installPhase = '' + mkdir $out + cp -a . $out + ''; + passthru.pluginName = "feediron"; +}) diff --git a/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch b/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch similarity index 100% rename from pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch rename to flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix new file mode 100644 index 0000000..f0df588 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix @@ -0,0 +1,17 @@ +{ stdenv, fetchFromGitHub }: +stdenv.mkDerivation ({ + pname = "ttrss-ff_instagram"; + version = "0366ffb-master"; + src = fetchFromGitHub { + owner = "wltb"; + repo = "ff_instagram"; + rev = "0366ffb18c4d490c8fbfba2f5f3367a5af23cfe8"; + sha256 = "0vvzl6wi6jmrqknsfddvckjgsgfizz1d923d1nyrpzjfn6bda1vk"; + fetchSubmodules = true; + }; + installPhase = '' + mkdir $out + cp -a . $out + ''; + passthru.pluginName = "ff_instagram"; +}) diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix new file mode 100644 index 0000000..072b6c3 --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix @@ -0,0 +1,17 @@ +{ stdenv, fetchFromGitHub }: +stdenv.mkDerivation ({ + pname = "ttrss-tumblr_gdpr_ua"; + version = "287c584-master"; + src = fetchFromGitHub { + owner = "hkockerbeck"; + repo = "ttrss-tumblr-gdpr-ua"; + rev = "287c584e68845d524f920156bff0b2eaa6f65117"; + sha256 = "1fviawgcclqky4k4xv1sqzvpb8i74w9f0pclm09m78s8l85wh9py"; + fetchSubmodules = true; + }; + installPhase = '' + mkdir $out + cp -a . $out + ''; + passthru.pluginName = "tumblr_gdpr_ua"; +}) diff --git a/pkgs/webapps/wallabag/default.nix b/flakes/mypackages/pkgs/webapps/wallabag/default.nix similarity index 100% rename from pkgs/webapps/wallabag/default.nix rename to flakes/mypackages/pkgs/webapps/wallabag/default.nix diff --git a/pkgs/webapps/wallabag/ldap.patch b/flakes/mypackages/pkgs/webapps/wallabag/ldap.patch similarity index 100% rename from pkgs/webapps/wallabag/ldap.patch rename to flakes/mypackages/pkgs/webapps/wallabag/ldap.patch diff --git a/pkgs/webapps/yourls/default.nix b/flakes/mypackages/pkgs/webapps/yourls/default.nix similarity index 63% rename from pkgs/webapps/yourls/default.nix rename to flakes/mypackages/pkgs/webapps/yourls/default.nix index d940c54..8001a60 100644 --- a/pkgs/webapps/yourls/default.nix +++ b/flakes/mypackages/pkgs/webapps/yourls/default.nix @@ -1,8 +1,8 @@ -{ yourls_config ? "/etc/yourls/config.php", mylibs, callPackage, lib, stdenv }: +{ yourls_config ? "/etc/yourls/config.php", fetchFromGitHub, callPackage, lib, stdenv }: let pluginNames = [ "ldap" ]; allPlugins = lib.attrsets.genAttrs pluginNames - (name: callPackage (./plugins + "/${name}") { inherit mylibs; }); + (name: callPackage (./plugins + "/${name}") {}); toPassthru = pkg: plugins: { inherit plugins allPlugins; withPlugins = withPlugins pkg; @@ -16,7 +16,16 @@ let passthru = toPassthru newYourls (pkg.plugins ++ plugins); }); in newYourls; - package = stdenv.mkDerivation (mylibs.fetchedGithub ./yourls.json // rec { + package = stdenv.mkDerivation (rec { + pname = "yourls"; + version = "1.7.3"; + src = fetchFromGitHub { + owner = "YOURLS"; + repo = "YOURLS"; + rev = "077018822d3594229daa8343310d0b40804b9ddc"; + sha256 = "1av6h619rwqn0yn0kjn2s2h3gmrhmxaaa9hd5ns4ralxgg731imd"; + fetchSubmodules = true; + }; installPhase = '' mkdir -p $out cp -a */ *.php $out/ diff --git a/flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix b/flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix new file mode 100644 index 0000000..5870faa --- /dev/null +++ b/flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix @@ -0,0 +1,17 @@ +{ stdenv, fetchFromGitHub }: +stdenv.mkDerivation (rec { + pname = "yourls-ldap-plugin"; + version = "2a3cb03-master"; + src = fetchFromGitHub { + owner = "k3a"; + repo = "yourls-ldap-plugin"; + rev = "2a3cb0334b8a6b81b284a7196e614bbd2b2b1615"; + sha256 = "0cchbnli77d295lzf7kjmn4dcxj2bmdqa9qc3f8l8qgmp4n5n0gh"; + fetchSubmodules = true; + }; + installPhase = '' + mkdir -p $out + cp plugin.php $out + ''; + passthru.pluginName = "ldap"; +}) diff --git a/flakes/myuids/flake.nix b/flakes/myuids/flake.nix index cc6dc66..ff33651 100644 --- a/flakes/myuids/flake.nix +++ b/flakes/myuids/flake.nix @@ -6,6 +6,7 @@ # Check that there is no clash with nixos/modules/misc/ids.nix uids = { cryptpad = 386; + openldap = 99; # commented in the ids file postfixscripts = 387; acme = 388; backup = 389; @@ -21,6 +22,7 @@ }; gids = { nagios = 11; # commented in the ids file + openldap = 99; # commented in the ids file cryptpad = 386; acme = 388; backup = 389; @@ -35,10 +37,20 @@ mastodon = 399; }; }; - nixosModule = { ... }: { + nixosModule = { config, lib, ... }: { config = { ids.uids = self.lib.uids; ids.gids = self.lib.gids; + assertions = [ + { + assertion = builtins.length (builtins.attrValues config.ids.gids) == builtins.length (lib.unique (builtins.attrValues config.ids.gids)); + message = "Non-unique list of gids"; + } + { + assertion = builtins.length (builtins.attrValues config.ids.uids) == builtins.length (lib.unique (builtins.attrValues config.ids.uids)); + message = "Non-unique list of uids"; + } + ]; }; }; }; diff --git a/flakes/naemon/flake.nix b/flakes/naemon/flake.nix new file mode 100644 index 0000000..9b2ace5 --- /dev/null +++ b/flakes/naemon/flake.nix @@ -0,0 +1,191 @@ +{ + outputs = { self }: { + nixosModule = self.nixosModules.naemon; + nixosModules.naemon = { config, lib, pkgs, ... }: + with lib; + + let + cfg = config.services.naemon; + + naemonConfig = pkgs.runCommand "naemon-config" { + objectsFile = pkgs.writeText "naemon_objects.cfg" cfg.objectDefs; + resourceFile = config.secrets.fullPaths."naemon/resources.cfg"; + extraConfig = pkgs.writeText "extra.cfg" cfg.extraConfig; + inherit (cfg) logDir varDir runDir cacheDir; + } '' + substituteAll ${./naemon.cfg} $out + cat $extraConfig >> $out + ''; + in + { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); + + options = { + services.naemon = { + enable = mkOption { + default = false; + description = " + Whether to use Naemon to monitor + your system or network. + "; + }; + + objectDefs = mkOption { + type = types.lines; + default = ""; + description = " + A list of Naemon object configuration that must define + the hosts, host groups, services and contacts for the + network that you want Naemon to monitor. + "; + }; + + extraResource = mkOption { + type = types.lines; + default = ""; + example = '' + # Sets $USER2$ to be the path to event handlers + #$USER2$=/usr/lib/monitoring-plugins/eventhandlers + + # Store some usernames and passwords (hidden from the CGIs) + #$USER3$=someuser + #$USER4$=somepassword + ''; + description = " + Lines to add to the resource file + # You can define $USERx$ macros in this file, which can in turn be used + # in command definitions in your host config file(s). $USERx$ macros are + # useful for storing sensitive information such as usernames, passwords, + # etc. They are also handy for specifying the path to plugins and + # event handlers - if you decide to move the plugins or event handlers to + # a different directory in the future, you can just update one or two + # $USERx$ macros, instead of modifying a lot of command definitions. + # + # Naemon supports up to 256 $USERx$ macros ($USER1$ through $USER256$) + # + # Resource files may also be used to store configuration directives for + # external data sources like MySQL... + # + "; + }; + + extraConfig = mkOption { + type = types.lines; + default = ""; + description = " + Extra config to append to main config + "; + }; + + user = mkOption { + type = types.str; + default = "naemon"; + description = "User for naemon"; + }; + + group = mkOption { + type = types.str; + default = "naemon"; + description = "Group for naemon"; + }; + + varDir = mkOption { + type = types.path; + default = "/var/lib/naemon"; + description = "The directory where naemon stores its data"; + }; + + cacheDir = mkOption { + type = types.path; + default = "/var/cache/naemon"; + description = "The directory where naemon stores its cache"; + }; + + runDir = mkOption { + type = types.path; + default = "/run/naemon"; + description = "The directory where naemon stores its runtime files"; + }; + + logDir = mkOption { + type = types.path; + default = "/var/log/naemon"; + description = "The directory where naemon stores its log files"; + }; + + package = mkOption { + type = types.package; + default = pkgs.naemon.override { + inherit (cfg) varDir cacheDir logDir runDir user group; + }; + description = '' + Naemon package to use + ''; + }; + }; + }; + + + config = mkIf cfg.enable { + secrets.keys = { + "naemon/resources.cfg" = { + user = cfg.user; + group = cfg.group; + permissions = "0400"; + text = '' + $USER1$=${pkgs.monitoring-plugins}/libexec + ${cfg.extraResource} + ''; + keyDependencies = [ pkgs.monitoring-plugins ]; + }; + }; + + users.users = optionalAttrs (cfg.user == "naemon") { + naemon = { + group = cfg.group; + uid = config.ids.uids.nagios; + extraGroups = [ "keys" ]; + }; + }; + users.groups = optionalAttrs (cfg.user == "naemon") { + naemon = { + gid = config.ids.gids.nagios; + }; + }; + + services.filesWatcher.naemon = { + paths = [ config.secrets.fullPaths."naemon/resources.cfg" ]; + }; + systemd.services.naemon = { + description = "Naemon monitoring daemon"; + path = [ cfg.package ]; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + + preStart = "${cfg.package}/bin/naemon -vp ${naemonConfig}"; + script = "${cfg.package}/bin/naemon --daemon ${naemonConfig}"; + reload = "${pkgs.utillinux}/bin/kill -HUP $MAINPID"; + serviceConfig = { + User = cfg.user; + Restart = "always"; + RestartSec = 2; + StandardOutput = "journal"; + StandardError = "inherit"; + PIDFile = "${cfg.runDir}/naemon.pid"; + LogsDirectory = assert lib.strings.hasPrefix "/var/log/" cfg.logDir; + lib.strings.removePrefix "/var/log/" cfg.logDir; + CacheDirectory = assert lib.strings.hasPrefix "/var/cache/" cfg.cacheDir; + let unprefixed = lib.strings.removePrefix "/var/cache/" cfg.cacheDir; + in [ unprefixed "${unprefixed}/checkresults" ]; + StateDirectory = assert lib.strings.hasPrefix "/var/lib/" cfg.varDir; + lib.strings.removePrefix "/var/lib/" cfg.varDir; + RuntimeDirectory = assert lib.strings.hasPrefix "/run/" cfg.runDir; + lib.strings.removePrefix "/run/" cfg.runDir; + }; + }; + }; + }; + }; +} diff --git a/modules/naemon/naemon.cfg b/flakes/naemon/naemon.cfg similarity index 100% rename from modules/naemon/naemon.cfg rename to flakes/naemon/naemon.cfg diff --git a/flakes/openarc/flake.lock b/flakes/openarc/flake.lock index e0b78a8..a9e5e81 100644 --- a/flakes/openarc/flake.lock +++ b/flakes/openarc/flake.lock @@ -17,19 +17,14 @@ }, "myuids": { "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" }, "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "path": "../myuids", + "type": "path" } }, "nixpkgs": { diff --git a/flakes/openarc/flake.nix b/flakes/openarc/flake.nix index 6fd45bf..17a3fdd 100644 --- a/flakes/openarc/flake.nix +++ b/flakes/openarc/flake.nix @@ -2,9 +2,7 @@ description = "Open source ARC implementation"; inputs.myuids = { - url = "https://git.immae.eu/perso/Immae/Config/Nix.git"; - type = "git"; - dir = "flakes/myuids"; + url = "path:../myuids"; }; inputs.flake-utils.url = "github:numtide/flake-utils"; inputs.nixpkgs.url = "github:NixOS/nixpkgs"; @@ -66,6 +64,8 @@ defaultSock = "/run/openarc/openarc.sock"; args = [ "-f" "-p" "local:${cfg.socket}" ] ++ lib.optionals (cfg.configFile != null) [ "-c" cfg.configFile ]; in { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); options = { services.openarc = { enable = lib.mkOption { diff --git a/flakes/opendmarc/flake.lock b/flakes/opendmarc/flake.lock index 4503c79..e0cbe17 100644 --- a/flakes/opendmarc/flake.lock +++ b/flakes/opendmarc/flake.lock @@ -17,19 +17,14 @@ }, "myuids": { "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" }, "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "path": "../myuids", + "type": "path" } }, "nixpkgs": { diff --git a/flakes/opendmarc/flake.nix b/flakes/opendmarc/flake.nix index 277fd25..70b8cd7 100644 --- a/flakes/opendmarc/flake.nix +++ b/flakes/opendmarc/flake.nix @@ -2,9 +2,7 @@ description = "Open source ARC implementation"; inputs.myuids = { - url = "https://git.immae.eu/perso/Immae/Config/Nix.git"; - type = "git"; - dir = "flakes/myuids"; + url = "path:../myuids"; }; inputs.flake-utils.url = "github:numtide/flake-utils"; inputs.nixpkgs.url = "github:NixOS/nixpkgs"; @@ -51,7 +49,9 @@ defaultSock = "/run/opendmarc/opendmarc.sock"; args = [ "-f" "-l" "-p" "local:${cfg.socket}" ] ++ lib.optionals (cfg.configFile != null) [ "-c" cfg.configFile ]; in { - options = { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); + options = { services.opendmarc = { enable = lib.mkOption { type = lib.types.bool; diff --git a/flakes/openfoodnetwork/default.nix b/flakes/openfoodnetwork/default.nix new file mode 100644 index 0000000..dd68177 --- /dev/null +++ b/flakes/openfoodnetwork/default.nix @@ -0,0 +1,39 @@ +{ bundlerEnv, defaultGemConfig, writeShellScript, v8, stdenv }: + +let + gems = bundlerEnv { + name = "openfoodnetwork"; + gemfile = ./Gemfile; + lockfile = ./Gemfile.lock; + gemset = import ./gemset.nix; + gemConfig = defaultGemConfig // { + libv8-node = attrs: { + dontBuild = false; + postPatch = let + noopScript = writeShellScript "noop" "exit 0"; + linkFiles = writeShellScript "link-files" '' + cd ../.. + + mkdir -p vendor/v8/out.gn/libv8/obj/ + ln -s "${v8}/lib/libv8.a" vendor/v8/out.gn/libv8/obj/libv8_monolith.a + + ln -s ${v8}/include vendor/v8/include + + mkdir -p ext/libv8-node + echo '--- !ruby/object:Libv8::Node::Location::Vendor {}' >ext/libv8-node/.location.yml + ''; + in '' + cp ${noopScript} libexec/build-libv8 + cp ${noopScript} libexec/build-monolith + cp ${noopScript} libexec/download-node + cp ${noopScript} libexec/extract-node + cp ${linkFiles} libexec/inject-libv8 + ''; + }; + }; + }; +in + stdenv.mkDerivation { + name = "openfoodnetwork"; + inherit + } diff --git a/flakes/openfoodnetwork/gemset.nix b/flakes/openfoodnetwork/gemset.nix new file mode 100644 index 0000000..2f212b8 --- /dev/null +++ b/flakes/openfoodnetwork/gemset.nix @@ -0,0 +1,2896 @@ +{ + actioncable = { + dependencies = ["actionpack" "activesupport" "nio4r" "websocket-driver"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ilq5mniarm0zlvnkagqj9n9p73ljrhphciz02aymrpfxxxclz2x"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + actionmailbox = { + dependencies = ["actionpack" "activejob" "activerecord" "activestorage" "activesupport" "mail"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16azdnjws215clb056b9mabglx4b8f61hr82hv7hm80dmn89zqq6"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + actionmailer = { + dependencies = ["actionpack" "actionview" "activejob" "activesupport" "mail" "rails-dom-testing"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00s07l2ac5igch1g2rpa0linmiq7mhgk6v6wxkckg8gbiqijb592"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + actionpack = { + dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xgysqnibjsy6kdz10x2xb3kwa6lssiqhh0zggrbgs31ypwhlpia"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + actionpack-action_caching = { + dependencies = ["actionpack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bxaz8sdhqkdjqwk58icy9668s0yxpgm28gdkdmxl3g41m94b8id"; + type = "gem"; + }; + version = "1.2.2"; + }; + actiontext = { + dependencies = ["actionpack" "activerecord" "activestorage" "activesupport" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0m4fy4qqh09vnzbhx383vjdfid6fzbs49bzzg415x05nmmjkx582"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + actionview = { + dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1yf4ic5kl324rs0raralpwx24s6hvvdzxfhinafylf8f3x7jj23z"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + active_model_serializers = { + dependencies = ["activemodel"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k3mgia2ahh7mbk30hjq9pzqbk0kh281s91kq2z6p555nv9y6l3k"; + type = "gem"; + }; + version = "0.8.4"; + }; + activejob = { + dependencies = ["activesupport" "globalid"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1q7c0i0kwarxgcbxk71wa9jnlg45grbxmhlrh7dk9bgcv7r7r7hn"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + activemerchant = { + dependencies = ["activesupport" "builder" "i18n" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ajmcgc4idxmvh8sghyb1ngxsc9x6r5yfi4r1z22d6a4j7b1yjzj"; + type = "gem"; + }; + version = "1.123.0"; + }; + activemodel = { + dependencies = ["activesupport"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16ixam4lni8b5lgx0whnax0imzh1dh10fy5r9pxs52n83yz5nbq3"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + activerecord = { + dependencies = ["activemodel" "activesupport"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ccgvlj767ybps3pxlaa4iw77n7wbriw2sr8754id3ngjfap08ja"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + activerecord-import = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17ydad9gcsh0c9ny68fyvxmh6rbld4pyvyabnc7882678dnvfy8i"; + type = "gem"; + }; + version = "1.2.0"; + }; + activerecord-postgresql-adapter = { + dependencies = ["pg"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1wdfd1mkns28ilr6nm18x69h651mjxwb8p2zk8pb6cjgx7c26axl"; + type = "gem"; + }; + version = "0.0.1"; + }; + activerecord-session_store = { + dependencies = ["actionpack" "activerecord" "multi_json" "rack" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06ddhz1b2yg72iv09n48gcd3ix5da7hxlzi7vvj13nrps2qwlffg"; + type = "gem"; + }; + version = "2.0.0"; + }; + activestorage = { + dependencies = ["actionpack" "activejob" "activerecord" "activesupport" "marcel" "mini_mime"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17knzz9fvqg4x582vy0xmlgjkxfb13xyzl2rgw19qfma86hxsvvi"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + activesupport = { + dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo" "zeitwerk"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19gx1jcq46x9d1pi1w8xq0bgvvfw239y4lalr8asm291gj3q3ds4"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + acts-as-taggable-on = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kfnyix173bazjswab21bx7hmqmik71awj2kz090fsa2nv58c4mw"; + type = "gem"; + }; + version = "8.1.0"; + }; + acts_as_list = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "12p22h59c45dnccb51pqk275ziyi502azf9w3qcnkcsq827ma5jm"; + type = "gem"; + }; + version = "1.0.4"; + }; + addressable = { + dependencies = ["public_suffix"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "022r3m9wdxljpbya69y2i3h9g3dhhfaqzidf95m6qjzms792jvgp"; + type = "gem"; + }; + version = "2.8.0"; + }; + afm = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06kj9hgd0z8pj27bxp2diwqh6fv7qhwwm17z64rhdc4sfn76jgn8"; + type = "gem"; + }; + version = "0.2.2"; + }; + angular-rails-templates = { + dependencies = ["railties" "sprockets" "tilt"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0aja8b2bjj8af29zagkm6pv48s0933l0d38j5b4wgxipf0c0mjxq"; + type = "gem"; + }; + version = "1.1.0"; + }; + angular_rails_csrf = { + dependencies = ["railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08g6xwz98apbfxwd0kbsxl7ll4bms11m563rjl4mavm1dnf3nsgh"; + type = "gem"; + }; + version = "4.5.0"; + }; + angularjs-file-upload-rails = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "07s0b8bwdp8asc16rp16q78p17cl5qnw8svqarbcsv0b1fkxiqbd"; + type = "gem"; + }; + version = "2.4.1"; + }; + angularjs-rails = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01blhjrzg82l76s5fj7jcgnykxxdj61m5swwy9x0wxnxhid81rgx"; + type = "gem"; + }; + version = "1.8.0"; + }; + Ascii85 = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ds4v9xgsyvijnlflak4dzf1qwmda9yd5bv8jwsb56nngd399rlw"; + type = "gem"; + }; + version = "1.1.0"; + }; + ast = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "04nc8x27hlzlrr5c2gn7mar4vdr0apw5xg22wp6m8dx3wqr04a0y"; + type = "gem"; + }; + version = "2.4.2"; + }; + awesome_nested_set = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06ggf81dy8wkds0b37xgx065b325fm0c6i6g1k0ml4ai8jwphm6r"; + type = "gem"; + }; + version = "3.4.0"; + }; + awesome_print = { + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0vkq6c8y2jvaw03ynds5vjzl1v9wg608cimkd3bidzxc0jvk56z9"; + type = "gem"; + }; + version = "1.9.2"; + }; + aws-sdk = { + dependencies = ["aws-sdk-resources"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xfan8fpiy019zp32l2a8smwfbii5m9hy49d8b8gvww2qcy5m3pr"; + type = "gem"; + }; + version = "2.2.0"; + }; + aws-sdk-core = { + dependencies = ["jmespath"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1f8diki6xvz048i0lhkxqngirgmqqj50jda8vjw0xxgv3qzklq4r"; + type = "gem"; + }; + version = "2.2.0"; + }; + aws-sdk-resources = { + dependencies = ["aws-sdk-core"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06y7sj2371pjw9vgsfipbz2g3pw3i4asdz27h1lb7pny8gwndkzk"; + type = "gem"; + }; + version = "2.2.0"; + }; + bcrypt = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02r1c3isfchs5fxivbq99gc3aq4vfyn8snhcy707dal1p8qz12qb"; + type = "gem"; + }; + version = "3.1.16"; + }; + bigdecimal = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0fxl2hybnfij668h7133p28f8b13jaj13wyyniqdiy8m3s6b1pcb"; + type = "gem"; + }; + version = "3.0.2"; + }; + bindex = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0zmirr3m02p52bzq4xgksq4pn8j641rx5d4czk68pv9rqnfwq7kv"; + type = "gem"; + }; + version = "0.8.1"; + }; + bootsnap = { + dependencies = ["msgpack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ndjra3h86dq28njm2swmaw6n3vsywrycrf7i5iy9l8hrhfhv4x2"; + type = "gem"; + }; + version = "1.9.1"; + }; + bugsnag = { + dependencies = ["concurrent-ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19yz4s0sw2w8jywkdf445zpdkg3s9869hmxcs7w68xvykpx0ickb"; + type = "gem"; + }; + version = "6.24.0"; + }; + builder = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "045wzckxpwcqzrjr353cxnyaxgf0qg22jh00dcx7z38cys5g1jlr"; + type = "gem"; + }; + version = "3.2.4"; + }; + bullet = { + dependencies = ["activesupport" "uniform_notifier"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01xachwsyykmp153514vz2khanbsz1n27j09za5gcxj54srh5l4p"; + type = "gem"; + }; + version = "6.1.5"; + }; + byebug = { + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0nx3yjf4xzdgb8jkmk2344081gqr22pgjqnmjg2q64mj5d6r9194"; + type = "gem"; + }; + version = "11.1.3"; + }; + cable_ready = { + dependencies = ["rails" "thread-local"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06lqnv1b3zxgn189v7df6avf3zrk1snfxkbm1ax0fz129k997hak"; + type = "gem"; + }; + version = "5.0.0.pre2"; + }; + cancancan = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "05kb459laaw339n7mas37v4k83nwz228bfpaghgybza347341x85"; + type = "gem"; + }; + version = "1.15.0"; + }; + capybara = { + dependencies = ["addressable" "mini_mime" "nokogiri" "rack" "rack-test" "regexp_parser" "xpath"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1viqcpsngy9fqjd68932m43ad6xj656d1x33nx9565q57chgi29k"; + type = "gem"; + }; + version = "3.35.3"; + }; + catalog = { + groups = ["default"]; + platforms = []; + source = { + path = engines/catalog; + type = "path"; + }; + version = "0.0.1"; + }; + childprocess = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ic028k8xgm2dds9mqnvwwx3ibaz32j8455zxr9f4bcnviyahya5"; + type = "gem"; + }; + version = "3.0.0"; + }; + chronic = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hrdkn4g8x7dlzxwb1rfgr8kw3bp4ywg5l4y4i9c2g5cwv62yvvn"; + type = "gem"; + }; + version = "0.10.2"; + }; + chunky_png = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1znw5x86hmm9vfhidwdsijz8m38pqgmv98l9ryilvky0aldv7mc9"; + type = "gem"; + }; + version = "1.4.0"; + }; + climate_control = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0q11v0iabvr6rif0d025xh078ili5frrihlj0m04zfg7lgvagxji"; + type = "gem"; + }; + version = "0.2.0"; + }; + cliver = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "096f4rj7virwvqxhkavy0v55rax10r4jqf8cymbvn4n631948xc7"; + type = "gem"; + }; + version = "0.3.2"; + }; + cocaine = { + dependencies = ["climate_control"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01kk5xd7lspbkdvn6nyj0y51zhvia3z6r4nalbdcqw5fbsywwi7d"; + type = "gem"; + }; + version = "0.5.8"; + }; + codecov = { + dependencies = ["simplecov"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pi2dmqxjw5wsn65yx5qz5ks5msqflj0zxvk11r3cxwgacvj3hys"; + type = "gem"; + }; + version = "0.6.0"; + }; + coderay = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jvxqxzply1lwp7ysn94zjhh57vc14mcshw1ygw14ib8lhc00lyw"; + type = "gem"; + }; + version = "1.1.3"; + }; + coffee-rails = { + dependencies = ["coffee-script" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "170sp4y82bf6nsczkkkzypzv368sgjg6lfrkib4hfjgxa6xa3ajx"; + type = "gem"; + }; + version = "5.0.0"; + }; + coffee-script = { + dependencies = ["coffee-script-source" "execjs"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0rc7scyk7mnpfxqv5yy4y5q1hx3i7q3ahplcp4bq2g5r24g2izl2"; + type = "gem"; + }; + version = "2.4.1"; + }; + coffee-script-source = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1907v9q1zcqmmyqzhzych5l7qifgls2rlbnbhy5vzyr7i7yicaz1"; + type = "gem"; + }; + version = "1.12.2"; + }; + combine_pdf = { + dependencies = ["ruby-rc4"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bxakrrip0sg5gxy50wdn7lr3h2w7rd590cjhnj4qi477cvi1qgg"; + type = "gem"; + }; + version = "1.0.21"; + }; + compass = { + dependencies = ["chunky_png" "compass-core" "compass-import-once" "rb-fsevent" "rb-inotify" "sass"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lfi83w8z75czr0pf0rmj9hda22082h3cmvczl8r1ma9agf88y2c"; + type = "gem"; + }; + version = "1.0.3"; + }; + compass-core = { + dependencies = ["multi_json" "sass"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0yaspqwdmzwdcqviclbs3blq7an16pysrfzylz8q1gxmmd6bpj3a"; + type = "gem"; + }; + version = "1.0.3"; + }; + compass-import-once = { + dependencies = ["sass"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bn7gwbfz7jvvdd0qdfqlx67fcb83gyvxqc7dr9fhcnks3z8z5rq"; + type = "gem"; + }; + version = "1.0.5"; + }; + compass-rails = { + dependencies = ["compass" "sass-rails" "sprockets"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1y1gi9lcmxzn0xvx2pf4xzj8n0s6rl0vbycyjk1kpcvycyjnbjgr"; + type = "gem"; + }; + version = "4.0.0"; + }; + concurrent-ruby = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0nwad3211p7yv9sda31jmbyw6sdafzmdi2i2niaz6f0wk5nq9h0f"; + type = "gem"; + }; + version = "1.1.9"; + }; + connection_pool = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ffdxhgirgc86qb42yvmfj6v1v0x4lvi0pxn9zhghkff44wzra0k"; + type = "gem"; + }; + version = "2.2.5"; + }; + crack = { + dependencies = ["rexml"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cr1kfpw3vkhysvkk3wg7c54m75kd68mbm9rs5azdjdq57xid13r"; + type = "gem"; + }; + version = "0.4.5"; + }; + crass = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0pfl5c0pyqaparxaqxi6s4gfl21bdldwiawrc0aknyvflli60lfw"; + type = "gem"; + }; + version = "1.0.6"; + }; + css_parser = { + dependencies = ["addressable"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xs4ind9xd099rb52b73pch8ha143dl8bhivqsbba4wrvxpbx751"; + type = "gem"; + }; + version = "1.9.0"; + }; + cuprite = { + dependencies = ["capybara" "ferrum"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1gz7min595pq4xkzm1nvn538i7plg7jwfc1pw6w8f4apfh94fv56"; + type = "gem"; + }; + version = "0.13"; + }; + custom_error_message = { + groups = ["default"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "3a8ec9dddc7a5b0aab7c69a6060596de300c68f4"; + sha256 = "1r2yah8dzng7i0000xfdksv3cj2z65x1nr4vjrnsv9sm7fj7bbld"; + type = "git"; + url = "https://github.com/jeremydurham/custom-err-msg.git"; + }; + version = "1.1.1"; + }; + dalli = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0br39scmr187w3ifl5gsddl2fhq6ahijgw6358plqjdzrizlg764"; + type = "gem"; + }; + version = "2.7.11"; + }; + database_cleaner = { + dependencies = ["database_cleaner-active_record"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1x4r22rnpwnm9yln88vhzqj4cl3sbd26c4j50g9k6wp7y01rln4w"; + type = "gem"; + }; + version = "2.0.1"; + }; + database_cleaner-active_record = { + dependencies = ["activerecord" "database_cleaner-core"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1jg7jd7w65hdarzbi8f252la3qgsnd2sjavhlmc82kwzfx37k38m"; + type = "gem"; + }; + version = "2.0.0"; + }; + database_cleaner-core = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0v44bn386ipjjh4m2kl53dal8g4d41xajn2jggnmjbhn6965fil6"; + type = "gem"; + }; + version = "2.0.1"; + }; + db2fog = { + dependencies = ["activerecord" "fog-core" "rails"]; + groups = ["default"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "5b63343847452f52aa42f7fc169d6ab3af57cda3"; + sha256 = "02fc3v81sx6rnvc492bdg057fs67qpsf83y25bsdqz83k21xmzyl"; + type = "git"; + url = "https://github.com/openfoodfoundation/db2fog.git"; + }; + version = "0.9.2"; + }; + ddtrace = { + dependencies = ["ffi" "msgpack"]; + groups = ["production" "staging"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0p7d6r2zpy9mqmd26ni9cpgc2yas4jira66rxx92l87amypkvasc"; + type = "gem"; + }; + version = "0.53.0"; + }; + debugger-linecache = { + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0iwyx190fd5vfwj1gzr8pg3m374kqqix4g4fc4qw29sp54d3fpdz"; + type = "gem"; + }; + version = "1.2.0"; + }; + devise = { + dependencies = ["bcrypt" "orm_adapter" "railties" "responders" "warden"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ag0skzk3h7bhmf1n2zwa7cg6kx5k5inxmq0kf5qpm7917ffm0mz"; + type = "gem"; + }; + version = "4.8.0"; + }; + devise-encryptable = { + dependencies = ["devise"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dh9gl7qa1a8x091xk9dc6lwc5jw6lqmiw7sii1hq0w4jknwlq4q"; + type = "gem"; + }; + version = "0.2.0"; + }; + devise-i18n = { + dependencies = ["devise"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11knkl0b40pyjz8934pmr3apzsmvvaj09w5ks8xzppd5agid2r6f"; + type = "gem"; + }; + version = "1.10.0"; + }; + devise-token_authenticatable = { + dependencies = ["devise"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ss9wcmjghl6s2kyqrgjn5z4bw1gxmlbqv0in2kirn56428w239f"; + type = "gem"; + }; + version = "1.1.0"; + }; + dfc_provider = { + dependencies = ["active_model_serializers" "jwt" "rspec"]; + groups = ["default"]; + platforms = []; + source = { + path = engines/dfc_provider; + type = "path"; + }; + version = "0.0.1"; + }; + diff-lcs = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0m925b8xc6kbpnif9dldna24q1szg4mk0fvszrki837pfn46afmz"; + type = "gem"; + }; + version = "1.4.4"; + }; + docile = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lxqxgq71rqwj1lpl9q1mbhhhhhhdkkj7my341f2889pwayk85sz"; + type = "gem"; + }; + version = "1.4.0"; + }; + dotenv = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0iym172c5337sm1x2ykc2i3f961vj3wdclbyg1x6sxs3irgfsl94"; + type = "gem"; + }; + version = "2.7.6"; + }; + dotenv-rails = { + dependencies = ["dotenv" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1my2jdmgmpf32rfxffkb9cyxh7ayis4q5ygpwjqj4vpp25y3a70c"; + type = "gem"; + }; + version = "2.7.6"; + }; + e2mmap = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0n8gxjb63dck3vrmsdcqqll7xs7f3wk78mw8w0gdk9wp5nx6pvj5"; + type = "gem"; + }; + version = "0.1.0"; + }; + erubi = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09l8lz3j00m898li0yfsnb6ihc63rdvhw3k5xczna5zrjk104f2l"; + type = "gem"; + }; + version = "1.10.0"; + }; + et-orbi = { + dependencies = ["tzinfo"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xr8i8ql4xzx17d12590i3j299hj6vc0ja2j29dy12i5nlchxrvp"; + type = "gem"; + }; + version = "1.2.4"; + }; + excon = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19g5nvkycnkzqq4mqn1zjznq9adrlv2jz0dr9w10cbn42hhqpiz7"; + type = "gem"; + }; + version = "0.81.0"; + }; + execjs = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1yz55sf2nd3l666ms6xr18sm2aggcvmb8qr3v53lr4rir32y1yp1"; + type = "gem"; + }; + version = "2.7.0"; + }; + factory_bot = { + dependencies = ["activesupport"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "04vxmjr200akcil9fqxc9ghbb9q0lyrh2q03xxncycd5vln910fi"; + type = "gem"; + }; + version = "6.2.0"; + }; + factory_bot_rails = { + dependencies = ["factory_bot" "railties"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "18fhcihkc074gk62iwqgbdgc3ymim4fm0b4p3ipffy5hcsb9d2r7"; + type = "gem"; + }; + version = "6.2.0"; + }; + faraday = { + dependencies = ["faraday-excon" "faraday-net_http" "faraday-net_http_persistent" "multipart-post" "ruby2_keywords"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0q646m07lfahakx5jdq77j004rcgfj6lkg13c0f84993gi78dhvi"; + type = "gem"; + }; + version = "1.4.1"; + }; + faraday-excon = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0h09wkb0k0bhm6dqsd47ac601qiaah8qdzjh8gvxfd376x1chmdh"; + type = "gem"; + }; + version = "1.1.0"; + }; + faraday-net_http = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fi8sda5hc54v1w3mqfl5yz09nhx35kglyx72w7b8xxvdr0cwi9j"; + type = "gem"; + }; + version = "1.0.1"; + }; + faraday-net_http_persistent = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0l2c835wl7gv34xp49fhd1bl4czkpw2g3ahqsak2251iqv5589ka"; + type = "gem"; + }; + version = "1.1.0"; + }; + ferrum = { + dependencies = ["addressable" "cliver" "concurrent-ruby" "websocket-driver"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17c2bryyzpdx3mj6rig4aym3wy24g2212zm0jz2gisbymhv9adbl"; + type = "gem"; + }; + version = "0.11"; + }; + ffaker = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0gif76bq11qz73qm8hv050wf642f9zwawra78bnpnj5kpqhjg3dl"; + type = "gem"; + }; + version = "2.20.0"; + }; + ffi = { + groups = ["default" "production" "staging"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ssxcywmb3flxsjdg13is6k01807zgzasdhj4j48dm7ac59cmksn"; + type = "gem"; + }; + version = "1.15.4"; + }; + flipper = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1gdnd7j12a560r4pi22v1z2cy0nymwr340922rfj9qkpj7h46371"; + type = "gem"; + }; + version = "0.20.4"; + }; + flipper-active_record = { + dependencies = ["activerecord" "flipper"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "042x64rr11ia7n4db2y6vjbfjv2ip0jp2m2mlyb6d9srbxvvkiif"; + type = "gem"; + }; + version = "0.20.4"; + }; + flipper-ui = { + dependencies = ["erubi" "flipper" "rack" "rack-protection"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0sf9giwiwrncvvac48rgc56xgj6s8scs7a9ahr6b2hqbyr1nja9l"; + type = "gem"; + }; + version = "0.20.4"; + }; + fog-aws = { + dependencies = ["fog-core" "fog-json" "fog-xml" "ipaddress"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00skbbgvhqzq6gpgzmw0957n0wf1y3vjgrdyq3sib0ghpyfgmig3"; + type = "gem"; + }; + version = "2.0.1"; + }; + fog-core = { + dependencies = ["builder" "excon" "formatador"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02449kh2x3zj9xxszm02vy8zpbsrykvjrg5gj3kqcy2yizy2bhp3"; + type = "gem"; + }; + version = "1.45.0"; + }; + fog-json = { + dependencies = ["fog-core" "multi_json"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zj8llzc119zafbmfa4ai3z5s7c4vp9akfs0f9l2piyvcarmlkyx"; + type = "gem"; + }; + version = "1.2.0"; + }; + fog-xml = { + dependencies = ["fog-core" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "043lwdw2wsi6d55ifk0w3izi5l1d1h0alwyr3fixic7b94kc812n"; + type = "gem"; + }; + version = "0.1.3"; + }; + foreman = { + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0szgxvnzwkzrfbq5dkwa98mig78aqglfy6irdsvq1gq045pbq9r7"; + type = "gem"; + }; + version = "0.87.2"; + }; + formatador = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1gc26phrwlmlqrmz4bagq1wd5b7g64avpx0ghxr9xdxcvmlii0l0"; + type = "gem"; + }; + version = "0.2.5"; + }; + foundation-icons-sass-rails = { + dependencies = ["railties" "sass-rails"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1z3bp0kcz7csid9r6h8z8asywh8mn2fwcm71b4v4qjca13qf4n2w"; + type = "gem"; + }; + version = "3.0.0"; + }; + foundation-rails = { + dependencies = ["railties" "sass"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dizpi3k3bb2arnf96rxx1qx3x3rwqshbdzb3l8ycj1laddrhwnl"; + type = "gem"; + }; + version = "5.5.2.1"; + }; + fugit = { + dependencies = ["et-orbi" "raabro"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jhbmc1l94vz25byfbmgi783lrwsh74xvslqzxd0pjf8i9xsxv49"; + type = "gem"; + }; + version = "1.4.5"; + }; + fuubar = { + dependencies = ["rspec-core" "ruby-progressbar"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1028vn7j3kc5qqwswrf3has3qm4j9xva70xmzb3n29i89f0afwmj"; + type = "gem"; + }; + version = "2.5.1"; + }; + geocoder = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0is3xss043nxvckqrbk0r881950q4khigrh41qqqjff44gm24bs3"; + type = "gem"; + }; + version = "1.6.7"; + }; + globalid = { + dependencies = ["activesupport"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k6ww3shk3mv119xvr9m99l6ql0czq91xhd66hm8hqssb18r2lvm"; + type = "gem"; + }; + version = "0.5.2"; + }; + gmaps4rails = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0avwx3ygmq2krkawyplw76q4bm05v56rwp1vdwfpvsd8bh4vzhq9"; + type = "gem"; + }; + version = "2.1.2"; + }; + good_migrations = { + dependencies = ["activerecord" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0f613j6gkdkipzhw6r9kngqk3g2zi6hwmscy1sdf5snfjpamhvin"; + type = "gem"; + }; + version = "0.1.0"; + }; + haml = { + dependencies = ["temple" "tilt"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "035fgbfr20m08w4603ls2lwqbggr0vy71mijz0p68ib1am394xbf"; + type = "gem"; + }; + version = "5.2.2"; + }; + hashdiff = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nynpl0xbj0nphqx1qlmyggq58ms1phf5i03hk64wcc0a17x1m1c"; + type = "gem"; + }; + version = "1.0.1"; + }; + hashery = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0qj8815bf7q6q7llm5rzdz279gzmpqmqqicxnzv066a020iwqffj"; + type = "gem"; + }; + version = "2.1.2"; + }; + highline = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0yclf57n2j3cw8144ania99h1zinf8q3f5zrhqa754j6gl95rp9d"; + type = "gem"; + }; + version = "2.0.3"; + }; + hiredis = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "04jj8k7lxqxw24sp0jiravigdkgsyrpprxpxm71ba93x1wr2w1bz"; + type = "gem"; + }; + version = "0.6.3"; + }; + i18n = { + dependencies = ["concurrent-ruby"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0g2fnag935zn2ggm5cn6k4s4xvv53v2givj1j90szmvavlpya96a"; + type = "gem"; + }; + version = "1.8.10"; + }; + i18n-js = { + dependencies = ["i18n"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xiq65q0rhafp3aknj602nbj7i016yjfvw28y83hg8ddqlqvc9x0"; + type = "gem"; + }; + version = "3.9.0"; + }; + immigrant = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15jf08h8if3wyq0kdgijcknqzmgfw4rqnyln68mydg1c5bn4s5cw"; + type = "gem"; + }; + version = "0.3.6"; + }; + ipaddress = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1x86s0s11w202j6ka40jbmywkrx8fhq8xiy8mwvnkhllj57hqr45"; + type = "gem"; + }; + version = "0.8.3"; + }; + jmespath = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1d4wac0dcd1jf6kc57891glih9w57552zgqswgy74d1xhgnk0ngf"; + type = "gem"; + }; + version = "1.4.0"; + }; + jquery-rails = { + dependencies = ["rails-dom-testing" "railties" "thor"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dkhm8lan1vnyl3ll0ks2q06576pdils8a1dr354vfc1y5dqw15i"; + type = "gem"; + }; + version = "4.4.0"; + }; + jquery-ui-rails = { + dependencies = ["railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1garrnqwh35acj2pp4sp6fpm2g881h23y644lzbic2qmcrq9wd2v"; + type = "gem"; + }; + version = "4.2.1"; + }; + json = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lrirj0gw420kw71bjjlqkqhqbrplla61gbv1jzgsz6bv90qr3ci"; + type = "gem"; + }; + version = "2.5.1"; + }; + json-schema = { + dependencies = ["addressable"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1yv5lfmr2nzd14af498xqd5p89f3g080q8wk0klr3vxgypsikkb5"; + type = "gem"; + }; + version = "2.8.1"; + }; + json_spec = { + dependencies = ["multi_json" "rspec"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03yiravv6q8lp37rip2i25w2qd63mwwi4jmw7ymf51y7j9xbjxvs"; + type = "gem"; + }; + version = "1.1.5"; + }; + jwt = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bg8pjx0mpvl10k6d8a6gc8dzlv2z5jkqcjbjcirnk032iriq838"; + type = "gem"; + }; + version = "2.3.0"; + }; + knapsack = { + dependencies = ["rake"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1f42akjbdkrg1ihwvls9pkkvz8vikaapzgxl82dd128rfn42chm9"; + type = "gem"; + }; + version = "4.0.0"; + }; + launchy = { + dependencies = ["addressable"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xdyvr5j0gjj7b10kgvh8ylxnwk3wx19my42wqn9h82r4p246hlm"; + type = "gem"; + }; + version = "2.5.0"; + }; + letter_opener = { + dependencies = ["launchy"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09a7kgsmr10a0hrc9bwxglgqvppjxij9w8bxx91mnvh0ivaw0nq9"; + type = "gem"; + }; + version = "1.7.0"; + }; + libv8-node = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xx217hrkpcm41p41inmy05kb7g8p9w5fwabgjgmpvz0d60j2862"; + type = "gem"; + }; + version = "15.14.0.1"; + }; + loofah = { + dependencies = ["crass" "nokogiri"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nqcya57x2n58y1dify60i0dpla40n4yir928khp4nj5jrn9mgmw"; + type = "gem"; + }; + version = "2.12.0"; + }; + mail = { + dependencies = ["mini_mime"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00wwz6ys0502dpk8xprwcqfwyf3hmnx6lgxaiq6vj43mkx43sapc"; + type = "gem"; + }; + version = "2.7.1"; + }; + marcel = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bp001p687nsa4a8sp3q1iv8pfhs24w7s3avychjp64sdkg6jxq3"; + type = "gem"; + }; + version = "1.0.1"; + }; + method_source = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pnyh44qycnf9mzi1j6fywd5fkskv3x7nmsqrrws0rjn5dd4ayfp"; + type = "gem"; + }; + version = "1.0.0"; + }; + mime-types = { + dependencies = ["mime-types-data"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zj12l9qk62anvk9bjvandpa6vy4xslil15wl6wlivyf51z773vh"; + type = "gem"; + }; + version = "3.3.1"; + }; + mime-types-data = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1phcq7z0zpipwd7y4fbqmlaqghv07fjjgrx99mwq3z3n0yvy7fmi"; + type = "gem"; + }; + version = "3.2021.0225"; + }; + mimemagic = { + dependencies = ["nokogiri" "rake"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17ycgsmz2229jh224ws77yg974cz326flgc401xrdkfpw90jvb08"; + type = "gem"; + }; + version = "0.4.3"; + }; + mini_mime = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kb7jq3wjgckmkzna799y5qmvn6vg52878bkgw35qay6lflcrwih"; + type = "gem"; + }; + version = "1.1.0"; + }; + mini_portile2 = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lvxm91hi0pabnkkg47wh1siv56s6slm2mdq1idfm86dyfidfprq"; + type = "gem"; + }; + version = "2.6.1"; + }; + mini_racer = { + dependencies = ["libv8-node"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0334q46gi3il9izw7k4z32fj06nm8pznqdkr9r51033lnwwy9zy3"; + type = "gem"; + }; + version = "0.4.0"; + }; + minitest = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19z7wkhg59y8abginfrm2wzplz7py3va8fyngiigngqvsws6cwgl"; + type = "gem"; + }; + version = "5.14.4"; + }; + monetize = { + dependencies = ["money"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0cna2myxdbwfq0gn6k2hgrh368dq7wld3jklm96443ysykd0difn"; + type = "gem"; + }; + version = "1.11.0"; + }; + money = { + dependencies = ["i18n"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11fk7i1w3qjb1br7507z748g1rh3mcmnvpm4jach0i4hsc2wrb5k"; + type = "gem"; + }; + version = "6.14.1"; + }; + msgpack = { + groups = ["default" "production" "staging"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06iajjyhx0rvpn4yr3h1hc4w4w3k59bdmfhxnjzzh76wsrdxxrc6"; + type = "gem"; + }; + version = "1.4.2"; + }; + multi_json = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0pb1g1y3dsiahavspyzkdy39j4q377009f6ix0bh1ag4nqw43l0z"; + type = "gem"; + }; + version = "1.15.0"; + }; + multi_xml = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lmd4f401mvravi1i1yq7b2qjjli0yq7dfc4p1nj5nwajp7r6hyj"; + type = "gem"; + }; + version = "0.6.0"; + }; + multipart-post = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zgw9zlwh2a6i1yvhhc4a84ry1hv824d6g2iw2chs3k5aylpmpfj"; + type = "gem"; + }; + version = "2.1.1"; + }; + nio4r = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xk64wghkscs6bv2n22853k2nh39d131c6rfpnlw12mbjnnv9v1v"; + type = "gem"; + }; + version = "2.5.8"; + }; + nokogiri = { + dependencies = ["mini_portile2" "racc"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1v02g7k7cxiwdcahvlxrmizn3avj2q6nsjccgilq1idc89cr081b"; + type = "gem"; + }; + version = "1.12.5"; + }; + oauth2 = { + dependencies = ["faraday" "jwt" "multi_json" "multi_xml" "rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1q6q2kgpxmygk8kmxqn54zkw8cs57a34zzz5cxpsh1bj3ag06rk3"; + type = "gem"; + }; + version = "1.4.7"; + }; + ofn-qz = { + groups = ["default"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "467f6ea1c44529c7c91cac4c8211bbd863588c0b"; + sha256 = "1rm2r2gfbc8cbv9gd4619ivv3qvklwpdayvklyd7w5k9c110fm7j"; + type = "git"; + url = "https://github.com/openfoodfoundation/ofn-qz.git"; + }; + version = "0.1.0"; + }; + order_management = { + groups = ["default"]; + platforms = []; + source = { + path = engines/order_management; + type = "path"; + }; + version = "0.0.1"; + }; + orm_adapter = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fg9jpjlzf5y49qs9mlpdrgs5rpcyihq1s4k79nv9js0spjhnpda"; + type = "gem"; + }; + version = "0.5.0"; + }; + pagy = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "010z4lmpj7ld8k6hcpsyd2m0iicycaaabyzscgvnir8cklx1w9cw"; + type = "gem"; + }; + version = "4.11.0"; + }; + paper_trail = { + dependencies = ["activerecord" "request_store"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hvz0fdzginyyx2x8c755aibdhfvmpjfb9666pdk6ccr9nkb7w1k"; + type = "gem"; + }; + version = "12.1.0"; + }; + paperclip = { + dependencies = ["activemodel" "activerecord" "activesupport" "cocaine" "mime-types"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "12acd9ambpsq25x4mi4anmsz9p442zhqkba2f4hgml01njxpn8y9"; + type = "gem"; + }; + version = "3.4.2"; + }; + parallel = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hkfpm78c2vs1qblnva3k1grijvxh87iixcnyd83s3lxrxsjvag4"; + type = "gem"; + }; + version = "1.21.0"; + }; + paranoia = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02plzv9qygzxa3fryz6cgap64jqrzwprjsm7r467g15mhaa4fzxi"; + type = "gem"; + }; + version = "2.4.3"; + }; + parser = { + dependencies = ["ast"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06ma6w87ph8lnc9z4hi40ynmcdnjv0p8x53x0s3fjkz4q2p6sxh5"; + type = "gem"; + }; + version = "3.0.2.0"; + }; + paypal-sdk-core = { + dependencies = ["multi_json" "xml-simple"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0zjqykpxn6snv92wn8a179xyn1vbj327x91dh75lld3myfjz0b0l"; + type = "gem"; + }; + version = "0.3.4"; + }; + paypal-sdk-merchant = { + dependencies = ["paypal-sdk-core"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0v8gqhn7s53xdf5583hcf3ph22n81hniwli3s1jprak7nx5453f7"; + type = "gem"; + }; + version = "1.117.2"; + }; + pdf-reader = { + dependencies = ["Ascii85" "afm" "hashery" "ruby-rc4" "ttfunk"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "14cxj3ra9nnn334qpm2vsx9s0zk3095s8ih6cwcp47h3hv03c73y"; + type = "gem"; + }; + version = "2.5.0"; + }; + pg = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "13mfrysrdrh8cka1d96zm0lnfs59i5x2g6ps49r2kz5p3q81xrzj"; + type = "gem"; + }; + version = "1.2.3"; + }; + power_assert = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01z44m715rb6nzfrc90c5rkkdiy42dv3q94jw1q8baf9dg33nwi5"; + type = "gem"; + }; + version = "2.0.1"; + }; + pry = { + dependencies = ["coderay" "method_source"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0iyw4q4an2wmk8v5rn2ghfy2jaz9vmw2nk8415nnpx2s866934qk"; + type = "gem"; + }; + version = "0.13.1"; + }; + pry-byebug = { + dependencies = ["byebug" "pry"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "096y5vmzpyy4x9h4ky4cs4y7d19vdq9vbwwrqafbh5gagzwhifiv"; + type = "gem"; + }; + version = "3.9.0"; + }; + public_suffix = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xqcgkl7bwws1qrlnmxgh8g4g9m10vg60bhlw40fplninb3ng6d9"; + type = "gem"; + }; + version = "4.0.6"; + }; + puma = { + dependencies = ["nio4r"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ahk9a2a05985m0037gqlpha5vdkvmwhyk8v1shkbnwkkm30k0mq"; + type = "gem"; + }; + version = "5.5.0"; + }; + raabro = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10m8bln9d00dwzjil1k42i5r7l82x25ysbi45fwyv4932zsrzynl"; + type = "gem"; + }; + version = "1.4.0"; + }; + racc = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "178k7r0xn689spviqzhvazzvxfq6fyjldxb3ywjbgipbfi4s8j1g"; + type = "gem"; + }; + version = "1.5.2"; + }; + rack = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0i5vs0dph9i5jn8dfc6aqd6njcafmb20rwqngrf759c9cvmyff16"; + type = "gem"; + }; + version = "2.2.3"; + }; + rack-mini-profiler = { + dependencies = ["rack"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03hcvjw9nrv0w6yjy2zkv4ivin9xg2wr7xfcvx7rc2msv1gmjb6z"; + type = "gem"; + }; + version = "2.3.3"; + }; + rack-protection = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "159a4j4kragqh0z0z8vrpilpmaisnlz3n7kgiyf16bxkwlb3qlhz"; + type = "gem"; + }; + version = "2.1.0"; + }; + rack-proxy = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jdr2r5phr3q7d6k9cnxjwlkaps0my0n43wq9mzw3xdqhg9wa3d6"; + type = "gem"; + }; + version = "0.7.0"; + }; + rack-rewrite = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0milw71dv96wnc6i48vbzypws51dgf415kkp8c4air0mkdhpj838"; + type = "gem"; + }; + version = "1.5.1"; + }; + rack-ssl = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0c21xqkjyl10fngq6dy8082vmn2png8cwkiyzv83ymixq5cx7ygp"; + type = "gem"; + }; + version = "1.4.1"; + }; + rack-test = { + dependencies = ["rack"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0rh8h376mx71ci5yklnpqqn118z3bl67nnv5k801qaqn1zs62h8m"; + type = "gem"; + }; + version = "1.1.0"; + }; + rack-timeout = { + groups = ["production" "staging"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16ahj3qz3xhfrwvqb4nf6cfzvliigg0idfsp5jyr8qwk676d2f30"; + type = "gem"; + }; + version = "0.6.0"; + }; + rails = { + dependencies = ["actioncable" "actionmailbox" "actionmailer" "actionpack" "actiontext" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties" "sprockets-rails"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1y59m2x8rdc581bjgyyr9dabi3vk3frqhhpbb5ldpbj622kxfpbz"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + rails-controller-testing = { + dependencies = ["actionpack" "actionview" "activesupport"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "151f303jcvs8s149mhx2g5mn67487x0blrf9dzl76q1nb7dlh53l"; + type = "gem"; + }; + version = "1.0.5"; + }; + rails-dom-testing = { + dependencies = ["activesupport" "nokogiri"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lfq2a7kp2x64dzzi5p4cjcbiv62vxh9lyqk2f0rqq3fkzrw8h5i"; + type = "gem"; + }; + version = "2.0.3"; + }; + rails-html-sanitizer = { + dependencies = ["loofah"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09qrfi3pgllxb08r024lln9k0qzxs57v0slsj8616xf9c0cwnwbk"; + type = "gem"; + }; + version = "1.4.2"; + }; + rails-i18n = { + dependencies = ["i18n" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "05mcgv748vppnm3fnml37wjy3dw61wj8vfw14ldaj1yx1bmkhb07"; + type = "gem"; + }; + version = "6.0.0"; + }; + rails_safe_tasks = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06bl9cgj8jyc04qdm4jp02ph2vlarapy119lagk6cq1hadzdw7n2"; + type = "gem"; + }; + version = "1.0.0"; + }; + railties = { + dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1kwpm068cqys34p2g0j3l1g0cd5f3kxnsay5v7lmbd0sgarac0vy"; + type = "gem"; + }; + version = "6.1.4.1"; + }; + rainbow = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bb2fpjspydr6x0s8pn1pqkzmxszvkfapv0p4627mywl7ky4zkhk"; + type = "gem"; + }; + version = "3.0.0"; + }; + rake = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15whn7p9nrkxangbs9hh75q585yfn66lv0v2mhj6q6dl6x8bzr2w"; + type = "gem"; + }; + version = "13.0.6"; + }; + ransack = { + dependencies = ["activerecord" "activesupport" "i18n"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0z25sv93lfiyjjm9fgkmnjkc9kjdlpkd7wairk2vqj7dxklv7yvs"; + type = "gem"; + }; + version = "2.4.2"; + }; + rb-fsevent = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1qsx9c4jr11vr3a9s5j83avczx9qn9rjaf32gxpc2v451hvbc0is"; + type = "gem"; + }; + version = "0.11.0"; + }; + rb-inotify = { + dependencies = ["ffi"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1jm76h8f8hji38z3ggf4bzi8vps6p7sagxn3ab57qc0xyga64005"; + type = "gem"; + }; + version = "0.10.1"; + }; + redcarpet = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bvk8yyns5s1ls437z719y5sdv9fr8kfs8dmr6g8s761dv5n8zvi"; + type = "gem"; + }; + version = "3.5.1"; + }; + redis = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ig832dp0xmpp6a934nifzaj7wm9lzjxzasw911fagycs8p6m720"; + type = "gem"; + }; + version = "4.4.0"; + }; + regexp_parser = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0vg7imjnfcqjx7kw94ccj5r78j4g190cqzi1i59sh4a0l940b9cr"; + type = "gem"; + }; + version = "2.1.1"; + }; + request_store = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0cx74kispmnw3ljwb239j65a2j14n8jlsygy372hrsa8mxc71hxi"; + type = "gem"; + }; + version = "1.5.0"; + }; + responders = { + dependencies = ["actionpack" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "14kjykc6rpdh24sshg9savqdajya2dislc1jmbzg91w9967f4gv1"; + type = "gem"; + }; + version = "3.0.1"; + }; + rexml = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53"; + type = "gem"; + }; + version = "3.2.5"; + }; + roadie = { + dependencies = ["css_parser" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01kld3drqfiih5x8c13cvr6dpvdl7jml0v9bcw4fsy322lax3kn0"; + type = "gem"; + }; + version = "4.0.0"; + }; + roadie-rails = { + dependencies = ["railties" "roadie"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jjcqnp37z65dksykzwjiz149kx65nw70lyx8dkw1fm5x7yraqvh"; + type = "gem"; + }; + version = "2.2.0"; + }; + roo = { + dependencies = ["nokogiri" "rubyzip"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1z2nbf1w48ip2akf1ql86y6569aizi53d6ickjbplkga12n0isf8"; + type = "gem"; + }; + version = "2.8.3"; + }; + rspec = { + dependencies = ["rspec-core" "rspec-expectations" "rspec-mocks"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dwai7jnwmdmd7ajbi2q0k0lx1dh88knv5wl7c34wjmf94yv8w5q"; + type = "gem"; + }; + version = "3.10.0"; + }; + rspec-core = { + dependencies = ["rspec-support"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wwnfhxxvrlxlk1a3yxlb82k2f9lm0yn0598x7lk8fksaz4vv6mc"; + type = "gem"; + }; + version = "3.10.1"; + }; + rspec-expectations = { + dependencies = ["diff-lcs" "rspec-support"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1sz9bj4ri28adsklnh257pnbq4r5ayziw02qf67wry0kvzazbb17"; + type = "gem"; + }; + version = "3.10.1"; + }; + rspec-mocks = { + dependencies = ["diff-lcs" "rspec-support"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1d13g6kipqqc9lmwz5b244pdwc97z15vcbnbq6n9rlf32bipdz4k"; + type = "gem"; + }; + version = "3.10.2"; + }; + rspec-rails = { + dependencies = ["actionpack" "activesupport" "railties" "rspec-core" "rspec-expectations" "rspec-mocks" "rspec-support"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "152yz205p8zi5nxxhs8z581rjdvvqsfjndklkvn11f2vi50nv7n9"; + type = "gem"; + }; + version = "5.0.2"; + }; + rspec-retry = { + dependencies = ["rspec-core"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0n6qc0d16h6bgh1xarmc8vc58728mgjcsjj8wcd822c8lcivl0b1"; + type = "gem"; + }; + version = "0.6.2"; + }; + rspec-support = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15j52parvb8cgvl6s0pbxi2ywxrv6x0764g222kz5flz0s4mycbl"; + type = "gem"; + }; + version = "3.10.2"; + }; + rswag = { + dependencies = ["rswag-api" "rswag-specs" "rswag-ui"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1w7dc4ipxaf6dagj6zbn4j7r384gh4zhdb2i7dvpqahrszf6cc7r"; + type = "gem"; + }; + version = "2.4.0"; + }; + rswag-api = { + dependencies = ["railties"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1s8wc2m4xngbdm5ms2xskpykzbmr9cvapxpjv4k6yirv71lqdxqc"; + type = "gem"; + }; + version = "2.4.0"; + }; + rswag-specs = { + dependencies = ["activesupport" "json-schema" "railties"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dma3j5vfjhyclg8y0gsp44vs4wn9chf4jgfhc9r6ws018xrbxzd"; + type = "gem"; + }; + version = "2.4.0"; + }; + rswag-ui = { + dependencies = ["actionpack" "railties"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08f7g0cmz5gyzsszaqwmy4mrj2xh6krnd03jw9yi80gqayda4rkr"; + type = "gem"; + }; + version = "2.4.0"; + }; + rubocop = { + dependencies = ["parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19jg2mm4xj044j06asqv7v0bmq1axikl9pskf35riz54rskv8wci"; + type = "gem"; + }; + version = "1.22.1"; + }; + rubocop-ast = { + dependencies = ["parser"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0x0xfq2mpg194rcanbjrgvjbh94s9kq72jynxx61789s628kxy59"; + type = "gem"; + }; + version = "1.12.0"; + }; + rubocop-rails = { + dependencies = ["activesupport" "rack" "rubocop"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1mq3x7jpmp49wwa2r880dcmn27arqc9ln8v2y0dv3ha7s5g8mzrn"; + type = "gem"; + }; + version = "2.12.3"; + }; + ruby-progressbar = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02nmaw7yx9kl7rbaan5pl8x5nn0y4j5954mzrkzi9i3dhsrps4nc"; + type = "gem"; + }; + version = "1.11.0"; + }; + ruby-rc4 = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00vci475258mmbvsdqkmqadlwn6gj9m01sp7b5a3zd90knil1k00"; + type = "gem"; + }; + version = "0.1.5"; + }; + ruby2_keywords = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15wfcqxyfgka05v2a7kpg64x57gl1y4xzvnc9lh60bqx5sf1iqrs"; + type = "gem"; + }; + version = "0.0.4"; + }; + rubyzip = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0grps9197qyxakbpw02pda59v45lfgbgiyw48i0mq9f2bn9y6mrz"; + type = "gem"; + }; + version = "2.3.2"; + }; + rufus-scheduler = { + dependencies = ["fugit"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1x1cr9hd3phshgrrh796ql37339j5i6w7i7skxjkyygigdzl5kjy"; + type = "gem"; + }; + version = "3.7.0"; + }; + sass = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kfpcwh8dgw4lc81qglkvjl73689jy3g7196zkxm4fpskg1p5lkw"; + type = "gem"; + }; + version = "3.4.25"; + }; + sass-rails = { + dependencies = ["railties" "sass" "sprockets" "sprockets-rails" "tilt"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19bcs1ya3bkx36qaz21kgiz28s9h678m3rszcw7aany2lsis56y7"; + type = "gem"; + }; + version = "5.0.8"; + }; + sd_notify = { + groups = ["production" "staging"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0c9imnjbakx25r2n7widfp00s19ndzmmwax761mx5vbwm9nariyb"; + type = "gem"; + }; + version = "0.1.1"; + }; + select2-rails = { + dependencies = ["sass-rails" "thor"]; + groups = ["default"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "fc240e85fbdf1878ff3c39d972c0cd9a312f5ed4"; + sha256 = "0lflvygxgmm4yqhnx66h77g742g01x7jajjjn33a4hm0n7lgdq5y"; + type = "git"; + url = "https://github.com/openfoodfoundation/select2-rails.git"; + }; + version = "3.4.9"; + }; + selenium-webdriver = { + dependencies = ["childprocess" "rubyzip"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0adcvp86dinaqq3nhf8p3m0rl2g6q0a4h52k0i7kdnsg1qz9k86y"; + type = "gem"; + }; + version = "3.142.7"; + }; + semantic_range = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dlp97vg95plrsaaqj7x8l7z9vsjbhnqk4rw1l30gy26lmxpfrih"; + type = "gem"; + }; + version = "3.0.0"; + }; + shoulda-matchers = { + dependencies = ["activesupport"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0z6v2acldnvqrnvfk70f9xq39ppw5j03kbz2hpz7s17lgnn21vx8"; + type = "gem"; + }; + version = "5.0.0"; + }; + sidekiq = { + dependencies = ["connection_pool" "rack" "redis"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "104a97cl94aclg71ngrr097zjbdf6cibnz4q3rqjb88izmd7cfk6"; + type = "gem"; + }; + version = "6.2.2"; + }; + sidekiq-scheduler = { + dependencies = ["e2mmap" "redis" "rufus-scheduler" "sidekiq" "thwait" "tilt"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k686psrg8rd902yyqi38vys11zb07192skzx8zyyvyz2l9vrzds"; + type = "gem"; + }; + version = "3.1.0"; + }; + simplecov = { + dependencies = ["docile" "simplecov-html" "simplecov_json_formatter"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hrv046jll6ad1s964gsmcq4hvkr3zzr6jc7z1mns22mvfpbc3cr"; + type = "gem"; + }; + version = "0.21.2"; + }; + simplecov-html = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0yx01bxa8pbf9ip4hagqkp5m0mqfnwnw2xk8kjraiywz4lrss6jb"; + type = "gem"; + }; + version = "0.12.3"; + }; + simplecov_json_formatter = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19r15hyvh52jx7fmsrcflb58xh8l7l0zx4sxkh3hqzhq68y81pjl"; + type = "gem"; + }; + version = "0.1.3"; + }; + spring = { + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "12kyz3jdnaarhf2jbykmd9mqg085gxsx00c16la5q7czxvpb2x2r"; + type = "gem"; + }; + version = "3.0.0"; + }; + spring-commands-rspec = { + dependencies = ["spring"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0b0svpq3md1pjz5drpa5pxwg8nk48wrshq8lckim4x3nli7ya0k2"; + type = "gem"; + }; + version = "1.0.4"; + }; + sprockets = { + dependencies = ["concurrent-ruby" "rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "182jw5a0fbqah5w9jancvfmjbk88h8bxdbwnl4d3q809rpxdg8ay"; + type = "gem"; + }; + version = "3.7.2"; + }; + sprockets-rails = { + dependencies = ["actionpack" "activesupport" "sprockets"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0mwmz36265646xqfyczgr1mhkm1hfxgxxvgdgr4xfcbf2g72p1k2"; + type = "gem"; + }; + version = "3.2.2"; + }; + state_machines = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00mi16hg3rhkxz4y58s173cbnjlba41y9bfcim90p4ja6yfj9ri3"; + type = "gem"; + }; + version = "0.5.0"; + }; + state_machines-activemodel = { + dependencies = ["activemodel" "state_machines"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0b4dffzlj38adin6gm0ky72r5c507qdb1jprnm7h9gnlj2qxlcp9"; + type = "gem"; + }; + version = "0.8.0"; + }; + state_machines-activerecord = { + dependencies = ["activerecord" "state_machines-activemodel"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dmaf4f4cg3gamzgga3gamp0kv9lvianqzr9103dw0xbp00vfbq7"; + type = "gem"; + }; + version = "0.8.0"; + }; + stringex = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15ns7j5smw04w6w7bqd5mm2qcl7w9lhwykyb974i4isgg9yc23ys"; + type = "gem"; + }; + version = "2.8.5"; + }; + stripe = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0b2savy5h9shdzr6fkfqyrpmpx1a82gn4j47895zwc279dhwnlrh"; + type = "gem"; + }; + version = "5.38.0"; + }; + temple = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "060zzj7c2kicdfk6cpnn40n9yjnhfrr13d0rsbdhdij68chp2861"; + type = "gem"; + }; + version = "0.8.2"; + }; + test-prof = { + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1vg0zjfgibdcgkzb4c25v0f4v6v8mvpzvgcag194rwglmkkyrwkx"; + type = "gem"; + }; + version = "1.0.7"; + }; + test-unit = { + dependencies = ["power_assert"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03pn837vgza8v550ggzhcxbvb80d6qivqnhv3n39lrfnsc8xgi7m"; + type = "gem"; + }; + version = "3.4.7"; + }; + thor = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "18yhlvmfya23cs3pvhr1qy38y41b6mhr5q9vwv5lrgk16wmf3jna"; + type = "gem"; + }; + version = "1.1.0"; + }; + thread-local = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ryjgfwcsbkxph1l24x87p1yabnnbqy958s57w37iwhf3z9nid9g"; + type = "gem"; + }; + version = "1.1.0"; + }; + thwait = { + dependencies = ["e2mmap"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0q0fqlh0668j66z0g3s5yhqs39368az2ycxyphsx4c5nib5r4kak"; + type = "gem"; + }; + version = "0.2.0"; + }; + tilt = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0rn8z8hda4h41a64l0zhkiwz2vxw9b1nb70gl37h1dg2k874yrlv"; + type = "gem"; + }; + version = "2.0.10"; + }; + timecop = { + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fw3nzycvd15qa7sxy9dxb4hqyizy1s8f7q3d50smbzyyvr8fvia"; + type = "gem"; + }; + version = "0.9.4"; + }; + ttfunk = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15iaxz9iak5643bq2bc0jkbjv8w2zn649lxgvh5wg48q9d4blw13"; + type = "gem"; + }; + version = "1.7.0"; + }; + tzinfo = { + dependencies = ["concurrent-ruby"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10qp5x7f9hvlc0psv9gsfbxg4a7s0485wsbq1kljkxq94in91l4z"; + type = "gem"; + }; + version = "2.0.4"; + }; + uglifier = { + dependencies = ["execjs"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wgh7bzy68vhv9v68061519dd8samcy8sazzz0w3k8kqpy3g4s5f"; + type = "gem"; + }; + version = "4.2.0"; + }; + unicode-display_width = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0csjm9shhfik0ci9mgimb7hf3xgh7nx45rkd9rzgdz6vkwr8rzxn"; + type = "gem"; + }; + version = "2.1.0"; + }; + uniform_notifier = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1614dqnky0f9f1znj0lih8i184vfps86md93dw0kxrg3af9gnqb4"; + type = "gem"; + }; + version = "1.14.2"; + }; + valid_email2 = { + dependencies = ["activemodel" "mail"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0l4xkwvx7aj5z18h6vzp0wsfjbcrl76ixp0x95wwlrhn03qab6hs"; + type = "gem"; + }; + version = "4.0.0"; + }; + view_component = { + dependencies = ["activesupport" "method_source"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0qygf9dfn42q8y3i2g04zqqmw1bjklmsxgdcpfk07nbnpjh391i9"; + type = "gem"; + }; + version = "2.40.0"; + }; + view_component_storybook = { + dependencies = ["view_component"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0yslfpcw58mqqaig83b2h98mf04i19ck37m270d8naxr69iv9h0n"; + type = "gem"; + }; + version = "0.10.1"; + }; + warden = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1l7gl7vms023w4clg02pm4ky9j12la2vzsixi2xrv9imbn44ys26"; + type = "gem"; + }; + version = "1.2.9"; + }; + web = { + groups = ["default"]; + platforms = []; + source = { + path = engines/web; + type = "path"; + }; + version = "0.0.1"; + }; + web-console = { + dependencies = ["actionview" "activemodel" "bindex" "railties"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0d9hk929cmisix2l1w9kkh05b57ih9yvnh4wv52axxw41scnv2d9"; + type = "gem"; + }; + version = "4.1.0"; + }; + webdrivers = { + dependencies = ["nokogiri" "rubyzip" "selenium-webdriver"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1naymcfmm9pkf0f67xd99d9f6dpv477ggyvc1c04gxifirynfydp"; + type = "gem"; + }; + version = "4.6.1"; + }; + webmock = { + dependencies = ["addressable" "crack" "hashdiff"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1l8vh8p0g92cqcvv0ra3mblsa4nczh0rz8nbwbkc3g3yzbva85xk"; + type = "gem"; + }; + version = "3.14.0"; + }; + webpacker = { + dependencies = ["activesupport" "rack-proxy" "railties" "semantic_range"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cq6m5qwm3bmi7hkjfmbg2cs4qjq4wswlrwcfk8l1svfqbi135v3"; + type = "gem"; + }; + version = "5.4.3"; + }; + websocket-driver = { + dependencies = ["websocket-extensions"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0a3bwxd9v3ghrxzjc4vxmf4xa18c6m4xqy5wb0yk5c6b9psc7052"; + type = "gem"; + }; + version = "0.7.5"; + }; + websocket-extensions = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0hc2g9qps8lmhibl5baa91b4qx8wqw872rgwagml78ydj8qacsqw"; + type = "gem"; + }; + version = "0.1.5"; + }; + whenever = { + dependencies = ["chronic"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0im2x9rgr752hb9f1nnfj486k96bfiqj0xsv2bmzaq1rqhbi9dyr"; + type = "gem"; + }; + version = "1.0.0"; + }; + wicked_pdf = { + dependencies = ["activesupport"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0i7ifpb5ynvg7m6i1bivmvnaz29vjfwf6f4qj9gs7nq4yyxflqr6"; + type = "gem"; + }; + version = "2.1.0"; + }; + wkhtmltopdf-binary = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ksmryizimmw60k5siciv3xfxx9q797bh5a1rga7hqban98rv0c2"; + type = "gem"; + }; + version = "0.12.6.5"; + }; + xml-simple = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1flpmghcbil6qbl3f6w67kpjrnjbw86x7h6g5n4m5ff0cg4sylrv"; + type = "gem"; + }; + version = "1.1.8"; + }; + xpath = { + dependencies = ["nokogiri"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bh8lk9hvlpn7vmi6h4hkcwjzvs2y0cmkk3yjjdr8fxvj6fsgzbd"; + type = "gem"; + }; + version = "3.2.0"; + }; + zeitwerk = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1746czsjarixq0x05f7p3hpzi38ldg6wxnxxw74kbjzh1sdjgmpl"; + type = "gem"; + }; + version = "2.4.2"; + }; +} \ No newline at end of file diff --git a/flakes/paste/flake.nix b/flakes/paste/flake.nix index 08d0681..97e31c8 100644 --- a/flakes/paste/flake.nix +++ b/flakes/paste/flake.nix @@ -45,6 +45,8 @@ let cfg = config.services.paste; in { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); options = { services.paste = { enable = lib.mkOption { diff --git a/flakes/paste/paste/paste.py b/flakes/paste/paste/paste.py index 86666b8..3172de5 100644 --- a/flakes/paste/paste/paste.py +++ b/flakes/paste/paste/paste.py @@ -10,9 +10,32 @@ import mimetypes magic = magic.Magic(mime=True) +mit_license = """ +Copyright (c) 2022 Immae + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + config = { "directory": os.environ["PASTE_DIRECTORY"], "self_paste_id": "abcd123", + "license_paste_id": "license", "max_content_length": 16 * 1000 * 1000 } @@ -33,6 +56,8 @@ def read_paste(paste_id): if mime.startswith("text/x-script."): mime="text/plain" return (content, mime) + elif paste_id == config["license_paste_id"]: + return (mit_license, "text/plain") else: abort(404) @@ -69,9 +94,11 @@ $ curl -X POST --data-binary @{self} {host} -> GET {paste}/download force download of file -Get the source +Get the source
+Software licensed under the terms of the MIT license '''.format(host=url_for('post_paste', _external=True, _scheme="https"), paste=url_for('get_paste', _external=True, _scheme="https", paste_id=config["self_paste_id"]), + license=url_for('get_paste', _external=True, _scheme="https", paste_id=config["license_paste_id"]), self=os.path.basename(__file__) ), mimetype="text/html") diff --git a/flakes/peertube/flake.lock b/flakes/peertube/flake.lock index 6187115..eeb516a 100644 --- a/flakes/peertube/flake.lock +++ b/flakes/peertube/flake.lock @@ -17,19 +17,14 @@ }, "myuids": { "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" }, "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "path": "../myuids", + "type": "path" } }, "nixpkgs": { diff --git a/flakes/peertube/flake.nix b/flakes/peertube/flake.nix index 2f9c8c1..e8153eb 100644 --- a/flakes/peertube/flake.nix +++ b/flakes/peertube/flake.nix @@ -1,9 +1,7 @@ { description = "A free software to take back control of your videos"; inputs.myuids = { - url = "https://git.immae.eu/perso/Immae/Config/Nix.git"; - type = "git"; - dir = "flakes/myuids"; + url = "path:../myuids"; }; inputs.flake-utils.url = "github:numtide/flake-utils"; inputs.nixpkgs.url = "github:NixOS/nixpkgs"; @@ -166,10 +164,10 @@ nixosModule = { lib, pkgs, config, ... }: let name = "peertube"; - cfg = config.services.peertube; + cfg = config.immaeServices.peertube; in { - options.services.peertube = { + options.immaeServices.peertube = { enable = lib.mkEnableOption "Enable Peertube’s service"; user = lib.mkOption { type = lib.types.str; @@ -239,6 +237,8 @@ environment.NODE_CONFIG_DIR = "${cfg.dataDir}/config"; environment.NODE_ENV = "production"; + environment.NPM_CONFIG_LOGS_DIR = "${cfg.dataDir}/npm_logs"; + environment.NPM_CONFIG_CACHE = "${cfg.dataDir}/npm_cache"; environment.HOME = cfg.package; path = [ pkgs.nodejs pkgs.yarn pkgs.bashInteractive pkgs.ffmpeg pkgs.openssl ]; diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/bower.nix b/flakes/private/buildbot/buildslist/bower.nix similarity index 100% rename from pkgs/python-packages/buildbot/plugins/buildslist/bower.nix rename to flakes/private/buildbot/buildslist/bower.nix diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/default.nix b/flakes/private/buildbot/buildslist/default.nix similarity index 88% rename from pkgs/python-packages/buildbot/plugins/buildslist/default.nix rename to flakes/private/buildbot/buildslist/default.nix index 4ab4c54..7f72503 100644 --- a/pkgs/python-packages/buildbot/plugins/buildslist/default.nix +++ b/flakes/private/buildbot/buildslist/default.nix @@ -1,16 +1,15 @@ -{ stdenv, runCommand, writeScriptBin, buildBowerComponents, pythonPackages, libsass, python, fetchurl, jq, yarn, nodejs-10_x, yarn2nix-moretea, sources }: +{ stdenv, runCommand, writeScriptBin, buildBowerComponents, pythonPackages, fetchurl, jq, yarn, nodejs-10_x, yarn2nix-moretea, buildslist_src }: let yarn2nix-moretea' = yarn2nix-moretea.override({ yarn = yarn.override({ nodejs = nodejs-10_x; }); nodejs = nodejs-10_x; }); - buildslist_src = sources.buildbot-plugin-buildslist; packagejson = runCommand "package.json" { buildInputs = [ jq ]; } '' cat ${buildslist_src}/package.json | jq -r '.version = "${pythonPackages.buildbot-pkg.version}"|.license= "MIT"' > $out ''; nodeHeaders = fetchurl { url = "https://nodejs.org/download/release/v${nodejs-10_x.version}/node-v${nodejs-10_x.version}-headers.tar.gz"; - sha256 = "15hkcbs328d3rc1s14rmky8lh8d3rr86l8k0bia0ggxzwl23lj9c"; + sha256 = "sha256-LEk6BOW/vwdUXGAialDOoyFIkZ81k6ADy6MhMfRiE5Y="; }; buildslist_yarn = yarn2nix-moretea'.mkYarnModules rec { name = "buildslist-yarn-modules"; @@ -21,7 +20,7 @@ let yarnNix = ./yarn-packages.nix; pkgConfig = { node-sass = { - buildInputs = [ libsass python ]; + buildInputs = with yarn2nix-moretea'.pkgs; [ libsass python2 ]; postInstall = '' node scripts/build.js --tarball=${nodeHeaders} diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/yarn-packages.nix b/flakes/private/buildbot/buildslist/yarn-packages.nix similarity index 100% rename from pkgs/python-packages/buildbot/plugins/buildslist/yarn-packages.nix rename to flakes/private/buildbot/buildslist/yarn-packages.nix diff --git a/modules/private/buildbot/common/build_helpers.py b/flakes/private/buildbot/common/build_helpers.py similarity index 62% rename from modules/private/buildbot/common/build_helpers.py rename to flakes/private/buildbot/common/build_helpers.py index acea905..77e6c07 100644 --- a/modules/private/buildbot/common/build_helpers.py +++ b/flakes/private/buildbot/common/build_helpers.py @@ -3,9 +3,12 @@ from buildbot_buildslist import BuildsList from shutil import which __all__ = [ - "force_scheduler", "deploy_scheduler", "hook_scheduler", - "clean_branch", "package_and_upload", "SlackStatusPush", - "XMPPStatusPush", "NixShellCommand" + "force_scheduler", "deploy_scheduler", "git_hook_scheduler", + "clean_branch", "package_and_upload", "AppriseStatusPush", + "XMPPStatusPush", "NixShellCommand", + "all_builder_names", "compute_build_infos", "deploy_ssh_command", + "configure_apprise_push", + "configure_xmpp_push", "deploy_hook_scheduler", ] # Small helpers" @@ -19,22 +22,21 @@ def clean_branch(props): def package_and_upload(package, package_dest, package_url): return [ steps.ShellCommand(name="build package", - logEnviron=False, haltOnFailure=True, workdir="source", + logEnviron=False, haltOnFailure=True, command=["git", "archive", "HEAD", "-o", package]), steps.FileUpload(name="upload package", workersrc=package, - workdir="source", masterdest=package_dest, + masterdest=package_dest, url=package_url, mode=0o644), steps.ShellCommand(name="cleanup package", logEnviron=False, - haltOnFailure=True, workdir="source", alwaysRun=True, + haltOnFailure=True, alwaysRun=True, command=["rm", "-f", package]), ] # Steps class NixShellCommand(steps.ShellCommand): - def __init__(self, command=None, pure=True, nixfile=None, **kwargs): - assert(isinstance(command, str)) + def __init__(self, command=None, nixPackages=[], pure=True, nixFile=None, nixIncludes={}, nixArgs={}, **kwargs): oldpath = kwargs.get("env", {}).get("PATH", None) if which("nix-shell", path=oldpath) is None: kwargs["env"] = kwargs.get("env", {}) @@ -43,23 +45,37 @@ class NixShellCommand(steps.ShellCommand): elif isinstance(oldpath, list): kwargs["env"]["PATH"] = ["/run/current-system/sw/bin"] + oldpath nixcommand = ["nix-shell"] + for k, v in nixArgs.items(): + nixcommand.append("--arg") + nixcommand.append(k) + nixcommand.append(v) if pure: nixcommand.append("--pure") + for k, v in nixIncludes.items(): + nixcommand.append("-I") + nixcommand.append("{}={}".format(k, v)) nixcommand.append("--run") nixcommand.append(command) - if nixfile is not None: - nixcommand.append(nixfile) + if len(nixPackages) > 0: + nixcommand.append("-p") + nixcommand += nixPackages + elif nixFile is not None: + nixcommand.append(nixFile) super().__init__(command=nixcommand, **kwargs) # Schedulers -def force_scheduler(name, builders): +def force_scheduler(name, builders, nobranch=False): + if nobranch: + branch = util.FixedParameter(name="branch", default="") + else: + branch=util.StringParameter(name="branch", label="Git reference (tag, branch)", required=True) + return schedulers.ForceScheduler(name=name, label="Force build", buttonName="Force build", reason=util.StringParameter(name="reason", label="Reason", default="Force build"), codebases=[ util.CodebaseParameter("", - branch=util.StringParameter( - name="branch", label="Git reference (tag, branch)", required=True), + branch=branch, revision=util.FixedParameter(name="revision", default=""), repository=util.FixedParameter(name="repository", default=""), project=util.FixedParameter(name="project", default=""), @@ -88,50 +104,51 @@ def deploy_scheduler(name, builders): ] ) -def hook_scheduler(project, timer=10): +def git_hook_scheduler(project, builders=[], timer=1): + if len(builders) == 0: + builders = ["{}_build".format(project)] + return schedulers.AnyBranchScheduler( + change_filter=util.ChangeFilter(category="gitolite-hooks", project=project), + name="{}_git_hook".format(project), treeStableTimer=timer, builderNames=builders) + +def deploy_hook_scheduler(project, builders, timer=1): return schedulers.AnyBranchScheduler( - change_filter=util.ChangeFilter(category="hooks", project=project), - name=project, treeStableTimer=timer, builderNames=["{}_build".format(project)]) + change_filter=util.ChangeFilter(category="deploy_webhook", project=project), + name="{}_deploy".format(project), treeStableTimer=timer, builderNames=builders) -# Slack/XMPP status push +# Builders +def all_builder_names(c): + return [builder.name for builder in c['builders']] + +# Apprise/XMPP status push from buildbot.reporters.http import HttpStatusPushBase from twisted.internet import defer from twisted.python import log -from buildbot.util import httpclientservice from buildbot.reporters import utils from buildbot.process import results from twisted.words.protocols.jabber.jid import JID from wokkel import client, xmppim from functools import partial +import apprise -class SlackStatusPush(HttpStatusPushBase): - name = "SlackStatusPush" +class AppriseStatusPush(HttpStatusPushBase): + name = "AppriseStatusPush" @defer.inlineCallbacks - def reconfigService(self, serverUrl, **kwargs): + def reconfigService(self, appriseUrls, **kwargs): + self.appriseUrls = appriseUrls yield HttpStatusPushBase.reconfigService(self, **kwargs) - self._http = yield httpclientservice.HTTPClientService.getService( - self.master, serverUrl) @defer.inlineCallbacks def send(self, build): yield utils.getDetailsForBuild(self.master, build, wantProperties=True) - response = yield self._http.post("", json=self.format(build)) - if response.code != 200: - log.msg("%s: unable to upload status: %s" % - (response.code, response.content)) + appobject = apprise.Apprise() + message = self.format(build) + for url in self.appriseUrls: + appobject.add(url.format(**message)) + yield appobject.notify(title=message["title"], body=message["text"]) def format(self, build): - colors = [ - "#36A64F", # success - "#F1E903", # warnings - "#DA0505", # failure - "#FFFFFF", # skipped - "#000000", # exception - "#FFFFFF", # retry - "#D02CA9", # cancelled - ] - if "environment" in build["properties"]: msg = "{} environment".format(build["properties"]["environment"][0]) if "build" in build["properties"]: @@ -152,67 +169,31 @@ class SlackStatusPush(HttpStatusPushBase): else: duration = "{}s".format(seconds) - text = "Build <{}|{}> of {}'s {} was {} in {}.".format( - build["url"], build["buildid"], + text = "Build {} ({}) of {}'s {} was {} in {}.".format( + build["number"], build["url"], build["builder"]["name"], msg, results.Results[build["results"]], duration, ) - fields = [ - { - "title": "Build", - "value": "<{}|{}>".format(build["url"], build["buildid"]), - "short": True, - }, - { - "title": "Project", - "value": build["builder"]["name"], - "short": True, - }, - { - "title": "Build status", - "value": results.Results[build["results"]], - "short": True, - }, - { - "title": "Build duration", - "value": duration, - "short": True, - }, - ] - if "environment" in build["properties"]: - fields.append({ - "title": "Environment", - "value": build["properties"]["environment"][0], - "short": True, - }) - if "build" in build["properties"]: - fields.append({ - "title": "Archive", - "value": build["properties"]["build"][0], - "short": True, - }) - attachments = [{ - "fallback": "", - "color": colors[build["results"]], - "fields": fields - }] else: - text = "Build <{}|{}> of {}'s {} started.".format( - build["url"], build["buildid"], + text = "Build {} ({}) of {}'s {} started.".format( + build["number"], build["url"], build["builder"]["name"], msg, ) - attachments = [] - return { "username": "Buildbot", - "icon_url": "http://docs.buildbot.net/current/_static/icon.png", + "image_url": "http://docs.buildbot.net/current/_static/icon.png", "text": text, - "attachments": attachments, + "title": "", } +def configure_apprise_push(c, secrets_file, builders): + c['services'].append(AppriseStatusPush( + name="apprise_status", builders=builders, + appriseUrls=open(secrets_file + "/apprise_webhooks", "r").read().split("\n"))) + class XMPPStatusPush(HttpStatusPushBase): name = "XMPPStatusPush" @@ -261,7 +242,7 @@ class XMPPStatusPush(HttpStatusPushBase): duration = "{}s".format(seconds) text = "Build {} ( {} ) of {}'s {} was {} in {}.".format( - build["buildid"], build["url"], + build["number"], build["url"], build["builder"]["name"], msg, results.Results[build["results"]], @@ -269,9 +250,44 @@ class XMPPStatusPush(HttpStatusPushBase): ) else: text = "Build {} ( {} ) of {}'s {} started.".format( - build["buildid"], build["url"], + build["number"], build["url"], build["builder"]["name"], msg, ) return text + +def configure_xmpp_push(c, secrets_file, builders, recipients): + c['services'].append(XMPPStatusPush( + name="xmpp_status", builders=builders, recipients=recipients, + password=open(secrets_file + "/notify_xmpp_password", "r").read().rstrip())) + +# LDAP edit +from buildbot.process.buildstep import FAILURE +from buildbot.process.buildstep import SUCCESS +from buildbot.process.buildstep import BuildStep + +def compute_build_infos(prefix, release_path): + @util.renderer + def compute(props): + import re, hashlib + build_file = props.getProperty("build") + package_dest = "{}/{}".format(release_path, build_file) + version = re.match(r"{0}_(.*).tar.gz".format(prefix), build_file).group(1) + with open(package_dest, "rb") as f: + sha = hashlib.sha256(f.read()).hexdigest() + return { + "build_version": version, + "build_hash": sha, + } + return compute + +def deploy_ssh_command(ssh_key_path, deploy_hosts): + @util.renderer + def compute(props): + environment = props["environment"] if props.hasProperty("environment") else "integration" + ssh_command = [ + "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", + "-i", ssh_key_path ] + return ssh_command + deploy_hosts.get(environment, ["host.invalid"]) + return compute diff --git a/modules/private/buildbot/common/libvirt.py b/flakes/private/buildbot/common/libvirt.py similarity index 100% rename from modules/private/buildbot/common/libvirt.py rename to flakes/private/buildbot/common/libvirt.py diff --git a/modules/private/buildbot/common/master.cfg b/flakes/private/buildbot/common/master.cfg similarity index 67% rename from modules/private/buildbot/common/master.cfg rename to flakes/private/buildbot/common/master.cfg index abe08e0..0357f2a 100644 --- a/modules/private/buildbot/common/master.cfg +++ b/flakes/private/buildbot/common/master.cfg @@ -22,6 +22,27 @@ class CustomBase(webhooks.base): return ([args], None) +class GitoliteHook(webhooks.base): + def getChanges(self, request): + try: + branch = request.args[b"branch"][0].decode("utf-8") + project = request.args[b"project"][0].decode("utf-8") + repository = request.args[b"repository"][0].decode("utf-8") + author = request.args[b"author"][0].decode("utf-8") + except Exception as e: + raise ValueError("Error missing key in request: " + str(e)) + + args = { + "author": "gitolite for " + author, + "category": "gitolite-hooks", + "comments": "gitolite post-receive hook", + "branch": branch, + "project": project, + "repository": repository, + } + + return ([args], None) + userInfoProvider = util.LdapUserInfo( uri=E.LDAP_URL, bindUser=E.LDAP_ADMIN_USER, @@ -52,7 +73,10 @@ c = BuildmasterConfig = { secrets.SecretInAFile(E.SECRETS_FILE), ], "www": { - "change_hook_dialects": { "base": { "custom_class": CustomBase } }, + "change_hook_dialects": { + "base": { "custom_class": CustomBase }, + "gitolite": { "custom_class": GitoliteHook }, + }, "plugins": { "waterfall_view": {}, "console_view": {}, diff --git a/flakes/private/buildbot/flake.lock b/flakes/private/buildbot/flake.lock new file mode 100644 index 0000000..8952f75 --- /dev/null +++ b/flakes/private/buildbot/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "buildslist": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "buildslist": "buildslist", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/buildbot/flake.nix b/flakes/private/buildbot/flake.nix new file mode 100644 index 0000000..8b3c704 --- /dev/null +++ b/flakes/private/buildbot/flake.nix @@ -0,0 +1,74 @@ +{ + description = "The continuous integration framework"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.buildslist = { + url = "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"; + type = "git"; + flake = false; + }; + outputs = { self, nixpkgs, flake-utils, buildslist }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + python = pkgs.python38; + wokkel = python.pkgs.buildPythonPackage rec { + pname = "wokkel"; + version = "18.0.0"; + src = python.pkgs.fetchPypi { + inherit pname version; + sha256 = "1spq44gg8gsviqx1dvlmjpgfc0wk0jpyx4ap01y2pad1ai9cw016"; + }; + propagatedBuildInputs = with python.pkgs; [ twisted.extras.tls twisted incremental dateutil ]; + doCheck = false; + }; + buildbot_common = python.pkgs.buildPythonPackage { + name = "buildbot_common"; + src = ./common; + format = "other"; + installPhase = '' + mkdir -p $out/${python.sitePackages} + cp -a $src $out/${python.sitePackages}/buildbot_common + ''; + }; + buildbot-full = python.pkgs.buildbot-full.withPlugins [ buildslist-plugin ] // { + inherit buildbot_common; + buildbot_config = project: python.pkgs.buildPythonPackage (rec { + name = "buildbot_config-${project.name}"; + src = if project.name == "test" then ./test_project else project.src; + format = "other"; + installPhase = '' + mkdir -p $out/${python.sitePackages} + cp -a $src $out/${python.sitePackages}/buildbot_config + ''; + }); + common_packages = pkgs: [ + (pkgs.apprise.overridePythonAttrs(old: { propagatedBuildInputs = old.propagatedBuildInputs ++ [ pkgs.sleekxmpp ]; })) pkgs.libvirt pkgs.treq pkgs.ldap3 + buildbot-full pkgs.buildbot-worker pkgs.pip buildbot_common + wokkel + ]; + }; + buildslist-plugin = pkgs.callPackage ./buildslist { + pythonPackages = python.pkgs; + buildslist_src = buildslist; + }; + in rec { + packages = { + buildslist = buildslist-plugin; + buildbot-full = buildbot-full; + buildbot_common = buildbot_common; + }; + defaultPackage = packages.buildbot-full; + legacyPackages = packages; + checks = packages; + }) // rec { + overlays = { + immae-buildbot = final: prev: { + immae-buildbot = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.immae-buildbot; + }; +} diff --git a/flakes/private/buildbot/test_project/__init__.py b/flakes/private/buildbot/test_project/__init__.py new file mode 100644 index 0000000..d5893fd --- /dev/null +++ b/flakes/private/buildbot/test_project/__init__.py @@ -0,0 +1,121 @@ +from buildbot.plugins import * +from buildbot_common.build_helpers import * +import buildbot_common.libvirt as ilibvirt +import os +from buildbot.util import bytes2unicode +import json + +__all__ = [ "configure", "E" ] + +class E(): + PROJECT = "test" + BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT) + SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT) + PB_SOCKET = os.environ["BUILDBOT_WORKER_PORT"] + WORKER_HOST = "{}:{}".format(os.environ["BUILDBOT_HOST"], PB_SOCKET) + RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT) + RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT) + GIT_URL = "https://git.immae.eu/perso/Immae/TestProject.git" + SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key" + LIBVIRT_URL = os.environ["BUILDBOT_VIRT_URL"] + "?keyfile=" + SSH_KEY_PATH + XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ") + + # master.cfg + SECRETS_FILE = os.getcwd() + "/secrets" + LDAP_URL = "ldaps://ldap.immae.eu:636" + LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu" + LDAP_BASE = "dc=immae,dc=eu" + LDAP_PATTERN = "(uid=%(username)s)" + LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=test,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))" + TITLE_URL = "https://git.immae.eu/?p=perso/Immae/TestProject.git;a=summary" + TITLE = "Test project" + +class CustomBase(webhooks.base): + def getChanges(self, request): + try: + content = request.content.read() + args = json.loads(bytes2unicode(content)) + except Exception as e: + raise ValueError("Error loading JSON: " + str(e)) + + args.setdefault("comments", "") + args.setdefault("repository", "") + args.setdefault("author", args.get("who", "unknown")) + + if args["category"] == "deploy_webhook": + args = { + "category": "deploy_webhook", + "comments": "", + "repository": "", + "author": "unknown", + "project": "TestProject", + "properties": { + "environment": args.get("environment", "integration"), + "build": "test_{}.tar.gz".format(args.get("branch", "master")) + } + } + + return ([args], None) + +def configure(c): + c["buildbotURL"] = E.BUILDBOT_URL + c["www"]["port"] = E.SOCKET + + c["www"]["change_hook_dialects"]["base"] = { "custom_class": CustomBase } + + configure_build(c) + configure_deploy(c) + + configure_apprise_push(c, E.SECRETS_FILE, all_builder_names(c)) + configure_xmpp_push(c, E.SECRETS_FILE, all_builder_names(c), E.XMPP_RECIPIENTS) + +def configure_build(c): + builder_name = "TestProject_build" + worker_name = "test-build" + c['schedulers'].append(force_scheduler("force_test", [builder_name])) + c['schedulers'].append(git_hook_scheduler("TestProject", [builder_name])) + c['workers'].append(libvirt_worker(worker_name)) + c['builders'].append(util.BuilderConfig(name=builder_name, workernames=[worker_name], factory=build_factory())) + +def configure_deploy(c): + builder_name = "TestProject_deploy" + worker_name = "test-deploy" + c['workers'].append(libvirt_worker(worker_name)) + c['schedulers'].append(deploy_hook_scheduler("TestProject", [builder_name])) + c['schedulers'].append(deploy_scheduler("deploy_test", [builder_name])) + c['builders'].append(util.BuilderConfig(name=builder_name, workernames=[worker_name], factory=deploy_factory())) + +def libvirt_worker(name): + return ilibvirt.LibVirtWorker(name, + open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(), + ilibvirt.Connection(E.LIBVIRT_URL), + E.WORKER_HOST) + +def build_factory(): + package = util.Interpolate("test_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch) + package_dest = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_PATH), clean_branch=clean_branch) + package_url = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_URL), clean_branch=clean_branch) + + factory = util.BuildFactory() + factory.addStep(steps.Git(logEnviron=False, + repourl=E.GIT_URL, mode="full", method="fresh")) + factory.addStep(steps.ShellCommand(name="env", + logEnviron=False, command=["env"])) + factory.addStep(steps.ShellCommand(name="pwd", + logEnviron=False, command=["pwd"])) + factory.addStep(steps.ShellCommand(name="true", + logEnviron=False, command=["true"])) + factory.addStep(steps.ShellCommand(name="echo", + logEnviron=False, command=["echo", package])) + factory.addSteps(package_and_upload(package, package_dest, package_url)) + + return factory + +def deploy_factory(): + package_dest = util.Interpolate("{}/%(prop:build)s".format(E.RELEASE_PATH)) + + factory = util.BuildFactory() + factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest])) + factory.addStep(steps.SetProperties(properties=compute_build_infos("test", E.RELEASE_PATH))) + factory.addStep(steps.MasterShellCommand(command=deploy_ssh_command(E.SSH_KEY_PATH, {}))) + return factory diff --git a/flakes/private/chatons/flake.lock b/flakes/private/chatons/flake.lock new file mode 100644 index 0000000..39ed484 --- /dev/null +++ b/flakes/private/chatons/flake.lock @@ -0,0 +1,23 @@ +{ + "nodes": { + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "root": { + "inputs": { + "environment": "environment" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/chatons/flake.nix b/flakes/private/chatons/flake.nix new file mode 100644 index 0000000..70fb02d --- /dev/null +++ b/flakes/private/chatons/flake.nix @@ -0,0 +1,142 @@ +{ + inputs.environment.url = "path:../environment"; + outputs = { self, environment }: { + nixosModule = self.nixosModules.chatons; + nixosModules.chatons = { config, lib, pkgs, nodes, ... }: + let + concatValue = value: if lib.isList value then builtins.concatStringsSep "," value else builtins.toString value; + toProperties = properties: builtins.concatStringsSep "\n" ( + lib.collect + (p: !(lib.isAttrs p)) + (lib.mapAttrsRecursive + (path: value: builtins.concatStringsSep "." (builtins.filter (f: f != "") path) + " = " + (concatValue value)) + properties)); + before = name: { + "${name}" = { + status.level = "OK"; + status.description = "OK"; + install.type = "PACKAGE"; + registration.load = "OPEN"; + }; + host = { + name = "Hetzner"; + server.type = "PHYSICAL"; + provider.type = "HOSTEDSERVER"; + server.distribution = "NixOS"; + country.name = "Allemagne"; + country.code = "DE"; + }; + }; + after = name: { + file = { + class = name; + protocol = "ChatonsInfos-0.5"; + generator = "Nix derivation"; + }; + "${name}" = { + legal.url = "https://www.immae.eu/mentions.html"; + guide.technical = "https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/"; + contact.url = "https://www.immae.eu/contacts_fr.html"; + contact.email = config.myEnv.tools.contact; + startdate = "01/01/2019"; + }; + }; + organization = { + file = { + class = "organization"; + protocol = "ChatonsInfos-0.5"; + datetime = "2021-01-11T22:23:00"; + generator = "Nix derivation"; + }; + organization = { + country.name = "France"; + country.code = "FR"; + name = "ImmaeEu"; + description = "ImmaeEu est un CHATONS des Alpes-Maritimes"; + website = "https://www.immae.eu"; + logo = "https://assets.immae.eu/logo.jpg"; + socialnetworks = { + diaspora = "https://diaspora.immae.eu/people/1a185f29cc76cb35"; + facebook = "https://www.facebook.com/ismael.bouya"; + mastodon = "https://mastodon.immae.eu/@immae"; + peertube = "https://peertube.immae.eu/accounts/immae/"; + twitter = "https://twitter.com/_immae"; + }; + chatrooms = { + xmpp = "ismael@immae.fr"; + irc = "immae@freenode"; + matrix = "#support:immae.eu"; + }; + contact.url = "https://www.immae.eu/contacts_fr.html"; + contact.email = config.myEnv.tools.contact; + legal.url = "https://www.immae.eu/mentions.html"; + guide.technical = "https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/"; + guide.user = "https://www.immae.eu/docs"; + status.level = "ACTIVE"; + status.description = "En activité"; + startdate = "01/01/2019"; + type = "COMPANY"; + owner = { + logo = "https://assets.immae.eu/logo.jpg"; + name = "Ismaël Bouya"; + website = "https://www.immae.eu"; + }; + memberof.chatons = { + startdate = "01/07/2019"; + status.level = "ACTIVE"; + status.description = "Participe au collectif"; + }; + }; + }; + subname = v: if v.published or true then "subs" else "subs-hidden"; + toOrganizationProperties = name: pkgs.writeText name (toProperties organization + "\n" + ( + builtins.concatStringsSep "\n" (lib.mapAttrsToList + (n: v: "${subname v}.${n} = https://www.immae.eu/.well-known/chatonsinfos/service-${n}.properties") mergedServices + )) + "\n" + ( + builtins.concatStringsSep "\n" (lib.mapAttrsToList + (n: v: "subs.hosting-${n} = https://www.immae.eu/.well-known/chatonsinfos/hosting-${n}.properties") mergedHostings + ))); + toHostingProperties = name: content: pkgs.writeText name (toProperties (lib.recursiveUpdate (before "hosting") (lib.recursiveUpdate content (after "hosting")))); + toServiceProperties = name: content: pkgs.writeText name (toProperties (lib.recursiveUpdate (before "service") (lib.recursiveUpdate content (after "service")))); + + cfg = config.myServices.chatonsProperties; + mergedServices = lib.foldr (v: o: lib.recursiveUpdate o v) {} (lib.mapAttrsToList (k: v: if (v.config.myServices or {}) ? "chatonsProperties" then v.config.myServices.chatonsProperties.services else {}) nodes); + mergedHostings = lib.foldr (v: o: lib.recursiveUpdate o v) {} (lib.mapAttrsToList (k: v: if (v.config.myServices or {}) ? "chatonsProperties" then v.config.myServices.chatonsProperties.hostings else {}) nodes); + in { + imports = [ + environment.nixosModule + ]; + options.myServices.chatonsProperties.organization = lib.mkOption { + type = lib.types.attrsOf lib.types.unspecified; + default = {}; + description = '' + nested attrs of strings or arrays of strings + ''; + }; + options.myServices.chatonsProperties.services = lib.mkOption { + type = lib.types.attrsOf lib.types.unspecified; + default = {}; + description = '' + nested attrs of strings or arrays of strings + ''; + }; + options.myServices.chatonsProperties.hostings = lib.mkOption { + type = lib.types.attrsOf lib.types.unspecified; + default = {}; + description = '' + nested attrs of strings or arrays of strings + ''; + }; + options.myServices.chatonsProperties.propertiesPath = lib.mkOption { + type = lib.types.package; + readOnly = true; + default = pkgs.runCommand "chatons" {} '' + mkdir -p $out + cp ${toOrganizationProperties "immae-eu"} $out/immae-eu.properties + ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: c: "cp ${toHostingProperties n c} $out/hosting-${n}.properties") mergedHostings)} + ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: c: "cp ${toServiceProperties n c} $out/service-${n}.properties") mergedServices)} + ''; + }; + }; + }; +} diff --git a/flakes/private/environment-dummy/flake.nix b/flakes/private/environment-dummy/flake.nix new file mode 100644 index 0000000..5ebc27f --- /dev/null +++ b/flakes/private/environment-dummy/flake.nix @@ -0,0 +1,18 @@ +{ + description = '' + A dummy flake that contains a compatible structure to the one stored at + git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets + It is used as default value in "public" configurations + ''; + outputs = { self }: { + vars-file = ./vars.yml; + ldap-conf = ./ldap.conf; + environment-file = ./environment.nix; + nixosModule = self.nixosModules.my-environment; + nixosModules.my-environment = { ... }: { + config.myEnv = import self.environment-file; + }; + nixosModules.users-config-eldiron = { ... }: {}; + }; +} + diff --git a/flakes/private/environment-dummy/ldap.conf b/flakes/private/environment-dummy/ldap.conf new file mode 100644 index 0000000..064a4be --- /dev/null +++ b/flakes/private/environment-dummy/ldap.conf @@ -0,0 +1,13 @@ +# Indices to maintain +index objectClass eq +index uid pres,eq +index mail pres,sub,eq +index cn pres,sub,eq +index sn pres,sub,eq +index dc eq +index krbPrincipalName eq +index member eq +index memberOf eq + +access to * + by * none diff --git a/flakes/private/environment-dummy/vars.yml b/flakes/private/environment-dummy/vars.yml new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/flakes/private/environment-dummy/vars.yml @@ -0,0 +1 @@ +{} diff --git a/flakes/private/environment/flake.nix b/flakes/private/environment/flake.nix new file mode 100644 index 0000000..15c079a --- /dev/null +++ b/flakes/private/environment/flake.nix @@ -0,0 +1,1135 @@ +{ + outputs = { self }: { + nixosModule = self.nixosModules.environment; + nixosModules.environment = { config, lib, name, ... }: + with lib; + with types; + with lists; + let + ldapOptions = { + base = mkOption { description = "Base of the LDAP tree"; type = str; }; + host = mkOption { description = "Host to access LDAP"; type = str; }; + root_dn = mkOption { description = "DN of the root user"; type = str; }; + root_pw = mkOption { description = "Hashed password of the root user"; type = str; }; + replication_dn = mkOption { description = "DN of the user allowed to replicate the LDAP directory"; type = str; }; + replication_pw = mkOption { description = "Password of the user allowed to replicate the LDAP directory"; type = str; }; + }; + mkLdapOptions = name: more: mkOption { + description = "${name} LDAP configuration"; + type = submodule { + options = ldapOptions // { + dn = mkOption { description = "DN of the ${name} user"; type = str; }; + password = mkOption { description = "password of the ${name} user"; type = str; }; + filter = mkOption { description = "Filter for ${name} users"; type = str; default = ""; }; + } // more; + }; + }; + mysqlOptions = { + host = mkOption { description = "Host to access Mysql"; type = str; }; + remoteHost = mkOption { description = "Host to access Mysql from outside"; type = str; }; + port = mkOption { description = "Port to access Mysql"; type = int; }; + socket = mkOption { description = "Socket to access Mysql"; type = path; }; + systemUsers = mkOption { + description = "Attrs of user-passwords allowed to access mysql"; + type = attrsOf str; + }; + pam = mkOption { + description = "PAM configuration for mysql"; + type = submodule { + options = { + dn = mkOption { description = "DN to connect as to check users"; type = str; }; + password = mkOption { description = "DN password to connect as to check users"; type = str; }; + filter = mkOption { description = "filter to match users"; type = str; }; + }; + }; + }; + }; + mkMysqlOptions = name: more: mkOption { + description = "${name} mysql configuration"; + type = submodule { + options = mysqlOptions // { + database = mkOption { description = "${name} database"; type = str; }; + user = mkOption { description = "${name} user"; type = str; }; + password = mkOption { description = "mysql password of the ${name} user"; type = str; }; + } // more; + }; + }; + psqlOptions = { + host = mkOption { description = "Host to access Postgresql"; type = str; }; + port = mkOption { description = "Port to access Postgresql"; type = str; }; + socket = mkOption { description = "Socket to access Postgresql"; type = path; }; + pam = mkOption { + description = "PAM configuration for psql"; + type = submodule { + options = { + dn = mkOption { description = "DN to connect as to check users"; type = str; }; + password = mkOption { description = "DN password to connect as to check users"; type = str; }; + filter = mkOption { description = "filter to match users"; type = str; }; + }; + }; + }; + }; + mkPsqlOptions = name: mkOption { + description = "${name} psql configuration"; + type = submodule { + options = psqlOptions // { + database = mkOption { description = "${name} database"; type = str; }; + schema = mkOption { description = "${name} schema"; type = nullOr str; default = null; }; + user = mkOption { description = "${name} user"; type = str; }; + password = mkOption { description = "psql password of the ${name} user"; type = str; }; + }; + }; + }; + redisOptions = { + host = mkOption { description = "Host to access Redis"; type = str; }; + port = mkOption { description = "Port to access Redis"; type = str; }; + socket = mkOption { description = "Socket to access Redis"; type = path; }; + dbs = mkOption { + description = "Attrs of db number. Each number should be unique to avoid collision!"; + type = attrsOf str; + }; + spiped_key = mkOption { + type = str; + description = '' + Key to use with spiped to make a secure channel to replication + ''; + }; + predixy = mkOption { + description = "Predixy configuration. Unused yet"; + type = submodule { + options = { + read = mkOption { type = str; description = "Read password"; }; + }; + }; + }; + }; + mkRedisOptions = name: mkOption { + description = "${name} redis configuration"; + type = submodule { + options = redisOptions // { + db = mkOption { description = "${name} database"; type = str; }; + }; + }; + }; + smtpOptions = { + host = mkOption { description = "Host to access SMTP"; type = str; }; + port = mkOption { description = "Port to access SMTP"; type = str; }; + }; + mkSmtpOptions = name: mkOption { + description = "${name} smtp configuration"; + type = submodule { + options = smtpOptions // { + email = mkOption { description = "${name} email"; type = str; }; + password = mkOption { description = "SMTP password of the ${name} user"; type = str; }; + }; + }; + }; + hostEnv = submodule { + options = { + fqdn = mkOption { + description = "Host FQDN"; + type = str; + }; + hostKey = mkOption { + type = nullOr str; + default = null; + description = '' + ssh host key + ''; + }; + isVm = mkEnableOption "The host is a vm"; + users = mkOption { + type = unspecified; + default = pkgs: []; + description = '' + Sublist of users from realUsers. Function that takes pkgs as + argument and gives an array as a result + ''; + }; + emails = mkOption { + default = []; + description = "List of e-mails that the server can be a sender of"; + type = listOf str; + }; + ldap = mkOption { + description = '' + LDAP credentials for the host + ''; + type = submodule { + options = { + password = mkOption { type = str; description = "Password for the LDAP connection"; }; + dn = mkOption { type = str; description = "DN for the LDAP connection"; }; + }; + }; + }; + mx = mkOption { + description = "subdomain and priority for MX server"; + default = { enable = false; }; + type = submodule { + options = { + enable = mkEnableOption "Enable MX"; + subdomain = mkOption { type = nullOr str; description = "Subdomain name (mx-*)"; }; + priority = mkOption { type = nullOr int; description = "Priority"; }; + }; + }; + }; + ips = mkOption { + description = '' + attrs of ip4/ip6 grouped by section + ''; + type = attrsOf (submodule { + options = { + alias = mkOption { + type = nullOr str; + default = null; + description = '' + alias to use in DNS for that group + ''; + }; + ip4 = mkOption { + type = listOf str; + default = []; + description = '' + ip4 addresses of the host + ''; + }; + ip6 = mkOption { + type = listOf str; + default = []; + description = '' + ip6 addresses of the host + ''; + }; + }; + }); + }; + }; + }; + in + { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); + + options.myEnv = { + servers = mkOption { + description = '' + Attrs of servers information in the cluster (not necessarily handled by nixops) + ''; + default = {}; + type = attrsOf hostEnv; + }; + hetznerCloud = mkOption { + description = '' + Hetzner Cloud credential information + ''; + type = submodule { + options = { + authToken = mkOption { + type = str; + description = '' + The API auth token. + ''; + }; + }; + }; + }; + hetzner = mkOption { + description = '' + Hetzner credential information + ''; + type = submodule { + options = { + user = mkOption { type = str; description = "User"; }; + pass = mkOption { type = str; description = "Password"; }; + }; + }; + }; + sshd = mkOption { + description = '' + sshd service credential information + ''; + type = submodule { + options = { + rootKeys = mkOption { type = attrsOf str; description = "Keys of root users"; }; + ldap = mkOption { + description = '' + LDAP credentials for cn=ssh,ou=services,dc=immae,dc=eu dn + ''; + type = submodule { + options = { + password = mkOption { description = "Password"; type = str; }; + }; + }; + }; + psql = mkOption { + description = '' + PSQL credentials for immae_auth_read + ''; + type = submodule { + options = { + password = mkOption { description = "Password"; type = str; }; + }; + }; + }; + }; + }; + }; + ports = mkOption { + description = '' + non-standard reserved ports. Must be unique! + ''; + type = attrsOf port; + default = {}; + apply = let + noDupl = x: builtins.length (builtins.attrValues x) == builtins.length (unique (builtins.attrValues x)); + in + x: if isAttrs x && noDupl x then x else throw "Non unique values for ports"; + }; + httpd = mkOption { + description = '' + httpd service credential information + ''; + type = submodule { + options = { + ldap = mkOption { + description = '' + LDAP credentials for cn=httpd,ou=services,dc=immae,dc=eu dn + ''; + type = submodule { + options = { + password = mkOption { description = "Password"; type = str; }; + }; + }; + }; + }; + }; + }; + smtp = mkOption { + type = submodule { options = smtpOptions; }; + description = "SMTP configuration"; + }; + ldap = mkOption { + description = '' + LDAP server configuration + ''; + type = submodule { + options = ldapOptions; + }; + }; + databases = mkOption { + description = "Databases configuration"; + type = submodule { + options = { + mysql = mkOption { + type = submodule { options = mysqlOptions; }; + description = "Mysql configuration"; + }; + redis = mkOption { + type = submodule { options = redisOptions; }; + description = "Redis configuration"; + }; + postgresql = mkOption { + type = submodule { options = psqlOptions; }; + description = "Postgresql configuration"; + }; + }; + }; + }; + jabber = mkOption { + description = "Jabber configuration"; + type = submodule { + options = { + postfix_user_filter = mkOption { type = str; description = "Postfix filter to get xmpp users"; }; + ldap = mkLdapOptions "Jabber" {}; + postgresql = mkPsqlOptions "Jabber"; + }; + }; + }; + realUsers = mkOption { + description = '' + Attrset of function taking pkgs as argument. + Real users settings, should provide a subattr of users.users. + with at least: name, (hashed)Password, shell + ''; + type = attrsOf unspecified; + }; + users = mkOption { + description = "System and regular users uid/gid"; + type = attrsOf (submodule { + options = { + uid = mkOption { + description = "user uid"; + type = int; + }; + gid = mkOption { + description = "user gid"; + type = int; + }; + }; + }); + }; + dns = mkOption { + description = "DNS configuration"; + type = submodule { + options = { + ns = mkOption { + description = "Attrs of NS servers group"; + example = { + foo = { + "ns1.foo.com" = [ "198.51.100.10" "2001:db8:abcd::1" ]; + "ns2.foo.com" = [ "198.51.100.15" "2001:db8:1234::1" ]; + }; + }; + type = attrsOf (attrsOf (listOf str)); + }; + }; + }; + }; + backup = mkOption { + description = '' + Remote backup with duplicity + ''; + type = submodule { + options = { + password = mkOption { type = str; description = "Password for encrypting files"; }; + remotes = mkOption { + type = attrsOf (submodule { + options = { + remote = mkOption { + type = functionTo str; + example = literalExample '' + bucket: "s3://some_host/${bucket}"; + ''; + description = '' + Function. + Takes a bucket name as argument and returns a url + ''; + }; + accessKeyId = mkOption { type = str; description = "Remote access-key"; }; + secretAccessKey = mkOption { type = str; description = "Remote access secret"; }; + }; + }); + }; + }; + }; + }; + zrepl_backup = mkOption { + type = submodule { + options = { + ssh_key = mkOption { + description = "SSH key information"; + type = submodule { + options = { + public = mkOption { type = str; description = "Public part of the key"; }; + private = mkOption { type = lines; description = "Private part of the key"; }; + }; + }; + }; + mysql = mkMysqlOptions "Zrepl" {}; + certs = mkOption { + description = "Certificates"; + type = attrsOf (submodule { + options = { + key = mkOption { type = str; description = "Key"; }; + certificate = mkOption { type = str; description = "Certificate"; }; + }; + }); + }; + }; + }; + }; + rsync_backup = mkOption { + description ='' + Rsync backup configuration from controlled host + ''; + type = submodule { + options = { + ssh_key = mkOption { + description = "SSH key information"; + type = submodule { + options = { + public = mkOption { type = str; description = "Public part of the key"; }; + private = mkOption { type = lines; description = "Private part of the key"; }; + }; + }; + }; + profiles = mkOption { + description = "Attrs of profiles to backup"; + default = {}; + type = attrsOf (submodule { + options = { + keep = mkOption { type = int; description = "Number of backups to keep"; }; + check_command = mkOption { type = str; description = "command to check if backup needs to be done"; default = "backup"; }; + login = mkOption { type = str; description = "Login to connect to host"; }; + port = mkOption { type = str; default = "22"; description = "Port to connect to host"; }; + host = mkOption { type = str; description = "Host to connect to"; }; + host_key = mkOption { type = str; description = "Host key"; }; + host_key_type = mkOption { type = str; description = "Host key type"; }; + parts = mkOption { + description = "Parts to backup for this host"; + type = attrsOf (submodule { + options = { + remote_folder = mkOption { type = path; description = "Remote folder to backup";}; + exclude_from = mkOption { + type = listOf path; + default = []; + description = "List of folders/files to exclude from the backup"; + }; + files_from = mkOption { + type = listOf path; + default = []; + description = "List of folders/files to backup in the base folder"; + }; + args = mkOption { + type = nullOr str; + default = null; + description = "Extra arguments to pass to rsync"; + }; + }; + }); + }; + }; + }); + }; + }; + }; + }; + monitoring = mkOption { + description = "Monitoring configuration"; + type = submodule { + options = { + status_url = mkOption { type = str; description = "URL to push status to"; }; + status_token = mkOption { type = str; description = "Token for the status url"; }; + http_user_password = mkOption { type = str; description = "HTTP credentials to check services behind wall"; }; + email = mkOption { type = str; description = "Admin E-mail"; }; + ssh_public_key = mkOption { type = str; description = "SSH public key"; }; + ssh_secret_key = mkOption { type = str; description = "SSH secret key"; }; + imap_login = mkOption { type = str; description = "IMAP login"; }; + imap_password = mkOption { type = str; description = "IMAP password"; }; + eriomem_keys = mkOption { type = listOf (listOf str); description = "Eriomem keys"; default = []; }; + ovh_sms = mkOption { + description = "OVH credentials for sms script"; + type = submodule { + options = { + endpoint = mkOption { type = str; default = "ovh-eu"; description = "OVH endpoint"; }; + application_key = mkOption { type = str; description = "Application key"; }; + application_secret = mkOption { type = str; description = "Application secret"; }; + consumer_key = mkOption { type = str; description = "Consumer key"; }; + account = mkOption { type = str; description = "Account"; }; + }; + }; + }; + nrdp_tokens = mkOption { type = listOf str; description = "Tokens allowed to push status update"; }; + apprise_urls = mkOption { type = str; description = "Apprise space-separated urls to push status update"; }; + netdata_aggregator = mkOption { type = str; description = "Url where netdata information should be sent"; }; + netdata_keys = mkOption { type = attrsOf str; description = "netdata host keys"; }; + immae_contact = mkOption { type = str; description = "Immae Contact e-mail"; }; + email_check = mkOption { + description = "Emails services to check"; + type = attrsOf (submodule { + options = { + local = mkOption { type = bool; default = false; description = "Use local configuration"; }; + port = mkOption { type = nullOr str; default = null; description = "Port to connect to ssh"; }; + login = mkOption { type = nullOr str; default = null; description = "Login to connect to ssh"; }; + targets = mkOption { type = listOf str; description = "Hosts to send E-mails to"; }; + mail_address = mkOption { type = nullOr str; default = null; description = "E-mail recipient part to send e-mail to"; }; + mail_domain = mkOption { type = nullOr str; default = null; description = "E-mail domain part to send e-mail to"; }; + }; + }); + }; + }; + }; + }; + mpd = mkOption { + description = "MPD configuration"; + type = submodule { + options = { + folder = mkOption { type = str; description = "Folder to serve from the MPD instance"; }; + password = mkOption { type = str; description = "Password to connect to the MPD instance"; }; + host = mkOption { type = str; description = "Host to connect to the MPD instance"; }; + port = mkOption { type = str; description = "Port to connect to the MPD instance"; }; + }; + }; + }; + ftp = mkOption { + description = "FTP configuration"; + type = submodule { + options = { + ldap = mkLdapOptions "FTP" { + proftpd_filter = mkOption { type = str; description = "Filter for proftpd listing in LDAP"; }; + pure-ftpd_filter = mkOption { type = str; description = "Filter for pure-ftpd listing in LDAP"; }; + }; + }; + }; + }; + vpn = mkOption { + description = "VPN configuration"; + type = attrsOf (submodule { + options = { + prefix = mkOption { type = str; description = "ipv6 prefix for the vpn subnet"; }; + privateKey = mkOption { type = str; description = "Private key for the host"; }; + publicKey = mkOption { type = str; description = "Public key for the host"; }; + }; + }); + }; + mail = mkOption { + description = "Mail configuration"; + type = submodule { + options = { + dmarc = mkOption { + description = "DMARC configuration"; + type = submodule { + options = { + ignore_hosts = mkOption { + type = lines; + description = '' + Hosts to ignore when checking for dmarc + ''; + }; + }; + }; + }; + dkim = mkOption { + description = "DKIM configuration"; + type = attrsOf (submodule { + options = { + public = mkOption { + type = attrsOf str; + example = literalExample '' + { + v = "DKIM1"; + k = "rsa"; + p = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3w1a2aMxWw9+hdcmbqX4UevcVqr204y0K73Wdc7MPZiOOlUJQYsMNSYR1Y/SC7jmPKeitpcJCpQgn/cveJZbuikjjPLsDReHyFEYmC278ZLRTELHx6f1IXM8WE08JIRT69CfZiMi1rVcOh9qRT4F93PyjCauU8Y5hJjtg9ThsWwIDAQAB"; + } + ''; + description = "Public entry to put in DNS TXT field"; + }; + private = mkOption { type = nullOr str; default = null; description = "Private key"; }; + }; + }); + }; + postfix = mkOption { + description = "Postfix configuration"; + type = submodule { + options = { + mysql = mkMysqlOptions "Postfix" { + password_encrypt = mkOption { type = str; description = "Key to encrypt relay password in database"; }; + }; + admins = mkOption { + description = '' + List of admins meant to receive common aliases + ''; + type = listOf str; + }; + common_aliases = mkOption { + description = '' + List of aliases common to all hosts, to forward to admins + ''; + type = listOf str; + }; + other_aliases = mkOption { + description = '' + Other list of aliases, to forward to admins + ''; + type = listOf str; + }; + }; + }; + }; + dovecot = mkOption { + description = "Dovecot configuration"; + type = submodule { + options = { + ldap = mkLdapOptions "Dovecot" { + pass_attrs = mkOption { type = str; description = "Password attribute in LDAP"; }; + user_attrs = mkOption { type = str; description = "User attribute mapping in LDAP"; }; + iterate_attrs = mkOption { type = str; description = "User attribute mapping for listing in LDAP"; }; + iterate_filter = mkOption { type = str; description = "User attribute filter for listing in LDAP"; }; + postfix_mailbox_filter = mkOption { type = str; description = "Postfix filter to get mailboxes"; }; + }; + }; + }; + }; + rspamd = mkOption { + description = "rspamd configuration"; + type = submodule { + options = { + redis = mkRedisOptions "Redis"; + read_password_hashed = mkOption { type = str; description = "Hashed read password for rspamd"; }; + write_password_hashed = mkOption { type = str; description = "Hashed write password for rspamd"; }; + read_password = mkOption { + type = str; + description = "Read password for rspamd. Unused"; + apply = x: ""; + }; + write_password = mkOption { + type = str; + description = "Write password for rspamd. Unused"; + apply = x: ""; + }; + }; + }; + }; + sympa = mkOption { + description = "Sympa configuration"; + type = submodule { + options = { + listmasters = mkOption { + type = listOf str; + description = "Listmasters"; + }; + postgresql = mkPsqlOptions "Sympa"; + data_sources = mkOption { + type = attrsOf str; + default = {}; + description = "Data sources to make available to sympa"; + }; + scenari = mkOption { + type = attrsOf str; + default = {}; + description = "Scenari to make available to sympa"; + }; + }; + }; + }; + }; + }; + }; + coturn = mkOption { + description = "Coturn configuration"; + type = submodule { + options = { + auth_access_key = mkOption { type = str; description = "key to access coturn"; }; + }; + }; + }; + buildbot = mkOption { + description = "Buildbot configuration"; + type = submodule { + options = { + ssh_key = mkOption { + description = "SSH key information"; + type = submodule { + options = { + public = mkOption { type = str; description = "Public part of the key"; }; + private = mkOption { type = lines; description = "Private part of the key"; }; + }; + }; + }; + workerPassword = mkOption { description = "Buildbot worker password"; type = str; }; + user = mkOption { + description = "Buildbot user"; + type = submodule { + options = { + uid = mkOption { + description = "user uid"; + type = int; + }; + gid = mkOption { + description = "user gid"; + type = int; + }; + }; + }; + }; + ldap = mkOption { + description = "Ldap configuration for buildbot"; + type = submodule { + options = { + password = mkOption { type = str; description = "Buildbot password"; }; + }; + }; + }; + projects = mkOption { + description = "Projects to make a buildbot for"; + type = attrsOf (submodule { + options = { + name = mkOption { type = str; description = "Project name"; }; + src = mkOption { type = path; description = "source of the project configuration"; }; + packages = mkOption { + type = listOf package; + example = literalExample '' + [ pkgs.bash pkgs.git pkgs.gzip pkgs.openssh ]; + ''; + description = '' + Builds packages list to make available to buildbot project. + ''; + }; + pythonPathHome = mkOption { type = bool; description = "Whether to add project’s python home to python path"; }; + workerPort = mkOption { type = port; description = "Port for the worker"; }; + secrets = mkOption { + type = attrsOf lines; + description = "Secrets for the project to dump as files"; + }; + secretsDeps = mkOption { + type = listOf package; + default = []; + description = "Dependencies of file that will land in secrets"; + }; + environment = mkOption { + type = attrsOf str; + description = '' + Environment variables for the project. + BUILDBOT_ is prefixed to the variable names + ''; + }; + activationScript = mkOption { + type = lines; + description = '' + Activation script to run during deployment + ''; + }; + webhookTokens = mkOption { + type = nullOr (listOf str); + default = null; + description = '' + List of tokens allowed to push to project’s change_hook/base endpoint + ''; + }; + }; + }); + }; + }; + }; + }; + tools = mkOption { + description = "Tools configurations"; + type = submodule { + options = { + contact = mkOption { type = str; description = "Contact e-mail address"; }; + assets = mkOption { + default = {}; + type = attrsOf (submodule { + options = { + assetType = mkOption { type = enum ["tgz" "url" "googleFont"]; default = "url"; description = "Type of asset"; }; + tgzRemoveComponents = mkOption { type = int; default = 0; description = "Remove components when extracting"; }; + url = mkOption { type = str; description = "URL to fetch"; }; + sha256 = mkOption { type = str; description = "Hash of the url"; }; + }; + }); + description = "Assets to provide on assets.immae.eu"; + }; + davical = mkOption { + description = "Davical configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Davical"; + ldap = mkLdapOptions "Davical" {}; + }; + }; + }; + diaspora = mkOption { + description = "Diaspora configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Diaspora"; + redis = mkRedisOptions "Diaspora"; + ldap = mkLdapOptions "Diaspora" {}; + secret_token = mkOption { type = str; description = "Secret token"; }; + }; + }; + }; + dmarc_reports = mkOption { + description = "DMARC reports configuration"; + type = submodule { + options = { + mysql = mkMysqlOptions "DMARC" {}; + anonymous_key = mkOption { type = str; description = "Anonymous hashing key"; }; + }; + }; + }; + etherpad-lite = mkOption { + description = "Etherpad configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Etherpad"; + ldap = mkLdapOptions "Etherpad" { + group_filter = mkOption { type = str; description = "Filter for groups"; }; + }; + adminPassword = mkOption { type = str; description = "Admin password for mypads / admin"; }; + session_key = mkOption { type = str; description = "Session key"; }; + api_key = mkOption { type = str; description = "API key"; }; + }; + }; + }; + gitolite = mkOption { + description = "Gitolite configuration"; + type = submodule { + options = { + ldap = mkLdapOptions "Gitolite" {}; + ssh_key = mkOption { + description = "SSH key information"; + type = submodule { + options = { + public = mkOption { type = str; description = "Public part of the key"; }; + private = mkOption { type = lines; description = "Private part of the key"; }; + }; + }; + }; + }; + }; + }; + landing = mkOption { + description = "Landing configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Landing"; + }; + }; + }; + kanboard = mkOption { + description = "Kanboard configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Kanboard"; + ldap = mkLdapOptions "Kanboard" { + admin_dn = mkOption { type = str; description = "Admin DN"; }; + }; + }; + }; + }; + mantisbt = mkOption { + description = "Mantisbt configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Mantisbt"; + ldap = mkLdapOptions "Mantisbt" {}; + master_salt = mkOption { type = str; description = "Master salt for password hash"; }; + }; + }; + }; + mastodon = mkOption { + description = "Mastodon configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Mastodon"; + redis = mkRedisOptions "Mastodon"; + ldap = mkLdapOptions "Mastodon" {}; + paperclip_secret = mkOption { type = str; description = "Paperclip secret"; }; + otp_secret = mkOption { type = str; description = "OTP secret"; }; + secret_key_base = mkOption { type = str; description = "Secret key base"; }; + vapid = mkOption { + description = "vapid key"; + type = submodule { + options = { + private = mkOption { type = str; description = "Private key"; }; + public = mkOption { type = str; description = "Public key"; }; + }; + }; + }; + }; + }; + }; + mediagoblin = mkOption { + description = "Mediagoblin configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Mediagoblin"; + redis = mkRedisOptions "Mediagoblin"; + ldap = mkLdapOptions "Mediagoblin" {}; + }; + }; + }; + nextcloud = mkOption { + description = "Nextcloud configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Nextcloud"; + redis = mkRedisOptions "Nextcloud"; + password_salt = mkOption { type = str; description = "Password salt"; }; + instance_id = mkOption { type = str; description = "Instance ID"; }; + secret = mkOption { type = str; description = "App secret"; }; + }; + }; + }; + peertube = mkOption { + description = "Peertube configuration"; + type = submodule { + options = { + listenPort = mkOption { type = port; description = "Port to listen to"; }; + postgresql = mkPsqlOptions "Peertube"; + redis = mkRedisOptions "Peertube"; + ldap = mkLdapOptions "Peertube" {}; + }; + }; + }; + phpldapadmin = mkOption { + description = "phpLdapAdmin configuration"; + type = submodule { + options = { + ldap = mkLdapOptions "phpldapadmin" {}; + }; + }; + }; + rompr = mkOption { + description = "Rompr configuration"; + type = submodule { + options = { + mpd = mkOption { + description = "MPD configuration"; + type = submodule { + options = { + host = mkOption { type = str; description = "Host for MPD"; }; + port = mkOption { type = port; description = "Port to access MPD host"; }; + }; + }; + }; + }; + }; + }; + roundcubemail = mkOption { + description = "Roundcubemail configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "TT-RSS"; + secret = mkOption { type = str; description = "Secret"; }; + }; + }; + }; + shaarli = mkOption { + description = "Shaarli configuration"; + type = submodule { + options = { + ldap = mkLdapOptions "Shaarli" {}; + }; + }; + }; + status_engine = mkOption { + description = "Status Engine configuration"; + type = submodule { + options = { + mysql = mkMysqlOptions "StatusEngine" {}; + ldap = mkLdapOptions "StatusEngine" {}; + }; + }; + }; + task = mkOption { + description = "Taskwarrior configuration"; + type = submodule { + options = { + ldap = mkLdapOptions "Taskwarrior" {}; + taskwarrior-web = mkOption { + description = "taskwarrior-web profiles"; + default = {}; + type = attrsOf (submodule { + options = { + uid = mkOption { + type = listOf str; + description = "List of ldap uids having access to this profile"; + }; + org = mkOption { type = str; description = "Taskd organisation"; }; + key = mkOption { type = str; description = "Taskd key"; }; + date = mkOption { type = str; description = "Preferred date format"; }; + }; + }); + }; + }; + }; + }; + ttrss = mkOption { + description = "TT-RSS configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "TT-RSS"; + ldap = mkLdapOptions "TT-RSS" {}; + }; + }; + }; + wallabag = mkOption { + description = "Wallabag configuration"; + type = submodule { + options = { + postgresql = mkPsqlOptions "Wallabag"; + ldap = mkLdapOptions "Wallabag" { + admin_filter = mkOption { type = str; description = "Admin users filter"; }; + }; + redis = mkRedisOptions "Wallabag"; + secret = mkOption { type = str; description = "App secret"; }; + }; + }; + }; + webhooks = mkOption { + type = attrsOf str; + description = "Mapping 'name'.php => script for webhooks"; + }; + csp_reports = mkOption { + description = "CSP report configuration"; + type = submodule { + options = { + report_uri = mkOption { type = str; description = "URI to report CSP violations to"; }; + policies = mkOption { type = attrsOf str; description = "CSP policies to apply"; }; + }; + }; + }; + commento = mkOption { + description = "Commento configuration"; + type = submodule { + options = { + listenPort = mkOption { type = port; description = "Port to listen to"; }; + postgresql = mkPsqlOptions "Commento"; + smtp = mkSmtpOptions "Commento"; + }; + }; + }; + cryptpad = mkOption { + description = "Cryptpad configuration"; + type = submodule { + options = { + email = mkOption { type = str; description = "Admin e-mail"; }; + admins = mkOption { type = listOf str; description = "Instance admin public keys"; }; + port = mkOption { type = port; description = "Port to listen to"; }; + }; + }; + }; + ympd = mkOption { + description = "Ympd configuration"; + type = submodule { + options = { + listenPort = mkOption { type = port; description = "Port to listen to"; }; + mpd = mkOption { + description = "MPD configuration"; + type = submodule { + options = { + password = mkOption { type = str; description = "Password to access MPD host"; }; + host = mkOption { type = str; description = "Host for MPD"; }; + port = mkOption { type = port; description = "Port to access MPD host"; }; + }; + }; + }; + }; + }; + }; + umami = mkOption { + description = "Umami configuration"; + type = submodule { + options = { + listenPort = mkOption { type = port; description = "Port to listen to"; }; + postgresql = mkPsqlOptions "Umami"; + hashSalt = mkOption { type = str; description = "Hash salt"; }; + }; + }; + }; + yourls = mkOption { + description = "Yourls configuration"; + type = submodule { + options = { + mysql = mkMysqlOptions "Yourls" {}; + ldap = mkLdapOptions "Yourls" {}; + cookieKey = mkOption { type = str; description = "Cookie key"; }; + }; + }; + }; + }; + }; + }; + serverSpecific = mkOption { type = attrsOf unspecified; description = "Server specific configuration"; }; + }; + options.hostEnv = mkOption { + readOnly = true; + type = hostEnv; + default = config.myEnv.servers."${name}"; + description = "Host environment"; + }; + }; + }; +} diff --git a/modules/private/mail/filter-rewrite-from.py b/flakes/private/mail-relay/filter-rewrite-from.py similarity index 100% rename from modules/private/mail/filter-rewrite-from.py rename to flakes/private/mail-relay/filter-rewrite-from.py diff --git a/flakes/private/mail-relay/flake.lock b/flakes/private/mail-relay/flake.lock new file mode 100644 index 0000000..bbb2011 --- /dev/null +++ b/flakes/private/mail-relay/flake.lock @@ -0,0 +1,36 @@ +{ + "nodes": { + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "root": { + "inputs": { + "environment": "environment", + "secrets": "secrets" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/mail-relay/flake.nix b/flakes/private/mail-relay/flake.nix new file mode 100644 index 0000000..639bd06 --- /dev/null +++ b/flakes/private/mail-relay/flake.nix @@ -0,0 +1,58 @@ +{ + inputs.environment.url = "path:../environment"; + inputs.secrets.url = "path:../../secrets"; + + outputs = { self, environment, secrets }: { + nixosModule = self.nixosModules.mail-relay; + nixosModules.mail-relay = { lib, pkgs, config, name, ... }: + { + imports = [ + environment.nixosModule + secrets.nixosModule + ]; + options.myServices.mailRelay.enable = lib.mkEnableOption "enable Mail relay services"; + config = lib.mkIf config.myServices.mailRelay.enable { + secrets.keys."opensmtpd/creds" = { + user = "smtpd"; + group = "smtpd"; + permissions = "0400"; + text = '' + eldiron ${name}:${config.hostEnv.ldap.password} + ''; + }; + users.users.smtpd.extraGroups = [ "keys" ]; + services.opensmtpd = { + enable = true; + serverConfiguration = let + filter-rewrite-from = pkgs.runCommand "filter-rewrite-from.py" { + buildInputs = [ pkgs.python38 ]; + } '' + cp ${./filter-rewrite-from.py} $out + patchShebangs $out + ''; + in '' + table creds \ + "${config.secrets.fullPaths."opensmtpd/creds"}" + # FIXME: filtering requires 6.6, uncomment following lines when + # upgrading + # filter "fixfrom" \ + # proc-exec "${filter-rewrite-from} ${name}@immae.eu" + # listen on socket filter "fixfrom" + action "relay-rewrite-from" relay \ + helo ${config.hostEnv.fqdn} \ + host smtp+tls://eldiron@eldiron.immae.eu:587 \ + auth \ + mail-from ${name}@immae.eu + action "relay" relay \ + helo ${config.hostEnv.fqdn} \ + host smtp+tls://eldiron@eldiron.immae.eu:587 \ + auth + match for any !mail-from "@immae.eu" action "relay-rewrite-from" + match for any mail-from "@immae.eu" action "relay" + ''; + }; + environment.systemPackages = [ config.services.opensmtpd.package ]; + }; + }; + }; +} diff --git a/flakes/private/milters/flake.lock b/flakes/private/milters/flake.lock new file mode 100644 index 0000000..1a0c138 --- /dev/null +++ b/flakes/private/milters/flake.lock @@ -0,0 +1,186 @@ +{ + "nodes": { + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "openarc": { + "inputs": { + "flake-utils": "flake-utils", + "myuids": "myuids", + "nixpkgs": "nixpkgs", + "openarc": "openarc_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_2": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "opendmarc": { + "inputs": { + "flake-utils": "flake-utils_2", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "root": { + "inputs": { + "environment": "environment", + "files-watcher": "files-watcher", + "openarc": "openarc", + "opendmarc": "opendmarc", + "secrets": "secrets" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/milters/flake.nix b/flakes/private/milters/flake.nix new file mode 100644 index 0000000..c4de5b6 --- /dev/null +++ b/flakes/private/milters/flake.nix @@ -0,0 +1,106 @@ +{ + inputs.secrets.url = "path:../../secrets"; + inputs.environment.url = "path:../environment"; + inputs.files-watcher.url = "path:../../files-watcher"; + inputs.opendmarc.url = "path:../../opendmarc"; + inputs.openarc.url = "path:../../openarc"; + outputs = { self, secrets, environment, opendmarc, openarc, files-watcher }: { + nixosModule = self.nixosModules.milters; + nixosModules.milters = { lib, pkgs, config, nodes, ... }: + { + imports = [ + secrets.nixosModule + environment.nixosModule + files-watcher.nixosModule + opendmarc.nixosModule + openarc.nixosModule + ]; + options.myServices.mail.milters.enable = lib.mkEnableOption "enable Mail milters"; + options.myServices.mail.milters.sockets = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + opendkim = "/run/opendkim/opendkim.sock"; + opendmarc = config.services.opendmarc.socket; + openarc = config.services.openarc.socket; + }; + readOnly = true; + description = '' + milters sockets + ''; + }; + config = lib.mkIf config.myServices.mail.milters.enable { + secrets.keys = { + "opendkim" = { + isDir = true; + user = config.services.opendkim.user; + group = config.services.opendkim.group; + permissions = "0550"; + }; + "opendkim/eldiron.private" = { + user = config.services.opendkim.user; + group = config.services.opendkim.group; + permissions = "0400"; + text = config.myEnv.mail.dkim.eldiron.private; + }; + }; + users.users."${config.services.opendkim.user}".extraGroups = [ "keys" ]; + services.opendkim = { + enable = true; + socket = "local:${config.myServices.mail.milters.sockets.opendkim}"; + domains = + let + getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) p.emailPolicies; + bydomain = builtins.mapAttrs (n: getDomains) nodes.eldiron.config.myServices.dns.zones; + domains' = lib.flatten (builtins.attrValues bydomain); + in + builtins.concatStringsSep "," domains'; + keyPath = config.secrets.fullPaths."opendkim"; + selector = "eldiron"; + configFile = pkgs.writeText "opendkim.conf" '' + SubDomains yes + UMask 002 + AlwaysAddARHeader yes + ''; + group = config.services.postfix.group; + }; + systemd.services.opendkim.serviceConfig.Slice = "mail.slice"; + systemd.services.opendkim.preStart = lib.mkBefore '' + # Skip the prestart script as keys are handled in secrets + exit 0 + ''; + services.filesWatcher.opendkim = { + restart = true; + paths = [ + config.secrets.fullPaths."opendkim/eldiron.private" + ]; + }; + + systemd.services.milter_verify_from = { + description = "Verify from milter"; + after = [ "network.target" ]; + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + Slice = "mail.slice"; + User = "postfix"; + Group = "postfix"; + ExecStart = let + pymilter = with pkgs.python38Packages; buildPythonPackage rec { + pname = "pymilter"; + version = "1.0.4"; + src = fetchPypi { + inherit pname version; + sha256 = "1bpcvq7d72q0zi7c8h5knhasywwz9gxc23n9fxmw874n5k8hsn7k"; + }; + doCheck = false; + buildInputs = [ pkgs.libmilter ]; + }; + python = pkgs.python38.withPackages (p: [ pymilter ]); + in "${python}/bin/python ${./verify_from.py} -s /run/milter_verify_from/verify_from.sock"; + RuntimeDirectory = "milter_verify_from"; + }; + }; + }; + }; + }; +} diff --git a/modules/private/mail/verify_from.py b/flakes/private/milters/verify_from.py similarity index 100% rename from modules/private/mail/verify_from.py rename to flakes/private/milters/verify_from.py diff --git a/flakes/private/monitoring/flake.lock b/flakes/private/monitoring/flake.lock new file mode 100644 index 0000000..2e156fb --- /dev/null +++ b/flakes/private/monitoring/flake.lock @@ -0,0 +1,67 @@ +{ + "nodes": { + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "environment": "environment", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/monitoring/flake.nix b/flakes/private/monitoring/flake.nix new file mode 100644 index 0000000..b7c3997 --- /dev/null +++ b/flakes/private/monitoring/flake.nix @@ -0,0 +1,267 @@ +{ + inputs = { + environment.url = "path:../environment"; + secrets.url = "path:../../secrets"; + naemon.url = "path:../../naemon"; + nixpkgs-lib.url = "github:NixOS/nixpkgs?dir=lib"; + }; + outputs = { self, environment, nixpkgs-lib, secrets, naemon }: { + nagios-cli-config = ./nagios-cli.cfg; + lib = rec { + expandedObject = kind: object: objects: + if object ? "use" + then expandedObject kind objects.templates.${kind}.${object.use} objects // object + else object; + + objectsCommon = import ./objects_common.nix; + toObjects = import ./to_objects.nix { inherit (nixpkgs-lib) lib; }; + + toMasterPassiveObject = svcTemplate: freshnessThresholdMultiplier: objects: + { + service = with nixpkgs-lib.lib; map (s: + { + host_name = (expandedObject "service" s objects).host_name; + use = svcTemplate; + retry_interval = "1"; + freshness_threshold = let + fs = expandedObject "service" s objects; + in if builtins.isInt fs.check_interval + then builtins.ceil (freshnessThresholdMultiplier * 60 * fs.check_interval) + else fs.check_interval; + } + // filterAttrs (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_") s + // mapAttrs' + (n: nameValuePair (removePrefix "__passive_" n)) + (filterAttrs (k: _: hasPrefix "__passive_" k) s) + ) objects.service; + host = objects.host; + }; + + emailCheck = allCfg: host: hostFQDN: let + cfg = allCfg."${host}"; + reverseTargets = builtins.attrNames (nixpkgs-lib.lib.filterAttrs (k: v: builtins.elem host v.targets) allCfg); + to_email = cfg': host': + let sep = if nixpkgs-lib.lib.hasInfix "+" cfg'.mail_address then "_" else "+"; + in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}"; + mails_to_send = builtins.concatStringsSep "," (map (n: to_email allCfg."${n}" host) cfg.targets); + mails_to_receive = builtins.concatStringsSep "," (map (n: "${to_email cfg n}:${n}") reverseTargets); + command = if cfg.local + then + [ "check_emails_local" "/var/lib/naemon/checks/email" mails_to_send mails_to_receive ] + else + [ "check_emails" cfg.login cfg.port mails_to_send mails_to_receive ]; + in + { + service_description = "${hostFQDN} email service is active"; + use = "mail-service"; + host_name = hostFQDN; + servicegroups = "webstatus-email"; + check_command = command; + }; + }; + nixosModule = self.nixosModules.monitoring; + nixosModules.monitoring = { config, pkgs, lib, ... }: + let + cfg = config.myServices.monitoring; + allPluginsConfig = import ./myplugins.nix { + inherit pkgs lib config; + sudo = "/run/wrappers/bin/sudo"; + }; + mypluginsConfig = lib.mapAttrs (n: v: + if builtins.isFunction v + then v (cfg.pluginsArgs."${n}" or {}) + else v + ) (lib.getAttrs cfg.activatedPlugins allPluginsConfig); + myplugins = let + mypluginsChunk = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: v.chunk or "") mypluginsConfig); + in pkgs.runCommand "buildplugins" { + buildInputs = [ pkgs.makeWrapper pkgs.perl ]; + } '' + mkdir $out + ${mypluginsChunk} + ''; + objectsModule = with lib.types; submodule { + options = { + command = lib.mkOption { + type = attrsOf str; + default = {}; + description = "Command definitions"; + }; + + host = lib.mkOption { + type = attrsOf (attrsOf str); + default = {}; + description = "Host definitions"; + }; + hostgroup = lib.mkOption { + type = attrsOf (attrsOf str); + default = {}; + description = "Host group definitions"; + }; + hostdependency = lib.mkOption { + type = listOf (attrsOf str); + default = []; + description = "Host dependency definitions"; + }; + + service = lib.mkOption { + type = listOf (attrsOf (oneOf [ str (listOf str) int ])); + # str -> string + # listOf str -> list to be concatenated with "!" + # int -> toString + default = []; + description = "Service definitions"; + }; + servicegroup = lib.mkOption { + type = attrsOf (attrsOf str); + default = {}; + description = "Service group definitions"; + }; + servicedependency = lib.mkOption { + type = listOf (attrsOf str); + default = []; + description = "Service dependency definitions"; + }; + + contact = lib.mkOption { + type = attrsOf (attrsOf str); + default = {}; + description = "Contact definitions"; + }; + contactgroup = lib.mkOption { + type = attrsOf (attrsOf str); + default = {}; + description = "Contact group definitions"; + }; + + timeperiod = lib.mkOption { + type = attrsOf (attrsOf str); + default = {}; + description = "Time period definitions"; + }; + + templates = lib.mkOption { + description = "Template definitions"; + default = {}; + type = submodule { + options = { + service = lib.mkOption { type = attrsOf (attrsOf (either str int)); default = {}; }; + contact = lib.mkOption { type = attrsOf (attrsOf str); default = {}; }; + host = lib.mkOption { type = attrsOf (attrsOf str); default = {}; }; + }; + }; + }; + }; + }; + in + { + options = { + myServices.monitoring = { + enable = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + Whether to enable monitoring. + ''; + }; + master = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + This instance is the master instance + ''; + }; + pluginsArgs = lib.mkOption { + default = {}; + description = "Arguments to pass to the naemon plugin configuration"; + type = lib.types.attrsOf (lib.types.attrsOf lib.types.unspecified); + }; + activatedPlugins = lib.mkOption { + default = []; + description = "List of naemon plugins to activate"; + type = lib.types.listOf (lib.types.enum (builtins.attrNames allPluginsConfig)); + }; + fromMasterActivatedPlugins = lib.mkOption { + default = []; + description = "List of naemon plugins to activate from master"; + type = lib.types.listOf (lib.types.str); + }; + resources = lib.mkOption { + default = {}; + description = "List of additionnal resources elements"; + type = lib.types.attrsOf (lib.types.str); + }; + objects = lib.mkOption { + default = {}; + description = "Object definitions"; + type = objectsModule; + }; + fromMasterObjects = lib.mkOption { + default = {}; + description = "Object definitions of checks that should be executed from master"; + type = objectsModule; + }; + }; + }; + + imports = [ + environment.nixosModule + secrets.nixosModule + naemon.nixosModule + ]; + config = lib.mkIf cfg.enable { + myServices.monitoring.objects.command = + lib.foldr (v: o: o // (v.commands or {})) {} (builtins.attrValues mypluginsConfig); + + security.sudo.extraRules = let + pluginsSudo = lib.lists.remove null (lib.mapAttrsToList (k: v: + if (v ? sudo) + then ({ users = [ "naemon" ]; } // (v.sudo myplugins)) + else null) mypluginsConfig); + in pluginsSudo; + + environment.etc.cnagios.source = "${pkgs.cnagios}/share/doc/cnagios"; + environment.systemPackages = let + nagios-cli = pkgs.writeScriptBin "nagios-cli" '' + #!${pkgs.stdenv.shell} + sudo -u naemon ${pkgs.nagios-cli}/bin/nagios-cli -c ${self.nagios-cli-config} + ''; + in [ + pkgs.cnagios + nagios-cli + ]; + secrets.keys = { + "naemon/id_rsa" = { + user = "naemon"; + group = "naemon"; + permissions = "0400"; + text = config.myEnv.monitoring.ssh_secret_key; + }; + "naemon/resources.cfg".keyDependencies = [ myplugins ]; + }; + services.naemon = { + enable = true; + extraConfig = '' + use_syslog=1 + log_initial_states=1 + date_format=iso8601 + admin_email=${config.myEnv.monitoring.email} + '' + lib.optionalString (!cfg.master) '' + obsess_over_services=1 + ocsp_command=notify-master + ''; + extraResource = let + resources = [cfg.resources or {}] ++ (lib.mapAttrsToList (k: v: v.resources or {}) mypluginsConfig); + joined = lib.zipAttrsWith (n: v: if builtins.length (lib.unique v) == 1 then builtins.head v else abort "Non-unique resources names") resources; + joinedStr = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "$" + "${k}$=${v}") joined); + in '' + $USER2$=${myplugins} + ${joinedStr} + ''; + objectDefs = + self.lib.toObjects cfg.objects; + }; + }; + }; + }; +} diff --git a/modules/private/monitoring/myplugins.nix b/flakes/private/monitoring/myplugins.nix similarity index 88% rename from modules/private/monitoring/myplugins.nix rename to flakes/private/monitoring/myplugins.nix index e59ddc4..35730bb 100644 --- a/modules/private/monitoring/myplugins.nix +++ b/flakes/private/monitoring/myplugins.nix @@ -21,31 +21,24 @@ in }; notify-primary = { resources = { - USER206 = config.myEnv.monitoring.slack_channel; - USER207 = config.myEnv.monitoring.slack_url; - USER210 = config.myEnv.monitoring.eban.user; - USER211 = config.myEnv.monitoring.eban.password; + USER210 = config.myEnv.monitoring.apprise_urls; }; commands = { # $OVE is to force naemon to run via shell instead of execve which fails here notify-host-by-email = "ADMINEMAIL=\"$ADMINEMAIL$\" SERVICENOTIFICATIONID=\"$SERVICENOTIFICATIONID$\" HOSTSTATE=\"$HOSTSTATE$\" HOSTOUTPUT=\"$HOSTOUTPUT$\" $USER2$/notify_by_email host \"$NOTIFICATIONTYPE$\" \"$HOSTALIAS$\" \"$LONGDATETIME$\" \"$CONTACTEMAIL$\" $OVE"; # $OVE is to force naemon to run via shell instead of execve which fails here notify-service-by-email = "ADMINEMAIL=\"$ADMINEMAIL$\" SERVICENOTIFICATIONID=\"$SERVICENOTIFICATIONID$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_email service \"$NOTIFICATIONTYPE$\" \"$HOSTALIAS$\" \"$LONGDATETIME$\" \"$CONTACTEMAIL$\" $OVE"; - notify-by-slack = "HOST=\"$HOSTALIAS$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_slack \"$ARG1$\" \"$ARG2$\""; - notify-host-eban-url = "STATUS_NAME=\"Server\" USER=\"$USER210$\" PASSWORD=\"$USER211$\" HOSTSTATE=\"$HOSTSTATE$\" $USER2$/notify_eban_url"; - notify-service-eban-url = "STATUS_NAME=\"$_SERVICEWEBSTATUS_NAME$\" USER=\"$USER210$\" PASSWORD=\"$USER211$\" SERVICESTATE=\"$SERVICESTATE$\" $USER2$/notify_eban_url"; + notify-host-by-apprise = "HOST=\"$HOSTALIAS$\" NOTIFICATIONTYPE=\"$NOTIFICATIONTYPE$\" HOSTSTATE=\"$HOSTSTATE$\" HOSTOUTPUT=\"$HOSTOUTPUT$\" $USER2$/notify_by_apprise host \"$ARG1$\""; + notify-service-by-apprise = "HOST=\"$HOSTALIAS$\" NOTIFICATIONTYPE=\"$NOTIFICATIONTYPE$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_apprise service \"$ARG1$\""; }; chunk = '' - cp ${./plugins}/{notify_by_email,notify_by_slack,notify_eban_url} $out - patchShebangs $out/{notify_by_email,notify_by_slack,notify_eban_url} + cp ${./plugins}/{notify_by_email,notify_by_apprise} $out + patchShebangs $out/{notify_by_email,notify_by_apprise} wrapProgram $out/notify_by_email --prefix PATH : ${lib.makeBinPath [ pkgs.mailutils ]} - wrapProgram $out/notify_by_slack --prefix PATH : ${lib.makeBinPath [ - pkgs.curl pkgs.jq - ]} - wrapProgram $out/notify_eban_url --prefix PATH : ${lib.makeBinPath [ - pkgs.curl + wrapProgram $out/notify_by_apprise --prefix PATH : ${lib.makeBinPath [ + pkgs.apprise ]} ''; }; @@ -79,6 +72,28 @@ in check_external_dns = "$USER1$/check_dns -H $ARG2$ -s $ARG1$ $ARG3$"; }; }; + mdadm = { + commands = { + check_mdadm = "$USER2$/check_command -c \"${pkgs.mdadm}/bin/mdadm --monitor --scan -1\" -s 0 -o \"^$\" -r root"; + }; + sudo = _: { + commands = [ + { command = "${pkgs.mdadm}/bin/mdadm --monitor --scan -1"; options = [ "NOPASSWD" ]; } + ]; + runAs = "root"; + }; + }; + postfix = { + commands = { + check_mailq = "$USER1$/check_mailq -s -w 1 -c 2"; + }; + sudo = _: { + commands = [ + { command = "${pkgs.postfix}/bin/mailq"; options = [ "NOPASSWD" ]; } + ]; + runAs = "root"; + }; + }; emails = { resources = { USER203 = config.secrets.fullPaths."naemon/id_rsa"; @@ -120,7 +135,7 @@ in cp ${./plugins}/check_eriomem $out/ patchShebangs $out/check_eriomem wrapProgram $out/check_eriomem --prefix PATH : ${lib.makeBinPath [ - pkgs.s3cmd pkgs.python3 + pkgs.s3cmd pkgs.python38 ]} cp ${./plugins}/check_backup_age $out/check_backup_eriomem_age patchShebangs $out/check_backup_eriomem_age @@ -178,6 +193,8 @@ in commands = { check_http = "$USER1$/check_http --sni -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\""; check_https = "$USER1$/check_http --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\""; + check_https_4 = "$USER1$/check_http -4 --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\""; + check_https_6 = "$USER1$/check_http -6 --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\""; check_https_auth = "$USER1$/check_http --sni --ssl -a \"$USER202$\" -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\""; check_https_certificate = "$USER1$/check_http --sni --ssl -H \"$ARG1$\" -C 21,15"; check_https_code = "$USER1$/check_http --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -e \"$ARG3$\" -r \"$ARG4$\""; @@ -240,7 +257,7 @@ in cp ${./plugins}/check_mem.sh $out/ patchShebangs $out/check_mem.sh wrapProgram $out/check_mem.sh --prefix PATH : ${lib.makeBinPath [ - pkgs.gnugrep pkgs.gawk pkgs.procps-ng + pkgs.gnugrep pkgs.gawk pkgs.procps ]} ''; }; @@ -303,31 +320,25 @@ in cp ${./plugins}/check_ovh_sms $out/ patchShebangs $out/check_ovh_sms wrapProgram $out/check_ovh_sms --prefix PATH : ${lib.makeBinPath [ - (pkgs.python3.withPackages (ps: [ps.ovh])) + (pkgs.python38.withPackages (ps: [ps.ovh])) ]} ''; }; - postgresql = { + postgresql = { package }: { commands = { check_postgresql_replication = "${sudo} -u postgres $USER2$/check_postgres_replication \"$ARG1$\" \"$ARG2$\" \"$ARG3$\""; check_postgresql_database_count = "$USER2$/check_postgres_database_count \"$ARG1$\" \"$ARG2$\" \"$ARG3$\""; }; - chunk = let - postgresqlBinary = if config.myServices.databasesReplication.postgresql.enable - then config.myServices.databasesReplication.postgresql.mainPackage - else if config.myServices.databases.enable - then config.myServices.databases.postgresql.package - else pkgs.postgresql; - in '' + chunk = '' cp ${./plugins}/check_postgres_replication $out/ patchShebangs $out/check_postgres_replication wrapProgram $out/check_postgres_replication --prefix PATH : ${lib.makeBinPath [ - postgresqlBinary + package ]} cp ${./plugins}/check_postgres_database_count $out/ patchShebangs $out/check_postgres_database_count wrapProgram $out/check_postgres_database_count --prefix PATH : ${lib.makeBinPath [ - postgresqlBinary + package ]} ''; diff --git a/modules/private/monitoring/nagios-cli.cfg b/flakes/private/monitoring/nagios-cli.cfg similarity index 100% rename from modules/private/monitoring/nagios-cli.cfg rename to flakes/private/monitoring/nagios-cli.cfg diff --git a/modules/private/monitoring/objects_common.nix b/flakes/private/monitoring/objects_common.nix similarity index 82% rename from modules/private/monitoring/objects_common.nix rename to flakes/private/monitoring/objects_common.nix index 7c9f642..1da7764 100644 --- a/modules/private/monitoring/objects_common.nix +++ b/flakes/private/monitoring/objects_common.nix @@ -9,23 +9,9 @@ , loadAlert ? "1.0" , load5Alert ? loadAlert , load15Alert ? load5Alert -, mdadm , master -, lib -, mypluginsConfig , ... }: -let - defaultPassiveInfo = { - filter = lib.attrsets.filterAttrs - (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_"); - use = "external-passive-service"; - freshness_threshold = "450"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - host_name = hostFQDN; - }; -in { host = { "${hostFQDN}" = { @@ -39,13 +25,12 @@ in }; service = [ { - passiveInfo = defaultPassiveInfo; service_description = "Size on root partition"; use = "local-service"; check_command = ["check_local_disk" "20%" "10%" "/"]; + __passive_servicegroups = "webstatus-resources"; } { - passiveInfo = defaultPassiveInfo; service_description = "Total number of process"; use = "local-service"; check_command = [ @@ -54,12 +39,12 @@ in processAlert "RSZDT" ]; + __passive_servicegroups = "webstatus-resources"; } { - passiveInfo = defaultPassiveInfo; service_description = "Network bandwidth"; use = "local-service"; - check_interval = "2"; + check_interval = 2; max_check_attempts = "20"; retry_interval = "2"; check_command = [ @@ -68,9 +53,9 @@ in "20480" # kb/s "51200" # kb/s ]; + __passive_servicegroups = "webstatus-resources"; } { - passiveInfo = defaultPassiveInfo; service_description = "Average load"; use = "local-service"; check_command = [ @@ -78,44 +63,33 @@ in "${loadWarn},${load5Warn},${load15Warn}" "${loadAlert},${load5Alert},${load15Alert}" ]; + __passive_servicegroups = "webstatus-resources"; } { - passiveInfo = defaultPassiveInfo; service_description = "Swap usage"; use = "local-service"; check_command = ["check_local_swap" "20" "10"]; + __passive_servicegroups = "webstatus-resources"; } { - passiveInfo = defaultPassiveInfo; service_description = "Memory usage"; use = "local-service"; check_command = ["check_memory" "80" "90"]; + __passive_servicegroups = "webstatus-resources"; } { - passiveInfo = defaultPassiveInfo; service_description = "NTP is activated and working"; use = "local-service"; check_command = ["check_ntp"]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "No mdadm array is degraded"; - use = "local-service"; - check_command = [ - "check_command_output" - "${mdadm}/bin/mdadm --monitor --scan -1" - "^$" - "-s 0 -r root" - ]; + __passive_servicegroups = "webstatus-resources"; } ]; - command = lib.foldr (v: o: o // (v.commands or {})) {} (builtins.attrValues mypluginsConfig) // { + command = { check_local_disk = "$USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$"; check_local_procs = "$USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$"; check_local_load = "$USER1$/check_load -r -w $ARG1$ -c $ARG2$"; check_local_swap = "$USER1$/check_swap -n ok -w $ARG1$ -c $ARG2$"; check_ntp = "$USER1$/check_ntp_time -t 30 -q -H 0.arch.pool.ntp.org"; - check_mailq = "$USER1$/check_mailq -s -w 1 -c 2"; check_smtp = "$USER1$/check_smtp -H $HOSTADDRESS$ -p 25 -S -D 21,15"; check_host_alive = "$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5"; @@ -157,7 +131,7 @@ in generic-service = { active_checks_enabled = "1"; check_freshness = "0"; - check_interval = "10"; + check_interval = 10; check_period = "24x7"; contact_groups = "admins"; event_handler_enabled = "1"; @@ -179,38 +153,38 @@ in local-service = { use = "generic-service"; host_name = hostFQDN; - check_interval = "5"; + check_interval = 5; max_check_attempts = "4"; retry_interval = "1"; servicegroups = "webstatus-resources"; }; external-service = { use = "generic-service"; - check_interval = "5"; + check_interval = 5; max_check_attempts = "4"; retry_interval = "1"; }; web-service = { use = "generic-service"; - check_interval = "20"; + check_interval = 20; max_check_attempts = "2"; retry_interval = "1"; }; external-web-service = { use = "generic-service"; - check_interval = "20"; + check_interval = 20; max_check_attempts = "2"; retry_interval = "1"; }; mail-service = { use = "generic-service"; - check_interval = "15"; + check_interval = 15; max_check_attempts = "1"; retry_interval = "1"; }; dns-service = { use = "generic-service"; - check_interval = "120"; + check_interval = 120; notification_interval = "120"; max_check_attempts = "5"; retry_interval = "5"; diff --git a/modules/private/monitoring/plugins/check_backup_age b/flakes/private/monitoring/plugins/check_backup_age similarity index 100% rename from modules/private/monitoring/plugins/check_backup_age rename to flakes/private/monitoring/plugins/check_backup_age diff --git a/modules/private/monitoring/plugins/check_bandwidth b/flakes/private/monitoring/plugins/check_bandwidth similarity index 95% rename from modules/private/monitoring/plugins/check_bandwidth rename to flakes/private/monitoring/plugins/check_bandwidth index 53c5d85..21d01f5 100755 --- a/modules/private/monitoring/plugins/check_bandwidth +++ b/flakes/private/monitoring/plugins/check_bandwidth @@ -110,8 +110,7 @@ avg_tx=$(bc <<< "scale=2;$sum_tx/$counter") if [ $(bc <<< "$avg_rx > $critical || $avg_tx > $critical") -eq 1 ]; then - echo "$interface CRITICAL - AVG_RX: $avg_rx kb/s, AVG_TX: - $avg_tx kb/s | RX="$avg_rx"kbps;0;0;0; TX="$avg_tx"kbps;0;0;0;" + echo "$interface CRITICAL - AVG_RX: $avg_rx kb/s, AVG_TX: $avg_tx kb/s | RX="$avg_rx"kbps;0;0;0; TX="$avg_tx"kbps;0;0;0;" exit $STATE_CRITICAL elif [ $(bc <<< "$avg_rx > $warning || $avg_tx > $warning") -eq 1 ]; then echo "$interface WARNING - AVG_RX: $avg_rx kb/s, AVG_TX: $avg_tx kb/s | RX="$avg_rx"kbps;0;0;0; TX="$avg_tx"kbps;0;0;0;" diff --git a/modules/private/monitoring/plugins/check_command b/flakes/private/monitoring/plugins/check_command similarity index 100% rename from modules/private/monitoring/plugins/check_command rename to flakes/private/monitoring/plugins/check_command diff --git a/modules/private/monitoring/plugins/check_emails b/flakes/private/monitoring/plugins/check_emails similarity index 100% rename from modules/private/monitoring/plugins/check_emails rename to flakes/private/monitoring/plugins/check_emails diff --git a/modules/private/monitoring/plugins/check_eriomem b/flakes/private/monitoring/plugins/check_eriomem similarity index 100% rename from modules/private/monitoring/plugins/check_eriomem rename to flakes/private/monitoring/plugins/check_eriomem diff --git a/modules/private/monitoring/plugins/check_ftp_database b/flakes/private/monitoring/plugins/check_ftp_database similarity index 100% rename from modules/private/monitoring/plugins/check_ftp_database rename to flakes/private/monitoring/plugins/check_ftp_database diff --git a/modules/private/monitoring/plugins/check_git b/flakes/private/monitoring/plugins/check_git similarity index 100% rename from modules/private/monitoring/plugins/check_git rename to flakes/private/monitoring/plugins/check_git diff --git a/modules/private/monitoring/plugins/check_imap_connection b/flakes/private/monitoring/plugins/check_imap_connection similarity index 100% rename from modules/private/monitoring/plugins/check_imap_connection rename to flakes/private/monitoring/plugins/check_imap_connection diff --git a/modules/private/monitoring/plugins/check_last_file_date b/flakes/private/monitoring/plugins/check_last_file_date similarity index 100% rename from modules/private/monitoring/plugins/check_last_file_date rename to flakes/private/monitoring/plugins/check_last_file_date diff --git a/modules/private/monitoring/plugins/check_mem.sh b/flakes/private/monitoring/plugins/check_mem.sh similarity index 56% rename from modules/private/monitoring/plugins/check_mem.sh rename to flakes/private/monitoring/plugins/check_mem.sh index cc97ae2..3a29040 100755 --- a/modules/private/monitoring/plugins/check_mem.sh +++ b/flakes/private/monitoring/plugins/check_mem.sh @@ -1,21 +1,23 @@ -#!/bin/bash +#!/usr/bin/env bash if [ "$1" = "-w" ] && [ "$2" -gt "0" ] && [ "$3" = "-c" ] && [ "$4" -gt "0" ]; then - FreeM=`free -m` + FreeM=`free -m -w` memTotal_m=`echo "$FreeM" |grep Mem |awk '{print $2}'` memUsed_m=`echo "$FreeM" |grep Mem |awk '{print $3}'` memFree_m=`echo "$FreeM" |grep Mem |awk '{print $4}'` + memShared_m=`echo "$FreeM" |grep Mem |awk '{print $5}'` memBuffer_m=`echo "$FreeM" |grep Mem |awk '{print $6}'` memCache_m=`echo "$FreeM" |grep Mem |awk '{print $7}'` - memUsedPrc=`echo $((($memUsed_m*100)/$memTotal_m))||cut -d. -f1` + memAvailable_m=`echo "$FreeM" |grep Mem |awk '{print $8}'` + memUsedPrc=`echo $((($memUsed_m-$memBuffer_m-$memCache_m)*100/$memTotal_m))||cut -d. -f1` if [ "$memUsedPrc" -ge "$4" ]; then - echo "Memory: CRITICAL Total: $memTotal_m MB - Used: $memUsed_m MB - $memUsedPrc% used!|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; CACHE=$memCache_m;;;; BUFFER=$memBuffer_m;;;;" + echo "Memory: CRITICAL Total: $memTotal_m MB - Used/Buffer/Cache: $memUsed_m MB - $memUsedPrc% used!|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; SHARED=$memShared_m;;;; CACHE=$memCache_m;;;; AVAILABLE=$memAvailable_m;;;; BUFFER=$memBuffer_m;;;;" exit 2 elif [ "$memUsedPrc" -ge "$2" ]; then - echo "Memory: WARNING Total: $memTotal_m MB - Used: $memUsed_m MB - $memUsedPrc% used!|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; CACHE=$memCache_m;;;; BUFFER=$memBuffer_m;;;;" + echo "Memory: WARNING Total: $memTotal_m MB - Used/Buffer/Cache: $memUsed_m MB - $memUsedPrc% used!|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; SHARED=$memShared_m;;;; CACHE=$memCache_m;;;; AVAILABLE=$memAvailable_m;;;; BUFFER=$memBuffer_m;;;;" exit 1 else - echo "Memory: OK Total: $memTotal_m MB - Used: $memUsed_m MB - $memUsedPrc% used|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; CACHE=$memCache_m;;;; BUFFER=$memBuffer_m;;;;" + echo "Memory: OK Total: $memTotal_m MB - Used/Buffer/Cache: $memUsed_m MB - $memUsedPrc% used|TOTAL=$memTotal_m;;;; USED=$memUsed_m;;;; SHARED=$memShared_m;;;; CACHE=$memCache_m;;;; AVAILABLE=$memAvailable_m;;;; BUFFER=$memBuffer_m;;;;" exit 0 fi else # If inputs are not as expected, print help. diff --git a/modules/private/monitoring/plugins/check_mysql_replication b/flakes/private/monitoring/plugins/check_mysql_replication similarity index 100% rename from modules/private/monitoring/plugins/check_mysql_replication rename to flakes/private/monitoring/plugins/check_mysql_replication diff --git a/modules/private/monitoring/plugins/check_openldap_replication b/flakes/private/monitoring/plugins/check_openldap_replication similarity index 100% rename from modules/private/monitoring/plugins/check_openldap_replication rename to flakes/private/monitoring/plugins/check_openldap_replication diff --git a/modules/private/monitoring/plugins/check_ovh_sms b/flakes/private/monitoring/plugins/check_ovh_sms similarity index 100% rename from modules/private/monitoring/plugins/check_ovh_sms rename to flakes/private/monitoring/plugins/check_ovh_sms diff --git a/modules/private/monitoring/plugins/check_postgres_database_count b/flakes/private/monitoring/plugins/check_postgres_database_count similarity index 100% rename from modules/private/monitoring/plugins/check_postgres_database_count rename to flakes/private/monitoring/plugins/check_postgres_database_count diff --git a/modules/private/monitoring/plugins/check_postgres_replication b/flakes/private/monitoring/plugins/check_postgres_replication similarity index 100% rename from modules/private/monitoring/plugins/check_postgres_replication rename to flakes/private/monitoring/plugins/check_postgres_replication diff --git a/modules/private/monitoring/plugins/check_redis_replication b/flakes/private/monitoring/plugins/check_redis_replication similarity index 100% rename from modules/private/monitoring/plugins/check_redis_replication rename to flakes/private/monitoring/plugins/check_redis_replication diff --git a/modules/private/monitoring/plugins/check_zfs_snapshot b/flakes/private/monitoring/plugins/check_zfs_snapshot similarity index 100% rename from modules/private/monitoring/plugins/check_zfs_snapshot rename to flakes/private/monitoring/plugins/check_zfs_snapshot diff --git a/flakes/private/monitoring/plugins/notify_by_apprise b/flakes/private/monitoring/plugins/notify_by_apprise new file mode 100755 index 0000000..82bc5a3 --- /dev/null +++ b/flakes/private/monitoring/plugins/notify_by_apprise @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +APPRISE_USERNAME="Naemon" +APPRISE_USERICON="https://assets.immae.eu/monitoring.png" +APPRISE_URLS=$(echo "$2" | sed -e "s/{username}/$APPRISE_USERNAME/g" -e "s@{image_url}@$APPRISE_USERICON@g") + +if [ "$SERVICESTATE" = "CRITICAL" ]; then + ICON="❗" +elif [ "$SERVICESTATE" = "WARNING" ]; then + ICON="⚠️:" +elif [ "$SERVICESTATE" = "OK" ]; then + ICON="✅" +elif [ "$SERVICESTATE" = "UNKNOWN" ]; then + ICON="❓" +elif [ "$HOSTSTATE" = "UP" ]; then + ICON="✅" +elif [ "$HOSTSTATE" = "DOWN" ]; then + ICON="❗" +elif [ "$HOSTSTATE" = "UNKNOWN" ]; then + ICON="❓" +elif [ "$HOSTSTATE" = "UNREACHABLE" ]; then + ICON="❓" +else + ICON="◻" +fi + +if [ "$1" = "host" ]; then + apprise --title "${ICON} ${NOTIFICATIONTYPE} ${HOST} is ${HOSTSTATE}" --body "$HOSTOUTPUT" $APPRISE_URLS +else + apprise --title "${ICON} ${NOTIFICATIONTYPE} ${SERVICEDESC} on ${HOST} is ${SERVICESTATE}" --body "$SERVICEOUTPUT" $APPRISE_URLS +fi diff --git a/modules/private/monitoring/plugins/notify_by_email b/flakes/private/monitoring/plugins/notify_by_email similarity index 100% rename from modules/private/monitoring/plugins/notify_by_email rename to flakes/private/monitoring/plugins/notify_by_email diff --git a/modules/private/monitoring/plugins/notify_by_slack b/flakes/private/monitoring/plugins/notify_by_slack similarity index 100% rename from modules/private/monitoring/plugins/notify_by_slack rename to flakes/private/monitoring/plugins/notify_by_slack diff --git a/modules/private/monitoring/plugins/send_nrdp.sh b/flakes/private/monitoring/plugins/send_nrdp.sh similarity index 100% rename from modules/private/monitoring/plugins/send_nrdp.sh rename to flakes/private/monitoring/plugins/send_nrdp.sh diff --git a/modules/private/monitoring/send_mails b/flakes/private/monitoring/send_mails similarity index 100% rename from modules/private/monitoring/send_mails rename to flakes/private/monitoring/send_mails diff --git a/modules/private/monitoring/to_objects.nix b/flakes/private/monitoring/to_objects.nix similarity index 88% rename from modules/private/monitoring/to_objects.nix rename to flakes/private/monitoring/to_objects.nix index 12721d2..57a71ad 100644 --- a/modules/private/monitoring/to_objects.nix +++ b/flakes/private/monitoring/to_objects.nix @@ -11,13 +11,13 @@ let toStr = k: v: if k == "check_command" && builtins.isList v then builtins.concatStringsSep "!" v - else v; + else builtins.toString v; toService = service: '' define service { ${builtins.concatStringsSep "\n" (mapAttrsToList (k: v: " ${pad 30 k} ${toStr k v}" - ) (filterAttrs (k: v: ! builtins.elem k ["passiveInfo" "filter"]) service))} + ) (filterAttrs (k: v: ! hasPrefix "__passive_" k) service))} } ''; toServices = services: builtins.concatStringsSep "\n" (map toService services); @@ -53,7 +53,7 @@ let ${pad 30 "name"} ${k} ${pad 30 "register"} 0 ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv: - " ${pad 30 kk} ${vv}" + " ${pad 30 kk} ${builtins.toString vv}" ) v)} } ''; @@ -69,9 +69,9 @@ let then toTemplates v else if builtins.elem keyname ["hostgroup" "host" "contactgroup" "contact" "timeperiod" "servicegroup"] then toOthers keyname v - else if builtins.elem keyname ["servicedependency"] + else if builtins.elem keyname ["servicedependency" "hostdependency"] then toOthersArray keyname v - else ""; + else builtins.trace ("Warning: unknown object type " + keyname) ""; toObjects = v: builtins.concatStringsSep "\n" (mapAttrsToList toObjects' v); in toObjects diff --git a/flakes/private/openarc/flake.lock b/flakes/private/openarc/flake.lock index be75993..60b0fdf 100644 --- a/flakes/private/openarc/flake.lock +++ b/flakes/private/openarc/flake.lock @@ -2,7 +2,8 @@ "nodes": { "files-watcher": { "locked": { - "narHash": "sha256-6urOJuzXsu4HJHyVmrZHd40SMzzTeHiOiDOM40q53Y0=", + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", "path": "../../files-watcher", "type": "path" }, @@ -26,68 +27,19 @@ "type": "github" } }, - "my-lib": { - "inputs": { - "nixpkgs": "nixpkgs" - }, + "myuids": { "locked": { - "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=", - "path": "../../lib", + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", "type": "path" }, "original": { - "path": "../../lib", + "path": "../myuids", "type": "path" } }, - "myuids": { - "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" - }, - "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" - } - }, - "nix-lib": { - "locked": { - "lastModified": 1633008342, - "narHash": "sha256-wZV5YidnsqV/iufDIhaZip3LzwUGeIt8wtdiGS5+cXc=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "6eae8a116011f4db0aa5146f364820024411d6bb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs": { - "locked": { - "lastModified": 1631570365, - "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "df7113c0727881519248d4c7d080324e0ee3327b", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { "locked": { "lastModified": 1597943282, "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", @@ -106,11 +58,12 @@ "inputs": { "flake-utils": "flake-utils", "myuids": "myuids", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs", "openarc": "openarc_2" }, "locked": { - "narHash": "sha256-ilrfNs6jpi1OceDE3y1atkovECx6PKNWubwLc0Sjx+s=", + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", "path": "../../openarc", "type": "path" }, @@ -138,15 +91,14 @@ "root": { "inputs": { "files-watcher": "files-watcher", - "my-lib": "my-lib", - "nix-lib": "nix-lib", "openarc": "openarc", "secrets": "secrets" } }, "secrets": { "locked": { - "narHash": "sha256-w3u1bMEJHCg9SqErJ5Qi0sTX2xx7mk+HrHZXzpjQd1w=", + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", "path": "../../secrets", "type": "path" }, diff --git a/flakes/private/openarc/flake.nix b/flakes/private/openarc/flake.nix index b4ab4c8..56c3a1a 100644 --- a/flakes/private/openarc/flake.nix +++ b/flakes/private/openarc/flake.nix @@ -1,63 +1,47 @@ { - inputs.openarc = { - path = "../../openarc"; - type = "path"; - }; - inputs.secrets = { - path = "../../secrets"; - type = "path"; - }; - inputs.files-watcher = { - path = "../../files-watcher"; - type = "path"; - }; - inputs.my-lib = { - path = "../../lib"; - type = "path"; - }; - inputs.nix-lib.url = "github:NixOS/nixpkgs"; + inputs.openarc.url = "path:../../openarc"; + inputs.secrets.url = "path:../../secrets"; + inputs.files-watcher.url = "path:../../files-watcher"; description = "Private configuration for openarc"; - outputs = { self, nix-lib, my-lib, files-watcher, openarc, secrets }: - let - cfg = name': { config, lib, pkgs, name, ... }: { - imports = [ - (my-lib.lib.withNarKey files-watcher "nixosModule") - (my-lib.lib.withNarKey openarc "nixosModule") - (my-lib.lib.withNarKey secrets "nixosModule") - ]; - config = lib.mkIf (name == name') { - services.openarc = { - enable = true; - user = "opendkim"; - socket = "/run/openarc/openarc.sock"; - group = config.services.postfix.group; - configFile = pkgs.writeText "openarc.conf" '' - AuthservID mail.immae.eu - Domain mail.immae.eu - KeyFile ${config.secrets.fullPaths."opendkim/eldiron.private"} - Mode sv - Selector eldiron - SoftwareHeader yes - Syslog Yes - ''; - }; - systemd.services.openarc.serviceConfig.Slice = "mail.slice"; - systemd.services.openarc.postStart = '' - while [ ! -S ${config.services.openarc.socket} ]; do - sleep 0.5 - done - chmod g+w ${config.services.openarc.socket} + outputs = { self, files-watcher, openarc, secrets }: { + nixosModule = self.nixosModules.openarc; + nixosModules.openarc = { config, pkgs, ... }: { + imports = [ + files-watcher.nixosModule + openarc.nixosModule + secrets.nixosModule + ]; + config = { + services.openarc = { + enable = true; + user = "opendkim"; + socket = "/run/openarc/openarc.sock"; + group = config.services.postfix.group; + configFile = pkgs.writeText "openarc.conf" '' + AuthservID mail.immae.eu + Domain mail.immae.eu + KeyFile ${config.secrets.fullPaths."opendkim/eldiron.private"} + Mode sv + Selector eldiron + SoftwareHeader yes + Syslog Yes ''; - services.filesWatcher.openarc = { - restart = true; - paths = [ - config.secrets.fullPaths."opendkim/eldiron.private" - ]; - }; + }; + systemd.services.openarc.serviceConfig.Slice = "mail.slice"; + systemd.services.openarc.postStart = '' + while [ ! -S ${config.services.openarc.socket} ]; do + sleep 0.5 + done + chmod g+w ${config.services.openarc.socket} + ''; + services.filesWatcher.openarc = { + restart = true; + paths = [ + config.secrets.fullPaths."opendkim/eldiron.private" + ]; }; }; - in - openarc.outputs // - { nixosModules = openarc.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron" "backup-2"] cfg; }; + }; + }; } diff --git a/flakes/private/opendmarc/flake.lock b/flakes/private/opendmarc/flake.lock index f40e1a9..fdd4d64 100644 --- a/flakes/private/opendmarc/flake.lock +++ b/flakes/private/opendmarc/flake.lock @@ -1,8 +1,21 @@ { "nodes": { + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, "files-watcher": { "locked": { - "narHash": "sha256-6urOJuzXsu4HJHyVmrZHd40SMzzTeHiOiDOM40q53Y0=", + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", "path": "../../files-watcher", "type": "path" }, @@ -26,68 +39,19 @@ "type": "github" } }, - "my-lib": { - "inputs": { - "nixpkgs": "nixpkgs" - }, + "myuids": { "locked": { - "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=", - "path": "../../lib", + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", "type": "path" }, "original": { - "path": "../../lib", + "path": "../myuids", "type": "path" } }, - "myuids": { - "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" - }, - "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" - } - }, - "nix-lib": { - "locked": { - "lastModified": 1633008342, - "narHash": "sha256-wZV5YidnsqV/iufDIhaZip3LzwUGeIt8wtdiGS5+cXc=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "6eae8a116011f4db0aa5146f364820024411d6bb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs": { - "locked": { - "lastModified": 1631570365, - "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "df7113c0727881519248d4c7d080324e0ee3327b", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { "locked": { "lastModified": 1597943282, "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", @@ -106,10 +70,11 @@ "inputs": { "flake-utils": "flake-utils", "myuids": "myuids", - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs" }, "locked": { - "narHash": "sha256-7jup/d3+WXXWsNMB7Sp5Py4rJQV30Z5+PJITBISbQ9o=", + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", "path": "../../opendmarc", "type": "path" }, @@ -120,16 +85,16 @@ }, "root": { "inputs": { + "environment": "environment", "files-watcher": "files-watcher", - "my-lib": "my-lib", - "nix-lib": "nix-lib", "opendmarc": "opendmarc", "secrets": "secrets" } }, "secrets": { "locked": { - "narHash": "sha256-w3u1bMEJHCg9SqErJ5Qi0sTX2xx7mk+HrHZXzpjQd1w=", + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", "path": "../../secrets", "type": "path" }, diff --git a/flakes/private/opendmarc/flake.nix b/flakes/private/opendmarc/flake.nix index e2575e7..7e9e8eb 100644 --- a/flakes/private/opendmarc/flake.nix +++ b/flakes/private/opendmarc/flake.nix @@ -1,77 +1,62 @@ { - inputs.opendmarc = { - path = "../../opendmarc"; - type = "path"; - }; - inputs.secrets = { - path = "../../secrets"; - type = "path"; - }; - inputs.files-watcher = { - path = "../../files-watcher"; - type = "path"; - }; - inputs.my-lib = { - path = "../../lib"; - type = "path"; - }; - inputs.nix-lib.url = "github:NixOS/nixpkgs"; + inputs.opendmarc.url = "path:../../opendmarc"; + inputs.environment.url = "path:../environment"; + inputs.secrets.url = "path:../../secrets"; + inputs.files-watcher.url = "path:../../files-watcher"; description = "Private configuration for opendmarc"; - outputs = { self, nix-lib, opendmarc, my-lib, files-watcher, secrets }: - let - cfg = name': { config, lib, pkgs, name, ... }: { - imports = [ - (my-lib.lib.withNarKey files-watcher "nixosModule") - (my-lib.lib.withNarKey opendmarc "nixosModule") - (my-lib.lib.withNarKey secrets "nixosModule") - ]; - config = lib.mkIf (name == name') { - users.users."${config.services.opendmarc.user}".extraGroups = [ "keys" ]; - systemd.services.opendmarc.serviceConfig.Slice = "mail.slice"; - services.opendmarc = { - enable = true; - socket = "/run/opendmarc/opendmarc.sock"; - configFile = pkgs.writeText "opendmarc.conf" '' - AuthservID HOSTNAME - FailureReports false - FailureReportsBcc postmaster@immae.eu - FailureReportsOnNone true - FailureReportsSentBy postmaster@immae.eu - IgnoreAuthenticatedClients true - IgnoreHosts ${config.secrets.fullPaths."opendmarc/ignore.hosts"} - SoftwareHeader true - SPFIgnoreResults true - SPFSelfValidate true - UMask 002 - ''; - group = config.services.postfix.group; - }; - services.filesWatcher.opendmarc = { - restart = true; - paths = [ - config.secrets.fullPaths."opendmarc/ignore.hosts" - ]; - }; - secrets.keys = { - "opendmarc/ignore.hosts" = { - user = config.services.opendmarc.user; - group = config.services.opendmarc.group; - permissions = "0400"; - text = let - mxes = lib.attrsets.filterAttrs - (n: v: v.mx.enable) - config.myEnv.servers; - in - builtins.concatStringsSep "\n" ([ - config.myEnv.mail.dmarc.ignore_hosts - ] ++ lib.mapAttrsToList (n: v: v.fqdn) mxes); - }; + outputs = { self, environment, opendmarc, files-watcher, secrets }: { + nixosModule = self.nixosModules.opendmarc; + nixosModules.opendmarc = { config, lib, pkgs, ... }: { + imports = [ + environment.nixosModule + files-watcher.nixosModule + opendmarc.nixosModule + secrets.nixosModule + ]; + config = { + users.users."${config.services.opendmarc.user}".extraGroups = [ "keys" ]; + systemd.services.opendmarc.serviceConfig.Slice = "mail.slice"; + services.opendmarc = { + enable = true; + socket = "/run/opendmarc/opendmarc.sock"; + configFile = pkgs.writeText "opendmarc.conf" '' + AuthservID HOSTNAME + FailureReports false + FailureReportsBcc postmaster@immae.eu + FailureReportsOnNone true + FailureReportsSentBy postmaster@immae.eu + IgnoreAuthenticatedClients true + IgnoreHosts ${config.secrets.fullPaths."opendmarc/ignore.hosts"} + SoftwareHeader true + SPFIgnoreResults true + SPFSelfValidate true + UMask 002 + ''; + group = config.services.postfix.group; + }; + services.filesWatcher.opendmarc = { + restart = true; + paths = [ + config.secrets.fullPaths."opendmarc/ignore.hosts" + ]; + }; + secrets.keys = { + "opendmarc/ignore.hosts" = { + user = config.services.opendmarc.user; + group = config.services.opendmarc.group; + permissions = "0400"; + text = let + mxes = lib.attrsets.filterAttrs + (n: v: v.mx.enable) + config.myEnv.servers; + in + builtins.concatStringsSep "\n" ([ + config.myEnv.mail.dmarc.ignore_hosts + ] ++ lib.mapAttrsToList (n: v: v.fqdn) mxes); }; }; }; - in - opendmarc.outputs // - { nixosModules = opendmarc.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron" "backup-2"] cfg; }; + }; + }; } - diff --git a/flakes/private/openldap/flake.nix b/flakes/private/openldap/flake.nix new file mode 100644 index 0000000..130312d --- /dev/null +++ b/flakes/private/openldap/flake.nix @@ -0,0 +1,6 @@ +{ + outputs = { self }: { + immae-schema = ./immae.schema; + immae-ldif = ./immae.ldif; + }; +} diff --git a/flakes/private/openldap/immae.ldif b/flakes/private/openldap/immae.ldif new file mode 100644 index 0000000..f1b4cb7 --- /dev/null +++ b/flakes/private/openldap/immae.ldif @@ -0,0 +1,83 @@ +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. +# CRC32 22130f5f +dn: cn=immae,cn=schema,cn=config +objectClass: olcSchemaConfig +cn: immae +olcObjectIdentifier: {0}Immaeroot 1.3.6.1.4.1.50071 +olcObjectIdentifier: {1}Immae Immaeroot:2 +olcObjectIdentifier: {2}ImmaeattributeType Immae:3 +olcObjectIdentifier: {3}ImmaeobjectClass Immae:4 +olcAttributeTypes: {0}( ImmaeattributeType:1 NAME 'immaeTtrssLogin' DESC 'lo + gin for TTRSS' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SY + NTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {1}( ImmaeattributeType:2 NAME 'immaeFtpDirectory' DESC ' + home directory for ftp' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466. + 115.121.1.26 ) +olcAttributeTypes: {2}( ImmaeattributeType:3 NAME 'immaeFtpUid' DESC 'user i + d for ftp' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) +olcAttributeTypes: {3}( ImmaeattributeType:4 NAME 'immaeFtpGid' DESC 'group + id for ftp' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) +olcAttributeTypes: {4}( ImmaeattributeType:5 NAME 'immaeSshKey' DESC 'OpenSS + H Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.4 + 0 ) +olcAttributeTypes: {5}( ImmaeattributeType:6 NAME 'immaeAccessDn' EQUALITY d + istinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) +olcAttributeTypes: {6}( ImmaeattributeType:17 NAME 'immaeAccessWriteDn' EQUA + LITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) +olcAttributeTypes: {7}( ImmaeattributeType:18 NAME 'immaeAccessReadSubtree' + EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) +olcAttributeTypes: {8}( ImmaeattributeType:7 NAME 'immaeXmppUid' DESC 'user + part for Xmpp' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SY + NTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {9}( ImmaeattributeType:8 NAME 'immaePostfixAddress' DESC + 'the dovecot address to match as username' EQUALITY caseIgnoreIA5Match SUB + STR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} + ) +olcAttributeTypes: {10}( ImmaeattributeType:9 NAME 'immaePostfixHome' DESC ' + the postfix home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1 + 466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: {11}( ImmaeattributeType:10 NAME 'immaePostfixMail' DESC + 'the dovecot mail location' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1 + 466.115.121.1.26 SINGLE-VALUE ) +olcAttributeTypes: {12}( ImmaeattributeType:11 NAME 'immaePostfixUid' DESC ' + the dovecot uid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121 + .1.26 SINGLE-VALUE ) +olcAttributeTypes: {13}( ImmaeattributeType:12 NAME 'immaePostfixGid' DESC ' + the dovecot gid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121 + .1.26 SINGLE-VALUE ) +olcAttributeTypes: {14}( ImmaeattributeType:16 NAME 'immaePuppetJson' DESC ' + Puppet hiera json' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.12 + 1.1.40 ) +olcAttributeTypes: {15}( ImmaeattributeType:19 NAME 'immaeTaskId' DESC 'Task + warrior server Org:Name:Key' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubs + tringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcAttributeTypes: {16}( ImmaeattributeType:20 NAME 'immaePeertubeId' DESC ' + login for Peertube' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMat + ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) +olcObjectClasses: {0}( ImmaeobjectClass:1 NAME 'immaeTtrssClass' DESC 'Expan + sion of the existing object classes for ttrss' SUP top AUXILIARY MUST immae + TtrssLogin ) +olcObjectClasses: {1}( ImmaeobjectClass:2 NAME 'immaeFtpClass' DESC 'Expansi + on of the existing object classes for ftp' SUP top AUXILIARY MUST ( immaeFt + pDirectory $ immaeFtpGid $ immaeFtpUid ) ) +olcObjectClasses: {2}( ImmaeobjectClass:3 NAME 'immaeSshClass' DESC 'OpenSSH + class' SUP top AUXILIARY MAY immaeSSHKey ) +olcObjectClasses: {3}( ImmaeobjectClass:4 NAME 'immaeAccessClass' DESC 'Acce + ss class' SUP top AUXILIARY MAY ( immaeAccessDn $ immaeAccessWriteDn $ imma + eAccessReadSubtree ) ) +olcObjectClasses: {4}( ImmaeobjectClass:5 NAME 'immaeXmppClass' DESC 'Expans + ion of the existing object classes for XMPP' SUP top AUXILIARY MUST immaeXm + ppUid ) +olcObjectClasses: {5}( ImmaeobjectClass:6 NAME 'immaePostfixClass' DESC 'Exp + ansion of the existing object classes for Postfix' SUP top AUXILIARY MAY ( + immaePostfixHome $ immaePostfixMail $ immaePostfixUid $ immaePostfixGid ) M + UST ( immaePostfixAddress ) ) +olcObjectClasses: {6}( ImmaeobjectClass:8 NAME 'immaePuppetClass' DESC 'Expa + nsion of the existing object classes for Puppet' SUP top AUXILIARY MUST imm + aePuppetJson ) +olcObjectClasses: {7}( ImmaeobjectClass:9 NAME 'immaeTaskClass' DESC 'Expans + ion of the existing object classes for Task' SUP top AUXILIARY MUST immaeTa + skId ) +olcObjectClasses: {8}( ImmaeobjectClass:10 NAME 'immaePeertubeClass' DESC 'E + xpansion of the existing object classes for peertube' SUP top AUXILIARY MUS + T immaePeertubeId ) diff --git a/modules/private/databases/openldap/immae.schema b/flakes/private/openldap/immae.schema similarity index 98% rename from modules/private/databases/openldap/immae.schema rename to flakes/private/openldap/immae.schema index d2ef972..7b3b587 100644 --- a/modules/private/databases/openldap/immae.schema +++ b/flakes/private/openldap/immae.schema @@ -110,8 +110,8 @@ attributetype ( ImmaeattributeType:12 NAME 'immaePostfixGid' objectclass ( ImmaeobjectClass:6 NAME 'immaePostfixClass' DESC 'Expansion of the existing object classes for Postfix' SUP top AUXILIARY - MUST ( immaePostfixAddress $ immaePostfixHome $ - immaePostfixMail $ immaePostfixUid $ immaePostfixGid ) + MAY ( immaePostfixHome $ immaePostfixMail $ immaePostfixUid $ immaePostfixGid ) + MUST ( immaePostfixAddress ) ) # Tinc informations diff --git a/flakes/private/paste/flake.lock b/flakes/private/paste/flake.lock index 6ad428c..e81b9ee 100644 --- a/flakes/private/paste/flake.lock +++ b/flakes/private/paste/flake.lock @@ -15,35 +15,6 @@ "type": "github" } }, - "my-lib": { - "inputs": { - "nixpkgs": "nixpkgs" - }, - "locked": { - "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=", - "path": "../../lib", - "type": "path" - }, - "original": { - "path": "../../lib", - "type": "path" - } - }, - "nix-lib": { - "locked": { - "lastModified": 1632955135, - "narHash": "sha256-MyOBftnLv5UcPCL4AzvlyNEDwGD2cGGM9HMEOno/MZw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a4d96cd808f13d924988938ecf9a46b2a2787fa3", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs": { "locked": { "lastModified": 1631570365, @@ -59,28 +30,14 @@ "type": "github" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1631570365, - "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "df7113c0727881519248d4c7d080324e0ee3327b", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "type": "github" - } - }, "paste": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs" }, "locked": { - "narHash": "sha256-2ylI42ZHfzW6oCsxfFyHf5zVnDsPMwvJCACtcdErtPg=", + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", "path": "../../paste", "type": "path" }, @@ -91,8 +48,6 @@ }, "root": { "inputs": { - "my-lib": "my-lib", - "nix-lib": "nix-lib", "paste": "paste" } } diff --git a/flakes/private/paste/flake.nix b/flakes/private/paste/flake.nix index 23f8cd3..97853ea 100644 --- a/flakes/private/paste/flake.nix +++ b/flakes/private/paste/flake.nix @@ -1,30 +1,20 @@ { - inputs.paste = { - path = "../../paste"; - type = "path"; - }; - inputs.my-lib = { - path = "../../lib"; - type = "path"; - }; - inputs.nix-lib.url = "github:NixOS/nixpkgs"; + inputs.paste.url = "path:../../paste"; description = "Private configuration for paste"; - outputs = { self, my-lib, nix-lib, paste }: - let - cfg = name': { config, lib, pkgs, name, ... }: { - imports = [ - (my-lib.lib.withNarKey paste "nixosModule") - ]; - config = lib.mkIf (name == name') { - services.paste = { - enable = true; - webDirectory = "/paste"; - }; + outputs = { self, paste }: { + nixosModule = self.nixosModules.paste; + nixosModules.paste = { ... }: { + imports = [ + paste.nixosModule + ]; + config = { + services.paste = { + enable = true; + webDirectory = "/paste"; }; }; - in - paste.outputs // - { nixosModules = paste.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron"] cfg; }; + }; + }; } diff --git a/flakes/private/peertube/flake.lock b/flakes/private/peertube/flake.lock index 4944da7..0ecec47 100644 --- a/flakes/private/peertube/flake.lock +++ b/flakes/private/peertube/flake.lock @@ -32,36 +32,26 @@ }, "myuids": { "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" }, "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "path": "../myuids", + "type": "path" } }, "myuids_2": { "locked": { - "dir": "flakes/myuids", - "lastModified": 1628207001, - "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", - "ref": "master", - "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3", - "revCount": 865, - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" }, "original": { - "dir": "flakes/myuids", - "type": "git", - "url": "https://git.immae.eu/perso/Immae/Config/Nix.git" + "path": "../myuids", + "type": "path" } }, "nixpkgs": { @@ -97,12 +87,13 @@ "peertube": { "flake": false, "locked": { - "lastModified": 1610436329, - "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", - "owner": "Chocobozzz", - "repo": "PeerTube", - "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", - "type": "github" + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" }, "original": { "owner": "Chocobozzz", @@ -114,21 +105,21 @@ "peertube_2": { "flake": false, "locked": { - "lastModified": 1611184594, - "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", - "ref": "gitolite_local/syden", - "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", - "revCount": 6316, - "type": "git", - "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" }, "original": { - "ref": "gitolite_local/syden", - "type": "git", - "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" } }, - "peertube_origin": { + "peertube_open_instance": { "inputs": { "flake-utils": "flake-utils", "myuids": "myuids", @@ -136,16 +127,17 @@ "peertube": "peertube" }, "locked": { - "narHash": "sha256-ESrcCrx7QmNk8MHgws9KrPEZqIxKNQ6bcshbUPj9u88=", - "path": "../../peertube", + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", "type": "path" }, "original": { - "path": "../../peertube", + "path": "./../../peertube", "type": "path" } }, - "peertube_syden": { + "peertube_origin": { "inputs": { "flake-utils": "flake-utils_2", "myuids": "myuids_2", @@ -153,19 +145,20 @@ "peertube": "peertube_2" }, "locked": { - "narHash": "sha256-ESrcCrx7QmNk8MHgws9KrPEZqIxKNQ6bcshbUPj9u88=", - "path": "../../peertube", + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", "type": "path" }, "original": { - "path": "../../peertube", + "path": "./../../peertube", "type": "path" } }, "root": { "inputs": { - "peertube_origin": "peertube_origin", - "peertube_syden": "peertube_syden" + "peertube_open_instance": "peertube_open_instance", + "peertube_origin": "peertube_origin" } } }, diff --git a/flakes/private/peertube/flake.nix b/flakes/private/peertube/flake.nix index e0e0d54..8eb81e9 100644 --- a/flakes/private/peertube/flake.nix +++ b/flakes/private/peertube/flake.nix @@ -1,27 +1,25 @@ { description = "Patched peertube"; inputs.peertube_origin = { - path = "../../peertube"; - type = "path"; + url = "path:./../../peertube"; }; - inputs.peertube_syden = { - path = "../../peertube"; - type = "path"; + inputs.peertube_open_instance = { + url = "path:./../../peertube"; inputs.peertube = { url = "https://git.immae.eu/github/Chocobozzz/PeerTube.git"; - ref = "gitolite_local/syden"; + ref = "gitolite_local/open_instance"; flake = false; type = "git"; }; }; - outputs = { self, peertube_origin, peertube_syden }: { + outputs = { self, peertube_origin, peertube_open_instance }: { overlays = { - peertube_syden = final: prev: { peertube_syden = peertube_syden.defaultPackage."${final.system}"; }; + peertube_open_instance = final: prev: { peertube_open_instance = peertube_open_instance.defaultPackage."${final.system}"; }; peertube_origin = final: prev: { peertube_origin = peertube_origin.defaultPackage."${final.system}"; }; }; packages.x86_64-linux.peertube = peertube_origin.packages.x86_64-linux.peertube; - packages.x86_64-linux.peertube_syden = peertube_syden.packages.x86_64-linux.peertube; + packages.x86_64-linux.peertube_open_instance = peertube_open_instance.packages.x86_64-linux.peertube; defaultPackage.x86_64-linux = peertube_origin.defaultPackage.x86_64-linux; nixosModule = peertube_origin.nixosModule; }; diff --git a/flakes/private/php/flake.lock b/flakes/private/php/flake.lock new file mode 100644 index 0000000..c9af933 --- /dev/null +++ b/flakes/private/php/flake.lock @@ -0,0 +1,62 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "nixpkgs-4": "nixpkgs-4" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/php/flake.nix b/flakes/private/php/flake.nix new file mode 100644 index 0000000..a730b68 --- /dev/null +++ b/flakes/private/php/flake.nix @@ -0,0 +1,40 @@ +{ + description = "Php old versions"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.nixpkgs-4 = { + url = "github:NixOS/nixpkgs/062a0c5437b68f950b081bbfc8a699d57a4ee026"; + flake = false; + }; + outputs = { self, nixpkgs, nixpkgs-4, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + in rec { + packages = { + php72 = pkgs.php72; + php73 = pkgs.php73; + php74 = (import nixpkgs-4 { inherit system; overlays = []; }).php74; + cryptpad = (import nixpkgs-4 { inherit system; overlays = []; }).cryptpad; + python37 = (import nixpkgs-4 { inherit system; overlays = []; }).python37; + python37Packages = (import nixpkgs-4 { inherit system; overlays = []; }).python37Packages; + telegram-purple = (import nixpkgs-4 { inherit system; overlays = []; }).telegram-purple; + }; + defaultPackage = packages.php73; + legacyPackages = packages; + }) // rec { + overlays = { + php = final: prev: { + php72 = self.packages."${final.system}".php72; + php73 = self.packages."${final.system}".php73; + php74 = self.packages."${final.system}".php74; + cryptpad = self.packages."${final.system}".cryptpad; + python37 = self.packages."${final.system}".python37; + telegram-purple = self.packages."${final.system}".telegram-purple; + }; + }; + overlay = overlays.php; + }; +} diff --git a/flakes/private/ssh/flake.lock b/flakes/private/ssh/flake.lock new file mode 100644 index 0000000..bbb2011 --- /dev/null +++ b/flakes/private/ssh/flake.lock @@ -0,0 +1,36 @@ +{ + "nodes": { + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "root": { + "inputs": { + "environment": "environment", + "secrets": "secrets" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/ssh/flake.nix b/flakes/private/ssh/flake.nix new file mode 100644 index 0000000..0ca6d67 --- /dev/null +++ b/flakes/private/ssh/flake.nix @@ -0,0 +1,107 @@ +{ + inputs.environment.url = "path:../environment"; + inputs.secrets.url = "path:../../secrets"; + outputs = { self, environment, secrets }: { + nixosModule = self.nixosModules.ssh; + nixosModules.ssh = { lib, pkgs, config, ... }: + let + cfg = config.myServices.ssh; + in + { + imports = [ + environment.nixosModule + secrets.nixosModule + ]; + options.myServices.ssh = let + module = lib.types.submodule { + options = { + vars = lib.mkOption { + type = lib.types.attrsOf lib.types.lines; + default = {}; + description = '' + variables to interpolate in the script. A `name_` prefix will be prepended + ''; + }; + snippet = lib.mkOption { + type = lib.types.lines; + description = '' + Snippet to use + ''; + }; + dependencies = lib.mkOption { + type = lib.types.listOf lib.types.package; + default = []; + description = '' + Dependencies of the package + ''; + }; + }; + }; + in { + modules = lib.mkOption { + type = lib.types.attrsOf module; + default = {}; + description = '' + List of modules to enable + ''; + }; + }; + config = lib.mkIf (builtins.length (builtins.attrValues cfg.modules) > 0) { + + services.openssh.extraConfig = '' + AuthorizedKeysCommand /etc/ssh/ldap_authorized_keys + AuthorizedKeysCommandUser nobody + ''; + + secrets.keys."ssh-ldap" = { + user = "nobody"; + group = "nogroup"; + permissions = "0400"; + text = config.myEnv.sshd.ldap.password; + }; + secrets.keys."ssh-psql" = { + user = "nobody"; + group = "nogroup"; + permissions = "0400"; + text = config.myEnv.sshd.psql.password; + }; + system.activationScripts.sshd = { + deps = [ "secrets" ]; + text = '' + install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-ldap"} /etc/ssh/ldap_password + install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-psql"} /etc/ssh/psql_password + ''; + }; + # ssh is strict about parent directory having correct rights, don't + # move it in the nix store. + environment.etc."ssh/ldap_authorized_keys" = let + deps = lib.lists.unique ( + [ pkgs.which pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.postgresql ] + ++ lib.flatten (map (v: v.dependencies) (builtins.attrValues cfg.modules)) + ); + vars = lib.concatMapAttrs (n: v: ( + lib.mapAttrs' (n': lib.nameValuePair "${n}_${n'}") v.vars + )) cfg.modules; + fullScript = pkgs.runCommand "ldap_authorized_keys" (vars // { + snippets = builtins.concatStringsSep "\n" (map (v: v.snippet) (builtins.attrValues cfg.modules)); + }) '' + substituteAll ${./ldap_authorized_keys.sh} $out + # Second call for the included snippets + substituteAllInPlace $out + chmod a+x $out + ''; + ldap_authorized_keys = pkgs.runCommand "ldap_authorized_keys" { + buildInputs = [ pkgs.makeWrapper ]; + } '' + makeWrapper "${fullScript}" "$out" --prefix PATH : ${lib.makeBinPath deps} + ''; + in { + enable = true; + mode = "0755"; + user = "root"; + source = ldap_authorized_keys; + }; + }; + }; + }; +} diff --git a/modules/private/ssh/ldap_authorized_keys.sh b/flakes/private/ssh/ldap_authorized_keys.sh similarity index 71% rename from modules/private/ssh/ldap_authorized_keys.sh rename to flakes/private/ssh/ldap_authorized_keys.sh index 402f283..f4395be 100755 --- a/modules/private/ssh/ldap_authorized_keys.sh +++ b/flakes/private/ssh/ldap_authorized_keys.sh @@ -4,8 +4,14 @@ LDAPSEARCH=ldapsearch KEY="immaeSshKey" LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu" LDAP_PASS=$(cat /etc/ssh/ldap_password) -LDAP_HOST="ldap.immae.eu" +LDAP_HOST="ldap://ldap.immae.eu" LDAP_BASE="dc=immae,dc=eu" +USER_LDAP_BASE="ou=users,dc=immae,dc=eu" + +PSQL_BASE="immae" +PSQL_HOST="localhost" +PSQL_USER="immae_auth_read" +PSQL_PASS=$(cat /etc/ssh/psql_password) suitable_for() { type_for="$1" @@ -41,7 +47,11 @@ clean_key_line() { } ldap_search() { - $LDAPSEARCH -h $LDAP_HOST -ZZ -b $LDAP_BASE -D $LDAP_BIND -w "$LDAP_PASS" -x -o ldif-wrap=no -LLL "$@" + $LDAPSEARCH -H $LDAP_HOST -ZZ -b $LDAP_BASE -D $LDAP_BIND -w "$LDAP_PASS" -x -o ldif-wrap=no -LLL "$@" +} + +psql_search() { + PGPASSWORD="$PSQL_PASS" psql -U "$PSQL_USER" -h "$PSQL_HOST" -X -A -t -d "$PSQL_BASE" -c "$@" } ldap_keys() { diff --git a/flakes/private/system/flake.lock b/flakes/private/system/flake.lock new file mode 100644 index 0000000..3602f00 --- /dev/null +++ b/flakes/private/system/flake.lock @@ -0,0 +1,185 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs_2", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "root": { + "inputs": { + "backports": "backports", + "environment": "environment", + "mypackages": "mypackages", + "myuids": "myuids", + "secrets-public": "secrets-public" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/private/system/flake.nix b/flakes/private/system/flake.nix new file mode 100644 index 0000000..04ebbc7 --- /dev/null +++ b/flakes/private/system/flake.nix @@ -0,0 +1,168 @@ +{ + inputs.environment.url = "path:../environment"; + inputs.secrets-public.url = "path:../../secrets"; + inputs.mypackages.url = "path:../../mypackages"; + inputs.myuids.url = "path:../../myuids"; + inputs.backports.url = "path:../../backports"; + outputs = { self, secrets-public, mypackages, backports, environment, myuids }: { + nixosModule = self.nixosModules.system; + nixosModules.system = { pkgs, lib, config, name, nodes, secrets, options, ... }: + { + imports = [ + secrets.nixosModules.users-config-common + environment.nixosModule + secrets-public.nixosModule + ]; + config = { + myEnv = import secrets.environment-file; + networking.hostName = name; + deployment.keys."vars.yml" = { + keyCommand = [ pkgs.stdenv.shell "-c" "cat ${secrets.vars-file}" ]; + user = "root"; + group = "root"; + permissions = "0400"; + }; + + networking.extraHosts = builtins.concatStringsSep "\n" + (lib.mapAttrsToList (n: v: "${lib.head v.config.hostEnv.ips.main.ip4} ${n}") nodes); + + users.extraUsers.root.openssh.authorizedKeys.keys = [ config.myEnv.sshd.rootKeys.nix_repository ]; + secrets.deleteSecretsVars = true; + secrets.gpgKeys = [ + ./public_keys/Immae.pub + ]; + secrets.secretsVars = "/run/keys/vars.yml"; + + services.openssh.enable = true; + + nixpkgs.overlays = + builtins.attrValues mypackages.overlays ++ + builtins.attrValues backports.overlays ++ + [ + (self: super: { + postgresql = self.postgresql_pam; + mariadb = self.mariadb_106.overrideAttrs(old: { + passthru = old.passthru // { mysqlVersion = "5.7"; }; + }); + }) # don’t put them as generic overlay because of home-manager + ]; + + services.journald.extraConfig = '' + #Should be "warning" but disabled for now, it prevents anything from being stored + MaxLevelStore=info + MaxRetentionSec=1year + ''; + + users.groups.acme.gid = myuids.lib.gids.acme; + users.users = + builtins.listToAttrs (map (x: lib.attrsets.nameValuePair x.name ({ + isNormalUser = true; + home = "/home/${x.name}"; + createHome = true; + linger = true; + # Enable in latest unstable homeMode = "755"; + } // x)) (config.hostEnv.users pkgs)) + // { + acme.uid = myuids.lib.uids.acme; + }; + environment.systemPackages = [ + pkgs.inetutils + pkgs.htop + pkgs.iftop + pkgs.bind.dnsutils + pkgs.httpie + pkgs.iotop + pkgs.whois + pkgs.ngrep + pkgs.tcpdump + pkgs.wireshark-cli + pkgs.tcpflow + pkgs.mitmproxy + pkgs.nmap + pkgs.p0f + pkgs.socat + pkgs.lsof + pkgs.psmisc + pkgs.openssl + pkgs.wget + + pkgs.pv + pkgs.smartmontools + + pkgs.git + pkgs.vim + pkgs.rsync + pkgs.strace + pkgs.sqlite + + pkgs.jq + pkgs.yq + ]; + + users.mutableUsers = lib.mkDefault false; + + systemd.services."vars.yml-key".enable = lib.mkForce false; + systemd.targets.maintenance = { + description = "Maintenance target with only sshd"; + after = [ "network-online.target" "sshd.service" ]; + requires = [ "network-online.target" "sshd.service" ]; + unitConfig.AllowIsolate = "yes"; + }; + + security.acme.acceptTerms = true; + security.acme.preliminarySelfsigned = true; + + security.acme.certs = { + "${name}" = { + domain = config.hostEnv.fqdn; + }; + }; + security.acme.defaults = { + email = "ismael@bouya.org"; + webroot = "/var/lib/acme/acme-challenges"; + postRun = builtins.concatStringsSep "\n" [ + (lib.optionalString config.services.nginx.enable "systemctl reload nginx.service") + ]; + extraLegoRenewFlags = [ "--reuse-key" ]; + keyType = lib.mkDefault "ec256"; # https://github.com/NixOS/nixpkgs/pull/83121 + #extraLegoRunFlags = [ "--reuse-key" "--preferred-chain" "ISRG Root X1"]; + #extraLegoRenewFlags = ["--preferred-chain" "ISRG Root X1"]; + }; + + services.nginx = { + recommendedTlsSettings = true; + virtualHosts = { + "${config.hostEnv.fqdn}" = { + acmeRoot = config.security.acme.defaults.webroot; + useACMEHost = name; + forceSSL = true; + }; + }; + }; + + services.fail2ban.jails.DEFAULT = { + settings.bantime = "12h"; + settings.findtime = "12h"; + }; + services.fail2ban = { + enable = true; + #findtime = "12h"; + #bantime = "12h"; + bantime-increment = { + enable = true; # Enable increment of bantime after each violation + formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)"; + #multipliers = "1 2 4 8 16 32 64"; + maxtime = "168h"; # Do not ban for more than 1 week + overalljails = true; # Calculate the bantime based on all the violations + }; + maxretry = 10; + ignoreIP = let + ip4s = lib.flatten (lib.mapAttrsToList (n: v: (lib.mapAttrsToList (n: v: v.ip4 or []) v.ips)) (config.myEnv.servers)); + ip6s = lib.flatten (lib.mapAttrsToList (n: v: (lib.mapAttrsToList (n: v: v.ip6 or []) v.ips)) (config.myEnv.servers)); + in + ip4s ++ ip6s; + }; + }; + }; + }; +} diff --git a/nixops/public_keys/Immae.pub b/flakes/private/system/public_keys/Immae.pub similarity index 100% rename from nixops/public_keys/Immae.pub rename to flakes/private/system/public_keys/Immae.pub diff --git a/flakes/rsync_backup/flake.nix b/flakes/rsync_backup/flake.nix index 6d359e5..d81d176 100644 --- a/flakes/rsync_backup/flake.nix +++ b/flakes/rsync_backup/flake.nix @@ -183,7 +183,7 @@ if [ "$skip" != "$DEST" ]; then ''; backup_profile_tail = name: profile: '' - ssh -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -i ${ssh_key} -p $PORT $DEST sh -c "date > .cache/last_backup" + ssh -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -i ${ssh_key} -p $PORT $DEST sh -c "date > .cache/last_backup" || true fi # [ "$skip" != "$DEST" ] ##### End ${name} ##### ''; @@ -228,7 +228,7 @@ ]; programs.ssh.knownHosts = lib.attrsets.mapAttrs' (name: profile: lib.attrsets.nameValuePair name { - hostNames = [ profile.host ]; + extraHostNames = [ profile.host ]; publicKey = "${profile.host_key_type} ${profile.host_key}"; }) cfg.profiles; diff --git a/flakes/secrets/flake.nix b/flakes/secrets/flake.nix index ef74a30..7bf04a4 100644 --- a/flakes/secrets/flake.nix +++ b/flakes/secrets/flake.nix @@ -3,6 +3,8 @@ outputs = { self }: { nixosModule = { config, lib, pkgs, ... }: { + # Necessary for situations where flake gets included multiple times + key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; }); options.secrets = with lib; { keys = mkOption { type = types.attrsOf (types.submodule { @@ -36,11 +38,38 @@ type = types.str; description = "Content of the entry"; }; + keyDependencies = mkOption { + default = []; + type = types.listOf (types.either types.path types.package); + description = '' + (public) system dependencies that needs to be + uploaded with the key. + + keyDependencies + ignoredKeyDependencies should + contain the exhaustive list of the text context. + + A warning will be thrown if there are remaning + dependencies from the text. + ''; + }; + ignoredKeyDependencies = mkOption { + default = []; + type = types.listOf (types.either types.path types.package); + description = '' + dependencies that must not be sent along with the key. + + keyDependencies + ignoredKeyDependencies should + contain the exhaustive list of the text context. + + A warning will be thrown if there are remaning + dependencies from the text. + ''; + }; }; }); default = {}; description = "Keys attrs to upload to the server"; - apply = lib.mapAttrsToList (dest: v: v // { inherit dest; }); + apply = builtins.mapAttrs (dest: v: v // { inherit dest; }); }; gpgKeys = mkOption { type = types.listOf types.path; @@ -74,8 +103,8 @@ # Read-only variables fullPaths = mkOption { type = types.attrsOf types.path; - default = builtins.listToAttrs - (map (v: { name = v.dest; value = "${config.secrets.location}/${v.dest}"; }) config.secrets.keys); + default = builtins.mapAttrs + (n: v: "${config.secrets.location}/${n}") config.secrets.keys; readOnly = true; description = "set of full paths to secrets"; }; @@ -83,7 +112,7 @@ config = let location = config.secrets.location; - keys = config.secrets.keys; + keys = builtins.attrValues config.secrets.keys; empty = pkgs.runCommand "empty" { preferLocalBuild = true; } "mkdir -p $out && touch $out/done"; fpath = v: "secrets/${v.dest}${lib.optionalString v.isTemplated ".gucci.tpl"}"; dumpKey = v: @@ -125,7 +154,24 @@ exclPath = builtins.concatStringsSep " -o " (map (d: " -path $TMP/${d.dest}") dirs); in lib.optionalString (builtins.length dirs > 0) " -not \\( ${exclPath} \\) "; + + checkKeyDependencies = key: + let + allDeps = builtins.map (n: if builtins.isPath n then "${n}" else n.drvPath) (key.keyDependencies ++ key.ignoredKeyDependencies); + context = builtins.attrNames (builtins.getContext key.text); + missing = builtins.foldl' (o: n: lib.remove n o) context allDeps; + in + lib.optional (!key.isDir && builtins.length missing > 0) + '' + Key ${key.dest} has non declared dependencies in its context: ${builtins.concatStringsSep " " missing} + Add them to ignoredKeyDependencies to ignore + ''; in lib.mkIf (builtins.length keys > 0) { + warnings = lib.concatMap checkKeyDependencies keys; + # FIXME: Use lib.concatMap (k: k.keyDependencies) keys in latest nixpkgs + system.extraDependencies = lib.concatMap (k: builtins.map (dep: + if builtins.isPath dep then pkgs.writeText "extra-dep" "${dep}" else dep + ) k.keyDependencies) keys; system.activationScripts.secrets = { deps = [ "users" "wrappers" ]; text = '' @@ -133,13 +179,11 @@ TMP=$(${pkgs.coreutils}/bin/mktemp -d) TMPWORK=$(${pkgs.coreutils}/bin/mktemp -d) chmod go-rwx $TMPWORK - if [ -n "$TMP" -a -n "$TMPWORK" ]; then + if [ -n "$TMP" -a -n "$TMPWORK" -a -f ${config.secrets.secretsVars} ]; then install -m0750 -o root -g keys -d $TMP ${pkgs.ssh-to-age}/bin/ssh-to-age -private-key -i ${config.secrets.decryptKey} -o $TMPWORK/keys.txt SOPS_AGE_KEY_FILE=$TMPWORK/keys.txt ${pkgs.sops}/bin/sops -d ${secrets} | ${pkgs.gnutar}/bin/tar --strip-components 1 -C $TMP -x - if [ -f ${config.secrets.secretsVars} ]; then - SOPS_AGE_KEY_FILE=$TMPWORK/keys.txt ${pkgs.sops}/bin/sops -d ${config.secrets.secretsVars} > $TMPWORK/vars.yml - fi + SOPS_AGE_KEY_FILE=$TMPWORK/keys.txt ${pkgs.sops}/bin/sops -d ${config.secrets.secretsVars} > $TMPWORK/vars.yml if [ -f $TMPWORK/vars.yml ]; then find $TMP -name "*.gucci.tpl" -exec \ /bin/sh -c 'f="{}"; ${pkgs.gucci}/bin/gucci -f '$TMPWORK'/vars.yml "$f" > "''${f%.gucci.tpl}"; touch --reference "$f" ''${f%.gucci.tpl} ; chmod --reference="$f" ''${f%.gucci.tpl} ; chown --reference="$f" ''${f%.gucci.tpl}' \; diff --git a/pkgs/webapps/surfer/default.nix b/flakes/surfer/default.nix similarity index 71% rename from pkgs/webapps/surfer/default.nix rename to flakes/surfer/default.nix index 9a04da5..7a25199 100644 --- a/pkgs/webapps/surfer/default.nix +++ b/flakes/surfer/default.nix @@ -1,9 +1,9 @@ -{ callPackage, mylibs, sources }: +{ callPackage, nodeEnv, src }: # built using node2nix -l package-lock.json # and changing "./." to "src" (callPackage ./node-packages.nix { - src = sources.webapps-surfer; - nodeEnv = callPackage mylibs.nodeEnv {}; + inherit src; + nodeEnv = callPackage nodeEnv {}; }).package.overrideAttrs(old: { postInstall = '' mkdir -p $out/bin diff --git a/flakes/surfer/flake.lock b/flakes/surfer/flake.lock new file mode 100644 index 0000000..66bea60 --- /dev/null +++ b/flakes/surfer/flake.lock @@ -0,0 +1,149 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "mypackages": "mypackages", + "nixpkgs": "nixpkgs_2", + "surfer": "surfer" + } + }, + "surfer": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/surfer/flake.nix b/flakes/surfer/flake.nix new file mode 100644 index 0000000..996104c --- /dev/null +++ b/flakes/surfer/flake.nix @@ -0,0 +1,36 @@ +{ + description = "Surfer is a Simple static file server"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.surfer = { + url = "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"; + type = "git"; + rev = "476177380452c9c7c5b1624805feedc824c5995e"; + flake = false; + }; + inputs.mypackages.url = "path:../mypackages"; + outputs = { self, nixpkgs, surfer, flake-utils, mypackages }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + nodeEnv = mypackages.mylibs.nodeEnv; + inherit (pkgs) callPackage; + in rec { + packages.surfer = callPackage ./. { inherit nodeEnv; src = surfer; }; + defaultPackage = packages.surfer; + legacyPackages.surfer = packages.surfer; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + surfer = final: prev: { + surfer = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.surfer; + }; +} diff --git a/pkgs/webapps/surfer/node-packages.nix b/flakes/surfer/node-packages.nix similarity index 100% rename from pkgs/webapps/surfer/node-packages.nix rename to flakes/surfer/node-packages.nix diff --git a/pkgs/webapps/taskwarrior-web/Gemfile.lock b/flakes/taskwarrior-web/Gemfile.lock similarity index 100% rename from pkgs/webapps/taskwarrior-web/Gemfile.lock rename to flakes/taskwarrior-web/Gemfile.lock diff --git a/pkgs/webapps/taskwarrior-web/default.nix b/flakes/taskwarrior-web/default.nix similarity index 75% rename from pkgs/webapps/taskwarrior-web/default.nix rename to flakes/taskwarrior-web/default.nix index d5368c5..7678b3c 100644 --- a/pkgs/webapps/taskwarrior-web/default.nix +++ b/flakes/taskwarrior-web/default.nix @@ -1,4 +1,4 @@ -{ ruby_2_6, bundlerEnv, mylibs, stdenv }: +{ ruby_2_6, bundlerEnv, src, stdenv }: let gems = bundlerEnv { name = "taskwarrior-web-env"; @@ -8,7 +8,10 @@ let gemdir = package.out; groups = [ "default" "local" "development" ]; }; - package = stdenv.mkDerivation (mylibs.fetchedGithub ./taskwarrior-web.json // rec { + package = stdenv.mkDerivation { + pname = "taskwarrior-web"; + version = src.shortRev; + inherit src; phases = [ "unpackPhase" "patchPhase" "installPhase" ]; patches = [ ./fixes.patch ./thin.patch ]; installPhase = '' @@ -18,5 +21,5 @@ let passthru = { inherit gems; }; - }); + }; in package diff --git a/pkgs/webapps/taskwarrior-web/fixes.patch b/flakes/taskwarrior-web/fixes.patch similarity index 56% rename from pkgs/webapps/taskwarrior-web/fixes.patch rename to flakes/taskwarrior-web/fixes.patch index 851f9f0..c4cea34 100644 --- a/pkgs/webapps/taskwarrior-web/fixes.patch +++ b/flakes/taskwarrior-web/fixes.patch @@ -11,6 +11,25 @@ index 212aed7..94c57df 100644 def format_date(timestamp) format = TaskwarriorWeb::Config.dateformat || '%-m/%-d/%Y' Time.parse(timestamp).localtime.strftime(format) +diff --git a/lib/taskwarrior-web/model/task.rb b/lib/taskwarrior-web/model/task.rb +index 212aed7..94c57df 100644 +--- a/lib/taskwarrior-web/model/task.rb ++++ b/lib/taskwarrior-web/model/task.rb +@@ -15,8 +15,14 @@ + + def initialize(attributes = {}) + attributes.each do |attr, value| ++ if attr == "uuid" ++ next ++ end + send("#{attr}=", value) if respond_to?(attr.to_sym) + end ++ if attributes.has_key? "uuid" ++ send("uuid=", attributes["uuid"]) ++ end + + @_errors = [] + @tags = [] if @tags.nil? diff --git a/lib/taskwarrior-web/services/builder/base.rb b/lib/taskwarrior-web/services/builder/base.rb index 58d246e..8f716ac 100644 --- a/lib/taskwarrior-web/services/builder/base.rb @@ -24,6 +43,44 @@ index 58d246e..8f716ac 100644 :tags => '_tags', :sync => 'sync' } +@@ -21,7 +21,7 @@ + substitute_parts if @command_string =~ /:id/ + end + parse_params +- @built = "#{@command_string}#{@params}" ++ @built = "#{@params}#{@command_string}" + end + + def task_command +@@ -43,23 +43,23 @@ + + def parse_params + string = '' +- string << %( #{@params.delete(:description).shellescape}) if @params.has_key?(:description) ++ string << %(#{@params.delete(:description).shellescape} ) if @params.has_key?(:description) + + if tags = @params.delete(:tags) + tag_indicator = TaskwarriorWeb::Config.property('tag.indicator') || '+' +- tags.each { |tag| string << %( #{tag_indicator}#{tag.to_s.shellescape}) } ++ tags.each { |tag| string << %(#{tag_indicator}#{tag.to_s.shellescape} ) } + end + + if tags = @params.delete(:remove_tags) +- tags.each { |tag| string << %( -#{tag.to_s.shellescape}) } ++ tags.each { |tag| string << %(-#{tag.to_s.shellescape} ) } + end + + @params.each do |attr, value| + if @command != :update or attr != :uuid + if value.respond_to? :each +- value.each { |val| string << %( #{attr.to_s}:\\"#{val.to_s.shellescape}\\") } ++ value.each { |val| string << %(#{attr.to_s}:\\"#{val.to_s.shellescape}\\" ) } + else +- string << %( #{attr.to_s}:\\"#{value.to_s.shellescape}\\") ++ string << %(#{attr.to_s}:\\"#{value.to_s.shellescape}\\" ) + end + end + end diff --git a/lib/taskwarrior-web/views/tasks/_form.erb b/lib/taskwarrior-web/views/tasks/_form.erb index 789e7a1..fa08698 100644 --- a/lib/taskwarrior-web/views/tasks/_form.erb diff --git a/flakes/taskwarrior-web/flake.lock b/flakes/taskwarrior-web/flake.lock new file mode 100644 index 0000000..ce87931 --- /dev/null +++ b/flakes/taskwarrior-web/flake.lock @@ -0,0 +1,62 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "taskwarrior-web": "taskwarrior-web" + } + }, + "taskwarrior-web": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flakes/taskwarrior-web/flake.nix b/flakes/taskwarrior-web/flake.nix new file mode 100644 index 0000000..b08290a --- /dev/null +++ b/flakes/taskwarrior-web/flake.nix @@ -0,0 +1,33 @@ +{ + description = "A web interface for the Taskwarrior todo application. Because being a neckbeard is only fun sometimes."; + inputs.flake-utils.url = "github:numtide/flake-utils"; + inputs.nixpkgs = { + url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742"; + flake = false; + }; + inputs.taskwarrior-web = { + url = "github:theunraveler/taskwarrior-web/a79cfe2b42791b62364118e58b21b892fff6ded8"; + flake = false; + }; + + outputs = { self, nixpkgs, taskwarrior-web, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system: + let + pkgs = import nixpkgs { inherit system; overlays = []; }; + inherit (pkgs) callPackage; + in rec { + packages.taskwarrior-web = callPackage ./. { src = taskwarrior-web; }; + defaultPackage = packages.taskwarrior-web; + legacyPackages.taskwarrior-web = packages.taskwarrior-web; + checks = { + build = defaultPackage; + }; + } + ) // rec { + overlays = { + taskwarrior-web = final: prev: { + taskwarrior-web = self.defaultPackage."${final.system}"; + }; + }; + overlay = overlays.taskwarrior-web; + }; +} diff --git a/pkgs/webapps/taskwarrior-web/gemset.nix b/flakes/taskwarrior-web/gemset.nix similarity index 100% rename from pkgs/webapps/taskwarrior-web/gemset.nix rename to flakes/taskwarrior-web/gemset.nix diff --git a/pkgs/webapps/taskwarrior-web/thin.patch b/flakes/taskwarrior-web/thin.patch similarity index 100% rename from pkgs/webapps/taskwarrior-web/thin.patch rename to flakes/taskwarrior-web/thin.patch diff --git a/lib/default.nix b/lib/default.nix deleted file mode 100644 index 7b392f1..0000000 --- a/lib/default.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ pkgs }: -with pkgs; -rec { - flakeCompat = import ./flake-compat.nix; - nodeEnv = import ./node-env.nix; - - fetchedGithub = path: - let - json = lib.importJSON path; - in rec { - version = json.tag; - pname = json.meta.name; - name = "${pname}-${version}"; - src = fetchFromGitHub json.github; - }; -} // (if builtins.pathExists ./private then callPackage ./private {} else {}) diff --git a/lib/flake-compat-patched.nix b/lib/flake-compat-patched.nix deleted file mode 100644 index 217a99f..0000000 --- a/lib/flake-compat-patched.nix +++ /dev/null @@ -1,190 +0,0 @@ -# Compatibility function to allow flakes to be used by -# non-flake-enabled Nix versions. Given a source tree containing a -# 'flake.nix' and 'flake.lock' file, it fetches the flake inputs and -# calls the flake's 'outputs' function. It then returns an attrset -# containing 'defaultNix' (to be used in 'default.nix'), 'shellNix' -# (to be used in 'shell.nix'). - -{ src, system ? builtins.currentSystem or "unknown-system" }: - -let - - lockFilePath = src + "/flake.lock"; - - lockFile = builtins.fromJSON (builtins.readFile lockFilePath); - - fetchTree = - info: - if info.type == "github" then - { outPath = fetchTarball "https://api.${info.host or "github.com"}/repos/${info.owner}/${info.repo}/tarball/${info.rev}"; - rev = info.rev; - shortRev = builtins.substring 0 7 info.rev; - lastModified = info.lastModified; - lastModifiedDate = formatSecondsSinceEpoch info.lastModified; - narHash = info.narHash; - } - else if info.type == "git" then - { outPath = - builtins.fetchGit - ({ url = info.url; } - // (if info ? rev then { inherit (info) rev; } else {}) - // (if info ? ref then { inherit (info) ref; } else {}) - ); - lastModified = info.lastModified; - lastModifiedDate = formatSecondsSinceEpoch info.lastModified; - narHash = info.narHash; - } // (if info ? rev then { - rev = info.rev; - shortRev = builtins.substring 0 7 info.rev; - } else { - }) - else if info.type == "path" then - { outPath = builtins.path { path = - if builtins.substring 0 1 info.path == "." - then builtins.toString src + "/" + info.path - else info.path; - }; - narHash = info.narHash; - } - else if info.type == "tarball" then - { outPath = fetchTarball info.url; - narHash = info.narHash; - } - else if info.type == "gitlab" then - { inherit (info) rev narHash lastModified; - outPath = fetchTarball "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}"; - shortRev = builtins.substring 0 7 info.rev; - } - else - # FIXME: add Mercurial, tarball inputs. - throw "flake input has unsupported input type '${info.type}'"; - - callFlake4 = flakeSrc: locks: - let - flake = import (flakeSrc + "/flake.nix"); - - inputs = builtins.mapAttrs (n: v: - if v.flake or true - then callFlake4 (fetchTree (v.locked // v.info)) v.inputs - else fetchTree (v.locked // v.info)) locks; - - outputs = flakeSrc // (flake.outputs (inputs // {self = outputs;})); - in - assert flake.edition == 201909; - outputs; - - callLocklessFlake = flakeSrc: - let - flake = import (flakeSrc + "/flake.nix"); - outputs = flakeSrc // (flake.outputs ({ self = outputs; })); - in outputs; - - rootSrc = let - # Try to clean the source tree by using fetchGit, if this source - # tree is a valid git repository. - tryFetchGit = src: - if isGit && !isShallow - then - let res = builtins.fetchGit src; - in if res.rev == "0000000000000000000000000000000000000000" then removeAttrs res ["rev" "shortRev"] else res - else { outPath = src; }; - # NB git worktrees have a file for .git, so we don't check the type of .git - isGit = builtins.pathExists (src + "/.git"); - isShallow = builtins.pathExists (src + "/.git/shallow"); - - in - { lastModified = 0; lastModifiedDate = formatSecondsSinceEpoch 0; } - // (if src ? outPath then src else tryFetchGit src); - - # Format number of seconds in the Unix epoch as %Y%m%d%H%M%S. - formatSecondsSinceEpoch = t: - let - rem = x: y: x - x / y * y; - days = t / 86400; - secondsInDay = rem t 86400; - hours = secondsInDay / 3600; - minutes = (rem secondsInDay 3600) / 60; - seconds = rem t 60; - - # Courtesy of https://stackoverflow.com/a/32158604. - z = days + 719468; - era = (if z >= 0 then z else z - 146096) / 146097; - doe = z - era * 146097; - yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; - y = yoe + era * 400; - doy = doe - (365 * yoe + yoe / 4 - yoe / 100); - mp = (5 * doy + 2) / 153; - d = doy - (153 * mp + 2) / 5 + 1; - m = mp + (if mp < 10 then 3 else -9); - y' = y + (if m <= 2 then 1 else 0); - - pad = s: if builtins.stringLength s < 2 then "0" + s else s; - in "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}${pad (toString minutes)}${pad (toString seconds)}"; - - allNodes = - builtins.mapAttrs - (key: node: - let - sourceInfo = - if key == lockFile.root - then rootSrc - else fetchTree (node.info or {} // removeAttrs node.locked ["dir"]); - - subdir = if key == lockFile.root then "" else node.locked.dir or ""; - - flake = import (sourceInfo + (if subdir != "" then "/" else "") + subdir + "/flake.nix"); - - inputs = builtins.mapAttrs - (inputName: inputSpec: allNodes.${resolveInput inputSpec}) - (node.inputs or {}); - - # Resolve a input spec into a node name. An input spec is - # either a node name, or a 'follows' path from the root - # node. - resolveInput = inputSpec: - if builtins.isList inputSpec - then getInputByPath lockFile.root inputSpec - else inputSpec; - - # Follow an input path (e.g. ["dwarffs" "nixpkgs"]) from the - # root node, returning the final node. - getInputByPath = nodeName: path: - if path == [] - then nodeName - else - getInputByPath - # Since this could be a 'follows' input, call resolveInput. - (resolveInput lockFile.nodes.${nodeName}.inputs.${builtins.head path}) - (builtins.tail path); - - outputs = flake.outputs (inputs // { self = result; }); - - result = outputs // sourceInfo // { inherit inputs; inherit outputs; inherit sourceInfo; }; - in - if node.flake or true then - assert builtins.isFunction flake.outputs; - result - else - sourceInfo - ) - lockFile.nodes; - - result = - if !(builtins.pathExists lockFilePath) - then callLocklessFlake rootSrc - else if lockFile.version == 4 - then callFlake4 rootSrc (lockFile.inputs) - else if lockFile.version >= 5 && lockFile.version <= 7 - then allNodes.${lockFile.root} - else throw "lock file '${lockFilePath}' has unsupported version ${toString lockFile.version}"; - -in - rec { - defaultNix = - result - // (if result ? defaultPackage.${system} then { default = result.defaultPackage.${system}; } else {}); - - shellNix = - defaultNix - // (if result ? devShell.${system} then { default = result.devShell.${system}; } else {}); - } diff --git a/lib/flake-compat.nix b/lib/flake-compat.nix deleted file mode 100644 index d3daa10..0000000 --- a/lib/flake-compat.nix +++ /dev/null @@ -1,8 +0,0 @@ -src: -(import ./flake-compat-patched.nix { inherit src; }).defaultNix -# Until https://github.com/edolstra/flake-compat/pull/18 is accepted -# (import ( -# fetchTarball { -# url = "https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz"; -# sha256 = "0x2jn3vrawwv9xp15674wjz9pixwjyj3j771izayl962zziivbx2"; -# }) { inherit src; }).defaultNix diff --git a/modules/default.nix b/modules/default.nix deleted file mode 100644 index 2f06eb1..0000000 --- a/modules/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -let - flakeCompat = import ../lib/flake-compat.nix; - flakeLib = (flakeCompat ../flakes/lib).lib; -in -{ - myids = (flakeCompat ../flakes/myuids).nixosModule; - secrets = flakeLib.withNarKeyCompat flakeCompat ../flakes/secrets "nixosModule"; - filesWatcher = flakeLib.withNarKeyCompat flakeCompat ../flakes/files-watcher "nixosModule"; - - webstats = ./webapps/webstats; - diaspora = ./webapps/diaspora.nix; - etherpad-lite = ./webapps/etherpad-lite.nix; - mastodon = ./webapps/mastodon.nix; - mediagoblin = ./webapps/mediagoblin.nix; - peertube = (flakeCompat ../flakes/peertube).nixosModule; - fiche = flakeLib.withNarKeyCompat flakeCompat ../flakes/fiche "nixosModule"; - paste = flakeLib.withNarKeyCompat flakeCompat ../flakes/paste "nixosModule"; - - opendmarc = flakeLib.withNarKeyCompat flakeCompat ../flakes/opendmarc "nixosModule"; - openarc = flakeLib.withNarKeyCompat flakeCompat ../flakes/openarc "nixosModule"; - - duplyBackup = ./duply_backup; - rsyncBackup = flakeLib.withNarKeyCompat flakeCompat ../flakes/rsync_backup "nixosModule"; - naemon = ./naemon; - - php-application = ./websites/php-application.nix; - zrepl = ./zrepl.nix; - websites = ./websites; -} // (if builtins.pathExists ./private then import ./private else {}) diff --git a/modules/naemon/default.nix b/modules/naemon/default.nix deleted file mode 100644 index 60a75b3..0000000 --- a/modules/naemon/default.nix +++ /dev/null @@ -1,183 +0,0 @@ -{ config, lib, pkgs, ... }: - -with lib; - -let - cfg = config.services.naemon; - - naemonConfig = pkgs.runCommand "naemon-config" { - objectsFile = pkgs.writeText "naemon_objects.cfg" cfg.objectDefs; - resourceFile = config.secrets.fullPaths."naemon/resources.cfg"; - extraConfig = pkgs.writeText "extra.cfg" cfg.extraConfig; - inherit (cfg) logDir varDir runDir cacheDir; - } '' - substituteAll ${./naemon.cfg} $out - cat $extraConfig >> $out - ''; -in -{ - options = { - services.naemon = { - enable = mkOption { - default = false; - description = " - Whether to use Naemon to monitor - your system or network. - "; - }; - - objectDefs = mkOption { - type = types.lines; - default = ""; - description = " - A list of Naemon object configuration that must define - the hosts, host groups, services and contacts for the - network that you want Naemon to monitor. - "; - }; - - extraResource = mkOption { - type = types.lines; - default = ""; - example = '' - # Sets $USER2$ to be the path to event handlers - #$USER2$=/usr/lib/monitoring-plugins/eventhandlers - - # Store some usernames and passwords (hidden from the CGIs) - #$USER3$=someuser - #$USER4$=somepassword - ''; - description = " - Lines to add to the resource file - # You can define $USERx$ macros in this file, which can in turn be used - # in command definitions in your host config file(s). $USERx$ macros are - # useful for storing sensitive information such as usernames, passwords, - # etc. They are also handy for specifying the path to plugins and - # event handlers - if you decide to move the plugins or event handlers to - # a different directory in the future, you can just update one or two - # $USERx$ macros, instead of modifying a lot of command definitions. - # - # Naemon supports up to 256 $USERx$ macros ($USER1$ through $USER256$) - # - # Resource files may also be used to store configuration directives for - # external data sources like MySQL... - # - "; - }; - - extraConfig = mkOption { - type = types.lines; - default = ""; - description = " - Extra config to append to main config - "; - }; - - user = mkOption { - type = types.str; - default = "naemon"; - description = "User for naemon"; - }; - - group = mkOption { - type = types.str; - default = "naemon"; - description = "Group for naemon"; - }; - - varDir = mkOption { - type = types.path; - default = "/var/lib/naemon"; - description = "The directory where naemon stores its data"; - }; - - cacheDir = mkOption { - type = types.path; - default = "/var/cache/naemon"; - description = "The directory where naemon stores its cache"; - }; - - runDir = mkOption { - type = types.path; - default = "/run/naemon"; - description = "The directory where naemon stores its runtime files"; - }; - - logDir = mkOption { - type = types.path; - default = "/var/log/naemon"; - description = "The directory where naemon stores its log files"; - }; - - package = mkOption { - type = types.package; - default = pkgs.naemon.override { - inherit (cfg) varDir cacheDir logDir runDir user group; - }; - description = '' - Naemon package to use - ''; - }; - }; - }; - - - config = mkIf cfg.enable { - secrets.keys = { - "naemon/resources.cfg" = { - user = cfg.user; - group = cfg.group; - permissions = "0400"; - text = '' - $USER1$=${pkgs.monitoring-plugins}/libexec - ${cfg.extraResource} - ''; - }; - }; - - users.users = optionalAttrs (cfg.user == "naemon") { - naemon = { - group = cfg.group; - uid = config.ids.uids.nagios; - extraGroups = [ "keys" ]; - }; - }; - users.groups = optionalAttrs (cfg.user == "naemon") { - naemon = { - gid = config.ids.gids.nagios; - }; - }; - - services.filesWatcher.naemon = { - paths = [ config.secrets.fullPaths."naemon/resources.cfg" ]; - }; - systemd.services.naemon = { - description = "Naemon monitoring daemon"; - path = [ cfg.package pkgs.monitoring-plugins ]; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - - preStart = "${cfg.package}/bin/naemon -vp ${naemonConfig}"; - script = "${cfg.package}/bin/naemon --daemon ${naemonConfig}"; - reload = "${pkgs.utillinux}/bin/kill -HUP $MAINPID"; - serviceConfig = { - User = cfg.user; - Restart = "always"; - RestartSec = 2; - StandardOutput = "journal"; - StandardError = "inherit"; - PIDFile = "${cfg.runDir}/naemon.pid"; - LogsDirectory = assert lib.strings.hasPrefix "/var/log/" cfg.logDir; - lib.strings.removePrefix "/var/log/" cfg.logDir; - CacheDirectory = assert lib.strings.hasPrefix "/var/cache/" cfg.cacheDir; - let unprefixed = lib.strings.removePrefix "/var/cache/" cfg.cacheDir; - in [ unprefixed "${unprefixed}/checkresults" ]; - StateDirectory = assert lib.strings.hasPrefix "/var/lib/" cfg.varDir; - lib.strings.removePrefix "/var/lib/" cfg.varDir; - RuntimeDirectory = assert lib.strings.hasPrefix "/run/" cfg.runDir; - lib.strings.removePrefix "/run/" cfg.runDir; - }; - }; - }; -} diff --git a/modules/private/buildbot/projects/caldance/__init__.py b/modules/private/buildbot/projects/caldance/__init__.py deleted file mode 100644 index 2074d9e..0000000 --- a/modules/private/buildbot/projects/caldance/__init__.py +++ /dev/null @@ -1,198 +0,0 @@ -from buildbot.plugins import * -from buildbot_common.build_helpers import * -import os -from buildbot.util import bytes2unicode -import json - -__all__ = [ "configure", "E" ] - -class E(): - PROJECT = "caldance" - BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT) - SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT) - PB_SOCKET = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT) - RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT) - RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT) - GIT_URL = "gitolite@git.immae.eu:perso/simon_descarpentries/www.cal-dance.com" - SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key" - SSH_HOST_KEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF" - LDAP_HOST = "ldap.immae.eu" - LDAP_DN = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu" - XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ") - - PUPPET_HOST = { - "integration": [ "-p8022", "root@caldance.cs.immae.dev"], - } - - # master.cfg - SECRETS_FILE = os.getcwd() + "/secrets" - LDAP_URL = "ldaps://ldap.immae.eu:636" - LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_BASE = "dc=immae,dc=eu" - LDAP_PATTERN = "(uid=%(username)s)" - LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=caldance,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))" - TITLE_URL = "https://caldance.cs.immae.dev" - TITLE = "Caldance" - -class CustomBase(webhooks.base): - def getChanges(self, request): - try: - content = request.content.read() - args = json.loads(bytes2unicode(content)) - except Exception as e: - raise ValueError("Error loading JSON: " + str(e)) - - args.setdefault("comments", "") - args.setdefault("repository", "") - args.setdefault("author", args.get("who", "unknown")) - - if args["category"] == "deploy_webhook": - args = { - "category": "deploy_webhook", - "comments": "", - "repository": "", - "author": "webhook", - "project": "Caldance", - "properties": { - "environment": args.get("environment", "integration"), - "build": "caldance_{}.tar.gz".format(args.get("build", "master")) - } - } - - return ([args], None) - -def deploy_hook_scheduler(project, timer=1): - return schedulers.AnyBranchScheduler( - change_filter=util.ChangeFilter(category="deploy_webhook", project=project), - name="{}_deploy".format(project), treeStableTimer=timer, builderNames=["{}_deploy".format(project)]) - -def configure(c): - c["buildbotURL"] = E.BUILDBOT_URL - c["www"]["port"] = E.SOCKET - - c["www"]["change_hook_dialects"]["base"] = { - "custom_class": CustomBase - } - c['workers'].append(worker.LocalWorker("generic-worker")) - c['workers'].append(worker.LocalWorker("deploy-worker")) - - db_lock = util.MasterLock("deploy_after_build") - - c['schedulers'].append(hook_scheduler("Caldance", timer=1)) - c['schedulers'].append(force_scheduler("force_caldance", ["Caldance_build"])) - c['schedulers'].append(deploy_scheduler("deploy_caldance", ["Caldance_deploy"])) - c['schedulers'].append(deploy_hook_scheduler("Caldance", timer=1)) - - c['builders'].append(factory("caldance", locks=[db_lock.access('exclusive')])) - - c['builders'].append(deploy_factory("caldance", locks=[db_lock.access('exclusive')])) - - c['services'].append(SlackStatusPush( - name="slack_status_caldance", - builders=["Caldance_build", "Caldance_deploy"], - serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip())) - c['services'].append(XMPPStatusPush( - name="xmpp_status_caldance", - builders=["Caldance_build", "Caldance_deploy"], - recipients=E.XMPP_RECIPIENTS, - password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip())) - -def factory(project, locks=[], ignore_fails=False): - release_file = "{1}/{0}_%(kw:clean_branch)s.tar.gz" - - package = util.Interpolate("{0}_%(kw:clean_branch)s.tar.gz".format(project), clean_branch=clean_branch) - package_dest = util.Interpolate(release_file.format(project, E.RELEASE_PATH), clean_branch=clean_branch) - package_url = util.Interpolate(release_file.format(project, E.RELEASE_URL), clean_branch=clean_branch) - - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.GIT_URL, - sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addSteps(package_and_upload(package, package_dest, package_url)) - - return util.BuilderConfig( - name="{}_build".format(project.capitalize()), - locks=locks, - workernames=["generic-worker"], factory=factory) - -def compute_build_infos(project): - @util.renderer - def compute(props): - import re, hashlib - build_file = props.getProperty("build") - package_dest = "{1}/{0}".format(build_file, E.RELEASE_PATH) - version = re.match(r"{0}_(.*).tar.gz".format(project), build_file).group(1) - with open(package_dest, "rb") as f: - sha = hashlib.sha256(f.read()).hexdigest() - return { - "build_version": version, - "build_hash": sha, - } - return compute - -@util.renderer -def puppet_ssh_command(props): - environment = props["environment"] if props.hasProperty("environment") else "integration" - ssh_command = [ - "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", - "-i", E.SSH_KEY_PATH ] - return ssh_command + E.PUPPET_HOST.get(environment, ["host.invalid"]) - -def deploy_factory(project, locks=[]): - package_dest = util.Interpolate("{0}/%(prop:build)s".format(E.RELEASE_PATH)) - - factory = util.BuildFactory() - factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest])) - factory.addStep(steps.SetProperties(properties=compute_build_infos(project))) - factory.addStep(LdapPush(environment=util.Property("environment"), - project=project, build_version=util.Property("build_version"), - build_hash=util.Property("build_hash"), ldap_password=util.Secret("ldap"))) - factory.addStep(steps.MasterShellCommand(command=puppet_ssh_command)) - return util.BuilderConfig( - name="{}_deploy".format(project.capitalize()), - locks=locks, - workernames=["deploy-worker"], factory=factory) - -from twisted.internet import defer -from buildbot.process.buildstep import FAILURE -from buildbot.process.buildstep import SUCCESS -from buildbot.process.buildstep import BuildStep - -class LdapPush(BuildStep): - name = "LdapPush" - renderables = ["environment", "project", "build_version", "build_hash", "ldap_password"] - - def __init__(self, **kwargs): - self.environment = kwargs.pop("environment") - self.project = kwargs.pop("project") - self.build_version = kwargs.pop("build_version") - self.build_hash = kwargs.pop("build_hash") - self.ldap_password = kwargs.pop("ldap_password") - self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST) - super().__init__(**kwargs) - - def run(self): - import json - from ldap3 import Reader, Writer, Server, Connection, ObjectDef - server = Server(self.ldap_host) - conn = Connection(server, - user=E.LDAP_DN, - password=self.ldap_password) - conn.bind() - obj = ObjectDef("immaePuppetClass", conn) - r = Reader(conn, obj, - "cn=caldance.{},{}".format(self.environment, E.LDAP_ROLES_BASE)) - r.search() - if len(r) > 0: - w = Writer.from_cursor(r) - for value in w[0].immaePuppetJson.values: - config = json.loads(value) - if "role::caldance::{}_version".format(self.project) in config: - config["role::caldance::{}_version".format(self.project)] = self.build_version - config["role::caldance::{}_sha256".format(self.project)] = self.build_hash - w[0].immaePuppetJson -= value - w[0].immaePuppetJson += json.dumps(config, indent=" ") - w.commit() - return defer.succeed(SUCCESS) - return defer.succeed(FAILURE) diff --git a/modules/private/buildbot/projects/cryptoportfolio/__init__.py b/modules/private/buildbot/projects/cryptoportfolio/__init__.py deleted file mode 100644 index 5d70f95..0000000 --- a/modules/private/buildbot/projects/cryptoportfolio/__init__.py +++ /dev/null @@ -1,169 +0,0 @@ -from buildbot.plugins import * -from buildbot_common.build_helpers import * -import os - -__all__ = [ "configure", "E" ] - -class E(): - PROJECT = "cryptoportfolio" - BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT) - SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT) - PB_SOCKET = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT) - RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT) - RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT) - GIT_URL = "https://git.immae.eu/perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/{0}.git" - SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key" - LDAP_HOST = "ldap.immae.eu" - LDAP_DN = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu" - - PUPPET_HOST = { - "production": "root@cryptoportfolio.immae.eu", - "integration": "root@cryptoportfolio-dev.immae.eu" - } - - # master.cfg - SECRETS_FILE = os.getcwd() + "/secrets" - LDAP_URL = "ldaps://ldap.immae.eu:636" - LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_BASE = "dc=immae,dc=eu" - LDAP_PATTERN = "(uid=%(username)s)" - LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=cryptoportfolio,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))" - TITLE_URL = "https://git.immae.eu" - TITLE = "Cryptoportfolio" - -# eval .. dans .zshrc_local -# mkdir -p $BUILD/go -# export GOPATH=$BUILD/go -# go get -u github.com/golang/dep/cmd/dep -# export PATH=$PATH:$BUILD/go/bin -# go get git.immae.eu/Cryptoportfolio/Front.git -# cd $BUILD/go/src/git.immae.eu/Cryptoportfolio/Front.git -# git checkout dev -# dep ensure -def configure(c): - c["buildbotURL"] = E.BUILDBOT_URL - c["www"]["port"] = E.SOCKET - - c['workers'].append(worker.LocalWorker("generic-worker")) - c['workers'].append(worker.LocalWorker("deploy-worker")) - - c['schedulers'].append(hook_scheduler("Trader")) - c['schedulers'].append(hook_scheduler("Front")) - c['schedulers'].append(force_scheduler( - "force_cryptoportfolio", ["Trader_build", "Front_build"])) - c['schedulers'].append(deploy_scheduler("deploy_cryptoportfolio", - ["Trader_deploy", "Front_deploy"])) - - c['builders'].append(factory("trader")) - c['builders'].append(factory("front", ignore_fails=True)) - - c['builders'].append(deploy_factory("trader")) - c['builders'].append(deploy_factory("front")) - - c['services'].append(SlackStatusPush( - name="slack_status_cryptoportfolio", - builders=["Front_build", "Trader_build", "Front_deploy", "Trader_deploy"], - serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip())) - -def factory(project, ignore_fails=False): - release_file = "{1}/{0}/{0}_%(kw:clean_branch)s.tar.gz" - - url = E.GIT_URL.format(project.capitalize()) - - package = util.Interpolate("{0}_%(kw:clean_branch)s.tar.gz".format(project), clean_branch=clean_branch) - package_dest = util.Interpolate(release_file.format(project, E.RELEASE_PATH), clean_branch=clean_branch) - package_url = util.Interpolate(release_file.format(project, E.RELEASE_URL), clean_branch=clean_branch) - - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=url, - mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="make install", - logEnviron=False, haltOnFailure=(not ignore_fails), - warnOnFailure=ignore_fails, flunkOnFailure=(not ignore_fails), - command=["make", "install"])) - factory.addStep(steps.ShellCommand(name="make test", - logEnviron=False, haltOnFailure=(not ignore_fails), - warnOnFailure=ignore_fails, flunkOnFailure=(not ignore_fails), - command=["make", "test"])) - factory.addSteps(package_and_upload(package, package_dest, package_url)) - - return util.BuilderConfig( - name="{}_build".format(project.capitalize()), - workernames=["generic-worker"], factory=factory) - -def compute_build_infos(project): - @util.renderer - def compute(props): - import re, hashlib - build_file = props.getProperty("build") - package_dest = "{2}/{0}/{1}".format(project, build_file, E.RELEASE_PATH) - version = re.match(r"{0}_(.*).tar.gz".format(project), build_file).group(1) - with open(package_dest, "rb") as f: - sha = hashlib.sha256(f.read()).hexdigest() - return { - "build_version": version, - "build_hash": sha, - } - return compute - -@util.renderer -def puppet_host(props): - environment = props["environment"] if props.hasProperty("environment") else "integration" - return E.PUPPET_HOST.get(environment, "host.invalid") - -def deploy_factory(project): - package_dest = util.Interpolate("{1}/{0}/%(prop:build)s".format(project, E.RELEASE_PATH)) - - factory = util.BuildFactory() - factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest])) - factory.addStep(steps.SetProperties(properties=compute_build_infos(project))) - factory.addStep(LdapPush(environment=util.Property("environment"), - project=project, build_version=util.Property("build_version"), - build_hash=util.Property("build_hash"), ldap_password=util.Secret("ldap"))) - factory.addStep(steps.MasterShellCommand(command=[ - "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", "-i", E.SSH_KEY_PATH, puppet_host])) - return util.BuilderConfig(name="{}_deploy".format(project.capitalize()), workernames=["deploy-worker"], factory=factory) - -from twisted.internet import defer -from buildbot.process.buildstep import FAILURE -from buildbot.process.buildstep import SUCCESS -from buildbot.process.buildstep import BuildStep - -class LdapPush(BuildStep): - name = "LdapPush" - renderables = ["environment", "project", "build_version", "build_hash", "ldap_password"] - - def __init__(self, **kwargs): - self.environment = kwargs.pop("environment") - self.project = kwargs.pop("project") - self.build_version = kwargs.pop("build_version") - self.build_hash = kwargs.pop("build_hash") - self.ldap_password = kwargs.pop("ldap_password") - self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST) - super().__init__(**kwargs) - - def run(self): - import json - from ldap3 import Reader, Writer, Server, Connection, ObjectDef - server = Server(self.ldap_host) - conn = Connection(server, - user=E.LDAP_DN, - password=self.ldap_password) - conn.bind() - obj = ObjectDef("immaePuppetClass", conn) - r = Reader(conn, obj, - "cn=cryptoportfolio.{},{}".format(self.environment, E.LDAP_ROLES_BASE)) - r.search() - if len(r) > 0: - w = Writer.from_cursor(r) - for value in w[0].immaePuppetJson.values: - config = json.loads(value) - if "role::cryptoportfolio::{}_version".format(self.project) in config: - config["role::cryptoportfolio::{}_version".format(self.project)] = self.build_version - config["role::cryptoportfolio::{}_sha256".format(self.project)] = self.build_hash - w[0].immaePuppetJson -= value - w[0].immaePuppetJson += json.dumps(config, indent=" ") - w.commit() - return defer.succeed(SUCCESS) - return defer.succeed(FAILURE) diff --git a/modules/private/buildbot/projects/denise/__init__.py b/modules/private/buildbot/projects/denise/__init__.py deleted file mode 100644 index abeba3c..0000000 --- a/modules/private/buildbot/projects/denise/__init__.py +++ /dev/null @@ -1,186 +0,0 @@ -from buildbot.plugins import * -from buildbot_common.build_helpers import * -import os -from buildbot.util import bytes2unicode -import json - -__all__ = [ "configure", "E" ] - -class E(): - PROJECT = "denise" - BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT) - SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT) - PB_SOCKET = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT) - SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key" - SSH_HOST_KEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF" - - BINGO_RELEASE_PATH = "/var/lib/buildbot/outputs/denise/bingo" - BINGO_BETA_PATH = "/var/lib/buildbot/outputs/denise/bingo_beta" - BINGO_GIT_URL = "gitolite@git.immae.eu:perso/Denise/bingo" - - OMS_RELEASE_PATH = "/var/lib/buildbot/outputs/denise/oms" - OMS_BETA_PATH = "/var/lib/buildbot/outputs/denise/oms_beta" - OMS_GIT_URL = "gitolite@git.immae.eu:perso/Denise/oms" - - AVENTURIERS_RELEASE_PATH = "/var/lib/buildbot/outputs/denise/aventuriers" - AVENTURIERS_GIT_URL = "https://git.immae.eu/perso/Denise/aventuriers.git" - - # master.cfg - SECRETS_FILE = os.getcwd() + "/secrets" - LDAP_URL = "ldaps://ldap.immae.eu:636" - LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_BASE = "dc=immae,dc=eu" - LDAP_PATTERN = "(uid=%(username)s)" - LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=denise,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))" - TITLE_URL = "https://oms.syanni.eu" - TITLE = "Syanni website" - -class CustomBase(webhooks.base): - def getChanges(self, request): - try: - content = request.content.read() - args = json.loads(bytes2unicode(content)) - except Exception as e: - raise ValueError("Error loading JSON: " + str(e)) - - args.setdefault("comments", "") - args.setdefault("repository", "") - args.setdefault("author", args.get("who", "unknown")) - - return ([args], None) - -def configure(c): - c["buildbotURL"] = E.BUILDBOT_URL - c["www"]["port"] = E.SOCKET - - c["www"]["change_hook_dialects"]["base"] = { - "custom_class": CustomBase - } - c['workers'].append(worker.LocalWorker("generic-worker-denise")) - - c['schedulers'].append(hook_scheduler("DeniseBingo", timer=1)) - c['schedulers'].append(hook_scheduler("DeniseOMS", timer=1)) - c['schedulers'].append(hook_scheduler("DeniseAventuriers", timer=1)) - c['schedulers'].append(force_scheduler("force_denise", [ - "DeniseBingo_build", "DeniseOMS_build", "DeniseAventuriers_build" - ])) - - c['builders'].append(denise_oms_factory()) - c['builders'].append(denise_bingo_factory()) - c['builders'].append(denise_aventuriers_factory()) - -def denise_bingo_factory(): - @util.renderer - def bingo_run_path(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return "/run/denise_bingo/gunicorn.pid" - else: - return "/run/denise_bingo_beta/gunicorn.pid" - - @util.renderer - def bingo_systemd_service(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return "denise-bingo" - else: - return "denise-bingo-beta" - - @util.renderer - def bingo_url(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return "https://bingo.syanni.eu" - else: - return "https://beta.bingo.syanni.eu" - - @util.renderer - def bingo_path(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return E.BINGO_RELEASE_PATH - else: - return E.BINGO_BETA_PATH - - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.BINGO_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.MasterShellCommand(command=util.Interpolate("rm -rf %(kw:bingo_path)s", bingo_path=bingo_path))) - factory.addStep(steps.DirectoryUpload(workersrc="../source", - masterdest=bingo_path, - url=bingo_url)) - factory.addStep(steps.MasterShellCommand(command=util.Interpolate("chmod -R a+rX %(kw:bingo_path)s", bingo_path=bingo_path))) - factory.addStep(steps.MasterShellCommand(command=util.Interpolate("/run/wrappers/bin/sudo systemctl restart %(kw:bingo_service)s.service", bingo_service=bingo_systemd_service))) - - return util.BuilderConfig(name="DeniseBingo_build", workernames=["generic-worker-denise"], factory=factory) - -def denise_oms_factory(): - @util.renderer - def oms_run_path(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return "/run/denise_oms/gunicorn.pid" - else: - return "/run/denise_oms_beta/gunicorn.pid" - - @util.renderer - def oms_systemd_service(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return "denise-oms" - else: - return "denise-oms-beta" - - @util.renderer - def oms_url(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return "https://oms.syanni.eu" - else: - return "https://beta.oms.syanni.eu" - - @util.renderer - def oms_path(props): - if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master": - return E.OMS_RELEASE_PATH - else: - return E.OMS_BETA_PATH - - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.OMS_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.MasterShellCommand(command=util.Interpolate("rm -rf %(kw:oms_path)s", oms_path=oms_path))) - factory.addStep(steps.DirectoryUpload(workersrc="../source", - masterdest=oms_path, - url=oms_url)) - factory.addStep(steps.MasterShellCommand(command=util.Interpolate("chmod -R a+rX %(kw:oms_path)s", oms_path=oms_path))) - factory.addStep(steps.MasterShellCommand(command=util.Interpolate("/run/wrappers/bin/sudo systemctl restart %(kw:oms_service)s.service", oms_service=oms_systemd_service))) - - return util.BuilderConfig(name="DeniseOMS_build", workernames=["generic-worker-denise"], factory=factory) - -def denise_aventuriers_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_Aventuriers"] + ":${PATH}", - "TZ": "Europe/Paris", - } - - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.AVENTURIERS_GIT_URL, - submodules=True, mode="full", method="fresh")) - factory.addStep(steps.ShellCommand(name="build files", - logEnviron=False, haltOnFailure=True, workdir="build", - env=path_env, command=["make", "tout", "encyclo"])) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.AVENTURIERS_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../build/html", - masterdest=E.AVENTURIERS_RELEASE_PATH, - url="https://aventuriers.syanni.eu")) - factory.addStep(steps.FileUpload(name="upload epub file", workersrc="aventuriers.epub", - workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/aventuriers.epub", - url="https://aventuriers.syanni.eu/aventuriers.epub", mode=0o644)) - factory.addStep(steps.FileUpload(name="upload mobi file", workersrc="aventuriers.mobi", - workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/aventuriers.mobi", - url="https://aventuriers.syanni.eu/aventuriers.mobi", mode=0o644)) - factory.addStep(steps.FileUpload(name="upload pdf file", workersrc="aventuriers.pdf", - workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/aventuriers.pdf", - url="https://aventuriers.syanni.eu/aventuriers.pdf", mode=0o644)) - factory.addStep(steps.FileUpload(name="upload encyclo pdf file", workersrc="encyclo.pdf", - workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/encyclo.pdf", - url="https://aventuriers.syanni.eu/encyclo.pdf", mode=0o644)) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.AVENTURIERS_RELEASE_PATH))) - - return util.BuilderConfig(name="DeniseAventuriers_build", workernames=["generic-worker-denise"], factory=factory) diff --git a/modules/private/buildbot/projects/immaeEu/__init__.py b/modules/private/buildbot/projects/immaeEu/__init__.py deleted file mode 100644 index 83265cd..0000000 --- a/modules/private/buildbot/projects/immaeEu/__init__.py +++ /dev/null @@ -1,314 +0,0 @@ -from buildbot.plugins import * -from buildbot_common.build_helpers import * -import os -from buildbot.util import bytes2unicode -import json - -__all__ = [ "configure", "E" ] - -class E(): - PROJECT = "immaeEu" - BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT) - SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT) - PB_SOCKET = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT) - SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key" - SSH_HOST_KEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF" - XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ") - - BIP39_GIT_URL = "https://git.immae.eu/perso/Immae/Projets/Cryptomonnaies/BIP39.git" - IMMAE_EU_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/Blog" - HISTORY_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/History" - RECETTES_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/Recettes" - COURS_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/Cours" - DOCS_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/Docs" - NORMALESUP_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Projets/Sites/Normalesup" - - COURS_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/cours" - COURS_TARBALL_PATH = "/var/lib/ftp/release.immae.eu/cours" - COURS_TARBALL_URL = "https://release.immae.eu/cours" - BIP39_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/bip39" - HISTORY_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/history" - IMMAE_EU_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/blog" - DOCS_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/docs" - RECETTES_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/recettes" - NORMALESUP_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/recherche" - GSMCELLS_RELEASE_PATH = "/var/lib/ftp/release.immae.eu/gsm_cells" - GSMCELLS_RELEASE_URL = "https://release.immae.eu/gsm_cells" - - # master.cfg - SECRETS_FILE = os.getcwd() + "/secrets" - LDAP_URL = "ldaps://ldap.immae.eu:636" - LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_BASE = "dc=immae,dc=eu" - LDAP_PATTERN = "(uid=%(username)s)" - LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=immaeEu,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))" - TITLE_URL = "https://www.immae.eu" - TITLE = "Immae website" - -class CustomBase(webhooks.base): - def getChanges(self, request): - try: - content = request.content.read() - args = json.loads(bytes2unicode(content)) - except Exception as e: - raise ValueError("Error loading JSON: " + str(e)) - - args.setdefault("comments", "") - args.setdefault("repository", "") - args.setdefault("author", args.get("who", "unknown")) - - return ([args], None) - -def configure(c): - c["buildbotURL"] = E.BUILDBOT_URL - c["www"]["port"] = E.SOCKET - - c["www"]["change_hook_dialects"]["base"] = { - "custom_class": CustomBase - } - c['workers'].append(worker.LocalWorker("generic-worker-immae-eu")) - - c['schedulers'].append(hook_scheduler("ImmaeEu", timer=1)) - c['schedulers'].append(hook_scheduler("Normalesup", timer=1)) - c['schedulers'].append(hook_scheduler("Cours", timer=1)) - c['schedulers'].append(hook_scheduler("Recettes", timer=1)) - c['schedulers'].append(hook_scheduler("Docs", timer=1)) - c['schedulers'].append(hook_scheduler("History", timer=1)) - c['schedulers'].append(hook_scheduler("BIP39", timer=1)) - c['schedulers'].append(schedulers.Nightly(name="GSMCells-weekly", - builderNames=["GSMCells_build"], dayOfWeek=6, hour=3)) - c['schedulers'].append(force_scheduler("force_immae_eu", [ - "ImmaeEu_build", "Normalesup_build", "Cours_build", "Docs_build", - "Recettes_build", "History_build", "BIP39_build" - ])) - c['schedulers'].append(schedulers.ForceScheduler( - name="GSMCells-force", label="Force build", - buttonName="Force build", - reason=util.StringParameter(name="reason", label="Reason", default="Force build"), - codebases=[ - util.CodebaseParameter("", - branch=util.FixedParameter(name="branch", default=""), - revision=util.FixedParameter(name="revision", default=""), - repository=util.FixedParameter(name="repository", default=""), - project=util.FixedParameter(name="project", default=""), - ), - ], - username=util.FixedParameter(name="username", default="Web button"), - builderNames=["GSMCells_build"] - )) - - c['builders'].append(immae_eu_factory()) - c['builders'].append(normalesup_factory()) - c['builders'].append(cours_factory()) - c['builders'].append(gsm_cells_factory()) - c['builders'].append(recettes_factory()) - c['builders'].append(docs_factory()) - c['builders'].append(history_factory()) - c['builders'].append(bip39_factory()) - - c['services'].append(SlackStatusPush( - name="slack_status_immae_eu_project", - builders=[ - "ImmaeEu_build", "Normalesup_build", "Cours_build", "Docs_build", - "GSMCells_build", "Recettes_build", "History_build", - "BIP39_build" - ], - serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip())) - c['services'].append(XMPPStatusPush( - name="xmpp_status_immae_eu_project", - builders=[ - "ImmaeEu_build", "Normalesup_build", "Cours_build", "Docs_build", - "GSMCells_build", "Recettes_build", "History_build", - "BIP39_build" - ], - recipients=E.XMPP_RECIPIENTS, - password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip())) - -def history_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_History"] + ":${PATH}" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.HISTORY_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="build website", - logEnviron=False, haltOnFailure=True, workdir="source", - env=path_env, command=["jekyll", "build"])) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.HISTORY_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../source/_site", - masterdest=E.HISTORY_RELEASE_PATH, - url="https://www.immae.eu/history")) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.HISTORY_RELEASE_PATH))) - - return util.BuilderConfig(name="History_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def docs_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_Docs"] + ":${PATH}" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.DOCS_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="build website", - logEnviron=False, haltOnFailure=True, workdir="source", - env=path_env, command=["make", "clean", "html"])) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.DOCS_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../source/_build/html", - masterdest=E.DOCS_RELEASE_PATH, - url="https://www.immae.eu/docs")) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.DOCS_RELEASE_PATH))) - - return util.BuilderConfig(name="Docs_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def recettes_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_Recettes"] + ":${PATH}" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.RECETTES_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(NixShellCommand(name="build website", - logEnviron=False, haltOnFailure=True, workdir="source", - env=path_env, command="jekyll build --trace --baseurl /recettes")) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.RECETTES_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../source/_site", - masterdest=E.RECETTES_RELEASE_PATH, - url="https://www.immae.eu/recettes")) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.RECETTES_RELEASE_PATH))) - - return util.BuilderConfig(name="Recettes_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def bip39_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_BIP39"] + ":${PATH}" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.BIP39_GIT_URL, - submodules=True, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="build file", - logEnviron=False, haltOnFailure=True, workdir="source", - env=path_env, command=["python", "compile.py"])) - factory.addStep(steps.FileUpload(name="upload file", workersrc="bip39-standalone.html", - workdir="source", masterdest=E.BIP39_RELEASE_PATH + "/index.html", - url="https://tools.immae.eu/BIP39", mode=0o644)) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.BIP39_RELEASE_PATH))) - - return util.BuilderConfig(name="BIP39_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def immae_eu_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_ImmaeEu"] + ":${PATH}" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.IMMAE_EU_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="build website", - logEnviron=False, haltOnFailure=True, workdir="source", - env=path_env, command=["make", "html"])) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.IMMAE_EU_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../source/output", - masterdest=E.IMMAE_EU_RELEASE_PATH, - url="https://www.immae.eu")) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.IMMAE_EU_RELEASE_PATH))) - - return util.BuilderConfig(name="ImmaeEu_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def cours_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_Cours"] + ":${PATH}", - "CI": "yes" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.COURS_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="build website", - logEnviron=False, haltOnFailure=True, workdir="source", - command=["make", "build"], env=path_env)) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.COURS_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../source/build", - masterdest=E.COURS_RELEASE_PATH, - url="https://www.immae.eu/cours")) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.COURS_RELEASE_PATH))) - - factory.addStep(steps.ShellCommand(name="build pdfs", - logEnviron=False, haltOnFailure=True, workdir="source", - command=["make", "pdfs"], env=path_env)) - - package = util.Interpolate("cours_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch) - release_file = "{0}/cours_%(kw:clean_branch)s.tar.gz" - package_dest = util.Interpolate(release_file.format(E.COURS_TARBALL_PATH), clean_branch=clean_branch) - package_url = util.Interpolate(release_file.format(E.COURS_TARBALL_URL), clean_branch=clean_branch) - factory.addStep(steps.ShellCommand(name="build pdf tarball", - logEnviron=False, haltOnFailure=True, workdir="source", - command=["tar", "-cvf", package, "-C", "pdfs", "mp", "mpsi"], env=path_env)) - factory.addStep(steps.FileUpload(name="upload package", workersrc=package, - workdir="source", masterdest=package_dest, - url=package_url, mode=0o644)) - - return util.BuilderConfig(name="Cours_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def normalesup_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_Normalesup"] + ":${PATH}" - } - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, repourl=E.NORMALESUP_GIT_URL, - submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(), - sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="build website", - logEnviron=False, haltOnFailure=True, workdir="source", - command=["make", "build"], env=path_env)) - factory.addStep(steps.ShellCommand(name="give read access to all files", - logEnviron=False, haltOnFailure=True, workdir="source", - command="chmod -R a+rX build", env=path_env)) - factory.addStep(steps.ShellCommand(name="synchronize with phare", - logEnviron=False, haltOnFailure=True, workdir="source", - env=path_env, command=[ - "rsync", "-av", "--delete", - "-e", "ssh -i {} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o CheckHostIP=no".format(E.SSH_KEY_PATH), - "build/", - os.environ["BUILDBOT_NORMALESUP_HOST"] - ])) - factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.NORMALESUP_RELEASE_PATH))) - factory.addStep(steps.DirectoryUpload(workersrc="../source/build", masterdest=E.NORMALESUP_RELEASE_PATH, - url="https://www.immae.eu/recherche")) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.NORMALESUP_RELEASE_PATH))) - - return util.BuilderConfig(name="Normalesup_build", workernames=["generic-worker-immae-eu"], factory=factory) - -def gsm_cells_factory(): - path_env = { - "PATH": os.environ["BUILDBOT_PATH_GSMCells"] + ":${PATH}", - "IN_BUILDBOT": "yes", - } - master_env = { - "HTACCESS": ''' - Options +FollowSymLinks - IndexIgnore * - ''' - } - for k, v in os.environ.items(): - if k.startswith("BUILDBOT_GSM_CELLS_"): - path_env[k[len("BUILDBOT_GSM_CELLS_"):]] = v - - script = os.environ["BUILDBOT_PROJECT_DIR"] + "/scripts/lacells_download" - factory = util.BuildFactory() - factory.addStep(steps.ShellCommand(name="download files", - logEnviron=False, haltOnFailure=True, command=[script], env=path_env)) - factory.addStep(steps.ShellCommand(name="give read access to all files", - logEnviron=False, haltOnFailure=True, - command="chmod a+r lacells.db", env=path_env)) - factory.addStep(steps.FileUpload(workersrc="lacells.db", - masterdest=(E.GSMCELLS_RELEASE_PATH+"/lacells.db"), url=(E.GSMCELLS_RELEASE_URL+"/lacells.db"))) - factory.addStep(steps.MasterShellCommand(command="touch {}/.duplicity-ignore".format(E.GSMCELLS_RELEASE_PATH))) - factory.addStep(steps.MasterShellCommand(command='echo "$HTACCESS" > {}/.htaccess'.format(E.GSMCELLS_RELEASE_PATH), - env=master_env)) - factory.addStep(steps.MasterShellCommand(command="ln -sf lacells.db {}/lacells.db.new".format(E.GSMCELLS_RELEASE_PATH))) - factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.GSMCELLS_RELEASE_PATH))) - - return util.BuilderConfig(name="GSMCells_build", workernames=["generic-worker-immae-eu"], factory=factory) diff --git a/modules/private/buildbot/projects/immaeEu/scripts/lacells_download b/modules/private/buildbot/projects/immaeEu/scripts/lacells_download deleted file mode 100755 index 1193cf3..0000000 --- a/modules/private/buildbot/projects/immaeEu/scripts/lacells_download +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env bash - -# FLG - Fast Lacells.db Generator -# -# Simple script to quickly download and generate lacells.db for LocalGSMBackend by n76 -# https://github.com/n76/Local-GSM-Backend -# Uses Mozilla Location Service, OpenCellID and radiocells.org databases as source -# Based on lacells-creator by wvengen and n76 -# -# Licensed under GPLv3 or later -# (C)2016 Sebastian Obrusiewicz -# sobrus@o2.pl - -if [ -z "$IN_BUILDBOT" ]; then -#DEFAULT_CONFIG_BEGIN -ENABLE_OCI=1 #enable OpenCellID data source -ENABLE_MOZ=1 #enable Mozilla Location Services (MLS) data source -ENABLE_RCO=0 #enable radiocells.org data source (it can be quite slow) - -# See https://en.wikipedia.org/wiki/Mobile_country_code -# 208 France -MCC="" #contry codes separated with "|", for example "260|262". Leave dot+asterisk ".*" for all countries -RCO_SRC_FILE="fr.sqlite" #radiocells.org source database file, set "openbmap.sqlite" for entire world database, see https://radiocells.org/downloads for smaller country specific files, for example "pl.sqlite" for Poland -RADIO="" #you can remove LTE if your phone does not support it -TOKEN="" #your OCID token, required to download from OpenCellID. Get your free token at https://opencellid.org/ -fi -TMPDIR='.' #for temporary files only, use disk if you don't have enough RAM, AND remember to have enough disk space in /var/tmp for sqlite temporary files -KEEP_FILES=1 #whether to keep (1) or delete (0) the CSV files after processing - -#do not edit following variables, unless you know what you're doing -EMPTY=',,,,,,,,,,,,,' #dummy empty file for disabled sources -OCI_FILE=$TMPDIR"/ocid.csv" #opencellid temporary file -MOZ_FILE=$TMPDIR"/mozilla.csv" #mozilla temporary file -RCO_FILE=$TMPDIR"/rco.csv" #radiocells.org temporary file -#DEFAULT_CONFIG_END - -#USER_CONFIG_BEGIN -BINDIR=$( dirname "$(readlink -f "$0")" ) #" -if [[ -f "${BINDIR}/config" ]]; then - . "${BINDIR}/config" -fi -#USER_CONFIG_END - -function manage_backup -{ - file=$1 - if [ -s $file ] - then - if [ $KEEP_FILES == "1" ] - then - gzip -kf $file - fi - elif [ -s $file".gz" ] && [ "${file##*.}" == "csv" ] - then - echo "Using" $file".gz backup file" - gzip -dkf $file".gz" - fi -} - - -function download_ocid -{ - URL="https://opencellid.org/ocid/downloads?token=${TOKEN}&type=full&file=cell_towers.csv.gz" - if [ $ENABLE_OCI == "1" ] - then - wget -qO- "$URL" | gunzip | egrep "^($RADIO),($MCC)," > $OCI_FILE - manage_backup $OCI_FILE - else - echo $EMPTY > $OCI_FILE - fi -} - -function download_mozilla -{ - if [ $ENABLE_MOZ == "1" ] - then - NW=`date -u "+%Y-%m-%d"` - wget -qO- "https://d17pt8qph6ncyq.cloudfront.net/export/MLS-full-cell-export-${NW}T000000.csv.gz" | gunzip | egrep "^($RADIO),($MCC)," > $MOZ_FILE - manage_backup $MOZ_FILE - else - echo $EMPTY > $MOZ_FILE - fi -} - -function download_radiocells -{ - if [ $ENABLE_RCO == "1" ] - then - RCO_SELECT="SELECT technology, mcc, mnc, area, cid, NULL, longitude, latitude, 1000 accuracy, measurements, NULL, NULL, NULL, NULL FROM cell_zone;" - wget -qO- "https://cdn.radiocells.org/"$RCO_SRC_FILE > $TMPDIR"/"$RCO_SRC_FILE - sqlite3 -header -csv $TMPDIR"/"$RCO_SRC_FILE "$RCO_SELECT" | egrep "^($RADIO),($MCC)," > $RCO_FILE - rm $TMPDIR"/"$RCO_SRC_FILE - manage_backup $RCO_FILE - else - echo $EMPTY > $RCO_FILE - fi -} - -echo "Downloading data" - -download_ocid & -OP=$! -download_mozilla & -MO=$! -download_radiocells & -RO=$! - -wait $OP -wait $MO -wait $RO - -if [ -s $MOZ_FILE ] && [ -s $OCI_FILE ] && [ -s $RCO_FILE ] -then - -manage_backup lacells.db -rm lacells.db - -echo "Generating database" - -sqlite3 lacells.db <<-SQL -PRAGMA synchronous = OFF; -PRAGMA journal_mode = OFF; - -CREATE TEMP TABLE cells_import (radio TEXT,mcc INTEGER,mnc INTEGER,lac INTEGER,cid INTEGER,unit STRING,longitude NUMERIC,latitude NUMERIC,accuracy INTEGER,samples INTEGER,changeable BOOLEAN,created INTEGER,updated INTEGER, avgSignal INTEGER); -CREATE TABLE cells (mcc INTEGER,mnc INTEGER,lac INTEGER,cid INTEGER,longitude REAL,latitude REAL,altitude REAL,accuracy REAL,samples INTEGER); - -.header on -.mode csv - -.import "$OCI_FILE" cells_import -.import "$MOZ_FILE" cells_import -.import "$RCO_FILE" cells_import - -UPDATE cells_import SET samples=1 WHERE samples IS NULL OR samples < 1; - -INSERT INTO cells -SELECT mcc, mnc, lac, cid, - sum(longitude * samples) / sum(samples) as longitude, - sum(latitude * samples) / sum(samples) as latitude, - -1 as altitude, - sum(accuracy * samples) / sum(samples) as accuracy, - sum(samples) as samples -FROM cells_import -GROUP BY mcc, mnc, lac, cid; - -DROP TABLE cells_import; - -UPDATE cells SET accuracy=500 WHERE accuracy < 500; -UPDATE cells SET accuracy=100000 WHERE accuracy > 100000; - -CREATE INDEX _idx1 ON cells (mcc, mnc, lac, cid); -CREATE INDEX _idx2 ON cells (lac, cid); - -VACUUM; -SQL - -else - echo "Download error" -fi - -rm $OCI_FILE -rm $MOZ_FILE -rm $RCO_FILE diff --git a/modules/private/buildbot/projects/test/__init__.py b/modules/private/buildbot/projects/test/__init__.py deleted file mode 100644 index e2f6f82..0000000 --- a/modules/private/buildbot/projects/test/__init__.py +++ /dev/null @@ -1,197 +0,0 @@ -from buildbot.plugins import * -from buildbot_common.build_helpers import * -import buildbot_common.libvirt as ilibvirt -import os -from buildbot.util import bytes2unicode -import json - -__all__ = [ "configure", "E" ] - -class E(): - PROJECT = "test" - BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT) - SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT) - PB_SOCKET = os.environ["BUILDBOT_WORKER_PORT"] - WORKER_HOST = "{}:{}".format(os.environ["BUILDBOT_HOST"], PB_SOCKET) - RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT) - RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT) - GIT_URL = "https://git.immae.eu/perso/Immae/TestProject.git" - SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key" - LIBVIRT_URL = os.environ["BUILDBOT_VIRT_URL"] + "?keyfile=" + SSH_KEY_PATH - PUPPET_HOST = "root@backup-1.v.immae.eu" - LDAP_HOST = "ldap.immae.eu" - LDAP_DN = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu" - XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ") - - # master.cfg - SECRETS_FILE = os.getcwd() + "/secrets" - LDAP_URL = "ldaps://ldap.immae.eu:636" - LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu" - LDAP_BASE = "dc=immae,dc=eu" - LDAP_PATTERN = "(uid=%(username)s)" - LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=test,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))" - TITLE_URL = "https://git.immae.eu/?p=perso/Immae/TestProject.git;a=summary" - TITLE = "Test project" - -class CustomBase(webhooks.base): - def getChanges(self, request): - try: - content = request.content.read() - args = json.loads(bytes2unicode(content)) - except Exception as e: - raise ValueError("Error loading JSON: " + str(e)) - - args.setdefault("comments", "") - args.setdefault("repository", "") - args.setdefault("author", args.get("who", "unknown")) - - if args["category"] == "deploy_webhook": - args = { - "category": "deploy_webhook", - "comments": "", - "repository": "", - "author": "unknown", - "project": "TestProject", - "properties": { - "environment": args.get("environment", "integration"), - "build": "test_{}.tar.gz".format(args.get("branch", "master")) - } - } - - return ([args], None) - -def deploy_hook_scheduler(project, timer=1): - return schedulers.AnyBranchScheduler( - change_filter=util.ChangeFilter(category="deploy_webhook", project=project), - name="{}_deploy".format(project), treeStableTimer=timer, builderNames=["{}_deploy".format(project)]) - -def configure(c): - c["buildbotURL"] = E.BUILDBOT_URL - c["www"]["port"] = E.SOCKET - - c["www"]["change_hook_dialects"]["base"] = { - "custom_class": CustomBase - } - c['workers'].append(ilibvirt.LibVirtWorker("test-build", - open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(), - ilibvirt.Connection(E.LIBVIRT_URL), - E.WORKER_HOST)) - c['workers'].append(ilibvirt.LibVirtWorker("test-deploy", - open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(), - ilibvirt.Connection(E.LIBVIRT_URL), - E.WORKER_HOST)) - - c['schedulers'].append(hook_scheduler("TestProject", timer=1)) - c['schedulers'].append(force_scheduler("force_test", ["TestProject_build"])) - c['schedulers'].append(deploy_scheduler("deploy_test", ["TestProject_deploy"])) - c['schedulers'].append(deploy_hook_scheduler("TestProject", timer=1)) - - c['builders'].append(factory()) - c['builders'].append(deploy_factory()) - - c['services'].append(SlackStatusPush( - name="slack_status_test_project", - builders=["TestProject_build", "TestProject_deploy"], - serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip())) - c['services'].append(XMPPStatusPush( - name="xmpp_status_test_project", - builders=["TestProject_build", "TestProject_deploy"], - recipients=E.XMPP_RECIPIENTS, - password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip())) - -def factory(): - package = util.Interpolate("test_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch) - package_dest = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_PATH), clean_branch=clean_branch) - package_url = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_URL), clean_branch=clean_branch) - - factory = util.BuildFactory() - factory.addStep(steps.Git(logEnviron=False, - repourl=E.GIT_URL, mode="full", method="copy")) - factory.addStep(steps.ShellCommand(name="env", - logEnviron=False, command=["env"])) - factory.addStep(steps.ShellCommand(name="pwd", - logEnviron=False, command=["pwd"])) - factory.addStep(steps.ShellCommand(name="true", - logEnviron=False, command=["true"])) - factory.addStep(steps.ShellCommand(name="echo", - logEnviron=False, command=["echo", package])) - factory.addSteps(package_and_upload(package, package_dest, package_url)) - - return util.BuilderConfig(name="TestProject_build", workernames=["test-build"], factory=factory) - - -def compute_build_infos(): - @util.renderer - def compute(props): - import re, hashlib - build_file = props.getProperty("build") - package_dest = "{}/{}".format(E.RELEASE_PATH, build_file) - version = re.match(r"{0}_(.*).tar.gz".format("test"), build_file).group(1) - with open(package_dest, "rb") as f: - sha = hashlib.sha256(f.read()).hexdigest() - return { - "build_version": version, - "build_hash": sha, - } - return compute - -@util.renderer -def puppet_host(props): - return E.PUPPET_HOST - -def deploy_factory(): - package_dest = util.Interpolate("{}/%(prop:build)s".format(E.RELEASE_PATH)) - - factory = util.BuildFactory() - factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest])) - factory.addStep(steps.SetProperties(properties=compute_build_infos())) - factory.addStep(LdapPush(environment=util.Property("environment"), - build_version=util.Property("build_version"), - build_hash=util.Property("build_hash"), - ldap_password=util.Secret("ldap"))) - factory.addStep(steps.MasterShellCommand(command=[ - "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", "-i", E.SSH_KEY_PATH, puppet_host])) - return util.BuilderConfig(name="TestProject_deploy", workernames=["test-deploy"], factory=factory) - -from twisted.internet import defer -from buildbot.process.buildstep import FAILURE -from buildbot.process.buildstep import SUCCESS -from buildbot.process.buildstep import BuildStep - -class LdapPush(BuildStep): - name = "LdapPush" - renderables = ["environment", "build_version", "build_hash", "ldap_password"] - - def __init__(self, **kwargs): - self.environment = kwargs.pop("environment") - self.build_version = kwargs.pop("build_version") - self.build_hash = kwargs.pop("build_hash") - self.ldap_password = kwargs.pop("ldap_password") - self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST) - super().__init__(**kwargs) - - def run(self): - import json - from ldap3 import Reader, Writer, Server, Connection, ObjectDef - server = Server(self.ldap_host) - conn = Connection(server, - user=E.LDAP_DN, - password=self.ldap_password) - conn.bind() - obj = ObjectDef("immaePuppetClass", conn) - r = Reader(conn, obj, - "cn=test.{},{}".format(self.environment, E.LDAP_ROLES_BASE)) - r.search() - if len(r) > 0: - w = Writer.from_cursor(r) - for value in w[0].immaePuppetJson.values: - config = json.loads(value) - if "test_version" in config: - config["test_version"] = self.build_version - config["test_sha256"] = self.build_hash - w[0].immaePuppetJson -= value - w[0].immaePuppetJson += json.dumps(config, indent=" ") - w.commit() - return defer.succeed(SUCCESS) - return defer.succeed(FAILURE) diff --git a/modules/private/certificates.nix b/modules/private/certificates.nix deleted file mode 100644 index 9879946..0000000 --- a/modules/private/certificates.nix +++ /dev/null @@ -1,199 +0,0 @@ -{ lib, pkgs, config, name, ... }: -{ - options.myServices.certificates = { - enable = lib.mkEnableOption "enable certificates"; - webroot = lib.mkOption { - readOnly = true; - default = "/var/lib/acme/acme-challenges"; - }; - certConfig = lib.mkOption { - default = { - webroot = lib.mkForce null; # avoids creation of tmpfiles - email = "ismael@bouya.org"; - postRun = builtins.concatStringsSep "\n" [ - (lib.optionalString config.services.httpd.Prod.enable "systemctl reload httpdProd.service") - (lib.optionalString config.services.httpd.Tools.enable "systemctl reload httpdTools.service") - (lib.optionalString config.services.httpd.Inte.enable "systemctl reload httpdInte.service") - (lib.optionalString config.services.nginx.enable "systemctl reload nginx.service") - ]; - extraLegoRenewFlags = [ "--reuse-key" ]; - keyType = lib.mkDefault "ec256"; # https://github.com/NixOS/nixpkgs/pull/83121 - }; - description = "Default configuration for certificates"; - }; - }; - - config = lib.mkIf config.myServices.certificates.enable { - services.nginx = { - recommendedTlsSettings = true; - virtualHosts = { - "${config.hostEnv.fqdn}" = { - acmeRoot = config.myServices.certificates.webroot; - useACMEHost = name; - forceSSL = true; - }; - }; - }; - services.websites.certs = config.myServices.certificates.certConfig; - myServices.databasesCerts = config.myServices.certificates.certConfig; - myServices.ircCerts = config.myServices.certificates.certConfig; - - security.acme.acceptTerms = true; - security.acme.preliminarySelfsigned = true; - - security.acme.certs = { - "${name}" = config.myServices.certificates.certConfig // { - domain = config.hostEnv.fqdn; - }; - }; - - users.users.acme = { - uid = config.ids.uids.acme; - group = "acme"; - description = "Acme user"; - }; - users.groups.acme = { - gid = config.ids.gids.acme; - }; - - systemd.services = lib.attrsets.mapAttrs' (k: v: - lib.attrsets.nameValuePair "acme-selfsigned-${k}" { - wantedBy = [ "acme-selfsigned-certificates.target" ]; - script = lib.mkAfter '' - cp $workdir/server.crt ${config.security.acme.certs."${k}".directory}/cert.pem - chown '${v.user}:${v.group}' ${config.security.acme.certs."${k}".directory}/cert.pem - chmod ${if v.allowKeysForGroup then "750" else "700"} ${config.security.acme.certs."${k}".directory}/cert.pem - - cp $workdir/ca.crt ${config.security.acme.certs."${k}".directory}/chain.pem - chown '${v.user}:${v.group}' ${config.security.acme.certs."${k}".directory}/chain.pem - chmod ${if v.allowKeysForGroup then "750" else "700"} ${config.security.acme.certs."${k}".directory}/chain.pem - ''; - } - ) config.security.acme.certs // - lib.attrsets.mapAttrs' (k: data: - lib.attrsets.nameValuePair "acme-${k}" { - after = lib.mkAfter [ "bind.service" ]; - serviceConfig = - let - cfg = config.security.acme; - hashOptions = let - domains = builtins.concatStringsSep "," ( - [ data.domain ] ++ (builtins.attrNames data.extraDomains) - ); - certOptions = builtins.concatStringsSep "," [ - (if data.ocspMustStaple then "must-staple" else "no-must-staple") - ]; - in - builtins.hashString "sha256" (builtins.concatStringsSep ";" [ data.keyType domains certOptions ]); - accountsDir = "accounts-${data.keyType}"; - lpath = "acme/${k}"; - apath = "/var/lib/${lpath}"; - spath = "/var/lib/acme/.lego/${k}"; - fileMode = if data.allowKeysForGroup then "640" else "600"; - dirFileMode = if data.allowKeysForGroup then "750" else "700"; - globalOpts = [ "-d" data.domain "--email" data.email "--path" "." "--key-type" data.keyType ] - ++ lib.optionals (cfg.acceptTerms) [ "--accept-tos" ] - ++ lib.optionals (data.dnsProvider != null && !data.dnsPropagationCheck) [ "--dns.disable-cp" ] - ++ lib.concatLists (lib.mapAttrsToList (name: root: [ "-d" name ]) data.extraDomains) - ++ (if data.dnsProvider != null then [ "--dns" data.dnsProvider ] else [ "--http" "--http.webroot" config.myServices.certificates.webroot ]) - ++ lib.optionals (cfg.server != null || data.server != null) ["--server" (if data.server == null then cfg.server else data.server)]; - certOpts = lib.optionals data.ocspMustStaple [ "--must-staple" ]; - runOpts = lib.escapeShellArgs (globalOpts ++ [ "run" ] ++ certOpts); - renewOpts = lib.escapeShellArgs (globalOpts ++ - [ "renew" "--days" (builtins.toString cfg.validMinDays) ] ++ - certOpts ++ data.extraLegoRenewFlags); - forceRenewOpts = lib.escapeShellArgs (globalOpts ++ - [ "renew" "--days" "999" ] ++ - certOpts ++ data.extraLegoRenewFlags); - keyName = builtins.replaceStrings ["*"] ["_"] data.domain; - in { - User = lib.mkForce "acme"; - Group = lib.mkForce "acme"; - WorkingDirectory = lib.mkForce spath; - StateDirectory = lib.mkForce "acme/.lego/${k} acme/.lego/${accountsDir}"; - ExecStartPre = - let - script = pkgs.writeScript "acme-prestart" '' - #!${pkgs.runtimeShell} -e - install -m 0755 -o acme -g acme -d ${config.myServices.certificates.webroot} - ''; - in - lib.mkForce "+${script}"; - ExecStart = lib.mkForce (pkgs.writeScript "acme-start" '' - #!${pkgs.runtimeShell} -e - # lego doesn't check key type after initial creation, we - # need to check for him - if [ -L ${spath}/accounts -o -d ${spath}/accounts ]; then - if [ -L ${spath}/accounts -a "$(readlink ${spath}/accounts)" != ../${accountsDir} ]; then - ln -sfn ../${accountsDir} ${spath}/accounts - mv -f ${spath}/certificates/${keyName}.key ${spath}/certificates/${keyName}.key.old - fi - else - ln -s ../${accountsDir} ${spath}/accounts - fi - # check if domain changed: lego doesn't check by itself - if [ ! -e ${spath}/certificates/${keyName}.crt -o ! -e ${spath}/certificates/${keyName}.key -o ! -e "${spath}/accounts/acme-v02.api.letsencrypt.org/${data.email}/account.json" ]; then - ${pkgs.lego}/bin/lego ${runOpts} - elif [ ! -f ${spath}/currentDomains -o "$(cat ${spath}/currentDomains)" != "${hashOptions}" ]; then - ${pkgs.lego}/bin/lego ${forceRenewOpts} - else - ${pkgs.lego}/bin/lego ${renewOpts} - fi - ''); - ExecStartPost = - let - ISRG_Root_X1 = pkgs.fetchurl { - url = "https://letsencrypt.org/certs/isrgrootx1.pem"; - sha256 = "1la36n2f31j9s03v847ig6ny9lr875q3g7smnq33dcsmf2i5gd92"; - }; - fix_ISRG_Root_X1 = pkgs.writeScript "fix-pem" '' - for file in chain fullchain full; do - if grep -q MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA "$file.pem"; then - cat ${ISRG_Root_X1} | grep -v " CERTIFICATE" | \ - sed -i.bak -ne "/MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/ {r /dev/stdin" -e ":a; n; /Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5/ { b }; ba };p" $file.pem - fi - done - ''; - script = pkgs.writeScript "acme-post-start" '' - #!${pkgs.runtimeShell} -e - install -m 0755 -o root -g root -d /var/lib/acme - install -m 0${dirFileMode} -o ${data.user} -g ${data.group} -d /var/lib/acme/${k} - cd /var/lib/acme/${k} - - # Test that existing cert is older than new cert - KEY=${spath}/certificates/${keyName}.key - KEY_CHANGED=no - if [ -e $KEY -a $KEY -nt key.pem ]; then - KEY_CHANGED=yes - cp -p ${spath}/certificates/${keyName}.key key.pem - cp -p ${spath}/certificates/${keyName}.crt fullchain.pem - cp -p ${spath}/certificates/${keyName}.issuer.crt chain.pem - ln -sf fullchain.pem cert.pem - cat key.pem fullchain.pem > full.pem - echo -n "${hashOptions}" > ${spath}/currentDomains - fi - - ${fix_ISRG_Root_X1} - chmod ${fileMode} *.pem - chown '${data.user}:${data.group}' *.pem - - if [ "$KEY_CHANGED" = "yes" ]; then - : # noop in case postRun is empty - ${data.postRun} - fi - ''; - in - lib.mkForce "+${script}"; - }; - } - ) config.security.acme.certs // - { - httpdProd = lib.mkIf config.services.httpd.Prod.enable - { after = [ "acme-selfsigned-certificates.target" ]; wants = [ "acme-selfsigned-certificates.target" ]; }; - httpdTools = lib.mkIf config.services.httpd.Tools.enable - { after = [ "acme-selfsigned-certificates.target" ]; wants = [ "acme-selfsigned-certificates.target" ]; }; - httpdInte = lib.mkIf config.services.httpd.Inte.enable - { after = [ "acme-selfsigned-certificates.target" ]; wants = [ "acme-selfsigned-certificates.target" ]; }; - }; - }; -} diff --git a/modules/private/databases/openldap/default.nix b/modules/private/databases/openldap/default.nix deleted file mode 100644 index d35aca0..0000000 --- a/modules/private/databases/openldap/default.nix +++ /dev/null @@ -1,147 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.databases.openldap; - ldapConfig = let - eldiron_schemas = pkgs.callPackage ./eldiron_schemas.nix {}; - in '' - ${eldiron_schemas} - - pidfile ${cfg.pids.pid} - argsfile ${cfg.pids.args} - - moduleload back_hdb - backend hdb - - TLSCertificateFile ${config.security.acme.certs.ldap.directory}/cert.pem - TLSCertificateKeyFile ${config.security.acme.certs.ldap.directory}/key.pem - TLSCACertificateFile ${config.security.acme.certs.ldap.directory}/fullchain.pem - TLSCACertificatePath ${pkgs.cacert.unbundled}/etc/ssl/certs/ - #This makes openldap crash - #TLSCipherSuite DEFAULT - - sasl-host kerberos.immae.eu - ''; -in -{ - options.myServices.databases = { - openldap = { - enable = lib.mkOption { - default = false; - example = true; - description = "Whether to enable ldap"; - type = lib.types.bool; - }; - baseDn = lib.mkOption { - type = lib.types.str; - description = '' - Base DN for LDAP - ''; - }; - rootDn = lib.mkOption { - type = lib.types.str; - description = '' - Root DN - ''; - }; - rootPw = lib.mkOption { - type = lib.types.str; - description = '' - Root (Hashed) password - ''; - }; - accessFile = lib.mkOption { - type = lib.types.path; - description = '' - The file path that defines the access - ''; - }; - dataDir = lib.mkOption { - type = lib.types.path; - default = "/var/lib/openldap"; - description = '' - The directory where Openldap stores its data. - ''; - }; - socketsDir = lib.mkOption { - type = lib.types.path; - default = "/run/slapd"; - description = '' - The directory where Openldap puts sockets and pid files. - ''; - }; - # Output variables - pids = lib.mkOption { - type = lib.types.attrsOf lib.types.path; - default = { - pid = "${cfg.socketsDir}/slapd.pid"; - args = "${cfg.socketsDir}/slapd.args"; - }; - readOnly = true; - description = '' - Slapd pid files - ''; - }; - }; - }; - - config = lib.mkIf cfg.enable { - secrets.keys = { - "ldap/password" = { - permissions = "0400"; - user = "openldap"; - group = "openldap"; - text = "rootpw ${cfg.rootPw}"; - }; - "ldap/access" = { - permissions = "0400"; - user = "openldap"; - group = "openldap"; - text = builtins.readFile cfg.accessFile; - }; - "ldap" = { - permissions = "0500"; - user = "openldap"; - group = "openldap"; - isDir = true; - }; - }; - users.users.openldap.extraGroups = [ "keys" ]; - networking.firewall.allowedTCPPorts = [ 636 389 ]; - - security.acme.certs."ldap" = config.myServices.databasesCerts // { - user = "openldap"; - group = "openldap"; - domain = "ldap.immae.eu"; - postRun = '' - systemctl restart openldap.service - ''; - }; - - services.filesWatcher.openldap = { - restart = true; - paths = [ config.secrets.fullPaths."ldap" ]; - }; - - services.openldap = { - enable = true; - dataDir = cfg.dataDir; - urlList = [ "ldap://" "ldaps://" ]; - logLevel = "none"; - extraConfig = ldapConfig; - extraDatabaseConfig = '' - moduleload memberof - overlay memberof - - moduleload syncprov - overlay syncprov - syncprov-checkpoint 100 10 - - include ${config.secrets.fullPaths."ldap/access"} - ''; - rootpwFile = config.secrets.fullPaths."ldap/password"; - suffix = cfg.baseDn; - rootdn = cfg.rootDn; - database = "hdb"; - }; - }; -} diff --git a/modules/private/databases/openldap/eldiron_schemas.nix b/modules/private/databases/openldap/eldiron_schemas.nix deleted file mode 100644 index cf45ebe..0000000 --- a/modules/private/databases/openldap/eldiron_schemas.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ fetchurl, openldap }: -let - kerberosSchema = fetchurl { - url = "https://raw.githubusercontent.com/krb5/krb5/0bdd3b8058ed4ec9acc050e316bea86f6830b15f/src/plugins/kdb/ldap/libkdb_ldap/kerberos.schema"; - sha256 = "17fnkkf6s3lznsl7wp6914pqsc78d038rh38l638big8z608ksww"; - }; - puppetSchema = fetchurl { - url = "https://raw.githubusercontent.com/puppetlabs/puppet/bf7c108825ffdb5ea89cf3e500d55d27ab64b8d2/ext/ldap/puppet.schema"; - sha256 = "11bjf5zfvqlim7p9vddcafs0wiq3v8ys77x8h6fbp9c6bdfh0awh"; - }; - schemas = [ - #"${openldap}/etc/schema/core.schema" - #"${openldap}/etc/schema/cosine.schema" - #"${openldap}/etc/schema/inetorgperson.schema" - #"${openldap}/etc/schema/nis.schema" - puppetSchema - kerberosSchema - ./immae.schema - ]; -in - builtins.concatStringsSep "\n" (map (v: "include ${v}") schemas) diff --git a/modules/private/default.nix b/modules/private/default.nix deleted file mode 100644 index 9108a92..0000000 --- a/modules/private/default.nix +++ /dev/null @@ -1,136 +0,0 @@ -let -set = { - # adatped from nixpkgs/nixos/modules/services/web-servers/apache-httpd/default.nix - httpdInte = import ../websites/httpd-service-builder.nix { httpdName = "Inte"; withUsers = false; }; - httpdProd = import ../websites/httpd-service-builder.nix { httpdName = "Prod"; withUsers = false; }; - httpdTools = import ../websites/httpd-service-builder.nix { httpdName = "Tools"; withUsers = true; }; - - databases = ./databases; - mariadb = ./databases/mariadb.nix; - openldap = ./databases/openldap; - postgresql = ./databases/postgresql.nix; - redis = ./databases/redis.nix; - postgresqlReplication = ./databases/postgresql_replication.nix; - mariadbReplication = ./databases/mariadb_replication.nix; - redisReplication = ./databases/redis_replication.nix; - openldapReplication = ./databases/openldap_replication.nix; - - websites = ./websites; - gemini = ./gemini; - - - # Personal websites - bakeerCloud = ./websites/bakeer/cloud.nix; - - capitainesLandingPages = ./websites/capitaines/landing_pages.nix; - - chloeInte = ./websites/chloe/integration.nix; - chloeProd = ./websites/chloe/production.nix; - - cipcaSympa = ./websites/cip-ca/sympa.nix; - - connexionswingInte = ./websites/connexionswing/integration.nix; - connexionswingProd = ./websites/connexionswing/production.nix; - - deniseDenisejeromeProd = ./websites/denise/denisejerome.nix; - deniseEvariste = ./websites/denise/evariste.nix; - deniseOMS = ./websites/denise/oms.nix; - deniseBingo = ./websites/denise/bingo.nix; - deniseAventuriers = ./websites/denise/aventuriers.nix; - deniseProduction = ./websites/denise/production.nix; - - emiliaMoodle = ./websites/emilia/moodle.nix; - emiliaAtelierFringant = ./websites/emilia/atelierfringant.nix; - - florianApp = ./websites/florian/app.nix; - florianInte = ./websites/florian/integration.nix; - florianProd = ./websites/florian/production.nix; - - immaeProd = ./websites/immae/production.nix; - immaeRelease = ./websites/immae/release.nix; - immaeTemp = ./websites/immae/temp.nix; - - isabelleAtenInte = ./websites/isabelle/aten_integration.nix; - isabelleAtenProd = ./websites/isabelle/aten_production.nix; - isabelleIridologie = ./websites/isabelle/iridologie.nix; - - jeromeNaturaloutil = ./websites/jerome/naturaloutil.nix; - - leilaProd = ./websites/leila/production.nix; - - ludivineInte = ./websites/ludivine/integration.nix; - ludivineProd = ./websites/ludivine/production.nix; - - nassimeProd = ./websites/nassime/production.nix; - - nathVillon = ./websites/nath/villon.nix; - - papaMaisonBbc = ./websites/papa/maison_bbc.nix; - papaSurveillance = ./websites/papa/surveillance.nix; - - patrickFodellaEcolyeu = ./websites/patrick_fodella/ecolyeu.nix; - patrickFodellaAltermondia = ./websites/patrick_fodella/altermondia.nix; - - piedsjalouxInte = ./websites/piedsjaloux/integration.nix; - piedsjalouxProd = ./websites/piedsjaloux/production.nix; - - ressourcerieBanonProd = ./websites/ressourcerie_banon/production.nix; - ressourcerieBanonCloud = ./websites/ressourcerie_banon/cloud.nix; - ressourcerieBanonCryptpad = ./websites/ressourcerie_banon/cryptpad.nix; - - richieProd = ./websites/richie/production.nix; - - sydenPeertube = ./websites/syden/peertube.nix; - - teliotortayProd = ./websites/telio_tortay/production.nix; - - # Tools - assetsTools = ./websites/tools/assets; - cloudTool = ./websites/tools/cloud; - cloudFarmTool = ./websites/tools/cloud/farm.nix; - cryptpadTool = ./websites/tools/cryptpad; - cryptpadFarmTool = ./websites/tools/cryptpad/farm.nix; - commentoTool = ./websites/tools/commento; - davTool = ./websites/tools/dav; - vpnTool = ./websites/tools/vpn; - dbTool = ./websites/tools/db; - diasporaTool = ./websites/tools/diaspora; - etherTool = ./websites/tools/ether; - gitTool = ./websites/tools/git; - imTool = ./websites/tools/im; - mastodonTool = ./websites/tools/mastodon; - mgoblinTool = ./websites/tools/mgoblin; - peertubeTool = ./websites/tools/peertube; - performanceTool = ./websites/tools/performance; - toolsTool = ./websites/tools/tools; - mailTool = ./websites/tools/mail; - statsTool = ./websites/tools/stats; - - # Games - codenamesGame = ./websites/tools/games/codenames; - terraformingMarsGame = ./websites/tools/games/terraforming-mars; - - mail = ./mail; - - buildbot = ./buildbot; - certificates = ./certificates.nix; - gitolite = ./gitolite; - irc = ./irc.nix; - pub = ./pub; - tasks = ./tasks; - dns = ./dns.nix; - ftp = ./ftp.nix; - mpd = ./mpd.nix; - ejabberd = ./ejabberd; - ssh = ./ssh; - monitoring = ./monitoring; - status = ./monitoring/status.nix; - status_engine = ./monitoring/status_engine.nix; - vpn = ./vpn; - - environment = ./environment.nix; - system = ./system.nix; - loginctl-linger = ./loginctl-linger.nix; -}; -in -builtins.listToAttrs (map (attr: { name = "priv${attr}"; value = set.${attr}; }) (builtins.attrNames set)) diff --git a/modules/private/dns.nix b/modules/private/dns.nix deleted file mode 100644 index 1d7fd52..0000000 --- a/modules/private/dns.nix +++ /dev/null @@ -1,197 +0,0 @@ -{ lib, pkgs, config, ... }: -{ - options.myServices.dns.enable = lib.mkEnableOption "enable DNS resolver"; - config = let - # taken from unstable - cartesianProductOfSets = attrsOfLists: with lib; - lib.foldl' (listOfAttrs: attrName: - concatMap (attrs: - map (listValue: attrs // { ${attrName} = listValue; }) attrsOfLists.${attrName} - ) listOfAttrs - ) [{}] (attrNames attrsOfLists); - cfg = config.services.bind; - keyIncludes = builtins.concatStringsSep "\n" (map (v: "include \"${config.secrets.fullPaths."bind/${v}.key"}\";") (builtins.attrNames config.myEnv.dns.keys)); - cartProduct = lib.foldr - (s: servers: servers // { ${s.masters} = lib.unique ((servers.${s.masters} or []) ++ [s.keys]); }) - {} - (lib.unique (lib.concatMap (z: cartesianProductOfSets { masters = z.masters or []; keys = z.keys or []; }) config.myEnv.dns.slaveZones)); - toKeyList = servers: keys: builtins.concatStringsSep "\n" (map (s: '' - server ${s} { - keys { ${builtins.concatStringsSep ";" keys}; }; - }; - '') servers); - serverIncludes = builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: toKeyList (lib.flatten (builtins.attrValues config.myEnv.dns.ns."${n}"))) cartProduct); - configFile = pkgs.writeText "named.conf" '' - include "/etc/bind/rndc.key"; - controls { - inet 127.0.0.1 allow {localhost;} keys {"rndc-key";}; - }; - - acl cachenetworks { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.cacheNetworks} }; - acl badnetworks { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.blockedNetworks} }; - - options { - listen-on { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.listenOn} }; - listen-on-v6 { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.listenOnIpv6} }; - allow-query { cachenetworks; }; - blackhole { badnetworks; }; - forward first; - forwarders { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.forwarders} }; - directory "/var/run/named"; - pid-file "/var/run/named/named.pid"; - ${cfg.extraOptions} - }; - - ${keyIncludes} - ${serverIncludes} - - ${cfg.extraConfig} - - ${ lib.concatMapStrings - ({ name, file, master ? true, extra ? "", slaves ? [], masters ? [] }: - '' - zone "${name}" { - type ${if master then "master" else "slave"}; - file "${file}"; - ${ if lib.lists.length slaves > 0 then - '' - allow-transfer { - ${lib.concatMapStrings (ip: "${ip};\n") slaves} - }; - '' else ""} - ${ if lib.lists.length masters > 0 then - '' - masters { - ${lib.concatMapStrings (ip: "${ip};\n") masters} - }; - '' else ""} - allow-query { any; }; - ${extra} - }; - '') - cfg.zones } - ''; - mxes = lib.attrsets.filterAttrs - (n: v: v.mx.enable) - config.myEnv.servers; - ip4mxes = builtins.concatStringsSep "\n" (lib.mapAttrsToList - (n: v: "${v.mx.subdomain} IN A ${v.ips.main.ip4}") - mxes); - ip6mxes = builtins.concatStringsSep "\n" (lib.mapAttrsToList - (n: v: builtins.concatStringsSep "\n" (map (i: "${v.mx.subdomain} IN AAAA ${i}") v.ips.main.ip6)) - mxes); - mxmxes = n: conf: builtins.concatStringsSep "\n" (lib.mapAttrsToList - (_: v: "${n} IN MX ${v.mx.priority} ${v.mx.subdomain}.${conf.name}.") - mxes); - in lib.mkIf config.myServices.dns.enable { - networking.firewall.allowedUDPPorts = [ 53 ]; - networking.firewall.allowedTCPPorts = [ 53 ]; - users.users.named.extraGroups = [ "keys" ]; - secrets.keys = lib.mapAttrs' (k: v: - lib.nameValuePair "bind/${k}.key" { - permissions = "0400"; - user = "named"; - text = '' - key "${k}" - { - algorithm ${v.algorithm}; - secret "${v.secret}"; - }; - ''; - } - ) config.myEnv.dns.keys; - services.bind = { - enable = true; - cacheNetworks = ["any"]; - configFile = configFile; - extraOptions = '' - allow-recursion { 127.0.0.1; }; - allow-transfer { none; }; - - notify-source ${config.myEnv.servers.eldiron.ips.main.ip4}; - notify-source-v6 ${lib.head config.myEnv.servers.eldiron.ips.main.ip6}; - version none; - hostname none; - server-id none; - ''; - zones = with config.myEnv.dns; - assert (builtins.substring ((builtins.stringLength soa.email)-1) 1 soa.email) != "."; - assert (builtins.substring ((builtins.stringLength soa.primary)-1) 1 soa.primary) != "."; - (map (conf: { - name = conf.name; - master = false; - file = "/var/run/named/${conf.name}.zone"; - masters = if lib.attrsets.hasAttr "masters" conf - then lib.lists.flatten (map (n: lib.attrsets.attrValues ns.${n}) conf.masters) - else []; - }) slaveZones) - ++ (map (conf: { - name = conf.name; - master = true; - extra = if lib.attrsets.hasAttr "extra" conf then conf.extra else ""; - slaves = if lib.attrsets.hasAttr "slaves" conf - then lib.lists.flatten (map (n: lib.attrsets.attrValues ns.${n}) conf.slaves) - else []; - file = pkgs.writeText "${conf.name}.zone" '' - $TTL 10800 - @ IN SOA ${soa.primary}. ${builtins.replaceStrings ["@"] ["."] soa.email}. ${soa.serial} ${soa.refresh} ${soa.retry} ${soa.expire} ${soa.ttl} - - ${lib.concatStringsSep "\n" (map (x: "@ IN NS ${x}.") (lib.concatMap (n: lib.attrsets.mapAttrsToList (k: v: k) ns.${n}) conf.ns))} - ${lib.optionalString (conf.withCAA != null) '' - ${conf.name}. IN CAA 0 issue "${conf.withCAA}" - ''} - - ${conf.entries} - - ${if lib.attrsets.hasAttr "withEmail" conf && lib.lists.length conf.withEmail > 0 then '' - ${ip4mxes} - ${ip6mxes} - ${lib.concatStringsSep "\n\n" (map (e: - let - n = if e.domain == "" then "@" else "${e.domain} "; - suffix = if e.domain == "" then "" else ".${e.domain}"; - in - '' - ; ------------------ mail: ${n} --------------------------- - ${mxmxes n conf} - - ; https://tools.ietf.org/html/rfc6186 - _submission._tcp${suffix} SRV 0 1 587 smtp.immae.eu. - _submissions._tcp${suffix} SRV 0 1 465 smtp.immae.eu. - _imap._tcp${suffix} SRV 0 1 143 imap.immae.eu. - _imaps._tcp${suffix} SRV 0 1 993 imap.immae.eu. - _pop3._tcp${suffix} SRV 10 1 110 pop3.immae.eu. - _pop3s._tcp${suffix} SRV 10 1 995 pop3.immae.eu. - _sieve._tcp${suffix} SRV 0 1 4190 imap.immae.eu. - - ; MTA-STS - ; https://blog.delouw.ch/2018/12/16/using-mta-sts-to-enhance-email-transport-security-and-privacy/ - ; https://support.google.com/a/answer/9261504 - _mta-sts${suffix} IN TXT "v=STSv1;id=20200109150200Z" - _smtp._tls${suffix} IN TXT "v=TLSRPTv1;rua=mailto:postmaster+mta-sts@immae.eu" - mta-sts${suffix} IN A ${config.myEnv.servers.eldiron.ips.main.ip4} - ${builtins.concatStringsSep "\n" (map (i: "mta-sts${suffix} IN AAAA ${i}") config.myEnv.servers.eldiron.ips.main.ip6)} - - ; Mail sender authentications - ${n} IN TXT "v=spf1 mx ~all" - _dmarc${suffix} IN TXT "v=DMARC1; p=none; adkim=r; aspf=r; fo=1; rua=mailto:postmaster+rua@immae.eu; ruf=mailto:postmaster+ruf@immae.eu;" - ${if e.send then '' - immae_eu._domainkey${suffix} IN TXT ( "v=DKIM1; k=rsa; s=email; " - "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzl3vLd8W5YAuumC5+ZT9OV7/14Pmh5JYtwyqKI3cfe9NnAqInt3xO4bZ7oqIxRKWN4SD39vm7O/QOvFdBt00ENOOzdP90s5gKw6eIP/4+vPTh0IWltAsmu9B2agzdtWUE7t2xFKIzEn8l9niRE2QYbVaqZv4sub98vY55fIgFoHtjkmNC7325S8fjDJGp6OPbyhAs6Xl5/adjF" - "0ko4Y2p6RaxLQfjlS0bxmK4Qg6C14pIXHtzVeqOuWrwApqt5+AULSn97iUtqV/IJlEEjC6DUR44t3C/G0G/k46iFclCqRRi0hdPrOHCtZDbtMubnTN9eaUiNpkXh1WnCflHwtjQwIDAQAB" ) - eldiron._domainkey${suffix} IN TXT ${config.myEnv.mail.dkim.eldiron.public} - '' else ""} - '') conf.withEmail)} - '' + (if conf.name == "immae.eu" then '' - ; ----------------- Accept DMARC reports ------------------- - ${lib.concatStringsSep "\n" ( - lib.flatten ( - map (z: map (e: "${e.domain}${if builtins.stringLength e.domain > 0 then "." else ""}${z.name}._report._dmarc IN TXT \"v=DMARC1;\"") (z.withEmail or [])) masterZones - ) - )} - '' else "") else ""} - ''; - }) masterZones); - }; - }; -} diff --git a/modules/private/environment.nix b/modules/private/environment.nix deleted file mode 100644 index 837d24b..0000000 --- a/modules/private/environment.nix +++ /dev/null @@ -1,1492 +0,0 @@ -{ config, lib, name, ... }: -with lib; -with types; -with lists; -let - ldapOptions = { - base = mkOption { description = "Base of the LDAP tree"; type = str; }; - host = mkOption { description = "Host to access LDAP"; type = str; }; - root_dn = mkOption { description = "DN of the root user"; type = str; }; - root_pw = mkOption { description = "Hashed password of the root user"; type = str; }; - replication_dn = mkOption { description = "DN of the user allowed to replicate the LDAP directory"; type = str; }; - replication_pw = mkOption { description = "Password of the user allowed to replicate the LDAP directory"; type = str; }; - }; - mkLdapOptions = name: more: mkOption { - description = "${name} LDAP configuration"; - type = submodule { - options = ldapOptions // { - dn = mkOption { description = "DN of the ${name} user"; type = str; }; - password = mkOption { description = "password of the ${name} user"; type = str; }; - filter = mkOption { description = "Filter for ${name} users"; type = str; default = ""; }; - } // more; - }; - }; - mysqlOptions = { - host = mkOption { description = "Host to access Mysql"; type = str; }; - remoteHost = mkOption { description = "Host to access Mysql from outside"; type = str; }; - port = mkOption { description = "Port to access Mysql"; type = str; }; - socket = mkOption { description = "Socket to access Mysql"; type = path; }; - systemUsers = mkOption { - description = "Attrs of user-passwords allowed to access mysql"; - type = attrsOf str; - }; - pam = mkOption { - description = "PAM configuration for mysql"; - type = submodule { - options = { - dn = mkOption { description = "DN to connect as to check users"; type = str; }; - password = mkOption { description = "DN password to connect as to check users"; type = str; }; - filter = mkOption { description = "filter to match users"; type = str; }; - }; - }; - }; - }; - mkMysqlOptions = name: more: mkOption { - description = "${name} mysql configuration"; - type = submodule { - options = mysqlOptions // { - database = mkOption { description = "${name} database"; type = str; }; - user = mkOption { description = "${name} user"; type = str; }; - password = mkOption { description = "mysql password of the ${name} user"; type = str; }; - } // more; - }; - }; - psqlOptions = { - host = mkOption { description = "Host to access Postgresql"; type = str; }; - port = mkOption { description = "Port to access Postgresql"; type = str; }; - socket = mkOption { description = "Socket to access Postgresql"; type = path; }; - pam = mkOption { - description = "PAM configuration for psql"; - type = submodule { - options = { - dn = mkOption { description = "DN to connect as to check users"; type = str; }; - password = mkOption { description = "DN password to connect as to check users"; type = str; }; - filter = mkOption { description = "filter to match users"; type = str; }; - }; - }; - }; - }; - mkPsqlOptions = name: mkOption { - description = "${name} psql configuration"; - type = submodule { - options = psqlOptions // { - database = mkOption { description = "${name} database"; type = str; }; - schema = mkOption { description = "${name} schema"; type = nullOr str; default = null; }; - user = mkOption { description = "${name} user"; type = str; }; - password = mkOption { description = "psql password of the ${name} user"; type = str; }; - }; - }; - }; - redisOptions = { - host = mkOption { description = "Host to access Redis"; type = str; }; - port = mkOption { description = "Port to access Redis"; type = str; }; - socket = mkOption { description = "Socket to access Redis"; type = path; }; - dbs = mkOption { - description = "Attrs of db number. Each number should be unique to avoid collision!"; - type = attrsOf str; - }; - spiped_key = mkOption { - type = str; - description = '' - Key to use with spiped to make a secure channel to replication - ''; - }; - predixy = mkOption { - description = "Predixy configuration. Unused yet"; - type = submodule { - options = { - read = mkOption { type = str; description = "Read password"; }; - }; - }; - }; - }; - mkRedisOptions = name: mkOption { - description = "${name} redis configuration"; - type = submodule { - options = redisOptions // { - db = mkOption { description = "${name} database"; type = str; }; - }; - }; - }; - smtpOptions = { - host = mkOption { description = "Host to access SMTP"; type = str; }; - port = mkOption { description = "Port to access SMTP"; type = str; }; - }; - mkSmtpOptions = name: mkOption { - description = "${name} smtp configuration"; - type = submodule { - options = smtpOptions // { - email = mkOption { description = "${name} email"; type = str; }; - password = mkOption { description = "SMTP password of the ${name} user"; type = str; }; - }; - }; - }; - hostEnv = submodule { - options = { - fqdn = mkOption { - description = "Host FQDN"; - type = str; - }; - users = mkOption { - type = unspecified; - default = pkgs: []; - description = '' - Sublist of users from realUsers. Function that takes pkgs as - argument and gives an array as a result - ''; - }; - emails = mkOption { - default = []; - description = "List of e-mails that the server can be a sender of"; - type = listOf str; - }; - ldap = mkOption { - description = '' - LDAP credentials for the host - ''; - type = submodule { - options = { - password = mkOption { type = str; description = "Password for the LDAP connection"; }; - dn = mkOption { type = str; description = "DN for the LDAP connection"; }; - }; - }; - }; - mx = mkOption { - description = "subdomain and priority for MX server"; - default = { enable = false; }; - type = submodule { - options = { - enable = mkEnableOption "Enable MX"; - subdomain = mkOption { type = nullOr str; description = "Subdomain name (mx-*)"; }; - priority = mkOption { type = nullOr str; description = "Priority"; }; - }; - }; - }; - ips = mkOption { - description = '' - attrs of ip4/ip6 grouped by section - ''; - type = attrsOf (submodule { - options = { - ip4 = mkOption { - type = str; - description = '' - ip4 address of the host - ''; - }; - ip6 = mkOption { - type = listOf str; - default = []; - description = '' - ip6 addresses of the host - ''; - }; - }; - }); - }; - }; - }; -in -{ - options.myEnv = { - servers = mkOption { - description = '' - Attrs of servers information in the cluster (not necessarily handled by nixops) - ''; - default = {}; - type = attrsOf hostEnv; - }; - hetznerCloud = mkOption { - description = '' - Hetzner Cloud credential information - ''; - type = submodule { - options = { - authToken = mkOption { - type = str; - description = '' - The API auth token. - ''; - }; - }; - }; - }; - hetzner = mkOption { - description = '' - Hetzner credential information - ''; - type = submodule { - options = { - user = mkOption { type = str; description = "User"; }; - pass = mkOption { type = str; description = "Password"; }; - }; - }; - }; - sshd = mkOption { - description = '' - sshd service credential information - ''; - type = submodule { - options = { - rootKeys = mkOption { type = attrsOf str; description = "Keys of root users"; }; - ldap = mkOption { - description = '' - LDAP credentials for cn=ssh,ou=services,dc=immae,dc=eu dn - ''; - type = submodule { - options = { - password = mkOption { description = "Password"; type = str; }; - }; - }; - }; - }; - }; - }; - ports = mkOption { - description = '' - non-standard reserved ports. Must be unique! - ''; - type = attrsOf port; - default = {}; - apply = let - noDupl = x: builtins.length (builtins.attrValues x) == builtins.length (unique (builtins.attrValues x)); - in - x: if isAttrs x && noDupl x then x else throw "Non unique values for ports"; - }; - httpd = mkOption { - description = '' - httpd service credential information - ''; - type = submodule { - options = { - ldap = mkOption { - description = '' - LDAP credentials for cn=httpd,ou=services,dc=immae,dc=eu dn - ''; - type = submodule { - options = { - password = mkOption { description = "Password"; type = str; }; - }; - }; - }; - }; - }; - }; - smtp = mkOption { - type = submodule { options = smtpOptions; }; - description = "SMTP configuration"; - }; - ldap = mkOption { - description = '' - LDAP server configuration - ''; - type = submodule { - options = ldapOptions; - }; - }; - databases = mkOption { - description = "Databases configuration"; - type = submodule { - options = { - mysql = mkOption { - type = submodule { options = mysqlOptions; }; - description = "Mysql configuration"; - }; - redis = mkOption { - type = submodule { options = redisOptions; }; - description = "Redis configuration"; - }; - postgresql = mkOption { - type = submodule { options = psqlOptions; }; - description = "Postgresql configuration"; - }; - }; - }; - }; - jabber = mkOption { - description = "Jabber configuration"; - type = submodule { - options = { - postfix_user_filter = mkOption { type = str; description = "Postfix filter to get xmpp users"; }; - ldap = mkLdapOptions "Jabber" {}; - postgresql = mkPsqlOptions "Jabber"; - }; - }; - }; - realUsers = mkOption { - description = '' - Attrset of function taking pkgs as argument. - Real users settings, should provide a subattr of users.users. - with at least: name, (hashed)Password, shell - ''; - type = attrsOf unspecified; - }; - users = mkOption { - description = "System and regular users uid/gid"; - type = attrsOf (submodule { - options = { - uid = mkOption { - description = "user uid"; - type = int; - }; - gid = mkOption { - description = "user gid"; - type = int; - }; - }; - }); - }; - dns = mkOption { - description = "DNS configuration"; - type = submodule { - options = { - soa = mkOption { - description = "SOA information"; - type = submodule { - options = { - serial = mkOption { - description = "Serial number. Should be incremented at each change and unique"; - type = str; - }; - refresh = mkOption { - description = "Refresh time"; - type = str; - }; - retry = mkOption { - description = "Retry time"; - type = str; - }; - expire = mkOption { - description = "Expire time"; - type = str; - }; - ttl = mkOption { - description = "Default TTL time"; - type = str; - }; - email = mkOption { - description = "hostmaster e-mail"; - type = str; - }; - primary = mkOption { - description = "Primary NS"; - type = str; - }; - }; - }; - }; - ns = mkOption { - description = "Attrs of NS servers group"; - example = { - foo = { - "ns1.foo.com" = [ "198.51.100.10" "2001:db8:abcd::1" ]; - "ns2.foo.com" = [ "198.51.100.15" "2001:db8:1234::1" ]; - }; - }; - type = attrsOf (attrsOf (listOf str)); - }; - keys = mkOption { - default = {}; - description = "DNS keys"; - type = attrsOf (submodule { - options = { - algorithm = mkOption { type = str; description = "Algorithm"; }; - secret = mkOption { type = str; description = "Secret"; }; - }; - }); - }; - slaveZones = mkOption { - description = "List of slave zones"; - type = listOf (submodule { - options = { - name = mkOption { type = str; description = "zone name"; }; - masters = mkOption { - description = "NS master groups of this zone"; - type = listOf str; - }; - keys = mkOption { - default = []; - description = "Keys associated to the server"; - type = listOf str; - }; - }; - }); - }; - masterZones = mkOption { - description = "List of master zones"; - type = listOf (submodule { - options = { - name = mkOption { type = str; description = "zone name"; }; - withCAA = mkOption { type = nullOr str; description = "CAA entry"; default = null; }; - slaves = mkOption { - description = "NS slave groups of this zone"; - type = listOf str; - }; - ns = mkOption { - description = "groups names that should have their NS entries listed here"; - type = listOf str; - }; - extra = mkOption { - description = "Extra zone configuration for bind"; - example = '' - notify yes; - ''; - type = lines; - }; - entries = mkOption { type = lines; description = "Regular entries of the NS zone"; }; - withEmail = mkOption { - description = "List of domains that should have mail entries (MX, dkim, SPF, ...)"; - default = []; - type = listOf (submodule { - options = { - domain = mkOption { type = str; description = "Which subdomain is concerned"; }; - send = mkOption { type = bool; description = "Whether there can be e-mails originating from the subdomain"; }; - receive = mkOption { type = bool; description = "Whether there can be e-mails arriving to the subdomain"; }; - }; - }); - }; - }; - }); - }; - }; - }; - }; - backup = mkOption { - description = '' - Remote backup with duplicity - ''; - type = submodule { - options = { - password = mkOption { type = str; description = "Password for encrypting files"; }; - remotes = mkOption { - type = attrsOf (submodule { - options = { - remote = mkOption { - type = unspecified; - example = literalExample '' - bucket: "s3://some_host/${bucket}"; - ''; - description = '' - Function. - Takes a bucket name as argument and returns a url - ''; - }; - accessKeyId = mkOption { type = str; description = "Remote access-key"; }; - secretAccessKey = mkOption { type = str; description = "Remote access secret"; }; - }; - }); - }; - }; - }; - }; - zrepl_backup = mkOption { - type = submodule { - options = { - ssh_key = mkOption { - description = "SSH key information"; - type = submodule { - options = { - public = mkOption { type = str; description = "Public part of the key"; }; - private = mkOption { type = lines; description = "Private part of the key"; }; - }; - }; - }; - mysql = mkMysqlOptions "Zrepl" {}; - }; - }; - }; - rsync_backup = mkOption { - description ='' - Rsync backup configuration from controlled host - ''; - type = submodule { - options = { - ssh_key = mkOption { - description = "SSH key information"; - type = submodule { - options = { - public = mkOption { type = str; description = "Public part of the key"; }; - private = mkOption { type = lines; description = "Private part of the key"; }; - }; - }; - }; - profiles = mkOption { - description = "Attrs of profiles to backup"; - type = attrsOf (submodule { - options = { - keep = mkOption { type = int; description = "Number of backups to keep"; }; - check_command = mkOption { type = str; description = "command to check if backup needs to be done"; default = "backup"; }; - login = mkOption { type = str; description = "Login to connect to host"; }; - port = mkOption { type = str; default = "22"; description = "Port to connect to host"; }; - host = mkOption { type = str; description = "Host to connect to"; }; - host_key = mkOption { type = str; description = "Host key"; }; - host_key_type = mkOption { type = str; description = "Host key type"; }; - parts = mkOption { - description = "Parts to backup for this host"; - type = attrsOf (submodule { - options = { - remote_folder = mkOption { type = path; description = "Remote folder to backup";}; - exclude_from = mkOption { - type = listOf path; - default = []; - description = "List of folders/files to exclude from the backup"; - }; - files_from = mkOption { - type = listOf path; - default = []; - description = "List of folders/files to backup in the base folder"; - }; - args = mkOption { - type = nullOr str; - default = null; - description = "Extra arguments to pass to rsync"; - }; - }; - }); - }; - }; - }); - }; - }; - }; - }; - monitoring = mkOption { - description = "Monitoring configuration"; - type = submodule { - options = { - status_url = mkOption { type = str; description = "URL to push status to"; }; - status_token = mkOption { type = str; description = "Token for the status url"; }; - http_user_password = mkOption { type = str; description = "HTTP credentials to check services behind wall"; }; - email = mkOption { type = str; description = "Admin E-mail"; }; - ssh_public_key = mkOption { type = str; description = "SSH public key"; }; - ssh_secret_key = mkOption { type = str; description = "SSH secret key"; }; - imap_login = mkOption { type = str; description = "IMAP login"; }; - imap_password = mkOption { type = str; description = "IMAP password"; }; - eriomem_keys = mkOption { type = listOf (listOf str); description = "Eriomem keys"; default = []; }; - ovh_sms = mkOption { - description = "OVH credentials for sms script"; - type = submodule { - options = { - endpoint = mkOption { type = str; default = "ovh-eu"; description = "OVH endpoint"; }; - application_key = mkOption { type = str; description = "Application key"; }; - application_secret = mkOption { type = str; description = "Application secret"; }; - consumer_key = mkOption { type = str; description = "Consumer key"; }; - account = mkOption { type = str; description = "Account"; }; - }; - }; - }; - eban = mkOption { - description = "Eban credentials for webhook"; - type = submodule { - options = { - user = mkOption { type = str; description = "User"; }; - password = mkOption { type = str; description = "Password"; }; - }; - }; - }; - nrdp_tokens = mkOption { type = listOf str; description = "Tokens allowed to push status update"; }; - slack_url = mkOption { type = str; description = "Slack webhook url to push status update"; }; - slack_channel = mkOption { type = str; description = "Slack channel to push status update"; }; - netdata_aggregator = mkOption { type = str; description = "Url where netdata information should be sent"; }; - netdata_keys = mkOption { type = attrsOf str; description = "netdata host keys"; }; - contacts = mkOption { type = attrsOf unspecified; description = "Contact dicts to fill naemon objects"; }; - email_check = mkOption { - description = "Emails services to check"; - type = attrsOf (submodule { - options = { - local = mkOption { type = bool; default = false; description = "Use local configuration"; }; - port = mkOption { type = nullOr str; default = null; description = "Port to connect to ssh"; }; - login = mkOption { type = nullOr str; default = null; description = "Login to connect to ssh"; }; - targets = mkOption { type = listOf str; description = "Hosts to send E-mails to"; }; - mail_address = mkOption { type = nullOr str; default = null; description = "E-mail recipient part to send e-mail to"; }; - mail_domain = mkOption { type = nullOr str; default = null; description = "E-mail domain part to send e-mail to"; }; - }; - }); - }; - }; - }; - }; - mpd = mkOption { - description = "MPD configuration"; - type = submodule { - options = { - folder = mkOption { type = str; description = "Folder to serve from the MPD instance"; }; - password = mkOption { type = str; description = "Password to connect to the MPD instance"; }; - host = mkOption { type = str; description = "Host to connect to the MPD instance"; }; - port = mkOption { type = str; description = "Port to connect to the MPD instance"; }; - }; - }; - }; - ftp = mkOption { - description = "FTP configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "FTP" { - proftpd_filter = mkOption { type = str; description = "Filter for proftpd listing in LDAP"; }; - pure-ftpd_filter = mkOption { type = str; description = "Filter for pure-ftpd listing in LDAP"; }; - }; - }; - }; - }; - vpn = mkOption { - description = "VPN configuration"; - type = attrsOf (submodule { - options = { - prefix = mkOption { type = str; description = "ipv6 prefix for the vpn subnet"; }; - privateKey = mkOption { type = str; description = "Private key for the host"; }; - publicKey = mkOption { type = str; description = "Public key for the host"; }; - }; - }); - }; - mail = mkOption { - description = "Mail configuration"; - type = submodule { - options = { - dmarc = mkOption { - description = "DMARC configuration"; - type = submodule { - options = { - ignore_hosts = mkOption { - type = lines; - description = '' - Hosts to ignore when checking for dmarc - ''; - }; - }; - }; - }; - dkim = mkOption { - description = "DKIM configuration"; - type = attrsOf (submodule { - options = { - public = mkOption { - type = str; - example = '' - ( "v=DKIM1; k=rsa; " - "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3w1a2aMxWw9+hdcmbqX4UevcVqr204y0K73Wdc7MPZiOOlUJQYsMNSYR1Y/SC7jmPKeitpcJCpQgn/cveJZbuikjjPLsDReHyFEYmC278ZLRTELHx6f1IXM8WE08JIRT69CfZiMi1rVcOh9qRT4F93PyjCauU8Y5hJjtg9ThsWwIDAQAB" ) - ''; - description = "Public entry to put in DNS TXT field"; - }; - private = mkOption { type = str; description = "Private key"; }; - }; - }); - }; - postfix = mkOption { - description = "Postfix configuration"; - type = submodule { - options = { - additional_mailbox_domains = mkOption { - description = '' - List of domains that are used as mailbox final destination, in addition to those defined in the DNS records - ''; - type = listOf str; - }; - mysql = mkMysqlOptions "Postfix" { - password_encrypt = mkOption { type = str; description = "Key to encrypt relay password in database"; }; - }; - backup_domains = mkOption { - description = '' - Domains that are accepted for relay as backup domain - ''; - type = attrsOf (submodule { - options = { - domains = mkOption { type = listOf str; description = "Domains list"; }; - relay_restrictions = mkOption { - type = lines; - description = '' - Restrictions for relaying the e-mails from the domains - ''; - }; - recipient_maps = mkOption { - description = '' - Recipient map to accept relay for. - Must be specified for domain, the rules apply to everyone! - ''; - type = listOf (submodule { - options = { - type = mkOption { - type = enum [ "hash" ]; - description = "Map type"; - }; - content = mkOption { - type = str; - description = "Map content"; - }; - }; - }); - }; - }; - }); - }; - }; - }; - }; - dovecot = mkOption { - description = "Dovecot configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "Dovecot" { - pass_attrs = mkOption { type = str; description = "Password attribute in LDAP"; }; - user_attrs = mkOption { type = str; description = "User attribute mapping in LDAP"; }; - iterate_attrs = mkOption { type = str; description = "User attribute mapping for listing in LDAP"; }; - iterate_filter = mkOption { type = str; description = "User attribute filter for listing in LDAP"; }; - postfix_mailbox_filter = mkOption { type = str; description = "Postfix filter to get mailboxes"; }; - }; - }; - }; - }; - rspamd = mkOption { - description = "rspamd configuration"; - type = submodule { - options = { - redis = mkRedisOptions "Redis"; - read_password_hashed = mkOption { type = str; description = "Hashed read password for rspamd"; }; - write_password_hashed = mkOption { type = str; description = "Hashed write password for rspamd"; }; - read_password = mkOption { - type = str; - description = "Read password for rspamd. Unused"; - apply = x: ""; - }; - write_password = mkOption { - type = str; - description = "Write password for rspamd. Unused"; - apply = x: ""; - }; - }; - }; - }; - scripts = mkOption { - description = "Mail script recipients"; - type = attrsOf (submodule { - options = { - external = mkEnableOption "Create a script_@mail.immae.eu external address"; - src = mkOption { - description = '' - git source to fetch the script from. - It must have a default.nix file as its root accepting a scriptEnv parameter - ''; - type = submodule { - options = { - url = mkOption { type = str; description = "git url to fetch"; }; - rev = mkOption { type = str; description = "git reference to fetch"; }; - }; - }; - }; - env = mkOption { - description = "Variables to pass to the script"; - type = unspecified; - }; - }; - }); - }; - sympa = mkOption { - description = "Sympa configuration"; - type = submodule { - options = { - listmasters = mkOption { - type = listOf str; - description = "Listmasters"; - }; - postgresql = mkPsqlOptions "Sympa"; - data_sources = mkOption { - type = attrsOf str; - default = {}; - description = "Data sources to make available to sympa"; - }; - scenari = mkOption { - type = attrsOf str; - default = {}; - description = "Scenari to make available to sympa"; - }; - }; - }; - }; - }; - }; - }; - buildbot = mkOption { - description = "Buildbot configuration"; - type = submodule { - options = { - ssh_key = mkOption { - description = "SSH key information"; - type = submodule { - options = { - public = mkOption { type = str; description = "Public part of the key"; }; - private = mkOption { type = lines; description = "Private part of the key"; }; - }; - }; - }; - workerPassword = mkOption { description = "Buildbot worker password"; type = str; }; - user = mkOption { - description = "Buildbot user"; - type = submodule { - options = { - uid = mkOption { - description = "user uid"; - type = int; - }; - gid = mkOption { - description = "user gid"; - type = int; - }; - }; - }; - }; - ldap = mkOption { - description = "Ldap configuration for buildbot"; - type = submodule { - options = { - password = mkOption { type = str; description = "Buildbot password"; }; - }; - }; - }; - projects = mkOption { - description = "Projects to make a buildbot for"; - type = attrsOf (submodule { - options = { - name = mkOption { type = str; description = "Project name"; }; - packages = mkOption { - type = unspecified; - example = literalExample '' - pkgs: [ pkgs.bash pkgs.git pkgs.gzip pkgs.openssh ]; - ''; - description = '' - Function. - Builds packages list to make available to buildbot project. - Takes pkgs as argument. - ''; - }; - pythonPackages = mkOption { - type = unspecified; - example = literalExample '' - p: pkgs: [ pkgs.python3Packages.pip ]; - ''; - description = '' - Function. - Builds python packages list to make available to buildbot project. - Takes buildbot python module as first argument and pkgs as second argument in order to augment the python modules list. - ''; - }; - pythonPathHome = mkOption { type = bool; description = "Whether to add project’s python home to python path"; }; - workerPort = mkOption { type = port; description = "Port for the worker"; }; - secrets = mkOption { - type = attrsOf str; - description = "Secrets for the project to dump as files"; - }; - environment = mkOption { - type = attrsOf str; - description = '' - Environment variables for the project. - BUILDBOT_ is prefixed to the variable names - ''; - }; - activationScript = mkOption { - type = lines; - description = '' - Activation script to run during deployment - ''; - }; - builderPaths = mkOption { - type = attrsOf unspecified; - default = {}; - description = '' - Attrs of functions to make accessible specifically per builder. - Takes pkgs as argument and should return a single path containing binaries. - This path will be accessible as BUILDBOT_PATH_ - ''; - }; - webhookTokens = mkOption { - type = nullOr (listOf str); - default = null; - description = '' - List of tokens allowed to push to project’s change_hook/base endpoint - ''; - }; - }; - }); - }; - }; - }; - }; - tools = mkOption { - description = "Tools configurations"; - type = submodule { - options = { - contact = mkOption { type = str; description = "Contact e-mail address"; }; - assets = mkOption { - default = {}; - type = attrsOf (submodule { - options = { - url = mkOption { type = str; description = "URL to fetch"; }; - sha256 = mkOption { type = str; description = "Hash of the url"; }; - }; - }); - description = "Assets to provide on assets.immae.eu"; - }; - davical = mkOption { - description = "Davical configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Davical"; - ldap = mkLdapOptions "Davical" {}; - }; - }; - }; - diaspora = mkOption { - description = "Diaspora configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Diaspora"; - redis = mkRedisOptions "Diaspora"; - ldap = mkLdapOptions "Diaspora" {}; - secret_token = mkOption { type = str; description = "Secret token"; }; - }; - }; - }; - dmarc_reports = mkOption { - description = "DMARC reports configuration"; - type = submodule { - options = { - mysql = mkMysqlOptions "DMARC" {}; - anonymous_key = mkOption { type = str; description = "Anonymous hashing key"; }; - }; - }; - }; - etherpad-lite = mkOption { - description = "Etherpad configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Etherpad"; - ldap = mkLdapOptions "Etherpad" { - group_filter = mkOption { type = str; description = "Filter for groups"; }; - }; - adminPassword = mkOption { type = str; description = "Admin password for mypads / admin"; }; - session_key = mkOption { type = str; description = "Session key"; }; - api_key = mkOption { type = str; description = "API key"; }; - redirects = mkOption { type = str; description = "Redirects for apache"; }; - }; - }; - }; - gitolite = mkOption { - description = "Gitolite configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "Gitolite" {}; - ssh_key = mkOption { - description = "SSH key information"; - type = submodule { - options = { - public = mkOption { type = str; description = "Public part of the key"; }; - private = mkOption { type = lines; description = "Private part of the key"; }; - }; - }; - }; - }; - }; - }; - kanboard = mkOption { - description = "Kanboard configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Kanboard"; - ldap = mkLdapOptions "Kanboard" { - admin_dn = mkOption { type = str; description = "Admin DN"; }; - }; - }; - }; - }; - mantisbt = mkOption { - description = "Mantisbt configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Mantisbt"; - ldap = mkLdapOptions "Mantisbt" {}; - master_salt = mkOption { type = str; description = "Master salt for password hash"; }; - }; - }; - }; - mastodon = mkOption { - description = "Mastodon configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Mastodon"; - redis = mkRedisOptions "Mastodon"; - ldap = mkLdapOptions "Mastodon" {}; - paperclip_secret = mkOption { type = str; description = "Paperclip secret"; }; - otp_secret = mkOption { type = str; description = "OTP secret"; }; - secret_key_base = mkOption { type = str; description = "Secret key base"; }; - vapid = mkOption { - description = "vapid key"; - type = submodule { - options = { - private = mkOption { type = str; description = "Private key"; }; - public = mkOption { type = str; description = "Public key"; }; - }; - }; - }; - }; - }; - }; - mediagoblin = mkOption { - description = "Mediagoblin configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Mediagoblin"; - redis = mkRedisOptions "Mediagoblin"; - ldap = mkLdapOptions "Mediagoblin" {}; - }; - }; - }; - nextcloud = mkOption { - description = "Nextcloud configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Peertube"; - redis = mkRedisOptions "Peertube"; - password_salt = mkOption { type = str; description = "Password salt"; }; - instance_id = mkOption { type = str; description = "Instance ID"; }; - secret = mkOption { type = str; description = "App secret"; }; - }; - }; - }; - peertube = mkOption { - description = "Peertube configuration"; - type = submodule { - options = { - listenPort = mkOption { type = port; description = "Port to listen to"; }; - postgresql = mkPsqlOptions "Peertube"; - redis = mkRedisOptions "Peertube"; - ldap = mkLdapOptions "Peertube" {}; - }; - }; - }; - syden_peertube = mkOption { - description = "Peertube Syden configuration"; - type = submodule { - options = { - listenPort = mkOption { type = port; description = "Port to listen to"; }; - postgresql = mkPsqlOptions "Peertube"; - redis = mkRedisOptions "Peertube"; - }; - }; - }; - phpldapadmin = mkOption { - description = "phpLdapAdmin configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "phpldapadmin" {}; - }; - }; - }; - rompr = mkOption { - description = "Rompr configuration"; - type = submodule { - options = { - mpd = mkOption { - description = "MPD configuration"; - type = submodule { - options = { - host = mkOption { type = str; description = "Host for MPD"; }; - port = mkOption { type = port; description = "Port to access MPD host"; }; - }; - }; - }; - }; - }; - }; - roundcubemail = mkOption { - description = "Roundcubemail configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "TT-RSS"; - secret = mkOption { type = str; description = "Secret"; }; - }; - }; - }; - shaarli = mkOption { - description = "Shaarli configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "Shaarli" {}; - }; - }; - }; - status_engine = mkOption { - description = "Status Engine configuration"; - type = submodule { - options = { - mysql = mkMysqlOptions "StatusEngine" {}; - ldap = mkLdapOptions "StatusEngine" {}; - }; - }; - }; - task = mkOption { - description = "Taskwarrior configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "Taskwarrior" {}; - taskwarrior-web = mkOption { - description = "taskwarrior-web profiles"; - type = attrsOf (submodule { - options = { - uid = mkOption { - type = listOf str; - description = "List of ldap uids having access to this profile"; - }; - org = mkOption { type = str; description = "Taskd organisation"; }; - key = mkOption { type = str; description = "Taskd key"; }; - date = mkOption { type = str; description = "Preferred date format"; }; - }; - }); - }; - }; - }; - }; - ttrss = mkOption { - description = "TT-RSS configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "TT-RSS"; - ldap = mkLdapOptions "TT-RSS" {}; - }; - }; - }; - wallabag = mkOption { - description = "Wallabag configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Wallabag"; - ldap = mkLdapOptions "Wallabag" { - admin_filter = mkOption { type = str; description = "Admin users filter"; }; - }; - redis = mkRedisOptions "Wallabag"; - secret = mkOption { type = str; description = "App secret"; }; - }; - }; - }; - webhooks = mkOption { - type = attrsOf str; - description = "Mapping 'name'.php => script for webhooks"; - }; - csp_reports = mkOption { - description = "CSP report configuration"; - type = submodule { - options = { - report_uri = mkOption { type = str; description = "URI to report CSP violations to"; }; - policies = mkOption { type = attrsOf str; description = "CSP policies to apply"; }; - postgresql = mkPsqlOptions "CSP reports"; - }; - }; - }; - commento = mkOption { - description = "Commento configuration"; - type = submodule { - options = { - listenPort = mkOption { type = port; description = "Port to listen to"; }; - postgresql = mkPsqlOptions "Commento"; - smtp = mkSmtpOptions "Commento"; - }; - }; - }; - cryptpad = mkOption { - description = "Cryptpad configuration"; - type = attrsOf (submodule { - options = { - email = mkOption { type = str; description = "Admin e-mail"; }; - admins = mkOption { type = listOf str; description = "Instance admin public keys"; }; - port = mkOption { type = port; description = "Port to listen to"; }; - }; - }); - }; - ympd = mkOption { - description = "Ympd configuration"; - type = submodule { - options = { - listenPort = mkOption { type = port; description = "Port to listen to"; }; - mpd = mkOption { - description = "MPD configuration"; - type = submodule { - options = { - password = mkOption { type = str; description = "Password to access MPD host"; }; - host = mkOption { type = str; description = "Host for MPD"; }; - port = mkOption { type = port; description = "Port to access MPD host"; }; - }; - }; - }; - }; - }; - }; - umami = mkOption { - description = "Umami configuration"; - type = submodule { - options = { - listenPort = mkOption { type = port; description = "Port to listen to"; }; - postgresql = mkPsqlOptions "Umami"; - hashSalt = mkOption { type = str; description = "Hash salt"; }; - }; - }; - }; - yourls = mkOption { - description = "Yourls configuration"; - type = submodule { - options = { - mysql = mkMysqlOptions "Yourls" {}; - ldap = mkLdapOptions "Yourls" {}; - cookieKey = mkOption { type = str; description = "Cookie key"; }; - }; - }; - }; - }; - }; - }; - serverSpecific = mkOption { type = attrsOf unspecified; description = "Server specific configuration"; }; - websites = mkOption { - description = "Websites configurations"; - type = submodule { - options = { - immae = mkOption { - description = "Immae configuration by environment"; - type = submodule { - options = { - temp = mkOption { - description = "Temp configuration"; - type = submodule { - options = { - ldap = mkLdapOptions "Immae temp" { - filter = mkOption { type = str; description = "Filter for user access"; }; - }; - }; - }; - }; - }; - }; - }; - isabelle = mkOption { - description = "Isabelle configurations by environment"; - type = - let - atenSubmodule = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "Symfony environment"; }; - secret = mkOption { type = str; description = "Symfony App secret"; }; - postgresql = mkPsqlOptions "Aten"; - }; - }; - }; - in - submodule { - options = { - aten_production = atenSubmodule; - aten_integration = atenSubmodule; - iridologie = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "SPIP environment"; }; - mysql = mkMysqlOptions "Iridologie" {}; - ldap = mkLdapOptions "Iridologie" {}; - }; - }; - }; - }; - }; - }; - chloe = mkOption { - description = "Chloe configurations by environment"; - type = - let - chloeSubmodule = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "SPIP environment"; }; - mysql = mkMysqlOptions "Chloe" {}; - ldap = mkLdapOptions "Chloe" {}; - }; - }; - }; - in - submodule { - options = { - production = chloeSubmodule; - integration = chloeSubmodule; - }; - }; - }; - connexionswing = mkOption { - description = "Connexionswing configurations by environment"; - type = - let - csSubmodule = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "Symfony environment"; }; - mysql = mkMysqlOptions "Connexionswing" {}; - secret = mkOption { type = str; description = "Symfony App secret"; }; - email = mkOption { type = str; description = "Symfony email notification"; }; - }; - }; - }; - in - submodule { - options = { - production = csSubmodule; - integration = csSubmodule; - }; - }; - }; - jerome = mkOption { - description = "Naturaloutil configuration"; - type = submodule { - options = { - mysql = mkMysqlOptions "Naturaloutil" {}; - server_admin = mkOption { type = str; description = "Server admin e-mail"; }; - }; - }; - }; - telio_tortay = mkOption { - description = "Telio Tortay configuration"; - type = submodule { - options = { - server_admin = mkOption { type = str; description = "Server admin e-mail"; }; - }; - }; - }; - ludivine = mkOption { - description = "Ludivinecassal configurations by environment"; - type = - let - lcSubmodule = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "Symfony environment"; }; - mysql = mkMysqlOptions "LudivineCassal" {}; - ldap = mkLdapOptions "LudivineCassal" {}; - secret = mkOption { type = str; description = "Symfony App secret"; }; - }; - }; - }; - in - submodule { - options = { - production = lcSubmodule; - integration = lcSubmodule; - }; - }; - }; - emilia = mkOption { - description = "Emilia configuration"; - type = submodule { - options = { - postgresql = mkPsqlOptions "Emilia"; - }; - }; - }; - florian = mkOption { - description = "Florian configuration"; - type = submodule { - options = { - server_admin = mkOption { type = str; description = "Server admin e-mail"; }; - }; - }; - }; - nassime = mkOption { - description = "Nassime configuration"; - type = submodule { - options = { - server_admin = mkOption { type = str; description = "Server admin e-mail"; }; - }; - }; - }; - piedsjaloux = mkOption { - description = "Piedsjaloux configurations by environment"; - type = - let - pjSubmodule = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "Symfony environment"; }; - mysql = mkMysqlOptions "Piedsjaloux" {}; - secret = mkOption { type = str; description = "Symfony App secret"; }; - }; - }; - }; - in - submodule { - options = { - production = pjSubmodule; - integration = pjSubmodule; - }; - }; - }; - richie = mkOption { - description = "Europe Richie configurations by environment"; - type = submodule { - options = { - mysql = mkMysqlOptions "Richie" {}; - smtp_mailer = mkOption { - description = "SMTP mailer configuration"; - type = submodule { - options = { - user = mkOption { type = str; description = "Username"; }; - password = mkOption { type = str; description = "Password"; }; - }; - }; - }; - }; - }; - }; - caldance = mkOption { - description = "Caldance configurations by environment"; - type = submodule { - options = { - integration = mkOption { - description = "environment configuration"; - type = submodule { - options = { - password = mkOption { type = str; description = "Password file content for basic auth"; }; - }; - }; - }; - }; - }; - }; - tellesflorian = mkOption { - description = "Tellesflorian configurations by environment"; - type = - let - tfSubmodule = mkOption { - description = "environment configuration"; - type = submodule { - options = { - environment = mkOption { type = str; description = "Symfony environment"; }; - mysql = mkMysqlOptions "Tellesflorian" {}; - secret = mkOption { type = str; description = "Symfony App secret"; }; - invite_passwords = mkOption { type = str; description = "Password basic auth"; }; - }; - }; - }; - in - submodule { - options = { - integration = tfSubmodule; - }; - }; - }; - }; - }; - }; - }; - options.hostEnv = mkOption { - readOnly = true; - type = hostEnv; - default = config.myEnv.servers."${name}"; - description = "Host environment"; - }; -} diff --git a/modules/private/gemini/default.nix b/modules/private/gemini/default.nix deleted file mode 100644 index ffe8a12..0000000 --- a/modules/private/gemini/default.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ lib, config, pkgs, ... }: -let - configFile = pkgs.writeText "config.yaml" '' - listen: ":1965" - hosts: - immae.eu: - cert: /var/lib/acme/immae/full.pem - key: /var/lib/acme/immae/key.pem - paths: - - path: / - root: ${./public} - ''; -in -{ - options.myServices.gemini.enable = lib.mkEnableOption "enable Gemini capsule"; - config = lib.mkIf config.myServices.gemini.enable { - networking.firewall.allowedTCPPorts = [ 1965 ]; - systemd.services.gemini = { - description = "Gemini capsule server"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - serviceConfig.ExecStart = "${pkgs.twins}/bin/twins -config ${configFile}"; - serviceConfig.Type = "simple"; - }; - }; -} diff --git a/modules/private/gitolite/default.nix b/modules/private/gitolite/default.nix deleted file mode 100644 index 6a74734..0000000 --- a/modules/private/gitolite/default.nix +++ /dev/null @@ -1,77 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.gitolite; -in { - options.myServices.gitolite = { - enable = lib.mkEnableOption "my gitolite service"; - gitoliteDir = lib.mkOption { - type = lib.types.str; - default = "/var/lib/gitolite"; - }; - }; - - config = lib.mkIf cfg.enable { - myServices.ssh.modules = [{ - snippet = builtins.readFile ./ldap_gitolite.sh; - dependencies = [ pkgs.gitolite ]; - }]; - networking.firewall.allowedTCPPorts = [ 9418 ]; - - secrets.keys."gitolite/ldap_password" = { - user = "gitolite"; - group = "gitolite"; - permissions = "0400"; - text = config.myEnv.tools.gitolite.ldap.password; - }; - - services.gitDaemon = { - enable = true; - user = "gitolite"; - group = "gitolite"; - basePath = "${cfg.gitoliteDir}/repositories"; - }; - - system.activationScripts.gitolite = let - deps = [ pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.coreutils ]; - gitolite_ldap_groups = pkgs.runCommand "gitolite_ldap_groups.sh" { - buildInputs = [ pkgs.makeWrapper ]; - } '' - makeWrapper "${./gitolite_ldap_groups.sh}" "$out" \ - --prefix PATH : ${lib.makeBinPath deps} \ - --set LDAP_PASS_PATH ${config.secrets.fullPaths."gitolite/ldap_password"} - ''; - in { - deps = [ "users" ]; - text = '' - if [ -d ${cfg.gitoliteDir} ]; then - ln -sf ${gitolite_ldap_groups} ${cfg.gitoliteDir}/gitolite_ldap_groups.sh - chmod g+rx ${cfg.gitoliteDir} - fi - if [ -f ${cfg.gitoliteDir}/projects.list ]; then - chmod g+r ${cfg.gitoliteDir}/projects.list - fi - ''; - }; - - users.users.wwwrun.extraGroups = [ "gitolite" ]; - users.users.gitolite.extraGroups = [ "keys" ]; - - users.users.gitolite.packages = let - python-packages = python-packages: with python-packages; [ - simplejson - urllib3 - sleekxmpp - ]; - in - [ - (pkgs.python3.withPackages python-packages) - pkgs.nettools - pkgs.findutils - ]; - # Installation: https://git.immae.eu/mantisbt/view.php?id=93 - services.gitolite = { - enable = true; - adminPubkey = config.myEnv.sshd.rootKeys.immae_dilion; - }; - }; -} diff --git a/modules/private/gitolite/ldap_gitolite.sh b/modules/private/gitolite/ldap_gitolite.sh deleted file mode 100644 index 23cb2bf..0000000 --- a/modules/private/gitolite/ldap_gitolite.sh +++ /dev/null @@ -1,33 +0,0 @@ -### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh -LDAP_GITOLITE_MEMBER="cn=users,cn=gitolite,ou=services,dc=immae,dc=eu" -GITOLITE_SHELL=$(which gitolite-shell) - -if [[ $user == gitolite ]]; then - ldap_search '(&(memberOf='$LDAP_GITOLITE_MEMBER')('$KEY'=*))' $KEY | \ - while read line ; - do - if [ ! -z "$line" ]; then - if [[ $line == dn* ]]; then - user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line") - if [ -n "$user" ]; then - if [[ $user == "immae" ]] || [[ $user == "denise" ]]; then - # Capitalize first letter (backward compatibility) - user=$(sed -r 's/^([a-z])/\U\1/' <<< "$user") - fi - else - # Service fake user - user=$(sed -n 's/.*cn=\([^,]*\).*/\1/p' <<< "$line") - fi - elif [[ $line == $KEY* ]]; then - key=$(clean_key_line git "$line") - if [ ! -z "$key" ]; then - if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then - echo -n 'command="'$GITOLITE_SHELL' '$user'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ' - echo $key - fi - fi - fi - fi - done - exit 0 -fi diff --git a/modules/private/irc.nix b/modules/private/irc.nix deleted file mode 100644 index bc0bfb4..0000000 --- a/modules/private/irc.nix +++ /dev/null @@ -1,54 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.irc; -in -{ - options.myServices = { - ircCerts = lib.mkOption { - description = "Default ircconfigurations for certificates as accepted by acme"; - }; - irc.enable = lib.mkOption { - type = lib.types.bool; - default = false; - description = '' - Whether to enable irc stuff. - ''; - }; - }; - - config = lib.mkIf cfg.enable { - security.acme.certs."irc" = config.myServices.ircCerts // { - domain = "irc.immae.eu"; - postRun = '' - systemctl restart stunnel.service - ''; - }; - - networking.firewall.allowedTCPPorts = [ 6697 ]; - services.bitlbee = with pkgs; { - enable = true; - authMode = "Registered"; - libpurple_plugins = [ - purple-hangouts - purple-matrix - ]; - plugins = [ - bitlbee-mastodon - bitlbee-facebook - bitlbee-discord - bitlbee-steam - ]; - }; - - services.stunnel = { - enable = true; - servers = { - bitlbee = { - accept = 6697; - connect = 6667; - cert = "${config.security.acme.certs.irc.directory}/full.pem"; - }; - }; - }; - }; -} diff --git a/modules/private/loginctl-linger.nix b/modules/private/loginctl-linger.nix deleted file mode 100644 index e6b9f23..0000000 --- a/modules/private/loginctl-linger.nix +++ /dev/null @@ -1,47 +0,0 @@ -{ config, lib, pkgs, ... }: - -# https://github.com/michalrus/dotfiles/commit/ebd5fa9583f82589f23531647aa677feb3f8d344#diff-4d353005ef5b3e37f33c07332b8523edR1 -# A temporary hack to `loginctl enable-linger $somebody` (for -# multiplexer sessions to last), until this one is unresolved: -# https://github.com/NixOS/nixpkgs/issues/3702 -# -# Usage: `users.extraUsers.somebody.linger = true` or slt. - -with lib; - -let - - dataDir = "/var/lib/systemd/linger"; - - lingeringUsers = map (u: u.name) (attrValues (flip filterAttrs config.users.users (n: u: u.linger))); - - lingeringUsersFile = builtins.toFile "lingering-users" - (concatStrings (map (s: "${s}\n") - (sort (a: b: a < b) lingeringUsers))); # this sorting is important for `comm` to work correctly - - updateLingering = pkgs.writeScript "update-lingering" '' - if [ ! -e ${dataDir} ]; then - install -m 0755 -o root -g root -d ${dataDir} - fi - if [ -e ${dataDir} ] ; then - ls ${dataDir} | sort | comm -3 -1 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl disable-linger - ls ${dataDir} | sort | comm -3 -2 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl enable-linger - fi - ''; - -in - -{ - options = { - users.users = mkOption { - options = [{ - linger = mkEnableOption "lingering for the user"; - }]; - }; - }; - - config = { - system.activationScripts.update-lingering = - stringAfter [ "users" ] updateLingering; - }; -} diff --git a/modules/private/mail/default.nix b/modules/private/mail/default.nix deleted file mode 100644 index 2d405c6..0000000 --- a/modules/private/mail/default.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ lib, pkgs, config, ... }: -{ - imports = [ - ./milters.nix - ./postfix.nix - ./dovecot.nix - ./relay.nix - ./rspamd.nix - ./opensmtpd.nix - ./sympa.nix - ]; - options.myServices.mail.enable = lib.mkEnableOption "enable Mail services"; - options.myServices.mailRelay.enable = lib.mkEnableOption "enable Mail relay services"; - options.myServices.mailBackup.enable = lib.mkEnableOption "enable MX backup services"; - - config = lib.mkIf config.myServices.mail.enable { - security.acme.certs."mail" = config.myServices.certificates.certConfig // { - domain = config.hostEnv.fqdn; - extraDomains = let - zonesWithMx = builtins.filter (zone: - lib.attrsets.hasAttr "withEmail" zone && lib.lists.length zone.withEmail > 0 - ) config.myEnv.dns.masterZones; - mxs = map (zone: "${config.hostEnv.mx.subdomain}.${zone.name}") zonesWithMx; - in builtins.listToAttrs (map (mx: lib.attrsets.nameValuePair mx null) mxs); - }; - # This is for clients that don’t support elliptic curves (e.g. - # printer) - security.acme.certs."mail-rsa" = config.myServices.certificates.certConfig // { - domain = config.hostEnv.fqdn; - keyType = "rsa4096"; - extraDomains = let - zonesWithMx = builtins.filter (zone: - lib.attrsets.hasAttr "withEmail" zone && lib.lists.length zone.withEmail > 0 - ) config.myEnv.dns.masterZones; - mxs = map (zone: "${config.hostEnv.mx.subdomain}.${zone.name}") zonesWithMx; - in builtins.listToAttrs (map (mx: lib.attrsets.nameValuePair mx null) mxs); - }; - systemd.slices.mail = { - description = "Mail slice"; - }; - }; -} diff --git a/modules/private/mail/milters.nix b/modules/private/mail/milters.nix deleted file mode 100644 index 4b93a7a..0000000 --- a/modules/private/mail/milters.nix +++ /dev/null @@ -1,88 +0,0 @@ -{ lib, pkgs, config, name, ... }: -{ - imports = - builtins.attrValues (import ../../../lib/flake-compat.nix ../../../flakes/private/openarc).nixosModules - ++ builtins.attrValues (import ../../../lib/flake-compat.nix ../../../flakes/private/opendmarc).nixosModules; - - options.myServices.mail.milters.sockets = lib.mkOption { - type = lib.types.attrsOf lib.types.path; - default = { - opendkim = "/run/opendkim/opendkim.sock"; - opendmarc = config.services.opendmarc.socket; - openarc = config.services.openarc.socket; - }; - readOnly = true; - description = '' - milters sockets - ''; - }; - config = lib.mkIf (config.myServices.mail.enable || config.myServices.mailBackup.enable) { - secrets.keys = { - "opendkim" = { - isDir = true; - user = config.services.opendkim.user; - group = config.services.opendkim.group; - permissions = "0550"; - }; - "opendkim/eldiron.private" = { - user = config.services.opendkim.user; - group = config.services.opendkim.group; - permissions = "0400"; - text = config.myEnv.mail.dkim.eldiron.private; - }; - "opendkim/eldiron.txt" = { - user = config.services.opendkim.user; - group = config.services.opendkim.group; - permissions = "0444"; - text = '' - eldiron._domainkey IN TXT ${config.myEnv.mail.dkim.eldiron.public}''; - }; - }; - users.users."${config.services.opendkim.user}".extraGroups = [ "keys" ]; - services.opendkim = { - enable = true; - socket = "local:${config.myServices.mail.milters.sockets.opendkim}"; - domains = builtins.concatStringsSep "," (lib.flatten (map - (zone: map - (e: "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}") - (zone.withEmail or []) - ) - config.myEnv.dns.masterZones - )); - keyPath = config.secrets.fullPaths."opendkim"; - selector = "eldiron"; - configFile = pkgs.writeText "opendkim.conf" '' - SubDomains yes - UMask 002 - AlwaysAddARHeader yes - ''; - group = config.services.postfix.group; - }; - systemd.services.opendkim.serviceConfig.Slice = "mail.slice"; - systemd.services.opendkim.preStart = lib.mkBefore '' - # Skip the prestart script as keys are handled in secrets - exit 0 - ''; - services.filesWatcher.opendkim = { - restart = true; - paths = [ - config.secrets.fullPaths."opendkim/eldiron.private" - ]; - }; - - systemd.services.milter_verify_from = { - description = "Verify from milter"; - after = [ "network.target" ]; - wantedBy = [ "multi-user.target" ]; - - serviceConfig = { - Slice = "mail.slice"; - User = "postfix"; - Group = "postfix"; - ExecStart = let python = pkgs.python3.withPackages (p: [ p.pymilter ]); - in "${python}/bin/python ${./verify_from.py} -s /run/milter_verify_from/verify_from.sock"; - RuntimeDirectory = "milter_verify_from"; - }; - }; - }; -} diff --git a/modules/private/mail/opensmtpd.nix b/modules/private/mail/opensmtpd.nix deleted file mode 100644 index e05bba9..0000000 --- a/modules/private/mail/opensmtpd.nix +++ /dev/null @@ -1,57 +0,0 @@ -{ lib, pkgs, config, name, ... }: -{ - config = lib.mkIf config.myServices.mailRelay.enable { - secrets.keys."opensmtpd/creds" = { - user = "smtpd"; - group = "smtpd"; - permissions = "0400"; - text = '' - eldiron ${name}:${config.hostEnv.ldap.password} - ''; - }; - users.users.smtpd.extraGroups = [ "keys" ]; - services.opensmtpd = { - enable = true; - serverConfiguration = let - filter-rewrite-from = pkgs.runCommand "filter-rewrite-from.py" { - buildInputs = [ pkgs.python3 ]; - } '' - cp ${./filter-rewrite-from.py} $out - patchShebangs $out - ''; - in '' - table creds \ - "${config.secrets.fullPaths."opensmtpd/creds"}" - # FIXME: filtering requires 6.6, uncomment following lines when - # upgrading - # filter "fixfrom" \ - # proc-exec "${filter-rewrite-from} ${name}@immae.eu" - # listen on socket filter "fixfrom" - action "relay-rewrite-from" relay \ - helo ${config.hostEnv.fqdn} \ - host smtp+tls://eldiron@eldiron.immae.eu:587 \ - auth \ - mail-from ${name}@immae.eu - action "relay" relay \ - helo ${config.hostEnv.fqdn} \ - host smtp+tls://eldiron@eldiron.immae.eu:587 \ - auth - match for any !mail-from "@immae.eu" action "relay-rewrite-from" - match for any mail-from "@immae.eu" action "relay" - ''; - }; - environment.systemPackages = [ config.services.opensmtpd.package ]; - services.mail.sendmailSetuidWrapper = { - program = "sendmail"; - source = "${config.services.opensmtpd.package}/bin/smtpctl"; - setuid = false; - setgid = false; - }; - security.wrappers.mailq = { - program = "mailq"; - source = "${config.services.opensmtpd.package}/bin/smtpctl"; - setuid = false; - setgid = false; - }; - }; -} diff --git a/modules/private/monitoring/default.nix b/modules/private/monitoring/default.nix deleted file mode 100644 index 0783c2f..0000000 --- a/modules/private/monitoring/default.nix +++ /dev/null @@ -1,249 +0,0 @@ -{ config, pkgs, lib, name, nodes, ... }: -let - cfg = config.myServices.monitoring; - activatedPlugins = [ "memory" "command" "bandwidth" ] - ++ (if cfg.master then (masterObjects.activatedPlugins or []) else []) - ++ (if cfg.master then (lib.flatten (map (v: v.activatedPlugins or []) otherObjects)) else []) - ++ (hostObjects.activatedPlugins or []) - ++ (if cfg.master then ["notify-primary"] else ["notify-secondary"]); - allPluginsConfig = import ./myplugins.nix { - inherit pkgs lib config; - sudo = "/run/wrappers/bin/sudo"; - }; - mypluginsConfig = lib.getAttrs activatedPlugins allPluginsConfig; - myplugins = let - mypluginsChunk = builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (k: v: v.chunk or "") mypluginsConfig); - in pkgs.runCommand "buildplugins" { - buildInputs = [ pkgs.makeWrapper pkgs.perl ]; - } '' - mkdir $out - ${mypluginsChunk} - ''; - toObjects = pkgs.callPackage ./to_objects.nix {}; - commonConfig = { - dilion = { - processWarn = "250"; processAlert = "400"; - loadWarn = "1.0"; loadAlert = "1.2"; - interface = "eth0"; - }; - eldiron = { - processWarn = "550"; processAlert = "650"; - loadWarn = "1.0"; loadAlert = "1.2"; - interface = "eth0"; - }; - backup-2 = { - processWarn = "60"; processAlert = "70"; - loadWarn = "1.0"; loadAlert = "2.0"; - interface = "ens3"; - }; - monitoring-1 = { - processWarn = "50"; processAlert = "60"; - loadWarn = "4.0"; loadAlert = "6.0"; - load15Warn = "1.0"; load15Alert = "2.0"; - interface = "ens3"; - }; - quatresaisons = { - processWarn = "250"; processAlert = "400"; - loadWarn = "1.0"; loadAlert = "1.2"; - interface = "eth0"; - }; - }; - externalObjects = lib.genAttrs [ "tiboqorl-fr" ] - (n: pkgs.callPackage (./. + "/objects_" + n + ".nix") { inherit emailCheck; }); - masterPassiveObjects = let - passiveNodes = lib.attrsets.filterAttrs (n: _: builtins.elem n ["backup-2" "eldiron" "quatresaisons" "dilion"]) nodes; - toPassiveServices = map (s: s.passiveInfo.filter s // s.passiveInfo); - passiveServices = lib.flatten (lib.attrsets.mapAttrsToList - (_: n: toPassiveServices n.config.myServices.monitoring.services) - passiveNodes - ) ++ lib.flatten (lib.attrsets.mapAttrsToList - (_: n: toPassiveServices n.service) - externalObjects); - in { - service = passiveServices; - host = lib.lists.foldr - (a: b: a//b) - {} - (lib.attrsets.mapAttrsToList (_: h: h.config.myServices.monitoring.hosts) passiveNodes - ++ lib.attrsets.mapAttrsToList (_: n: n.host) externalObjects); - }; - emailCheck = host: hostFQDN: let - allCfg = config.myEnv.monitoring.email_check; - cfg = allCfg."${host}"; - reverseTargets = builtins.attrNames (lib.attrsets.filterAttrs (k: v: builtins.elem host v.targets) allCfg); - to_email = cfg': host': - let sep = if lib.strings.hasInfix "+" cfg'.mail_address then "_" else "+"; - in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}"; - mails_to_send = builtins.concatStringsSep "," (map (n: to_email allCfg."${n}" host) cfg.targets); - mails_to_receive = builtins.concatStringsSep "," (map (n: "${to_email cfg n}:${n}") reverseTargets); - command = if cfg.local - then - [ "check_emails_local" "/var/lib/naemon/checks/email" mails_to_send mails_to_receive ] - else - [ "check_emails" cfg.login cfg.port mails_to_send mails_to_receive ]; - in - { - service_description = "${hostFQDN} email service is active"; - use = "mail-service"; - host_name = hostFQDN; - servicegroups = "webstatus-email"; - check_command = command; - }; - otherObjects = map - (n: (pkgs.callPackage (./. + "/objects_" + n + ".nix") { inherit emailCheck; })) - [ "ulminfo-fr" "phare" "eban" ]; - masterObjects = pkgs.callPackage ./objects_master.nix { inherit config; }; - commonObjects = pkgs.callPackage ./objects_common.nix ({ - master = cfg.master; - hostFQDN = config.hostEnv.fqdn; - hostName = name; - inherit mypluginsConfig; - } // builtins.getAttr name commonConfig); - hostObjects = - let - specific_file = ./. + "/objects_" + name + ".nix"; - in - lib.attrsets.optionalAttrs - (builtins.pathExists specific_file) - (pkgs.callPackage specific_file { - inherit config nodes emailCheck; - hostFQDN = config.hostEnv.fqdn; - hostName = name; - }); - objectsFiles = lib.mapAttrs' (name: value: lib.nameValuePair - "=/${name}/objects.conf" { alias = pkgs.writeText "objects.conf" (toObjects value); } - ) externalObjects; -in -{ - options = { - myServices.monitoring = { - enable = lib.mkOption { - type = lib.types.bool; - default = false; - description = '' - Whether to enable monitoring. - ''; - }; - master = lib.mkOption { - type = lib.types.bool; - default = false; - description = '' - This instance is the master instance - ''; - }; - hosts = lib.mkOption { - readOnly = true; - description = "Hosts list for this host"; - default = (commonObjects.host or {}) // (hostObjects.host or {}); - }; - services = lib.mkOption { - readOnly = true; - description = "Services list for this host"; - default = commonObjects.service ++ hostObjects.service; - }; - }; - }; - - config = lib.mkIf cfg.enable { - services.nginx = lib.mkIf config.myServices.status.enable { - virtualHosts."status.immae.eu".locations = objectsFiles // { - "=/common/immae.cfg" = { - alias = pkgs.writeText "immae.cfg" '' - # put me for instance in /etc/naemon/module-conf.d/immae.cfg - # Make sure that you have include_dir=module-conf.d in - # naemon.cfg - log_initial_states=1 - date_format=iso8601 - admin_email=${config.myEnv.monitoring.email} - obsess_over_services=1 - ocsp_command=notify-master - ''; - }; - "=/common/resource.cfg" = { - alias = pkgs.writeText "resource.cfg" '' - # Resource.cfg file - # Replace this with path to monitoring plugins - $USER1$=@@COMMON_PLUGINS@@ - # Replace this with a path to scripts from - # https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/tree/modules/private/monitoring/plugins - $USER2$=@@IMMAE_PLUGINS@@ - $USER200$=https://status.immae.eu/ - $USER201$=@@TOKEN@@ - ''; - }; - }; - }; - - security.sudo.extraRules = let - pluginsSudo = lib.lists.remove null (lib.attrsets.mapAttrsToList (k: v: - if (v ? sudo) - then ({ users = [ "naemon" ]; } // (v.sudo myplugins)) - else null) mypluginsConfig); - in [ - { - commands = [ - { command = "${pkgs.mdadm}/bin/mdadm --monitor --scan -1"; options = [ "NOPASSWD" ]; } - { command = "${pkgs.postfix}/bin/mailq"; options = [ "NOPASSWD" ]; } - ]; - users = [ "naemon" ]; - runAs = "root"; - } - ] ++ pluginsSudo; - environment.etc."mdadm.conf" = { - enable = true; - mode = "0644"; - user = "root"; - text = "MAILADDR ${config.myEnv.monitoring.email}"; - }; - - secrets.keys = { - "naemon/id_rsa" = { - user = "naemon"; - group = "naemon"; - permissions = "0400"; - text = config.myEnv.monitoring.ssh_secret_key; - }; - } // lib.optionalAttrs cfg.master ( - lib.mapAttrs' (k: v: lib.nameValuePair "${k}_access_key" { - user = "naemon"; - group = "naemon"; - permissions = "0400"; - text = '' - export AWS_ACCESS_KEY_ID="${v.accessKeyId}" - export AWS_SECRET_ACCESS_KEY="${v.secretAccessKey}" - export BASE_URL="${v.remote "immae-eldiron"}" - ''; - }) config.myEnv.backup.remotes - ); - # needed since extraResource is not in the closure - systemd.services.naemon.path = [ myplugins ]; - services.naemon = { - enable = true; - extraConfig = '' - use_syslog=1 - log_initial_states=1 - date_format=iso8601 - admin_email=${config.myEnv.monitoring.email} - '' + lib.optionalString (!cfg.master) '' - obsess_over_services=1 - ocsp_command=notify-master - '' + lib.optionalString (cfg.master) '' - broker_module=${pkgs.naemon-livestatus}/lib/naemon-livestatus/livestatus.so ${config.services.naemon.runDir}/live - broker_module=${pkgs.status_engine.module}/lib/status-engine/naemon/statusengine-${pkgs.naemon.status_engine_version}.o use_service_perfdata=1 use_process_data=0 use_system_command_data=0 use_external_command_data=0 use_flapping_data=0 use_program_status_data=0 use_notification_data=0 use_contact_status_data=0 use_contact_notification_data=0 use_event_handler_data=0 use_object_data=0 - ''; - extraResource = let - resources = [hostObjects.resources or {}] ++ (lib.mapAttrsToList (k: v: v.resources or {}) mypluginsConfig); - joined = lib.zipAttrsWith (n: v: if builtins.length (lib.unique v) == 1 then builtins.head v else abort "Non-unique resources names") resources; - joinedStr = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "$" + "${k}$=${v}") joined); - in '' - $USER2$=${myplugins} - ${joinedStr} - ''; - objectDefs = toObjects commonObjects - + toObjects hostObjects - + lib.optionalString cfg.master (toObjects masterObjects) - + lib.optionalString cfg.master (toObjects masterPassiveObjects) - + lib.optionalString cfg.master (builtins.concatStringsSep "\n" (map toObjects otherObjects)); - }; - }; -} diff --git a/modules/private/monitoring/objects_backup-2.nix b/modules/private/monitoring/objects_backup-2.nix deleted file mode 100644 index 28032a4..0000000 --- a/modules/private/monitoring/objects_backup-2.nix +++ /dev/null @@ -1,111 +0,0 @@ -{ config, pkgs, lib, hostFQDN, emailCheck, ... }: -let - defaultPassiveInfo = { - filter = lib.attrsets.filterAttrs - (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_"); - use = "external-passive-service"; - freshness_threshold = "450"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - host_name = hostFQDN; - }; -in -{ - activatedPlugins = [ "file_date" "mysql" "openldap" "redis" "emails" ]; - service = [ - (emailCheck "backup-2" hostFQDN // { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-email"; freshness_threshold = "1350"; }; - }) - { - passiveInfo = defaultPassiveInfo; - service_description = "Size on /backup2 partition"; - use = "local-service"; - check_command = ["check_local_disk" "10%" "5%" "/backup2"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-backup"; }; - service_description = "Last backup in /backup2/phare is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/phare" "14" "backup"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-backup"; }; - service_description = "Last backup in /backup2/dilion is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/dilion" "14" "backup"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-backup"; }; - service_description = "Last backup in /backup2/ulminfo is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/ulminfo" "14" "backup"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; }; - service_description = "Last postgresql dump in /backup2/eldiron/postgresql_backup is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/eldiron/postgresql_backup" "7" "postgres"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; }; - service_description = "Redis replication for eldiron is up to date"; - use = "local-service"; - check_command = ["check_redis_replication" "/run/redis_eldiron/redis.sock"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; }; - service_description = "Last redis dump in /backup2/eldiron/redis_backup is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/eldiron/redis_backup" "7" "redis"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; }; - service_description = "Mysql replication for eldiron is up to date"; - use = "local-service"; - check_command = ["check_mysql_replication" "/run/mysqld_eldiron/mysqld.sock" config.secrets.fullPaths."mysql_replication/eldiron/client"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; }; - service_description = "Last mysql dump in /backup2/eldiron/mysql_backup is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/eldiron/mysql_backup" "7" "mysql"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; }; - service_description = "Openldap replication for eldiron is up to date"; - use = "local-service"; - check_command = let - name = "eldiron"; - hcfg = config.myServices.databasesReplication.openldap.hosts.eldiron; - base = config.myServices.databasesReplication.openldap.base; - eldiron_schemas = pkgs.callPackage ../databases/openldap/eldiron_schemas.nix {}; - ldapConfig = pkgs.writeText "slapd.conf" '' - include ${pkgs.openldap}/etc/schema/core.schema - include ${pkgs.openldap}/etc/schema/cosine.schema - include ${pkgs.openldap}/etc/schema/inetorgperson.schema - include ${pkgs.openldap}/etc/schema/nis.schema - ${eldiron_schemas} - moduleload back_hdb - backend hdb - database hdb - - suffix "${hcfg.base}" - directory ${base}/${name}/openldap - ''; - in [ - "check_openldap_replication" - hcfg.url - hcfg.dn - config.secrets.fullPaths."openldap_replication/eldiron/replication_password" - hcfg.base - ldapConfig - ]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; }; - service_description = "Last openldap dump in /backup2/eldiron/openldap_backup is not too old"; - use = "local-service"; - check_command = ["check_last_file_date" "/backup2/eldiron/openldap_backup" "7" "openldap"]; - } - ]; -} diff --git a/modules/private/monitoring/objects_dilion.nix b/modules/private/monitoring/objects_dilion.nix deleted file mode 100644 index 16b3c64..0000000 --- a/modules/private/monitoring/objects_dilion.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ lib, hostFQDN, emailCheck, ... }: -let - defaultPassiveInfo = { - filter = lib.attrsets.filterAttrs - (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_"); - use = "external-passive-service"; - freshness_threshold = "450"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - host_name = hostFQDN; - }; - zfs_snapshot = name: { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; }; - service_description = "ZFS snapshot ${name} happened not too long ago"; - use = "local-service"; - check_command = ["check_zfs_snapshot" name]; - }; -in -{ - activatedPlugins = [ "zfs" ]; - service = [ - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; }; - service_description = "No ZFS pool is degraded"; - use = "local-service"; - check_command = ["check_zfs"]; - } - (zfs_snapshot "zpool/backup/eldiron/zpool/root") - (zfs_snapshot "zpool/backup/eldiron/zpool/root/etc") - (zfs_snapshot "zpool/backup/eldiron/zpool/root/var") - ]; -} diff --git a/modules/private/monitoring/objects_eban.nix b/modules/private/monitoring/objects_eban.nix deleted file mode 100644 index df54f6a..0000000 --- a/modules/private/monitoring/objects_eban.nix +++ /dev/null @@ -1,70 +0,0 @@ -{ ... }: -let - serviceTemplate = rest: { - host_name = "eban.bzh"; - use = "external-web-service"; - contacts = "eban"; - contact_groups = "null"; - check_interval = "15"; - - servicegroups = "webstatus-resources"; - _webstatus_namespace = "eban"; - } // rest; -in -{ - activatedPlugins = [ "http" ]; - contact = { - eban = { - use = "generic-contact"; - host_notification_commands = "notify-host-eban-url"; - service_notification_commands = "notify-service-eban-url"; - }; - }; - host = { - "eban.bzh" = { - alias = "eban.bzh"; - address = "eban.bzh"; - use = "linux-server"; - hostgroups = "webstatus-hosts"; - contacts = "eban"; - contact_groups = "null"; - _webstatus_name = "Eban"; - _webstatus_vhost = "status.eban.bzh"; - _webstatus_namespace = "eban"; - }; - }; - service = [ - (serviceTemplate { - service_description = "Eban website is up and running"; - check_command = ["check_https" "eban.bzh" "/" ""]; - _webstatus_name = "Main Website"; - _webstatus_url = "https://eban.bzh/"; - }) - (serviceTemplate { - service_description = "Eban blog is up and running"; - check_command = ["check_https" "blog.eban.bzh" "/" "<title>"]; - _webstatus_name = "Blog"; - _webstatus_url = "https://blog.eban.bzh/"; - }) - (serviceTemplate { - service_description = "Eban gitea is up and running"; - check_command = ["check_https" "git.eban.bzh" "/" "<title>"]; - _webstatus_name = "Git"; - _webstatus_url = "https://git.eban.bzh/"; - }) - (serviceTemplate { - service_description = "I Learned website is up and running"; - check_command = [ "check_https" "ilearned.eu.org" "/" "<title" ]; - - _webstatus_name = "I Learned website"; - _webstatus_url = "https://ilearned.eu.org/"; - }) - (serviceTemplate { - service_description = "I Learned gitea is up and running"; - check_command = [ "check_https" "git.ilearned.eu.org" "/" "<title" ]; - - _webstatus_name = "I Learned Git"; - _webstatus_url = "https://git.ilearned.eu.org/"; - }) - ]; -} diff --git a/modules/private/monitoring/objects_eldiron.nix b/modules/private/monitoring/objects_eldiron.nix deleted file mode 100644 index 75e7b0e..0000000 --- a/modules/private/monitoring/objects_eldiron.nix +++ /dev/null @@ -1,38 +0,0 @@ -{ lib, hostFQDN, emailCheck, ... }: -let - defaultPassiveInfo = { - filter = lib.attrsets.filterAttrs - (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_"); - use = "external-passive-service"; - freshness_threshold = "450"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - host_name = hostFQDN; - }; -in -{ - activatedPlugins = [ "emails" "postgresql" "zfs" ]; - service = [ - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; }; - service_description = "Postgresql replication for backup-2 is up to date"; - use = "local-service"; - check_command = ["check_postgresql_replication" "backup-2" "/run/postgresql" "5432"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; }; - service_description = "No ZFS pool is degraded"; - use = "local-service"; - check_command = ["check_zfs"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-email"; }; - service_description = "mailq is empty"; - use = "local-service"; - check_command = ["check_mailq"]; - } - (emailCheck "eldiron" hostFQDN // { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-email"; freshness_threshold = "1350"; }; - }) - ]; -} diff --git a/modules/private/monitoring/objects_master.nix b/modules/private/monitoring/objects_master.nix deleted file mode 100644 index 30bfe73..0000000 --- a/modules/private/monitoring/objects_master.nix +++ /dev/null @@ -1,39 +0,0 @@ -{ config, ... }: -{ - contact = { - immae = config.myEnv.monitoring.contacts.immae // { - use = "generic-contact"; - contactgroups = "admins"; - host_notification_commands = "notify-host-by-email,notify-by-slack!$USER206$!$USER207$"; - service_notification_commands = "notify-service-by-email,notify-by-slack!$USER206$!$USER207$"; - }; - }; - command = { - check_passive = "$USER1$/check_dummy 3 \"Service result are stale\""; - }; - templates = { - service = { - external-passive-service = { - active_checks_enabled = "0"; - check_freshness = "1"; - check_period = "24x7"; - contact_groups = "admins"; - event_handler_enabled = "1"; - flap_detection_enabled = "1"; - is_volatile = "0"; - max_check_attempts = "3"; - notification_interval = "60"; - notification_options = "w,u,c,r,f,s"; - notification_period = "24x7"; - notifications_enabled = "1"; - passive_checks_enabled = "1"; - process_perf_data = "1"; - retain_nonstatus_information = "1"; - retain_status_information = "1"; - retry_interval = "2"; - check_command = "check_passive"; - _webstatus_namespace = "immae"; - }; - }; - }; -} diff --git a/modules/private/monitoring/objects_monitoring-1.nix b/modules/private/monitoring/objects_monitoring-1.nix deleted file mode 100644 index 563be16..0000000 --- a/modules/private/monitoring/objects_monitoring-1.nix +++ /dev/null @@ -1,714 +0,0 @@ -{ config, pkgs, nodes, hostFQDN, emailCheck, lib, ... }: -{ - activatedPlugins = [ "dns" "ftp" "git" "http" "imap" "ovh" "tcp" ]; - host = { - # Dummy host for testing - # "dummy-host" = { - # alias = "dummy.host"; - # address = "dummy.host"; - # use = "linux-server"; - # check_command = "check_ok"; - # }; - }; - service = [ - # Dummy service for testing - # { - # service_description = "Dummy failing test"; - # host_name = "dummy-host"; - # use = "local-service"; - # check_interval = "0.3"; - # max_check_attempts = "1"; - # flap_detection_enabled = "0"; - # notification_interval = "0.1"; - # check_command = "check_critical"; - # } - - (emailCheck "monitoring-1" hostFQDN) - - { - service_description = "ftp has access to database for authentication"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = "check_ftp_database"; - - servicegroups = "webstatus-remote-services"; - _webstatus_name = "FTP"; - _webstatus_url = "ftp.immae.eu"; - } - - { - service_description = "gitolite is working"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = "check_git"; - - servicegroups = "webstatus-remote-services"; - _webstatus_name = "Git"; - _webstatus_url = "git.immae.eu"; - } - - { - service_description = "postfix SSL is up to date"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = "check_smtp"; - - servicegroups = "webstatus-ssl"; - _webstatus_name = "SMTP"; - _webstatus_url = "smtp.immae.eu"; - } - - { - service_description = "imap SSL is up to date"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = ["check_tcp_ssl" "993"]; - - servicegroups = "webstatus-ssl"; - _webstatus_name = "IMAP"; - _webstatus_url = "imap.immae.eu"; - } - - { - service_description = "imap connection works"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = "check_imap_connection"; - - servicegroups = "webstatus-remote-services,webstatus-email"; - _webstatus_name = "IMAP"; - _webstatus_url = "imap.immae.eu"; - } - - # Third party services - { - service_description = "OVH account has enough sms"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = "check_ovh_sms"; - - check_interval = "120"; - notification_interval = "1440"; - } - - # Backup services - # { - # service_description = "eriomem backup is up and not full"; - # host_name = "eldiron.immae.eu"; - # use = "external-service"; - # check_command = "check_backup_eriomem"; - - # check_interval = "120"; - # notification_interval = "1440"; - - # servicegroups = "webstatus-backup"; - # } - { - service_description = "ovh backup is up and not full"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = "check_ok"; - - check_interval = "120"; - notification_interval = "1440"; - - servicegroups = "webstatus-backup"; - } - - # DNS services - { - service_description = "eldiron dns is active and authoritative for aten.pro"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "aten.pro" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "aten.pro"; - } - - { - service_description = "eldiron dns is active and authoritative for bouya.org"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "bouya.org" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "bouya.org"; - } - - { - service_description = "eldiron dns is active and authoritative for filedesreves.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "filedesreves.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "filedesreves.fr"; - } - - { - service_description = "eldiron dns is active and authoritative for ludivinecassal.com"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "ludivinecassal.com" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "ludivinecassal.com"; - } - - { - service_description = "eldiron dns is active and authoritative for icommandeur.org"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "icommandeur.org" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "icommandeur.org"; - } - - { - service_description = "eldiron dns is active and authoritative for immae.eu"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "immae.eu" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "immae.eu"; - } - - { - service_description = "eldiron dns is active and authoritative for immae.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "immae.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "immae.fr"; - } - - { - service_description = "eldiron dns is active and authoritative for piedsjaloux.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "piedsjaloux.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "piedsjaloux.fr"; - } - - { - service_description = "eldiron dns is active and authoritative for saison-photo.org"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "saison-photo.org" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "saison-photo.org"; - } - - { - service_description = "eldiron dns is active and authoritative for tellesflorian.com"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "tellesflorian.com" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "tellesflorian.com"; - } - - { - service_description = "eldiron dns is active and authoritative for capitaines.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_dns" "capitaines.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "capitaines.fr"; - } - - { - service_description = "cloudns dns is active and authoritative for aten.pro"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "aten.pro" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "aten.pro (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for bouya.org"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "bouya.org" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "bouya.org (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for filedesreves.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "filedesreves.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "filedesreves.fr (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for ludivinecassal.com"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "ludivinecassal.com" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "ludivinecassal.com (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for icommandeur.org"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "icommandeur.org" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "icommandeur.org (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for immae.eu"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "immae.eu" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "immae.eu (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for immae.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "immae.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "immae.fr (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for piedsjaloux.fr"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "piedsjaloux.fr" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "piedsjaloux.fr (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for tellesflorian.com"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "tellesflorian.com" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "tellesflorian.com (Secondary DNS ClouDNS)"; - } - - { - service_description = "cloudns dns is active and authoritative for saison-photo.org"; - host_name = "eldiron.immae.eu"; - use = "dns-service"; - check_command = ["check_external_dns" "pns1.cloudns.net" "saison-photo.org" "-A"]; - - servicegroups = "webstatus-dns"; - _webstatus_name = "saison-photo.org (Secondary DNS ClouDNS)"; - } - - #### Web scenarios - { - service_description = "blog website is running on immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.immae.eu" "/blog/" "egrep -ri TODO /etc"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "Immae’s Blog"; - _webstatus_url = "https://www.immae.eu/blog"; - } - - { - service_description = "owncloud website is running on cloud.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "cloud.immae.eu" "/" "a safe home for all your data"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Nextcloud"; - _webstatus_url = "https://cloud.immae.eu"; - } - - { - service_description = "nextcloud website is running on nextcloud.4c.salle-s.org"; - host_name = "quatresaisons.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "nextcloud.4c.salle-s.org" "/" "a safe home for all your data"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Nextcloud"; - _webstatus_url = "https://nextcloud.4c.salle-s.org"; - } - - { - service_description = "davical website is running on dav.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "dav.immae.eu" "/davical/" "Log On Please"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Davical"; - _webstatus_url = "https://dav.immae.eu/davical"; - } - - { - service_description = "adminer website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https_auth" "tools.immae.eu" "/adminer/" "www.adminer.org"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Adminer"; - _webstatus_url = "https://tools.immae.eu/adminer/"; - } - - { - service_description = "ttrss website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "tools.immae.eu" "/ttrss/" "<title>Tiny Tiny RSS"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "TT-RSS"; - _webstatus_url = "https://tools.immae.eu/ttrss/"; - } - - { - service_description = "mpd website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https_auth" "tools.immae.eu" "/mpd/" "<title>ympd"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "MPD (YMPD)"; - _webstatus_url = "https://tools.immae.eu/mpd/"; - } - - { - service_description = "rompr mpd website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https_auth" "tools.immae.eu" "/rompr/" "<title>RompЯ"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "MPD (ROMPR)"; - _webstatus_url = "https://tools.immae.eu/rompr/"; - } - - { - service_description = "wallabag website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "tools.immae.eu" "/wallabag/" "<title>Bienvenue sur wallabag"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Wallabag"; - _webstatus_url = "https://tools.immae.eu/wallabag/"; - } - - { - service_description = "yourl website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "tools.immae.eu" "/url/admin/" "<title>YOURLS"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "YOURLS"; - _webstatus_url = "https://tools.immae.eu/url/admin/"; - } - - { - service_description = "roundcube website is running on mail.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "mail.immae.eu" "/roundcube/" "<title>Roundcube"]; - - servicegroups = "webstatus-webapps,webstatus-email"; - _webstatus_name = "Roundcube"; - _webstatus_url = "https://mail.immae.eu/roundcube/"; - } - - { - service_description = "dokuwiki website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "tools.immae.eu" "/dokuwiki/" "<title>start"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Dokuwiki"; - _webstatus_url = "https://tools.immae.eu/dokuwiki/"; - } - - { - service_description = "shaarli website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "tools.immae.eu" "/Shaarli/immae" "<title>Immae"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Shaarli"; - _webstatus_url = "https://tools.immae.eu/Shaarli/"; - } - - { - service_description = "ldap website is running on tools.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "tools.immae.eu" "/ldap/" "<title>phpLDAPadmin"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "LDAP"; - _webstatus_url = "https://tools.immae.eu/ldap/"; - } - - { - service_description = "gitweb website is running on git.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "git.immae.eu" "/cgit" "<title>Immae’s git"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Git"; - _webstatus_url = "https://git.immae.eu/"; - } - - { - service_description = "mantisbt website is running on git.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "git.immae.eu" "/mantisbt/" "<title>My View - MantisBT"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Mantisbt"; - _webstatus_url = "https://git.immae.eu/mantisbt"; - } - - { - service_description = "diaspora website is running on diaspora.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "diaspora.immae.eu" "/" "is the online social world where you are in control"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Diaspora"; - _webstatus_url = "https://diaspora.immae.eu/"; - } - - { - service_description = "peertube website is running on peertube.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "peertube.immae.eu" "/" "<title>Immae’s PeerTube"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Peertube"; - _webstatus_url = "https://peertube.immae.eu/"; - } - - { - service_description = "etherpad website is running on ether.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "ether.immae.eu" "/" "<title>Etherpad"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Etherpad"; - _webstatus_url = "https://ether.immae.eu/"; - } - - { - service_description = "mediagoblin website is running on mgoblin.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "mgoblin.immae.eu" "/" "<title>GNU MediaGoblin"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Mediagoblin"; - _webstatus_url = "https://mgoblin.immae.eu/"; - } - - { - service_description = "mastodon website is running on mastodon.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "mastodon.immae.eu" "/" "Mastodon"]; - - servicegroups = "webstatus-webapps"; - _webstatus_name = "Mastodon"; - _webstatus_url = "https://mastodon.immae.eu/"; - } - - # Other web pages - { - service_description = "Jerome website is running on naturaloutil.immae.eu"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "naturaloutil.immae.eu" "/ping.php" "YES"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "naturaloutil.immae.eu"; - _webstatus_url = "https://naturaloutil.immae.eu/"; - } - - { - service_description = "Telio website is running on realistesmedia.fr"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "realistesmedia.fr" "/" "doctype html"]; - contact_groups = "telio-tortay"; - } - - { - service_description = "Chloe website site is running on osteopathe-cc.fr"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.osteopathe-cc.fr" "/" "Chloé Condamin ostéopathe D.O."]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "osteopathe-cc.fr"; - _webstatus_url = "https://www.osteopathe-cc.fr/"; - } - - { - service_description = "Richie website is running on europe-richie.org"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.europe-richie.org" "/" "<title>.Europe Richie]"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "europe-richie.org"; - _webstatus_url = "https://www.europe-richie.org/"; - } - - { - service_description = "Ludivine website site is running on ludivinecassal.com"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.ludivinecassal.com" "/" "<title>Ludivine Cassal"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "ludivinecassal.com"; - _webstatus_url = "https://www.ludivinecassal.com/"; - } - - { - service_description = "Aten website site is running on aten.pro"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "aten.pro" "/" "<title>ATEN"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "aten.pro"; - _webstatus_url = "https://aten.pro/"; - } - - { - service_description = "PiedsJaloux website site is running on piedsjaloux.fr"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.piedsjaloux.fr" "/" "<title>Les Pieds Jaloux"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "piedsjaloux.fr"; - _webstatus_url = "https://www.piedsjaloux.fr/"; - } - - { - service_description = "Denise and Jerome website site is running on denisejerome.piedsjaloux.fr"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "denisejerome.piedsjaloux.fr" "/" "<title>Accueil - Mariage"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "denisejerome.piedsjaloux.fr"; - _webstatus_url = "https://denisejerome.piedsjaloux.fr/"; - } - - { - service_description = "Connexionswing website site is running on connexionswing.com"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.connexionswing.com" "/" "<title>Cours, stages"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "connexionswing.com"; - _webstatus_url = "https://www.connexionswing.com/"; - } - - { - service_description = "Sandetludo website site is running on sandetludo.com"; - host_name = "eldiron.immae.eu"; - use = "external-web-service"; - check_command = ["check_https" "www.sandetludo.com" "/" "<title>Cours de West Coast"]; - - servicegroups = "webstatus-websites"; - _webstatus_name = "sandetludo.com"; - _webstatus_url = "https://www.sandetludo.com/"; - } - - # SSL - { - service_description = "ldap SSL is up to date"; - host_name = "eldiron.immae.eu"; - use = "external-service"; - check_command = ["check_tcp_ssl" "636"]; - - servicegroups = "webstatus-ssl"; - _webstatus_name = "LDAP"; - _webstatus_url = "ldap.immae.eu"; - } - - # Tiboqorl - { - service_description = "Cyllene support page is running"; - host_name = "tiboqorl.fr"; - use = "external-web-service"; - contact_groups = "tiboqorl"; - check_command = [ "check_https" "sc.groupe-cyllene.com" "/" "<title>Support Client Cyllene" ]; - _webstatus_namespace = "tiboqorl"; - } - - { - service_description = "Origny page is running"; - host_name = "tiboqorl.fr"; - use = "external-web-service"; - contact_groups = "tiboqorl"; - check_command = [ "check_https" "origny.tiboqorl.fr" "/" "<title>Home Assistant" ]; - _webstatus_namespace = "tiboqorl"; - } - ]; - contact = { - telio-tortay = config.myEnv.monitoring.contacts.telio-tortay // { - use = "generic-contact"; - contactgroups = "telio-tortay"; - }; - thibault = config.myEnv.monitoring.contacts.thibault // { - use = "generic-contact"; - contactgroups = "tiboqorl"; - }; - }; - contactgroup = { - telio-tortay = { alias = "Telio Tortay"; members = "immae"; }; - tiboqorl = { alias = "Tiboqorl"; members = "immae"; }; - }; -} diff --git a/modules/private/monitoring/objects_quatresaisons.nix b/modules/private/monitoring/objects_quatresaisons.nix deleted file mode 100644 index f30cf81..0000000 --- a/modules/private/monitoring/objects_quatresaisons.nix +++ /dev/null @@ -1,38 +0,0 @@ -{ lib, hostFQDN, emailCheck, openldap, ... }: -let - defaultPassiveInfo = { - filter = lib.attrsets.filterAttrs - (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_"); - use = "external-passive-service"; - freshness_threshold = "450"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - host_name = hostFQDN; - }; -in -{ - resources = { - USER212 = "{{ .monitoring.quatresaisons.naemon_ldap }}"; - }; - activatedPlugins = [ "megaraid" "command" "postgresql" ]; - service = [ - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; }; - service_description = "No RAID device is degraded"; - use = "local-service"; - check_command = ["check_megaraid"]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; }; - service_description = "LDAP is running"; - use = "local-service"; - check_command = [ "check_command_status" "${openldap}/bin/ldapwhoami -D uid=naemon,ou=services,dc=salle-s,dc=org -w $USER212$" "0" ""]; - } - { - passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; }; - service_description = "Postgresql is running"; - use = "local-service"; - check_command = [ "check_postgresql_database_count" "/run/postgresql" "5432" "3" ]; - } - ]; -} diff --git a/modules/private/monitoring/objects_tiboqorl-fr.nix b/modules/private/monitoring/objects_tiboqorl-fr.nix deleted file mode 100644 index b49a1d8..0000000 --- a/modules/private/monitoring/objects_tiboqorl-fr.nix +++ /dev/null @@ -1,174 +0,0 @@ -{ lib, ... }: -let - hostFQDN = "tiboqorl.fr"; - defaultPassiveInfo = { - filter = lib.attrsets.filterAttrs - (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_"); - use = "external-passive-service"; - contact_groups = "tiboqorl"; - freshness_threshold = "450"; - notification_interval = "240"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - _webstatus_namespace = "tiboqorl"; - host_name = hostFQDN; - }; -in -{ - host = { - "tiboqorl.fr" = { - alias = "tiboqorl.fr"; - address = "tiboqorl.fr"; - use = "linux-server"; - contact_groups = "tiboqorl"; - hostgroups = "webstatus-hosts"; - _webstatus_name = "tiboqorl"; - _webstatus_vhost = "status.immae.eu"; - _webstatus_namespace = "tiboqorl"; - }; - }; - service = [ - { - passiveInfo = defaultPassiveInfo; - service_description = "Size on root partition"; - use = "local-service"; - check_command = ["check_local_disk" "20%" "10%" "/"]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "Total number of process"; - use = "local-service"; - check_command = [ "check_local_procs" "250" "400" "RSZDT" ]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "Network bandwidth"; - use = "local-service"; - check_interval = "2"; - max_check_attempts = "20"; - retry_interval = "2"; - check_command = [ - "check_local_bandwidth" - "eth0" - "20480" # kb/s - "51200" # kb/s - ]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "Average load"; - use = "local-service"; - check_command = [ - "check_local_load" - "0.75,0.75,0.75" # warn - "1.0,1.0,1.0" # alert - ]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "Swap usage"; - use = "local-service"; - check_command = ["check_local_swap" "20" "10"]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "Memory usage"; - use = "local-service"; - check_command = ["check_memory" "80" "90"]; - } - { - passiveInfo = defaultPassiveInfo; - service_description = "NTP is activated and working"; - use = "local-service"; - check_command = ["check_ntp"]; - } - ]; - command = { - check_local_disk = "$USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$"; - check_local_procs = "$USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$"; - check_local_load = "$USER1$/check_load -w $ARG1$ -c $ARG2$"; - check_local_swap = "$USER1$/check_swap -n ok -w $ARG1$ -c $ARG2$"; - check_local_bandwidth = "$USER2$/check_bandwidth -i=$ARG1$ -w $ARG2$ -c $ARG3$"; - check_memory = "$USER2$/check_mem.sh -w $ARG1$ -c $ARG2$"; - check_ntp = "$USER1$/check_ntp_time -t 30 -q -H 0.arch.pool.ntp.org"; - - check_host_alive = "$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5"; - - notify-master = "$USER2$/send_nrdp.sh -u \"$USER200$\" -t \"$USER201$\" -H \"$HOSTADDRESS$\" -s \"$SERVICEDESC$\" -S \"$SERVICESTATEID$\" -o \"$SERVICEOUTPUT$ | $SERVICEPERFDATA$\""; - }; - timeperiod = { - "24x7" = { - alias = "24 Hours A Day, 7 Days A Week"; - monday = "00:00-24:00"; - tuesday = "00:00-24:00"; - wednesday = "00:00-24:00"; - thursday = "00:00-24:00"; - friday = "00:00-24:00"; - saturday = "00:00-24:00"; - sunday = "00:00-24:00"; - }; - }; - servicegroup = { - webstatus-resources = { alias = "Local resources"; }; - }; - hostgroup = { - webstatus-hosts = { alias = "Hosts"; }; - }; - contactgroup = { - tiboqorl = { alias = "Naemon Administrators"; }; - }; - templates = { - service = { - generic-service = { - active_checks_enabled = "1"; - check_freshness = "0"; - check_interval = "10"; - check_period = "24x7"; - contact_groups = "tiboqorl"; - event_handler_enabled = "1"; - flap_detection_enabled = "1"; - is_volatile = "0"; - max_check_attempts = "3"; - notification_interval = "60"; - notification_options = "w,u,c,r,f,s"; - notification_period = "24x7"; - notifications_enabled = "0"; - obsess_over_service = "1"; - passive_checks_enabled = "1"; - process_perf_data = "1"; - retain_nonstatus_information = "1"; - retain_status_information = "1"; - retry_interval = "2"; - }; - local-service = { - use = "generic-service"; - host_name = hostFQDN; - check_interval = "5"; - max_check_attempts = "4"; - retry_interval = "1"; - servicegroups = "webstatus-resources"; - }; - }; - host = { - generic-host = { - event_handler_enabled = "1"; - flap_detection_enabled = "1"; - notification_period = "24x7"; - notifications_enabled = "1"; - process_perf_data = "1"; - retain_nonstatus_information = "1"; - retain_status_information = "1"; - }; - linux-server = { - check_command = "check_host_alive"; - check_interval = "5"; - check_period = "24x7"; - contact_groups = "tiboqorl"; - max_check_attempts = "10"; - notification_interval = "120"; - notification_options = "d,u,r,f"; - retry_interval = "1"; - }; - }; - }; -} diff --git a/modules/private/monitoring/plugins/notify_eban_url b/modules/private/monitoring/plugins/notify_eban_url deleted file mode 100755 index 107b5de..0000000 --- a/modules/private/monitoring/plugins/notify_eban_url +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -if [ "$SERVICESTATE" = "CRITICAL" -o "$SERVICESTATE" = "UNKNOWN" -o "$HOSTSTATE" = "DOWN" -o "$HOSTSTATE" = "UNREACHABLE" ]; then - MESSAGE="$STATUS_NAME seems down!" - curl -X GET -G --data-urlencode "user=$USER" --data-urlencode "pass=$PASSWORD" --data-urlencode "msg=$MESSAGE" https://smsapi.free-mobile.fr/sendmsg -fi diff --git a/modules/private/pub/default.nix b/modules/private/pub/default.nix deleted file mode 100644 index c419530..0000000 --- a/modules/private/pub/default.nix +++ /dev/null @@ -1,56 +0,0 @@ -{ lib, pkgs, config, ... }: -{ - options = { - myServices.pub.enable = lib.mkOption { - type = lib.types.bool; - default = false; - description = '' - Whether to enable pub user. - ''; - }; - }; - - config = lib.mkIf config.myServices.pub.enable { - myServices.ssh.modules = [{ - snippet = builtins.readFile ./ldap_pub.sh; - dependencies = [ pkgs.coreutils ]; - }]; - users.users.pub = let - restrict = pkgs.runCommand "restrict" { - file = ./restrict; - buildInputs = [ pkgs.makeWrapper ]; - } '' - mkdir -p $out/bin - cp $file $out/bin/restrict - chmod a+x $out/bin/restrict - patchShebangs $out/bin/restrict - wrapProgram $out/bin/restrict \ - --prefix PATH : ${lib.makeBinPath [ pkgs.bubblewrap pkgs.rrsync ]} \ - --set TMUX_RESTRICT ${./tmux.restrict.conf} - ''; - purple-hangouts = pkgs.purple-hangouts.overrideAttrs(old: { - installPhase = '' - install -Dm755 -t $out/lib/purple-2/ libhangouts.so - for size in 16 22 24 48; do - install -TDm644 hangouts$size.png $out/share/pixmaps/pidgin/protocols/$size/hangouts.png - done - ''; - }); - in { - createHome = true; - description = "Restricted shell user"; - home = "/var/lib/pub"; - uid = config.myEnv.users.pub.uid; - useDefaultShell = true; - packages = [ - restrict - pkgs.tmux - (pkgs.pidgin.override { plugins = [ - pkgs.purple-plugin-pack purple-hangouts - pkgs.purple-discord pkgs.purple-facebook - pkgs.telegram-purple - ]; }) - ]; - }; - }; -} diff --git a/modules/private/pub/ldap_pub.sh b/modules/private/pub/ldap_pub.sh deleted file mode 100644 index bbbefdc..0000000 --- a/modules/private/pub/ldap_pub.sh +++ /dev/null @@ -1,56 +0,0 @@ -### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh -LDAP_PUB_RESTRICT_MEMBER="cn=restrict,cn=pub,ou=services,dc=immae,dc=eu" -LDAP_PUB_FORWARD_MEMBER="cn=forward,cn=pub,ou=services,dc=immae,dc=eu" -ECHO=$(which echo) - -if [[ $user == pub ]]; then - ldap_search '(&(memberOf='$LDAP_PUB_RESTRICT_MEMBER')('$KEY'=*))' $KEY | \ - while read line ; - do - if [ ! -z "$line" ]; then - if [[ $line == dn* ]]; then - echo "" - user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line") - echo "# $user" - elif [[ $line == $KEY* ]]; then - key=$(clean_key_line pub "$line") - key_forward=$(clean_key_line forward "$line") - if [ ! -z "$key" ]; then - if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then - echo -n 'command="/etc/profiles/per-user/pub/bin/restrict '$user'" ' - echo $key - fi - elif [ ! -z "$key_forward" ]; then - if [[ $key_forward != *$'\n'* ]] && [[ $key_forward == ssh-* ]]; then - echo "# forward only" - echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" ' - echo $key_forward - fi - fi - fi - fi - done - - echo "" - ldap_search '(&(memberOf='$LDAP_PUB_FORWARD_MEMBER')('$KEY'=*))' $KEY | \ - while read line ; - do - if [ ! -z "$line" ]; then - if [[ $line == dn* ]]; then - echo "" - user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line") - echo "# $user" - elif [[ $line == $KEY* ]]; then - key=$(clean_key_line forward "$line") - if [ ! -z "$key" ]; then - if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then - echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" ' - echo $key - fi - fi - fi - fi - done - exit 0 -fi - diff --git a/modules/private/ssh/default.nix b/modules/private/ssh/default.nix deleted file mode 100644 index ee5dda5..0000000 --- a/modules/private/ssh/default.nix +++ /dev/null @@ -1,91 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.ssh; -in -{ - options.myServices.ssh = let - module = lib.types.submodule { - options = { - snippet = lib.mkOption { - type = lib.types.lines; - description = '' - Snippet to use - ''; - }; - dependencies = lib.mkOption { - type = lib.types.listOf lib.types.package; - default = []; - description = '' - Dependencies of the package - ''; - }; - }; - }; - in { - predefinedModules = lib.mkOption { - type = lib.types.attrsOf module; - default = { - regular = { - snippet = builtins.readFile ./ldap_regular.sh; - }; - }; - readOnly = true; - description = '' - Predefined modules - ''; - }; - modules = lib.mkOption { - type = lib.types.listOf module; - default = []; - description = '' - List of modules to enable - ''; - }; - }; - config = { - networking.firewall.allowedTCPPorts = [ 22 ]; - } // (lib.mkIf (builtins.length cfg.modules > 0) { - - services.openssh.extraConfig = '' - AuthorizedKeysCommand /etc/ssh/ldap_authorized_keys - AuthorizedKeysCommandUser nobody - ''; - - secrets.keys."ssh-ldap" = { - user = "nobody"; - group = "nogroup"; - permissions = "0400"; - text = config.myEnv.sshd.ldap.password; - }; - system.activationScripts.sshd = { - deps = [ "secrets" ]; - text = '' - install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-ldap"} /etc/ssh/ldap_password - ''; - }; - # ssh is strict about parent directory having correct rights, don't - # move it in the nix store. - environment.etc."ssh/ldap_authorized_keys" = let - deps = lib.lists.unique ( - [ pkgs.which pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.gnused pkgs.coreutils ] - ++ lib.flatten (map (v: v.dependencies) cfg.modules) - ); - fullScript = pkgs.runCommand "ldap_authorized_keys" { - snippets = builtins.concatStringsSep "\n" (map (v: v.snippet) cfg.modules); - } '' - substituteAll ${./ldap_authorized_keys.sh} $out - chmod a+x $out - ''; - ldap_authorized_keys = pkgs.runCommand "ldap_authorized_keys" { - buildInputs = [ pkgs.makeWrapper ]; - } '' - makeWrapper "${fullScript}" "$out" --prefix PATH : ${lib.makeBinPath deps} - ''; - in { - enable = true; - mode = "0755"; - user = "root"; - source = ldap_authorized_keys; - }; - }); -} diff --git a/modules/private/system.nix b/modules/private/system.nix deleted file mode 100644 index 5f3d79e..0000000 --- a/modules/private/system.nix +++ /dev/null @@ -1,98 +0,0 @@ -{ pkgs, lib, config, name, nodes, ... }: -{ - config = { - deployment.secrets."secret_vars.yml" = { - source = builtins.toString ../../nixops/secrets/vars.yml; - destination = config.secrets.secretsVars; - owner.user = "root"; - owner.group = "root"; - permissions = "0400"; - }; - - networking.extraHosts = builtins.concatStringsSep "\n" - (lib.mapAttrsToList (n: v: "${v.config.hostEnv.ips.main.ip4} ${n}") nodes); - - users.extraUsers.root.openssh.authorizedKeys.keys = [ config.myEnv.sshd.rootKeys.nix_repository ]; - secrets.deleteSecretsVars = true; - secrets.gpgKeys = [ - ../../nixops/public_keys/Immae.pub - ]; - secrets.secretsVars = "/run/keys/vars.yml"; - - services.openssh.enable = true; - - nixpkgs.overlays = builtins.attrValues (import ../../overlays) ++ [ - (self: super: { - postgresql = self.postgresql_pam; - mariadb = self.mariadb_pam; - }) # don’t put them as generic overlay because of home-manager - ]; - - services.journald.extraConfig = '' - #Should be "warning" but disabled for now, it prevents anything from being stored - MaxLevelStore=info - MaxRetentionSec=1year - ''; - - users.users = - builtins.listToAttrs (map (x: lib.attrsets.nameValuePair x.name ({ - isNormalUser = true; - home = "/home/${x.name}"; - createHome = true; - linger = true; - } // x)) (config.hostEnv.users pkgs)) - // { - root.packages = let - nagios-cli = pkgs.writeScriptBin "nagios-cli" '' - #!${pkgs.stdenv.shell} - sudo -u naemon ${pkgs.nagios-cli}/bin/nagios-cli -c ${./monitoring/nagios-cli.cfg} - ''; - in - [ - pkgs.telnet - pkgs.htop - pkgs.iftop - pkgs.bind.dnsutils - pkgs.httpie - pkgs.iotop - pkgs.whois - pkgs.ngrep - pkgs.tcpdump - pkgs.tshark - pkgs.tcpflow - # pkgs.mitmproxy # failing - pkgs.nmap - pkgs.p0f - pkgs.socat - pkgs.lsof - pkgs.psmisc - pkgs.openssl - pkgs.wget - - pkgs.cnagios - nagios-cli - - pkgs.pv - pkgs.smartmontools - ]; - }; - - users.mutableUsers = lib.mkDefault false; - - environment.etc.cnagios.source = "${pkgs.cnagios}/share/doc/cnagios"; - environment.systemPackages = [ - pkgs.git - pkgs.vim - pkgs.rsync - pkgs.strace - ] ++ - (lib.optional (builtins.length (config.hostEnv.users pkgs) > 0) pkgs.home-manager); - - systemd.targets.maintenance = { - description = "Maintenance target with only sshd"; - after = [ "network-online.target" "sshd.service" ]; - requires = [ "network-online.target" "sshd.service" ]; - unitConfig.AllowIsolate = "yes"; - }; - }; -} diff --git a/modules/private/system/dilion/vms.nix b/modules/private/system/dilion/vms.nix deleted file mode 100644 index af96622..0000000 --- a/modules/private/system/dilion/vms.nix +++ /dev/null @@ -1,185 +0,0 @@ -# inspired from https://nixos.wiki/wiki/Virtualization_in_NixOS -{ config, pkgs, lib, ... }@args: -let - pools = { - niximages = { - type = "dir"; - target = "/etc/libvirtd/base-images"; - }; - buildbot-disks = rec { - preStart = '' - mkdir -p ${target} - ''; - type = "dir"; - target = "/var/lib/libvirt/images/buildbot-disks"; - }; - zfspool = { - # pool-define-as --name zfspool --source-name zpool/libvirt --type zfs - type = "zfs"; - xml = '' - <source> - <name>zpool/libvirt</name> - </source> - ''; - }; - }; - networks = { - immae = { - bridgeNumber = "1"; - ipRange = "192.168.100"; - }; - }; - guests = { - caldance = { - pool = "zfspool"; - cpus = "1"; - memory = "2"; - network = "immae"; - diskSize = "10GiB"; - extraDevicesXML = '' - <filesystem type="mount"> - <source dir="/var/lib/caldance"/> - <target dir="home"/> - </filesystem> - ''; - }; - buildbot = { - pool = "zfspool"; - cpus = "1"; - memory = "3"; - network = "immae"; - diskSize = "10GiB"; - destroyVolumeOnExit = true; - }; - }; - toImage = f: "${import ./vms/base_image.nix f (args // { myEnv = config.myEnv; })}/nixos.qcow2"; -in -{ - environment.etc."libvirtd/base-images/nixos.qcow2".source = toImage ./vms/base_configuration.nix; - environment.etc."libvirtd/base-images/buildbot.qcow2".source = toImage ./vms/buildbot_configuration.nix; - systemd.services = lib.mapAttrs' (name: guest: lib.nameValuePair "libvirtd-guest-${name}" { - after = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ]; - requires = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ]; - wantedBy = [ "multi-user.target" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = "yes"; - }; - script = - let - xml = pkgs.writeText "libvirt-guest-${name}.xml" - '' - <domain type="kvm"> - <name>${name}</name> - <uuid>UUID</uuid> - <memory unit="GiB">${guest.memory}</memory> - <vcpu>${guest.cpus}</vcpu> - <os> - <type arch="x86_64">hvm</type> - </os> - <devices> - <emulator>/run/current-system/sw/bin/qemu-system-x86_64</emulator> - <disk type="volume"> - <source pool="${guest.pool}" volume="guest-${name}" /> - <target dev="vda" bus="virtio"/> - </disk> - ${guest.extraDevicesXML or ""} - <input type="keyboard" bus="usb"/> - <graphics type="vnc" port="-1" autoport="yes"/> - <interface type="network"> - <source network="${guest.network}" /> - </interface> - </devices> - <features> - <acpi/> - </features> - </domain> - ''; - in - guest.preStart or "" + '' - if ! ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then - ${pkgs.libvirt}/bin/virsh vol-create-as --pool ${guest.pool} --name 'guest-${name}' --capacity '${guest.diskSize}' - volume_path=$(${pkgs.libvirt}/bin/virsh vol-path --pool ${guest.pool} --vol 'guest-${name}') - ${pkgs.qemu}/bin/qemu-img convert /etc/libvirtd/base-images/nixos.qcow2 $volume_path - fi - uuid="$(${pkgs.libvirt}/bin/virsh domuuid '${name}' || true)" - ${pkgs.libvirt}/bin/virsh define <(sed "s/UUID/$uuid/" '${xml}') - ${pkgs.libvirt}/bin/virsh start '${name}' - ''; - preStop = '' - ${pkgs.libvirt}/bin/virsh shutdown '${name}' - let "timeout = $(date +%s) + 10" - while [ "$(${pkgs.libvirt}/bin/virsh list --name | grep --count '^${name}$')" -gt 0 ]; do - if [ "$(date +%s)" -ge "$timeout" ]; then - # Meh, we warned it... - ${pkgs.libvirt}/bin/virsh destroy '${name}' - else - # The machine is still running, let's give it some time to shut down - sleep 0.5 - fi - done - '' + lib.optionalString (guest.destroyVolumeOnExit or false) '' - if ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then - ${pkgs.libvirt}/bin/virsh vol-wipe --pool ${guest.pool} --vol 'guest-${name}' || true - ${pkgs.libvirt}/bin/virsh vol-delete --pool ${guest.pool} --vol 'guest-${name}' - fi - ''; - }) guests // (lib.mapAttrs' (name: network: lib.nameValuePair "libvirtd-network-${name}" { - after = [ "libvirtd.service" ]; - requires = [ "libvirtd.service" ]; - wantedBy = [ "multi-user.target" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = "yes"; - }; - script = let - xml = pkgs.writeText "libvirt-network-${name}.xml" '' - <network> - <name>${name}</name> - <uuid>UUID</uuid> - <forward mode='nat' /> - <bridge name='virbr${network.bridgeNumber}' /> - <domain name='${name}' localOnly='yes'/> - <ip address='${network.ipRange}.1' netmask='255.255.255.0'> - <dhcp> - <range start='${network.ipRange}.2' end='${network.ipRange}.254'/> - </dhcp> - </ip> - </network> - ''; - in '' - uuid="$(${pkgs.libvirt}/bin/virsh net-uuid '${name}' || true)" - ${pkgs.libvirt}/bin/virsh net-define <(sed "s/UUID/$uuid/" '${xml}') - ${pkgs.libvirt}/bin/virsh net-start '${name}' - ''; - preStop = '' - ${pkgs.libvirt}/bin/virsh net-destroy '${name}' - ''; - }) networks) // (lib.mapAttrs' (name: pool: lib.nameValuePair "libvirtd-pool-${name}" { - after = [ "libvirtd.service" ]; - requires = [ "libvirtd.service" ]; - wantedBy = [ "multi-user.target" ]; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = "yes"; - }; - script = let - xml = pkgs.writeText "libvirt-pool-${name}.xml" '' - <pool type="${pool.type}"> - <name>${name}</name> - <uuid>UUID</uuid> - ${pool.xml or ""} - ${if pool ? target then '' - <target> - <path>${pool.target}</path> - </target> - '' else ""} - </pool> - ''; - in pool.preStart or "" + '' - uuid="$(${pkgs.libvirt}/bin/virsh pool-uuid '${name}' || true)" - ${pkgs.libvirt}/bin/virsh pool-define <(sed "s/UUID/$uuid/" '${xml}') - ${pkgs.libvirt}/bin/virsh pool-start '${name}' || true - ''; - }) pools); -} diff --git a/modules/private/system/eldiron.nix b/modules/private/system/eldiron.nix deleted file mode 100644 index 8b2784d..0000000 --- a/modules/private/system/eldiron.nix +++ /dev/null @@ -1,228 +0,0 @@ -{ config, pkgs, lib, ... }: -{ - deployment = { - targetUser = "root"; - targetHost = config.hostEnv.ips.main.ip4; - substituteOnDestination = true; - }; - # ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age - secrets.ageKeys = [ "age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj" ]; - boot = { - kernelModules = [ "kvm-intel" ]; - blacklistedKernelModules = [ "nvidiafb" ]; - loader.timeout = 1; - loader.grub.devices = [ "/dev/sda" "/dev/sdb" ]; - kernel.sysctl = { - # https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001.md - "net.ipv4.tcp_sack" = 0; - }; - supportedFilesystems = [ "zfs" ]; - kernelParams = ["zfs.zfs_arc_max=6442450944"]; - kernelPackages = pkgs.linuxPackages_latest; - initrd.availableKernelModules = [ "ahci" "sd_mod" ]; - initrd.secrets = { - "/boot/pass.key" = "/boot/pass.key"; - }; - }; - services.udev.extraRules = '' - ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:56:a0:88", NAME="eth0" - ''; - nix.maxJobs = 8; - powerManagement.cpuFreqGovernor = "powersave"; - myEnv = import ../../../nixops/secrets/environment.nix; - - fileSystems = { - # pools: - # zpool: ashift=12 - # zfast: ashift=12 - # zfs: - # zpool/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy - # zpool/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key - # zpool/root/var: atime=on - # zfast/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy - # zfast/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key - # zfast/root/etc: ø - # zfast/root/nix: ø - # zfast/root/tmp: async=disabled - # zfast/root/var: atime=on - # zfast/root/var/lib: ø - # zfast/root/var/lib/mysql: logbias=throughput ; atime=off ; primarycache=metadata - # zfast/root/var/lib/postgresql: recordsize=8K ; atime=off ; logbias=throughput - # zfast/root/var/lib/postgresql/11.0: ø - # zfast/root/var/lib/postgresql/11.0/pg_wal: ø - "/" = { fsType = "zfs"; device = "zpool/root"; }; - "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/e6bb18fb-ff56-4b5f-ae9f-e60d40dc0622"; }; - "/etc" = { fsType = "zfs"; device = "zpool/root/etc"; }; - "/nix" = { fsType = "zfs"; device = "zfast/root/nix"; }; - "/tmp" = { fsType = "zfs"; device = "zfast/root/tmp"; }; - "/var" = { fsType = "zfs"; device = "zpool/root/var"; }; - "/var/lib/mysql" = { fsType = "zfs"; device = "zfast/root/var/lib/mysql"; }; - "/var/lib/postgresql" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql"; }; - "/var/lib/postgresql/11.0" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0"; }; - "/var/lib/postgresql/11.0/pg_wal" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0/pg_wal"; }; - }; - swapDevices = [ { label = "swap1"; } { label = "swap2"; } ]; - hardware.enableRedistributableFirmware = true; - - services.zfs = { - autoScrub = { - enable = false; - }; - }; - networking = { - hostId = "8262ca33"; # generated with head -c4 /dev/urandom | od -A none -t x4 - firewall.enable = true; - # FIXME: on next reboot, remove the /27 and the localCommands - interfaces."eth0".ipv4.addresses = - pkgs.lib.attrsets.mapAttrsToList - (n: ips: { address = ips.ip4; prefixLength = 32; }) - (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips) - ++ [ { address = config.hostEnv.ips.main.ip4; prefixLength = 27; } ]; - interfaces."eth0".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList - (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or [])) - config.hostEnv.ips); - defaultGateway = "176.9.151.65"; - localCommands = '' - # FIXME: Those commands were added by nixops and may not be - # actually needed - ip -6 addr add '2a01:4f8:160:3445::/64' dev 'eth0' || true - ip -4 route change '176.9.151.64/27' via '176.9.151.65' dev 'eth0' || true - ip -6 route add default via 'fe80::1' dev eth0 || true - ''; - nameservers = [ - "213.133.98.98" - "213.133.99.99" - "213.133.100.100" - "2a01:4f8:0:a0a1::add:1010" - "2a01:4f8:0:a102::add:9999" - "2a01:4f8:0:a111::add:9898" - ]; - }; - - imports = builtins.attrValues (import ../..); - - myServices.buildbot.enable = true; - myServices.databases.enable = true; - myServices.gitolite.enable = true; - myServices.monitoring.enable = true; - myServices.irc.enable = true; - myServices.pub.enable = true; - myServices.tasks.enable = true; - myServices.mpd.enable = true; - myServices.dns.enable = true; - myServices.certificates.enable = true; - myServices.websites.enable = true; - myServices.gemini.enable = true; - myServices.mail.enable = true; - myServices.ejabberd.enable = true; - myServices.vpn.enable = true; - myServices.ftp.enable = true; - - services.netdata.enable = true; - services.netdata.config.global."memory mode" = "none"; - services.netdata.config.health."enabled" = "no"; - services.netdata.config.web.mode = "none"; - users.users."${config.services.netdata.user}".extraGroups = [ "keys" ]; - environment.etc."netdata/stream.conf".source = config.secrets.fullPaths."netdata-stream.conf"; - secrets.keys = { - "netdata-stream.conf" = { - user = config.services.netdata.user; - group = config.services.netdata.group; - permissions = "0400"; - text = '' - [stream] - enabled = yes - destination = ${config.myEnv.monitoring.netdata_aggregator} - api key = ${config.myEnv.monitoring.netdata_keys.eldiron} - ''; - }; - "zrepl_backup/identity" = { - user = "root"; - group = "root"; - permissions = "0400"; - text = config.myEnv.zrepl_backup.ssh_key.private; - }; - }; - programs.ssh.knownHosts.dilion = { - hostNames = ["dilion.immae.eu"]; - publicKey = let - profile = config.myEnv.rsync_backup.profiles.dilion; - in - "${profile.host_key_type} ${profile.host_key}"; - }; - - services.cron = { - enable = true; - mailto = "cron@immae.eu"; - systemCronJobs = [ - '' - 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "immae.eu.*Recipient address rejected" - # Need a way to blacklist properly - # 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "NOQUEUE:" - 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtp -g "status=bounced" - '' - ]; - }; - - environment.systemPackages = [ pkgs.bindfs ]; - - services.zrepl = { - enable = true; - config = let - redis_dump = pkgs.writeScript "redis-dump" '' - #! ${pkgs.stdenv.shell} - ${pkgs.redis}/bin/redis-cli bgsave - ''; - in '' - jobs: - - type: push - # must not change - name: "backup-to-dilion" - filesystems: - "zpool/root": true - "zpool/root/etc": true - "zpool/root/var<": true - connect: - type: ssh+stdinserver - host: dilion.immae.eu - user: backup - port: 22 - identity_file: ${config.secrets.fullPaths."zrepl_backup/identity"} - snapshotting: - type: periodic - prefix: zrepl_ - interval: 1h - #hooks: - # - type: mysql-lock-tables - # dsn: "${config.myEnv.zrepl_backup.mysql.user}:${config.myEnv.zrepl_backup.mysql.password}@tcp(localhost)/" - # filesystems: - # "zpool/root/var": true - # - type: command - # path: ${redis_dump} - # err_is_fatal: false - # filesystems: - # "zpool/root/var": true - send: - encrypted: true - pruning: - keep_sender: - - type: regex - regex: "^manual_.*" - - type: grid - grid: 24x1h | 7x1d | 4x7d | 6x30d - regex: "^zrepl_.*" - keep_receiver: - - type: regex - regex: "^manual_.*" - - type: grid - grid: 6x4h | 7x1d | 4x7d | 6x30d - regex: "^zrepl_.*" - ''; - }; - # This value determines the NixOS release with which your system is - # to be compatible, in order to avoid breaking some software such as - # database servers. You should change this only after NixOS release - # notes say you should. - # https://nixos.org/nixos/manual/release-notes.html - system.stateVersion = "20.03"; # Did you read the comment? -} diff --git a/modules/private/system/quatresaisons.nix b/modules/private/system/quatresaisons.nix deleted file mode 100644 index 82db70f..0000000 --- a/modules/private/system/quatresaisons.nix +++ /dev/null @@ -1,436 +0,0 @@ -{ config, pkgs, lib, ... }: -let - serverSpecificConfig = config.myEnv.serverSpecific.quatresaisons; - yarnModules = pkgs.yarn2nix-moretea.mkYarnModules rec { - name = "landing"; - pname = name; - version = "v1.0.0"; - packageJSON = "${pkgs.sources.webapps-landing}/package.json"; - yarnLock = "${pkgs.sources.webapps-landing}/yarn.lock"; - yarnNix = ../websites/tools/tools/landing/yarn-packages.nix; - }; - toLanding = landingConfig: pkgs.stdenv.mkDerivation rec { - pname = "landing"; - version = "v1.0.0"; - src = pkgs.sources.webapps-landing; - - buildInputs = [ yarnModules pkgs.yarn2nix-moretea.yarn ]; - configurePhase = '' - ln -s ${yarnModules}/node_modules . - ''; - buildPhase = '' - yarn build - ''; - installPhase = '' - cp -a dist $out - cp -f ${landingConfig} $out/config.yml - ln -s service-worker.js $out/worker.js - ''; - }; - normalUsers = serverSpecificConfig.users; - sponsoredUser = pkgs.writeScriptBin "sponsored_user" '' - #!/usr/bin/env bash - - set -euo pipefail - [ -z "''${SUDO_USER+x}" ] && echo "Must be run with sudo" && exit 1 - - mygroup=$(id -ng $SUDO_USER) - - sponsored=$(getent group $mygroup | cut -d':' -f4) - - echo "Sponsored users: ''${sponsored:-<none>}" - - log () { - touch /var/log/sponsored_users - chmod go-rwx /var/log/sponsored_users - echo "`date` $mygroup $1" | LANG=C cat -v | tr '\012' ' ' | sed 's:$:\x0a:' >> /var/log/sponsored_users - } - - create_user () { - log "creates $1: $2" - useradd -m -G users,$mygroup -g $mygroup -p '!' "$1" - touch /var/lib/nixos/sponsored_users - chmod go-rwx /var/lib/nixos/sponsored_users - echo "$mygroup $1 $2" >> /var/lib/nixos/sponsored_users - (${pkgs.openldap}/bin/ldapadd -c -D cn=root,dc=salle-s,dc=org \ - -y ${config.secrets.fullPaths."ldap/sync_password"} 2>/dev/null >/dev/null || true) <<EOF - dn: uid=$1,uid=$mygroup,ou=users,dc=salle-s,dc=org - objectClass: inetOrgPerson - cn: $1 - description:: $(echo -n "$2" | base64) - sn: $1 - uid: $1 - EOF - while ! passwd "$1"; do - echo "please give an initial password" - done - } - - delete_user () { - IFS=","; - for u in $sponsored; do - if [ "$u" = "$1" ]; then - log "deletes $1" - userdel -r "$1" - sed -i -e "/^$mygroup $1/d" /var/lib/nixos/sponsored_users - ${pkgs.openldap}/bin/ldapdelete -D cn=root,dc=salle-s,dc=org \ - -y ${config.secrets.fullPaths."ldap/sync_password"} \ - "uid=$1,uid=$mygroup,ou=users,dc=salle-s,dc=org" - echo "deleted" - exit 0 - fi - done - - echo "User does not exist or does not belong to you"; - exit 1 - } - - reset_password () { - IFS=","; - for u in $sponsored; do - if [ "$u" = "$1" ]; then - log "resets password for $1" - passwd "$1" - exit 0 - fi - done - - echo "User does not exist or does not belong to you"; - exit 1 - } - - reset_ldap_password () { - if [ "$1" = "$mygroup" ]; then - log "resets web password" - ${pkgs.openldap}/bin/ldappasswd -D cn=root,dc=salle-s,dc=org \ - -y ${config.secrets.fullPaths."ldap/sync_password"} \ - -S "uid=$mygroup,ou=users,dc=salle-s,dc=org" - else - IFS=","; - for u in $sponsored; do - if [ "$u" = "$1" ]; then - log "resets web password of $1" - ${pkgs.openldap}/bin/ldappasswd -D cn=root,dc=salle-s,dc=org \ - -y ${config.secrets.fullPaths."ldap/sync_password"} \ - -S "uid=$1,uid=$mygroup,ou=users,dc=salle-s,dc=org" - exit 0 - fi - done - - echo "User does not exist or does not belong to you"; - exit 1 - fi - } - - show_help () { - echo "sponsored_users create username realname" - echo " create a new sub-user attached to your account" - echo "sponsored_users (delete|reset_password) username" - echo " delete a sub-user attached to your account or reset his password" - echo "sponsored_users reset_ldap_password username" - echo " reset the web password of a sub-user or yourself" - } - - [ -z "''${1+x}" -o -z "''${2+x}" ] && { show_help ; exit 0; } - action="$1" - username="$2" - shift - shift - - case "$action" in - create) - [ -z "''${1+x}" ] && { show_help ; echo "Conformément à la charte https://4c.salle-s.org/charte veuillez préciser le nom réel du futur utilisateur du compte $username, juste pour root." ; exit 1; } - create_user "$username" "$*"; - ;; - delete) - delete_user "$username"; - ;; - reset_password) - reset_password "$username"; - ;; - reset_ldap_password) - reset_ldap_password "$username"; - ;; - *) - show_help - ;; - esac - ''; -in -{ - deployment = { - targetUser = "root"; - targetHost = config.hostEnv.ips.main.ip4; - substituteOnDestination = true; - }; - # ssh-keyscan quatresaison | nix-shell -p ssh-to-age --run ssh-to-age - secrets.ageKeys = [ "age1yz8u6xvh2fltvyp96ep8crce3qx4tuceyhun6pwddfe0uvcrkarscxl7e7" ]; - - programs.ssh.package = pkgs.openssh.overrideAttrs(old: { - PATH_PASSWD_PROG = "/run/wrappers/bin/passwd"; - buildFlags = [ "SSH_KEYSIGN=/run/wrappers/bin/ssh-keysign" ]; - }); - - imports = builtins.attrValues (import ../..) ++ - [ ./quatresaisons/nextcloud.nix ./quatresaisons/databases.nix ]; - - myEnv = import ../../../nixops/secrets/environment.nix; - - fileSystems = { - "/" = { device = "/dev/disk/by-uuid/865931b4-c5cc-439f-8e42-8072c7a30634"; fsType = "ext4"; }; - "/home" = { device = "/dev/disk/by-uuid/76020bc4-5b88-464c-8952-9a59072c597f"; fsType = "ext4"; neededForBoot = true; }; - "/boot" = { device = "/dev/disk/by-uuid/0fb8421a-61e5-4ed5-a795-4dd3a9b2152a"; fsType = "ext4"; }; - "/var/lib" = { device = "/home/var_lib"; fsType = "none"; options = [ "defaults,bind" ]; }; - }; - powerManagement.cpuFreqGovernor = "powersave"; - hardware.enableRedistributableFirmware = true; - - boot.initrd.availableKernelModules = [ "ahci" "megaraid_sas" "sd_mod" ]; - boot.initrd.kernelModules = [ "dm-snapshot" ]; - boot.kernelModules = [ "kvm-intel" ]; - - boot.loader.grub.enable = true; - boot.loader.grub.version = 2; - boot.loader.grub.device = "/dev/sda"; - - networking.firewall.enable = false; - networking.firewall.allowedTCPPorts = [ 80 443 ]; - networking.useDHCP = false; - networking.interfaces.eth0.useDHCP = true; - networking.interfaces.eth0.ipv6.addresses = [ - { address = pkgs.lib.head config.hostEnv.ips.main.ip6; prefixLength = 64; } - ]; - networking.defaultGateway6 = { address = "fe80::1"; interface = "eth0"; }; - services.udev.extraRules = '' - ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:8b:2f:f0", NAME="eth0" - ''; - security.pam.services.chage.text = '' - auth sufficient pam_rootok.so - auth required pam_unix.so - account required pam_unix.so - session required pam_unix.so - password required pam_permit.so - ''; - security.pam.services.sshd.makeHomeDir = true; - security.pam.services.passwd_default = {}; - security.pam.services.passwd.text = '' - password required pam_cracklib.so enforce_for_root difok=2 minlen=8 dcredit=2 ocredit=2 retry=3 - '' + config.security.pam.services.passwd_default.text; - - system.activationScripts.ldapSync = { - deps = [ "secrets" "users" ]; - text = - let - com = "-D cn=root,dc=salle-s,dc=org -y ${config.secrets.fullPaths."ldap/sync_password"}"; - in '' - # Add users - ${pkgs.openldap}/bin/ldapadd -c ${com} -f ${config.secrets.fullPaths."ldap/ldaptree.ldif"} 2>/dev/null >/dev/null || true - - # Remove obsolete users - ${pkgs.openldap}/bin/ldapsearch -LLL ${com} -s one -b "ou=users,dc=salle-s,dc=org" "uid" |\ - grep "^uid" | ${pkgs.gnused}/bin/sed -e "s/uid: //" | while read ldapuser; do - - for user in ${builtins.concatStringsSep " " (builtins.attrNames normalUsers)}; do - if [ "$user" = "$ldapuser" ]; then - continue 2 - fi - done - ${pkgs.openldap}/bin/ldapdelete -r ${com} uid=$ldapuser,ou=users,dc=salle-s,dc=org - done - - # Subusers - if [ -f /var/lib/nixos/sponsored_users ]; then - cat /var/lib/nixos/sponsored_users | while read mainUser subUser name; do - (${pkgs.openldap}/bin/ldapadd -c ${com} 2>/dev/null >/dev/null || true) <<EOF - dn: uid=$subUser,uid=$mainUser,ou=users,dc=salle-s,dc=org - objectClass: inetOrgPerson - cn: $subUser - description:: $(echo -n "$name" | base64) - sn: $subUser - uid: $subUser - EOF - done - fi - ''; - }; - - secrets.keys = { - "ldap/sync_password" = { - permissions = "0400"; - text = serverSpecificConfig.ldap_sync_password; - }; - "ldap/ldaptree.ldif" = { - permissions = "0400"; - text = serverSpecificConfig.ldap_service_users - + (builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: v: '' - dn: uid=${n},ou=users,dc=salle-s,dc=org - objectClass: inetOrgPerson - cn: ${n} - description: ${v._meta.name or n} ${v._meta.email} - sn: ${n} - uid: ${n} - '') normalUsers)); - }; - }; - - myServices.monitoring.enable = true; - myServices.certificates.enable = true; - users.mutableUsers = true; - system.stateVersion = "21.03"; - programs.zsh.enable = true; - - users.motd = '' - Bienvenue sur quatresaisons.salle-s.org ! - - * Charte : - https://4c.salle-s.org/charte - * Gérer les utilisateurs unix additionnels : - sudo sponsored_user -h - * Applications web : - * tableau de bord : https://4c.salle-s.org/ - * nextcloud : https://nextcloud.4c.salle-s.org/ - ''; - - users.groups = - lib.mapAttrs (n: v: { gid = v.uid; }) normalUsers - // { wwwrun = { gid = config.ids.gids.wwwrun; }; }; - users.users = - let - defaultNormal = n: { - group = n; - extraGroups = [ "users" ]; - isNormalUser = true; - }; - in - lib.mapAttrs (n: v: defaultNormal n // (lib.filterAttrs (k: _: k != "_meta") v)) normalUsers - // { - sponsored-separator = { - uid = 10000; - group = "users"; - home = "/var/empty"; - extraGroups = []; - isNormalUser = true; - createHome = false; - }; - wwwrun = { - group = "wwwrun"; - description = "Apache httpd user"; - uid = config.ids.uids.wwwrun; - extraGroups = [ "keys" ]; - }; - }; - - system.activationScripts.usersPost = { - deps = [ "users" "groups" ]; - text = builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: v: '' - if getent shadow "${n}" | grep -q '^${n}:${v.initialHashedPassword or "!"}:1'; then - chage -d 0 "${n}" - [ '${v.initialHashedPassword or "!"}' = '!' ] && passwd -d "${n}" - fi - '') normalUsers); - }; - security.sudo.extraRules = [ - { - commands = [ - { command = "${sponsoredUser}/bin/sponsored_user"; options = [ "NOPASSWD" ]; } - { command = "/run/current-system/sw/bin/sponsored_user"; options = [ "NOPASSWD" ]; } - ]; - users = builtins.attrNames normalUsers; - runAs = "root"; - } - ]; - - environment.systemPackages = [ - sponsoredUser - pkgs.git pkgs.vim pkgs.rsync pkgs.strace pkgs.home-manager - pkgs.telnet pkgs.htop pkgs.iftop pkgs.bind.dnsutils pkgs.httpie - pkgs.iotop pkgs.whois pkgs.ngrep pkgs.tcpdump pkgs.tshark - pkgs.tcpflow pkgs.nmap pkgs.p0f pkgs.socat pkgs.lsof pkgs.psmisc - pkgs.openssl pkgs.wget pkgs.pv pkgs.smartmontools pkgs.youtube-dl - pkgs.unzip pkgs.octave pkgs.feh pkgs.xv pkgs.sshfs pkgs.gdb - pkgs.file pkgs.lynx pkgs.tmux pkgs.awesome pkgs.libreoffice - pkgs.evince pkgs.firefox pkgs.xcalib pkgs.python3 pkgs.python2 - pkgs.xorg.xkbcomp pkgs.subversion pkgs.xclip pkgs.imagemagick - pkgs.bc pkgs.sox pkgs.zip pkgs.gnome3.gnome-screenshot - pkgs.datadog-process-agent - ]; - - services.websites.env.production = { - enable = true; - adminAddr = "httpd@immae.eu"; - httpdName = "Prod"; - modules = [ "http2" "deflate" "filter" ]; - extraConfig = [ - '' - LogFormat "%{Host}i:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedVhost - Protocols h2 http/1.1 - AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript - '' ]; - ips = - let ips = config.hostEnv.ips.main; - in [ips.ip4] ++ (ips.ip6 or []); - - fallbackVhost = { - certName = "quatresaisons"; - hosts = [ "quatresaisons.immae.eu" ]; - root = pkgs.runCommand "empty" {} "mkdir $out && touch $out/index.html"; - extraConfig = [ "DirectoryIndex index.html" ]; - }; - vhostConfs.salle-s = { - certName = "quatresaisons"; - addToCerts = true; - hosts = [ "salle-s.org" ]; - root = toLanding ./quatresaisons/landing.yml; - extraConfig = [ - '' - <Directory ${toLanding ./quatresaisons/landing.yml}> - AllowOverride None - Require all granted - DirectoryIndex index.html - </Directory> - '' - ]; - }; - vhostConfs.tools = { - certName = "quatresaisons"; - addToCerts = true; - hosts = [ "4c.salle-s.org" "quatresaisons.salle-s.org" "quatre-saisons.salle-s.org" ]; - root = toLanding ./quatresaisons/landing_4c.yml; - extraConfig = [ - '' - Alias /charte ${serverSpecificConfig.charte_path} - <Directory ${serverSpecificConfig.charte_path}> - AllowOverride None - Require all granted - DirectoryIndex index.html index.txt - </Directory> - - <Directory ${toLanding ./quatresaisons/landing_4c.yml}> - AllowOverride None - Require all granted - DirectoryIndex index.html - </Directory> - '' - ]; - }; - }; - system.activationScripts.httpd = '' - install -d -m 0750 -o wwwrun -g wwwrun /var/lib/php - install -d -m 0750 -o wwwrun -g wwwrun /var/lib/php/sessions - ''; - - services.phpfpm = { - phpOptions = '' - session.save_path = "/var/lib/php/sessions" - post_max_size = 20M - ; 15 days (seconds) - session.gc_maxlifetime = 1296000 - ; 30 days (minutes) - session.cache_expire = 43200 - ''; - settings = { - log_level = "notice"; - }; - }; - -} diff --git a/modules/private/system/quatresaisons/databases.nix b/modules/private/system/quatresaisons/databases.nix deleted file mode 100644 index f7b27e0..0000000 --- a/modules/private/system/quatresaisons/databases.nix +++ /dev/null @@ -1,147 +0,0 @@ -{ pkgs, config, lib, ... }: -{ - config = let - serverSpecificConfig = config.myEnv.serverSpecific.quatresaisons; - phpLdapAdmin = pkgs.webapps.phpldapadmin.override { config = config.secrets.fullPaths."webapps/tools-ldap"; }; - in { - services.postgresql.enable = true; - services.postgresql.package = pkgs.postgresql_12; - services.postgresql.ensureUsers = [ - { name = "naemon"; } - ]; - secrets.keys = { - "ldap/password" = { - permissions = "0400"; - user = "openldap"; - group = "openldap"; - text = "rootpw ${serverSpecificConfig.ldap_root_pw}"; - }; - "webapps/tools-ldap" = { - user = "wwwrun"; - group = "wwwrun"; - permissions = "0400"; - text = '' - <?php - $config->custom->appearance['show_clear_password'] = true; - $config->custom->appearance['hide_template_warning'] = true; - $config->custom->appearance['theme'] = "tango"; - $config->custom->appearance['minimalMode'] = false; - $config->custom->appearance['tree'] = 'AJAXTree'; - - $servers = new Datastore(); - - $servers->newServer('ldap_pla'); - $servers->setValue('server','name','LDAP'); - $servers->setValue('server','host','ldap://localhost'); - $servers->setValue('login','auth_type','cookie'); - $servers->setValue('login','bind_id','${serverSpecificConfig.ldap_phpldapadmin_dn}'); - $servers->setValue('login','bind_pass','${serverSpecificConfig.ldap_phpldapadmin_password}'); - $servers->setValue('appearance','pla_password_hash','ssha'); - $servers->setValue('login','attr','uid'); - $servers->setValue('login','fallback_dn',true); - ''; - }; - }; - - users.users.openldap.extraGroups = [ "keys" ]; - services.openldap = { - enable = true; - dataDir = "/var/lib/openldap"; - urlList = [ "ldap://localhost" ]; - logLevel = "none"; - extraConfig = '' - pidfile /run/slapd/slapd.pid - argsfile /run/slapd/slapd.args - - moduleload back_hdb - backend hdb - ''; - - extraDatabaseConfig = '' - moduleload memberof - overlay memberof - - moduleload syncprov - overlay syncprov - syncprov-checkpoint 100 10 - - index objectClass eq - index uid pres,eq - #index uidMember pres,eq - index mail pres,sub,eq - index cn pres,sub,eq - index sn pres,sub,eq - index dc eq - index member eq - index memberOf eq - - # No one must access that information except root - access to attrs=description - by * none - - access to attrs=entry,uid filter="(uid=*)" - by dn.exact="${serverSpecificConfig.ldap_phpldapadmin_dn}" read - by * break - - access to dn.subtree="ou=users,dc=salle-s,dc=org" - by dn.subtree="ou=services,dc=salle-s,dc=org" read - by * break - - access to * - by self read - by anonymous auth - by * break - ''; - rootpwFile = config.secrets.fullPaths."ldap/password"; - suffix = "dc=salle-s,dc=org"; - rootdn = "cn=root,dc=salle-s,dc=org"; - database = "hdb"; - }; - - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.tools.extraConfig = [ - '' - Alias /ldap "${phpLdapAdmin}/htdocs" - <Directory "${phpLdapAdmin}/htdocs"> - DirectoryIndex index.php - <FilesMatch "\.php$"> - SetHandler "proxy:unix:${config.services.phpfpm.pools.ldap.socket}|fcgi://localhost" - </FilesMatch> - - AllowOverride None - Require all granted - </Directory> - '' - ]; - services.phpfpm.pools.ldap = { - user = "wwwrun"; - group = "wwwrun"; - settings = - let - basedir = builtins.concatStringsSep ":" [ phpLdapAdmin config.secrets.fullPaths."webapps/tools-ldap" ]; - in { - "listen.owner" = "wwwrun"; - "listen.group" = "wwwrun"; - "pm" = "ondemand"; - "pm.max_children" = "60"; - "pm.process_idle_timeout" = "60"; - - # Needed to avoid clashes in browser cookies (same domain) - "php_value[session.name]" = "LdapPHPSESSID"; - "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/phpldapadmin"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/phpldapadmin"; - }; - phpPackage = pkgs.php72; - }; - system.activationScripts.ldap = { - deps = [ "users" ]; - text = '' - install -m 0755 -o wwwrun -g wwwrun -d /var/lib/php/sessions/phpldapadmin - ''; - }; - systemd.services.phpfpm-ldap = { - after = lib.mkAfter [ "openldap.service" ]; - wants = [ "openldap.service" ]; - }; - }; -} diff --git a/modules/private/system/quatresaisons/landing.yml b/modules/private/system/quatresaisons/landing.yml deleted file mode 100644 index cf4ba87..0000000 --- a/modules/private/system/quatresaisons/landing.yml +++ /dev/null @@ -1,32 +0,0 @@ ---- -# Homepage configuration -# See https://fontawesome.com/icons for icons options - -title: "Websites dashboard" -subtitle: "Salle-S" -footer: false -#footer: '<p>Created with <span class="has-text-danger">❤️</span> with <a href="https://bulma.io/">bulma</a>, <a href="https://vuejs.org/">vuejs</a> & <a href="https://fontawesome.com/">font awesome</a> // Fork me on <a href="https://github.com/bastienwirtz/homer"><i class="fab fa-github-alt"></i></a></p>' # set false if you want to hide it. - -# Optional navbar -# links: [] # Allows for navbar (dark mode, layout, and search) without any links -links: [] - -# Services -# First level array represent a group. -# Leave only a "items" key if not using group (group name, icon & tagstyle are optional, section separation will not be displayed). -services: - - name: "Quatramaran" - items: - - name: "Roundcube" - logo: "assets/tools/roundcube.svg" - url: "https://quatramaran.salle-s.org/roundcube/" - - name: "Les dessous de paillasse" - url: "https://dessous-de-paillasse.salle-s.org" - - name: "Quatre Saisons" - items: - - name: "Charte d’utilisation" - icon: "fas fa-scroll" - url: "https://4c.salle-s.org/charte/" - - name: "Nextcloud" - logo: "assets/tools/nextcloud.png" - url: "https://nextcloud.4c.salle-s.org" diff --git a/modules/private/system/quatresaisons/landing_4c.yml b/modules/private/system/quatresaisons/landing_4c.yml deleted file mode 100644 index 0b9f6b6..0000000 --- a/modules/private/system/quatresaisons/landing_4c.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -# Homepage configuration -# See https://fontawesome.com/icons for icons options - -title: "Websites dashboard" -subtitle: "Quatre saisons" -footer: false -#footer: '<p>Created with <span class="has-text-danger">❤️</span> with <a href="https://bulma.io/">bulma</a>, <a href="https://vuejs.org/">vuejs</a> & <a href="https://fontawesome.com/">font awesome</a> // Fork me on <a href="https://github.com/bastienwirtz/homer"><i class="fab fa-github-alt"></i></a></p>' # set false if you want to hide it. - -# Optional navbar -# links: [] # Allows for navbar (dark mode, layout, and search) without any links -links: [] - -# Services -# First level array represent a group. -# Leave only a "items" key if not using group (group name, icon & tagstyle are optional, section separation will not be displayed). -services: - - items: - - name: "Charte d’utilisation" - icon: "fas fa-scroll" - url: "https://4c.salle-s.org/charte/" - - name: "Nextcloud" - logo: "assets/tools/nextcloud.png" - url: "https://nextcloud.4c.salle-s.org" diff --git a/modules/private/system/quatresaisons/nextcloud.nix b/modules/private/system/quatresaisons/nextcloud.nix deleted file mode 100644 index 89d69d5..0000000 --- a/modules/private/system/quatresaisons/nextcloud.nix +++ /dev/null @@ -1,141 +0,0 @@ -{ lib, pkgs, config, ... }: -let - nextcloud = pkgs.webapps.nextcloud.withApps (a: [ - a.apporder a.audioplayer a.bookmarks a.calendar a.carnet a.circles - a.contacts a.cookbook a.deck a.extract a.files_markdown - a.files_readmemd a.flowupload a.gpxedit a.gpxpod a.keeweb a.maps - a.metadata a.music a.notes a.ocsms a.passman a.polls a.spreed - a.social a.tasks - ]); - varDir = "/var/lib/nextcloud"; - phpFpm = rec { - basedir = builtins.concatStringsSep ":" ([ nextcloud varDir ] ++ nextcloud.apps); - pool = { - "listen.owner" = "wwwrun"; - "listen.group" = "wwwrun"; - "pm" = "ondemand"; - "pm.max_children" = "60"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[output_buffering]" = "0"; - "php_admin_value[max_execution_time]" = "1800"; - "php_admin_value[zend_extension]" = "opcache"; - #already enabled by default? - #"php_value[opcache.enable]" = "1"; - "php_value[opcache.enable_cli]" = "1"; - "php_value[opcache.interned_strings_buffer]" = "8"; - "php_value[opcache.max_accelerated_files]" = "10000"; - "php_value[opcache.memory_consumption]" = "128"; - "php_value[opcache.save_comments]" = "1"; - "php_value[opcache.revalidate_freq]" = "1"; - "php_admin_value[memory_limit]" = "512M"; - - "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; - }; - }; -in { - config = { - services.postgresql.ensureDatabases = [ "nextcloud" ]; - services.postgresql.ensureUsers = [ - { name = "nextcloud"; ensurePermissions = { "DATABASE nextcloud" = "ALL PRIVILEGES"; }; } - ]; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - - services.websites.env.production.vhostConfs.cloud = { - certName = "quatresaisons"; - addToCerts = true; - hosts = ["nextcloud.4c.salle-s.org" ]; - root = nextcloud; - extraConfig = - [ - '' - SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 - <Directory ${nextcloud}> - AcceptPathInfo On - DirectoryIndex index.php - Options FollowSymlinks - Require all granted - AllowOverride all - - <IfModule mod_headers.c> - Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload" - </IfModule> - <FilesMatch "\.php$"> - CGIPassAuth on - SetHandler "proxy:unix:${config.services.phpfpm.pools.nextcloud.socket}|fcgi://localhost" - </FilesMatch> - - </Directory> - '' - ]; - }; - services.websites.env.production.vhostConfs.cloud_wait = let - content = pkgs.writeText "contenu" '' - nextcloud est un service qui a besoin de pérennité du nom - "nextcloud.salle-s.org", on va peut-etre y arriver, c'est une - question de jours, voir le message informatique.internet:8017 - ''; - in { - certName = "quatresaisons"; - addToCerts = true; - hosts = ["nextcloud.salle-s.org" ]; - root = content; - extraConfig = - [ - '' - Alias / ${content} - '' - ]; - }; - - users.users.root.packages = let - occ = pkgs.writeScriptBin "nextcloud-occ" '' - #! ${pkgs.stdenv.shell} - cd ${nextcloud} - NEXTCLOUD_CONFIG_DIR="${nextcloud}/config" \ - exec \ - sudo -E -u wwwrun ${pkgs.php74}/bin/php \ - -c ${pkgs.php74}/etc/php.ini \ - occ $* - ''; - in [ occ ]; - - system.activationScripts.nextcloud = { - deps = [ "users" ]; - text = let - confs = lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) nextcloud.otherConfig; - in - '' - install -m 0755 -o wwwrun -g wwwrun -d ${varDir} - install -m 0755 -o wwwrun -g wwwrun -d ${varDir}/config - install -m 0750 -o wwwrun -g wwwrun -d ${varDir}/phpSessions - ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v: - "install -D -m 0644 -o wwwrun -g wwwrun -T ${v} ${varDir}/config/${n}.json" - ) confs)} - ''; - }; - services.phpfpm.pools.nextcloud = { - user = "wwwrun"; - group = "wwwrun"; - settings = phpFpm.pool; - phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache all.imagick ]); - }; - - services.cron = { - enable = true; - systemCronJobs = let - script = pkgs.writeScriptBin "nextcloud-cron" '' - #! ${pkgs.stdenv.shell} - export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive - export PATH=/run/wrappers/bin:$PATH - ${pkgs.php74}/bin/php -d memory_limit=512M -f ${nextcloud}/cron.php - ''; - in [ - '' - */15 * * * * wwwrun ${script}/bin/nextcloud-cron - '' - ]; - }; - }; -} diff --git a/modules/private/websites/bakeer/cloud.nix b/modules/private/websites/bakeer/cloud.nix deleted file mode 100644 index bf78317..0000000 --- a/modules/private/websites/bakeer/cloud.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.bakeer.cloud; - nextcloud = config.myServices.tools.cloud.farm.package; -in { - options.myServices.websites.bakeer.cloud.enable = lib.mkEnableOption "enable Bakeer’s cloud"; - - config = lib.mkIf cfg.enable { - myServices.tools.cloud.farm.instances = [ "bakeer" ]; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.bakeer = { - certName = "bakeer"; - certMainHost = "bakeer.immae.eu"; - addToCerts = true; - hosts = ["bakeer.immae.eu" "baxsolution.immae.eu"]; - root = nextcloud; - extraConfig = [ - config.myServices.tools.cloud.farm.vhosts.bakeer - ]; - }; - }; -} - diff --git a/modules/private/websites/capitaines/discourse_static/discourse.png b/modules/private/websites/capitaines/discourse_static/discourse.png deleted file mode 100644 index 91ce42d..0000000 Binary files a/modules/private/websites/capitaines/discourse_static/discourse.png and /dev/null differ diff --git a/modules/private/websites/capitaines/discourse_static/index.html b/modules/private/websites/capitaines/discourse_static/index.html deleted file mode 100644 index 4c2ead0..0000000 --- a/modules/private/websites/capitaines/discourse_static/index.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html> -<html lang='en'> - <head> - <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'> - <title>This instance is now closed - Discourse - - - -
- Discourse capitaines -

Sorry, this instance is closed now.

-
- - diff --git a/modules/private/websites/capitaines/landing_pages.nix b/modules/private/websites/capitaines/landing_pages.nix deleted file mode 100644 index edba8b9..0000000 --- a/modules/private/websites/capitaines/landing_pages.nix +++ /dev/null @@ -1,57 +0,0 @@ -{ lib, config, ... }: -let - cfg = config.myServices.websites.capitaines.landing_pages; - certName = "capitaines"; - domain = "capitaines.fr"; -in { - options.myServices.websites.capitaines.landing_pages.enable = lib.mkEnableOption "enable Capitaines's landing pages"; - - config = lib.mkIf cfg.enable { - services.websites.env.production.vhostConfs.capitaines_mastodon = rec { - inherit certName; - certMainHost = "mastodon.${domain}"; - hosts = [ certMainHost ]; - root = ./mastodon_static; - extraConfig = [ - '' - ErrorDocument 404 /index.html - - DirectoryIndex index.html - Options Indexes FollowSymLinks MultiViews Includes - Require all granted - - '' - ]; - }; - - services.websites.env.production.vhostConfs.capitaines_discourse = { - inherit certName; - addToCerts = true; - hosts = [ "discourse.${domain}" ]; - root = ./discourse_static; - extraConfig = [ - '' - ErrorDocument 404 /index.html - - DirectoryIndex index.html - Options Indexes FollowSymLinks MultiViews Includes - Require all granted - - '' - ]; - }; - - services.websites.env.production.vhostConfs.capitaines = { - inherit certName; - addToCerts = true; - hosts = [ domain ]; - root = ../_www; - extraConfig = [ '' - - DirectoryIndex index.htm - Require all granted - - '' ]; - }; - }; -} diff --git a/modules/private/websites/capitaines/mastodon_static/index.html b/modules/private/websites/capitaines/mastodon_static/index.html deleted file mode 100644 index fae4152..0000000 --- a/modules/private/websites/capitaines/mastodon_static/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - This instance is now closed - Mastodon - - - -
- Mastodon -

Sorry, this instance is closed now.

-
- - diff --git a/modules/private/websites/capitaines/mastodon_static/oops.png b/modules/private/websites/capitaines/mastodon_static/oops.png deleted file mode 100644 index 0abddad..0000000 Binary files a/modules/private/websites/capitaines/mastodon_static/oops.png and /dev/null differ diff --git a/modules/private/websites/chloe/app/default.nix b/modules/private/websites/chloe/app/default.nix deleted file mode 100644 index d23e3e0..0000000 --- a/modules/private/websites/chloe/app/default.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ environment ? "prod" -, varDir ? "/var/lib/chloe_${environment}" -, spip, stdenv, sassc, sources }: -let - siteDir = stdenv.mkDerivation { - version = sources.websites-chloe-app.version; - pname = "chloe"; - src = sources.websites-chloe-app; - buildPhase = '' - make - ''; - installPhase = '' - cp -a . $out - ''; - buildInputs = [ sassc ]; - }; -in -spip.override { - ldap = true; - siteName = "chloe"; - inherit environment siteDir varDir; -} diff --git a/modules/private/websites/chloe/config/chmod.php b/modules/private/websites/chloe/config/chmod.php deleted file mode 100644 index aae16cd..0000000 --- a/modules/private/websites/chloe/config/chmod.php +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/modules/private/websites/chloe/config/connect.php b/modules/private/websites/chloe/config/connect.php deleted file mode 100644 index 18b0933..0000000 --- a/modules/private/websites/chloe/config/connect.php +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/modules/private/websites/chloe/config/ldap.php b/modules/private/websites/chloe/config/ldap.php deleted file mode 100644 index 825b7ed..0000000 --- a/modules/private/websites/chloe/config/ldap.php +++ /dev/null @@ -1,9 +0,0 @@ - array('sAMAccountName','uid','login','userid','cn','sn'),'nom' => 'cn','email' => 'mail','bio' => 'description',); -$GLOBALS['ldap_search'] = getenv("SPIP_LDAP_SEARCH"); -?> diff --git a/modules/private/websites/chloe/integration.nix b/modules/private/websites/chloe/integration.nix deleted file mode 100644 index 533568e..0000000 --- a/modules/private/websites/chloe/integration.nix +++ /dev/null @@ -1,104 +0,0 @@ -{ lib, pkgs, config, ... }: -let - apacheUser = config.services.httpd.Inte.user; - apacheGroup = config.services.httpd.Inte.group; - ccfg = config.myEnv.websites.chloe.integration; - webRoot = "/var/lib/ftp/immae/chloe"; - varDir = "/var/lib/ftp/immae/chloe_var"; - cfg = config.myServices.websites.chloe.integration; -in { - options.myServices.websites.chloe.integration.enable = lib.mkEnableOption "enable Chloe's website in integration"; - - config = lib.mkIf cfg.enable { - secrets.keys."websites/chloe/integration" = { - user = apacheUser; - group = apacheGroup; - permissions = "0400"; - text = '' - SetEnv SPIP_CONFIG_DIR "${./config}" - SetEnv SPIP_VAR_DIR "${varDir}" - SetEnv SPIP_SITE "chloe-dev" - SetEnv SPIP_LDAP_BASE "dc=immae,dc=eu" - SetEnv SPIP_LDAP_HOST "ldaps://ldap.immae.eu" - SetEnv SPIP_LDAP_SEARCH_DN "${ccfg.ldap.dn}" - SetEnv SPIP_LDAP_SEARCH_PW "${ccfg.ldap.password}" - SetEnv SPIP_LDAP_SEARCH "${ccfg.ldap.filter}" - SetEnv SPIP_MYSQL_HOST "${ccfg.mysql.host}" - SetEnv SPIP_MYSQL_PORT "${ccfg.mysql.port}" - SetEnv SPIP_MYSQL_DB "${ccfg.mysql.database}" - SetEnv SPIP_MYSQL_USER "${ccfg.mysql.user}" - SetEnv SPIP_MYSQL_PASSWORD "${ccfg.mysql.password}" - ''; - }; - systemd.services.phpfpm-chloe_integration.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-chloe_integration.wants = [ "mysql.service" ]; - services.phpfpm.pools.chloe_integration = { - user = config.services.httpd.Inte.user; - group = config.services.httpd.Inte.group; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - # "php_admin_flag[log_errors]" = "on"; - "php_admin_value[open_basedir]" = "${../../../../pkgs/webapps/spip/spip_mes_options.php}:${./config}:${webRoot}:${varDir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - }; - phpPackage = pkgs.php72; - }; - system.activationScripts.chloe_integration = { - deps = [ "wrappers" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${varDir} ${varDir}/IMG ${varDir}/tmp ${varDir}/local - install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${varDir}/phpSessions - ''; - }; - services.websites.env.integration.modules = [ "proxy_fcgi" ]; - services.websites.env.integration.vhostConfs.chloe_integration = { - certName = "integration"; - addToCerts = true; - hosts = ["test.chc.immae.dev" ]; - root = webRoot; - extraConfig = [ - '' - Include ${config.secrets.fullPaths."websites/chloe/integration"} - - RewriteEngine On - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.chloe_integration.socket}|fcgi://localhost" - - - - DirectoryIndex index.php index.htm index.html - Options -Indexes +FollowSymLinks +MultiViews +Includes - Include ${webRoot}/htaccess.txt - - AllowOverride AuthConfig FileInfo Limit - Require all granted - - - - Require all denied - - - - Require all denied - - - - Use LDAPConnect - Require ldap-group cn=chc.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu - ErrorDocument 401 "" - - '' - ]; - }; - services.websites.env.integration.watchPaths = [ - config.secrets.fullPaths."websites/chloe/integration" - ]; - }; -} diff --git a/modules/private/websites/chloe/production.nix b/modules/private/websites/chloe/production.nix deleted file mode 100644 index 211232c..0000000 --- a/modules/private/websites/chloe/production.nix +++ /dev/null @@ -1,112 +0,0 @@ -{ lib, pkgs, config, ... }: -let - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; - ccfg = config.myEnv.websites.chloe.production; - app = pkgs.callPackage ./app { - inherit (ccfg) environment; - inherit (pkgs.webapps) spip; - varDir = "/var/lib/chloe_production"; - }; - cfg = config.myServices.websites.chloe.production; -in { - options.myServices.websites.chloe.production.enable = lib.mkEnableOption "enable Chloe's website in production"; - - config = lib.mkIf cfg.enable { - secrets.keys."websites/chloe/production" = { - user = apacheUser; - group = apacheGroup; - permissions = "0400"; - text = '' - SetEnv SPIP_CONFIG_DIR "${./config}" - SetEnv SPIP_VAR_DIR "${app.varDir}" - SetEnv SPIP_SITE "chloe-${app.environment}" - SetEnv SPIP_LDAP_BASE "dc=immae,dc=eu" - SetEnv SPIP_LDAP_HOST "ldaps://ldap.immae.eu" - SetEnv SPIP_LDAP_SEARCH_DN "${ccfg.ldap.dn}" - SetEnv SPIP_LDAP_SEARCH_PW "${ccfg.ldap.password}" - SetEnv SPIP_LDAP_SEARCH "${ccfg.ldap.filter}" - SetEnv SPIP_MYSQL_HOST "${ccfg.mysql.host}" - SetEnv SPIP_MYSQL_PORT "${ccfg.mysql.port}" - SetEnv SPIP_MYSQL_DB "${ccfg.mysql.database}" - SetEnv SPIP_MYSQL_USER "${ccfg.mysql.user}" - SetEnv SPIP_MYSQL_PASSWORD "${ccfg.mysql.password}" - ''; - }; - services.webstats.sites = [ { name = "osteopathe-cc.fr"; } ]; - - systemd.services.phpfpm-chloe_production.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-chloe_production.wants = [ "mysql.service" ]; - services.phpfpm.pools.chloe_production = { - user = config.services.httpd.Prod.user; - group = config.services.httpd.Prod.group; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - # "php_admin_flag[log_errors]" = "on"; - "php_admin_value[open_basedir]" = "${app.spipConfig}:${./config}:${app}:${app.varDir}:/tmp"; - "php_admin_value[session.save_path]" = "${app.varDir}/phpSessions"; - "pm" = "dynamic"; - "pm.max_children" = "20"; - "pm.start_servers" = "2"; - "pm.min_spare_servers" = "1"; - "pm.max_spare_servers" = "3"; - }; - phpPackage = pkgs.php72; - }; - system.activationScripts.chloe_production = { - deps = [ "wrappers" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir} ${app.varDir}/IMG ${app.varDir}/tmp ${app.varDir}/local - install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions - ''; - }; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.chloe = { - certName = "chloe"; - certMainHost = "osteopathe-cc.fr"; - hosts = ["osteopathe-cc.fr" "www.osteopathe-cc.fr" ]; - root = app.webRoot; - extraConfig = [ - '' - Use Stats osteopathe-cc.fr - - RewriteEngine On - RewriteCond "%{HTTP_HOST}" "!^www\.osteopathe-cc\.fr$" [NC] - RewriteRule ^(.+)$ https://www.osteopathe-cc.fr$1 [R=302,L] - - Include ${config.secrets.fullPaths."websites/chloe/production"} - - RewriteEngine On - RewriteRule ^/news.rss /spip.php?page=backend&id_rubrique=1 - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.chloe_production.socket}|fcgi://localhost" - - - - DirectoryIndex index.php index.htm index.html - Options -Indexes +FollowSymLinks +MultiViews +Includes - Include ${app.webRoot}/htaccess.txt - - AllowOverride AuthConfig FileInfo Limit - Require all granted - - - - Require all denied - - - - Require all denied - - '' - ]; - }; - services.websites.env.production.watchPaths = [ - config.secrets.fullPaths."websites/chloe/production" - ]; - }; -} diff --git a/modules/private/websites/cip-ca/sympa.nix b/modules/private/websites/cip-ca/sympa.nix deleted file mode 100644 index bb66fc6..0000000 --- a/modules/private/websites/cip-ca/sympa.nix +++ /dev/null @@ -1,28 +0,0 @@ -{ lib, config, ... }: -let - cfg = config.myServices.websites.cip-ca.sympa; -in -{ - options.myServices.websites.cip-ca.sympa.enable = lib.mkEnableOption "enable cip-ca’s sympa website"; - config = lib.mkIf cfg.enable { - services.websites.env.tools.vhostConfs.cipca_sympa = { - certName = "cip-ca"; - certMainHost = "mail.cip-ca.fr"; - hosts = [ "mail.cip-ca.fr" ]; - root = null; - extraConfig = [ - '' - Alias /static-sympa/ /var/lib/sympa/static_content/ - - Require all granted - AllowOverride none - - - SetHandler "proxy:unix:/run/sympa/wwsympa.socket|fcgi://" - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/commons/adminer.nix b/modules/private/websites/commons/adminer.nix deleted file mode 100644 index eae6a9a..0000000 --- a/modules/private/websites/commons/adminer.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ config, callPackage }: -callPackage ../tools/tools/adminer.nix { - forcePhpSocket = config.services.phpfpm.pools.adminer.socket; -} diff --git a/modules/private/websites/connexionswing/app/default.nix b/modules/private/websites/connexionswing/app/default.nix deleted file mode 100644 index b14b03b..0000000 --- a/modules/private/websites/connexionswing/app/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ environment, varDir, secretsPath -, composerEnv, fetchurl, fetchgit, sources }: -let - app = composerEnv.buildPackage ( - import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } // - rec { - pname = "connexionswing"; - name = "${pname}-${version}"; - version = sources.websites-connexionswing-app.version; - src = sources.websites-connexionswing-app; - noDev = (environment == "prod"); - preInstall = '' - export SYMFONY_ENV="${environment}" - ''; - postInstall = '' - cd $out - ${if environment == "prod" then "php ./bin/console assetic:dump --env=prod --no-debug" else ""} - rm app/config/parameters.yml - ln -sf ${secretsPath} app/config/parameters.yml - rm -rf var/{logs,cache} - ln -sf ${varDir}/var/{logs,cache} var/ - ln -sf ${varDir}/{medias,uploads} web/images/ - ''; - passthru = { - inherit varDir environment; - webRoot = "${app}/web"; - }; - }); -in app diff --git a/modules/private/websites/connexionswing/app/php-packages.nix b/modules/private/websites/connexionswing/app/php-packages.nix deleted file mode 100644 index 10bb737..0000000 --- a/modules/private/websites/connexionswing/app/php-packages.nix +++ /dev/null @@ -1,597 +0,0 @@ -# Generated with composer2nix and adapted to return only the list of -# packages -{ composerEnv, fetchurl, fetchgit ? null }: -{ - packages = { - "behat/transliterator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c"; - src = fetchurl { - url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c; - sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0"; - }; - }; - }; - "components/bootstrap" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "components-bootstrap-670295b9d6170a79acc8586a15e729bf24128275"; - src = fetchurl { - url = https://api.github.com/repos/components/bootstrap/zipball/670295b9d6170a79acc8586a15e729bf24128275; - sha256 = "0lcq9cjnywvf1nd8k99flgcf2dmfgyyxzsvcpip8xiibmh5x04p9"; - }; - }; - }; - "components/jquery" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "components-jquery-5dd7297d7603e11e53bdcca2a71074d92de37b8f"; - src = fetchurl { - url = https://api.github.com/repos/components/jquery/zipball/5dd7297d7603e11e53bdcca2a71074d92de37b8f; - sha256 = "1maplw3yic1pzbwwl2amjlivipsi1w0r8bq7i0mmjaqf7wij506i"; - }; - }; - }; - "components/jqueryui" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "components-jqueryui-44ecf3794cc56b65954cc19737234a3119d036cc"; - src = fetchurl { - url = https://api.github.com/repos/components/jqueryui/zipball/44ecf3794cc56b65954cc19737234a3119d036cc; - sha256 = "1y0ppxk44jkxbh38i05sg0zcgk927s5wy6sjngwr5qifibqbcbhk"; - }; - }; - }; - "composer/ca-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "composer-ca-bundle-d2c0a83b7533d6912e8d516756ebd34f893e9169"; - src = fetchurl { - url = https://api.github.com/repos/composer/ca-bundle/zipball/d2c0a83b7533d6912e8d516756ebd34f893e9169; - sha256 = "1as399dzrfbjnifb87j1g5cvrbacyddbay8fv59i56xx1bdq7lwc"; - }; - }; - }; - "doctrine/annotations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-annotations-54cacc9b81758b14e3ce750f205a393d52339e97"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97; - sha256 = "1wi5skihqbcinlkrkr15nmmvqkn2gydqib8xl232abdvfq1q0w24"; - }; - }; - }; - "doctrine/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-cache-eb152c5100571c7a45470ff2a35095ab3f3b900b"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b; - sha256 = "0iq0qqv1smlqz63jhj2fpjy54c5dwfwxyf5c89iky6i0yb81gwyd"; - }; - }; - }; - "doctrine/collections" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-collections-1a4fb7e902202c33cce8c55989b945612943c2ba"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba; - sha256 = "0fkiwkx7zbmfnh4p21za807lh1n7g1f4lpgy8y59g4r5krvpl90w"; - }; - }; - }; - "doctrine/common" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-common-4acb8f89626baafede6ee5475bc5844096eba8a9"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9; - sha256 = "0qjqframvg81z3lwqaj5haanqj9v3dfbj170pxmwlgmrfsbr16zh"; - }; - }; - }; - "doctrine/dbal" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873; - sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3"; - }; - }; - }; - "doctrine/doctrine-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-bundle-703fad32e4c8cbe609caf45a71a1d4266c830f0f"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/703fad32e4c8cbe609caf45a71a1d4266c830f0f; - sha256 = "0v2f63j22i3im8jbmv7spi8j42fay6dnxjvbxnbwj190ajxl6sdp"; - }; - }; - }; - "doctrine/doctrine-cache-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-cache-bundle-4c8e363f96427924e7e519c5b5119b4f54512697"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/4c8e363f96427924e7e519c5b5119b4f54512697; - sha256 = "1irm04iijzq6gziknwyb10a9s0xbzh04xs5i2d6aac86cc29187c"; - }; - }; - }; - "doctrine/doctrine-migrations-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-migrations-bundle-a9e506369f931351a2a6dd2aef588a822802b1b7"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/a9e506369f931351a2a6dd2aef588a822802b1b7; - sha256 = "1jgrqsgdwcm2g8rml76qr6b19s1vxfbnrp43qr6n1g9kbx7y9wg9"; - }; - }; - }; - "doctrine/inflector" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-inflector-90b2128806bfde671b6952ab8bea493942c1fdae"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae; - sha256 = "01vmclj3k7xil51jg329fznshh8d07pvm4mr89lvfn1d7fyrq6qw"; - }; - }; - }; - "doctrine/instantiator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-instantiator-8e884e78f9f0eb1329e445619e04456e64d8051d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d; - sha256 = "15dcja45rnwya431pcm826l68k1g8f1fabl7rih69alcdyvdlln4"; - }; - }; - }; - "doctrine/lexer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c; - sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74"; - }; - }; - }; - "doctrine/migrations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-migrations-c81147c0f2938a6566594455367e095150547f72"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/migrations/zipball/c81147c0f2938a6566594455367e095150547f72; - sha256 = "0x8hvxbm3f40sx25nq8zlh1kr936pagghzp89l0gdy5bar7cdzi5"; - }; - }; - }; - "doctrine/orm" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-orm-810a7baf81462a5ddf10e8baa8cb94b6eec02754"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/doctrine2/zipball/810a7baf81462a5ddf10e8baa8cb94b6eec02754; - sha256 = "1hmkc7917kgnav9hmlgvlp7qwm3zjj910ci71g9yqwjh6s28wrf1"; - }; - }; - }; - "fig/link-util" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac; - sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64"; - }; - }; - }; - "friendsofsymfony/jsrouting-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "friendsofsymfony-jsrouting-bundle-49c1069132dcef371fb526351569deabeb6f0d8e"; - src = fetchurl { - url = https://api.github.com/repos/FriendsOfSymfony/FOSJsRoutingBundle/zipball/49c1069132dcef371fb526351569deabeb6f0d8e; - sha256 = "0ymmxhxbjnzj8bk3zq55vq0xvsaq82348v321gy2jyi90d19p5j7"; - }; - }; - }; - "gedmo/doctrine-extensions" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "gedmo-doctrine-extensions-1e400fbd05b7e5f912f55fe95805450f7d3bed60"; - src = fetchurl { - url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/1e400fbd05b7e5f912f55fe95805450f7d3bed60; - sha256 = "14hmivynyzc1c9l5kxj9gbwjrkv9m9lrjjx2r1m74wdhi5p0p20v"; - }; - }; - }; - "immae/connexionswing-ckeditor-component" = { - targetDir = ""; - src = fetchgit { - name = "immae-connexionswing-ckeditor-component-3b35bd273a79f6b01fda7a246aed64aca147ea7a"; - url = "https://git.immae.eu/perso/Immae/Projets/packagist/connexionswing-ckeditor-component.git"; - rev = "3b35bd273a79f6b01fda7a246aed64aca147ea7a"; - sha256 = "1w0y6k28ci73n0db9gwvqg7grzvh1z718ys9v1ik8cla7zw83bni"; - }; - }; - "immae/jquery-touchswipe" = { - targetDir = ""; - src = fetchgit { - name = "immae-jquery-touchswipe-3e15949df974d6612d76dc9ee75cd976dbcc2114"; - url = "https://git.immae.eu/perso/Immae/Projets/packagist/jquery-touchswipe.git"; - rev = "3e15949df974d6612d76dc9ee75cd976dbcc2114"; - sha256 = "1pnvki1j3a65cdwwqs0id790ni813lh3r0m7556gdn0hsqa1cc4d"; - }; - }; - "incenteev/composer-parameter-handler" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550"; - src = fetchurl { - url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550; - sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm"; - }; - }; - }; - "jdorn/sql-formatter" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc"; - src = fetchurl { - url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc; - sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi"; - }; - }; - }; - "kriswallsmith/assetic" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "kriswallsmith-assetic-e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1"; - src = fetchurl { - url = https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1; - sha256 = "1dqk4zvx8fgqf8rb81sj9bipl5431jib2b9kcvxyig5fw99irpf8"; - }; - }; - }; - "monolog/monolog" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "monolog-monolog-fd8c787753b3a2ad11bc60c063cff1358a32a3b4"; - src = fetchurl { - url = https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4; - sha256 = "0avf3y8raw23krwdb7kw9qb5bsr5ls4i7qd2vh7hcds3qjixg3h9"; - }; - }; - }; - "ocramius/proxy-manager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "ocramius-proxy-manager-57e9272ec0e8deccf09421596e0e2252df440e11"; - src = fetchurl { - url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/57e9272ec0e8deccf09421596e0e2252df440e11; - sha256 = "10crhcnhz42b01i6lv6ysgc7awp7yw82p4i2a4sg6bjihw677yps"; - }; - }; - }; - "paragonie/random_compat" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "paragonie-random_compat-258c89a6b97de7dfaf5b8c7607d0478e236b04fb"; - src = fetchurl { - url = https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb; - sha256 = "11arrici2mgfj7r847wm423pqrvfj9wn9jcgyxnq4rzyahaxz5l1"; - }; - }; - }; - "psr/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8; - sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz"; - }; - }; - }; - "psr/container" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f; - sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j"; - }; - }; - }; - "psr/link" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562; - sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13"; - }; - }; - }; - "psr/log" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-log-4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d; - sha256 = "1mlcv17fjw39bjpck176ah1z393b6pnbw3jqhhrblj27c70785md"; - }; - }; - }; - "psr/simple-cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b; - sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw"; - }; - }; - }; - "ricbra/robots-txt-bundle" = { - targetDir = "Ricbra/Bundle/RobotsTxtBundle"; - src = composerEnv.buildZipPackage { - name = "ricbra-robots-txt-bundle-80d122a708893a762041464890e59a76babd6c22"; - src = fetchurl { - url = https://api.github.com/repos/ricbra/robots-txt-bundle/zipball/80d122a708893a762041464890e59a76babd6c22; - sha256 = "0w3lfzy1ys0bwl3shy4ychldfd711w1p2y13i1az2z2gh731d0ad"; - }; - }; - }; - "robloach/component-installer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "robloach-component-installer-908a859aa7c4949ba9ad67091e67bac10b66d3d7"; - src = fetchurl { - url = https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7; - sha256 = "19y5sv4k338bihzmm8iac6q43r18vxhmbpvrdhz8jn39r51ampq9"; - }; - }; - }; - "sensio/distribution-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-distribution-bundle-eb6266b3b472e4002538610b28a0a04bcf94891a"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/eb6266b3b472e4002538610b28a0a04bcf94891a; - sha256 = "0wyffqj924lz9cv0vbahyngjw1g850v0p34swygzzgp3cr0ank13"; - }; - }; - }; - "sensio/framework-extra-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-framework-extra-bundle-bb907234df776b68922eb4b25bfa061683597b6a"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb907234df776b68922eb4b25bfa061683597b6a; - sha256 = "011hcljjcfq5qy4a7mlf0hwqxyb58yci40ini0n5rqandcyk2nck"; - }; - }; - }; - "sensiolabs/security-checker" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensiolabs-security-checker-dc270d5fec418cc6ac983671dba5d80ffaffb142"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/security-checker/zipball/dc270d5fec418cc6ac983671dba5d80ffaffb142; - sha256 = "0fnshyd6f8j91a7y604nh6sqgscjl48mfa0727g2r4hkdfz8hpd1"; - }; - }; - }; - "swiftmailer/swiftmailer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "swiftmailer-swiftmailer-7ffc1ea296ed14bf8260b6ef11b80208dbadba91"; - src = fetchurl { - url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91; - sha256 = "1vl5pzgvr2yfrj1yfs02mi917b0gr56v76ibi40r51a3346zhp6v"; - }; - }; - }; - "symfony/assetic-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-assetic-bundle-2e0a23a4874838e26de6f025e02fc63328921a4c"; - src = fetchurl { - url = https://api.github.com/repos/symfony/assetic-bundle/zipball/2e0a23a4874838e26de6f025e02fc63328921a4c; - sha256 = "17rxrkyzxa6x5nn7qhhhdgx4z0nlznnq5fifza4wv9znca8bbwyc"; - }; - }; - }; - "symfony/monolog-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-monolog-bundle-8781649349fe418d51d194f8c9d212c0b97c40dd"; - src = fetchurl { - url = https://api.github.com/repos/symfony/monolog-bundle/zipball/8781649349fe418d51d194f8c9d212c0b97c40dd; - sha256 = "0wcqhg1vfdj3mxacr3fxpgqwy1rk9znjg9bmzx4jymk8l16i7bq8"; - }; - }; - }; - "symfony/polyfill-apcu" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-apcu-9b83bd010112ec196410849e840d9b9fefcb15ad"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/9b83bd010112ec196410849e840d9b9fefcb15ad; - sha256 = "0iiiqbn0bs0zqc95nz8l1qa5ysy0iifx4f27r9wnhzsh6f1h02mv"; - }; - }; - }; - "symfony/polyfill-intl-icu" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-intl-icu-80ee17ae83c10cd513e5144f91a73607a21edb4e"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/80ee17ae83c10cd513e5144f91a73607a21edb4e; - sha256 = "1hck9bn8zfb1pmx2yccf4w5dd9rbmvwii7hncin6px6nasi6wzvv"; - }; - }; - }; - "symfony/polyfill-mbstring" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-mbstring-3296adf6a6454a050679cde90f95350ad604b171"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171; - sha256 = "02wyx9fjx9lyc5q5d3bnn8aw9xag8im2wqanmbkljwd5vmx9k9b2"; - }; - }; - }; - "symfony/polyfill-php56" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php56-af98553c84912459db3f636329567809d639a8f6"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php56/zipball/af98553c84912459db3f636329567809d639a8f6; - sha256 = "1l1ydsd7cq3s97cpgl4fw1qxc2wmv27yfxa3q8ng9p66ypzvkw42"; - }; - }; - }; - "symfony/polyfill-php70" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php70-77454693d8f10dd23bb24955cffd2d82db1007a6"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php70/zipball/77454693d8f10dd23bb24955cffd2d82db1007a6; - sha256 = "146d620ca725iqdh7j0dqb99h20d4vs641c9vjy9x4jws3rgj905"; - }; - }; - }; - "symfony/polyfill-util" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-util-1a5ad95d9436cbff3296034fe9f8d586dce3fb3a"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-util/zipball/1a5ad95d9436cbff3296034fe9f8d586dce3fb3a; - sha256 = "0l7w4dlr7y3qijpaiq7hfhbhv1qqz9jjknr1n6k4vrss2a8d1sxk"; - }; - }; - }; - "symfony/swiftmailer-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec"; - src = fetchurl { - url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec; - sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01"; - }; - }; - }; - "symfony/symfony" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-symfony-4babd75194d45f7a4412560038924f3008c67ef2"; - src = fetchurl { - url = https://api.github.com/repos/symfony/symfony/zipball/4babd75194d45f7a4412560038924f3008c67ef2; - sha256 = "1347qp994yg6k91v5gwdwnn202bz92m0pj4090b59z5nqxh7463d"; - }; - }; - }; - "twig/extensions" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "twig-extensions-d188c76168b853481cc75879ea045bf93d718e9c"; - src = fetchurl { - url = https://api.github.com/repos/twigphp/Twig-extensions/zipball/d188c76168b853481cc75879ea045bf93d718e9c; - sha256 = "0d6wywys5fqzi3m8g8h3sb5phl5y3a7vfc95n214mqp0iwrcmzwm"; - }; - }; - }; - "twig/twig" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "twig-twig-b48680b6eb7d16b5025b9bfc4108d86f6b8af86f"; - src = fetchurl { - url = https://api.github.com/repos/twigphp/Twig/zipball/b48680b6eb7d16b5025b9bfc4108d86f6b8af86f; - sha256 = "1q82f246wq7whl11lx00n0skwmllppvpzg20x6q4frmw44dc6v9a"; - }; - }; - }; - "willdurand/jsonp-callback-validator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "willdurand-jsonp-callback-validator-1a7d388bb521959e612ef50c5c7b1691b097e909"; - src = fetchurl { - url = https://api.github.com/repos/willdurand/JsonpCallbackValidator/zipball/1a7d388bb521959e612ef50c5c7b1691b097e909; - sha256 = "19ds8f3nbss4b2xvqkcjkcvz0l4c5nhrm8w8yxc8a508r0jmd9in"; - }; - }; - }; - "zendframework/zend-code" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-code-95033f061b083e16cdee60530ec260d7d628b887"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-code/zipball/95033f061b083e16cdee60530ec260d7d628b887; - sha256 = "0h77qf267l2sp9wg3n61dpgpf6wh6p5jssy8mrg7vlns2j03f9f5"; - }; - }; - }; - "zendframework/zend-eventmanager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd; - sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n"; - }; - }; - }; - }; - devPackages = { - "doctrine/data-fixtures" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-data-fixtures-17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/data-fixtures/zipball/17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e; - sha256 = "15k7vl58kwh02g0a93rab82ifbgmc91srgminzlkjq5kx8agh7ab"; - }; - }; - }; - "doctrine/doctrine-fixtures-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-fixtures-bundle-74b8cc70a4a25b774628ee59f4cdf3623a146273"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/74b8cc70a4a25b774628ee59f4cdf3623a146273; - sha256 = "1bbflq8k6izwqgp9ka2gyb5y96a80b4lnlc5wrgc5gnih7hqidlf"; - }; - }; - }; - "sensio/generator-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65; - sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3"; - }; - }; - }; - "symfony/phpunit-bridge" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-phpunit-bridge-7470518370113785f67a7fd8e6e1667661e88805"; - src = fetchurl { - url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/7470518370113785f67a7fd8e6e1667661e88805; - sha256 = "0jd28ag0wks9sv62rkwsbx68csvdl5gabbz2h01hkqpa23gdkhs9"; - }; - }; - }; - }; -} diff --git a/modules/private/websites/connexionswing/integration.nix b/modules/private/websites/connexionswing/integration.nix deleted file mode 100644 index 9cf2b94..0000000 --- a/modules/private/websites/connexionswing/integration.nix +++ /dev/null @@ -1,141 +0,0 @@ -{ lib, pkgs, config, ... }: -let - secrets = config.myEnv.websites.connexionswing.integration; - webRoot = "/var/lib/ftp/immae/connexionswing/web"; - varDir = "/var/lib/ftp/immae/connexionswing_var"; - cfg = config.myServices.websites.connexionswing.integration; - pcfg = config.services.phpApplication; -in { - options.myServices.websites.connexionswing.integration.enable = lib.mkEnableOption "enable Connexionswing's website in integration"; - - config = lib.mkIf cfg.enable { - services.phpApplication.apps.connexionswing_integration = { - websiteEnv = "integration"; - httpdUser = config.services.httpd.Inte.user; - httpdGroup = config.services.httpd.Inte.group; - inherit webRoot varDir; - varDirPaths = { - "medias" = "0700"; - "uploads" = "0700"; - "var" = "0700"; - }; - app = "/var/lib/ftp/immae/connexionswing"; - serviceDeps = [ "mysql.service" ]; - preStartActions = [ - "./bin/console --env=dev cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" "/run/wrappers/bin/sendmail" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - }; - phpEnv = { - SYMFONY_DEBUG_MODE = "\"yes\""; - }; - phpWatchFiles = [ - config.secrets.fullPaths."websites/connexionswing/integration" - ]; - phpPackage = pkgs.php72; - }; - - secrets.keys."websites/connexionswing/integration" = { - user = config.services.httpd.Inte.user; - group = config.services.httpd.Inte.group; - permissions = "0400"; - text = '' - # This file is auto-generated during the composer install - parameters: - database_host: ${secrets.mysql.host} - database_port: ${secrets.mysql.port} - database_name: ${secrets.mysql.database} - database_user: ${secrets.mysql.user} - database_password: ${secrets.mysql.password} - database_server_version: ${pkgs.mariadb.mysqlVersion} - mailer_transport: sendmail - mailer_host: null - mailer_user: null - mailer_password: null - subscription_email: ${secrets.email} - allow_robots: true - secret: ${secrets.secret} - ''; - }; - - services.websites.env.integration.vhostConfs.connexionswing_integration = { - certName = "integration"; - addToCerts = true; - hosts = ["connexionswing.cs.immae.dev" "sandetludo.cs.immae.dev" ]; - root = webRoot; - extraConfig = [ - '' - - SetHandler "proxy:unix:${pcfg.phpListenPaths.connexionswing_integration}|fcgi://localhost" - - - - Options FollowSymLinks - AllowOverride None - Require all granted - - - - Options FollowSymLinks - AllowOverride None - Require all granted - - - - Use LDAPConnect - Require ldap-group cn=cs.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu - ErrorDocument 401 "" - - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - DirectoryIndex app_dev.php - - - Options -MultiViews - - - - RewriteEngine On - - RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ - RewriteRule ^(.*) - [E=BASE:%1] - - # Maintenance script - RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f - RewriteCond %{SCRIPT_FILENAME} !maintenance.php - RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L] - ErrorDocument 503 /maintenance.php - - # Sets the HTTP_AUTHORIZATION header removed by Apache - RewriteCond %{HTTP:Authorization} . - RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - RewriteCond %{ENV:REDIRECT_STATUS} ^$ - RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] - - # If the requested filename exists, simply serve it. - # We only want to let Apache serve files and not directories. - RewriteCond %{REQUEST_FILENAME} -f - RewriteRule ^ - [L] - - # Rewrite all other queries to the front controller. - RewriteRule ^ %{ENV:BASE}/app_dev.php [L] - - - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/connexionswing/production.nix b/modules/private/websites/connexionswing/production.nix deleted file mode 100644 index 4b0407f..0000000 --- a/modules/private/websites/connexionswing/production.nix +++ /dev/null @@ -1,110 +0,0 @@ -{ lib, pkgs, config, ... }: -let - secrets = config.myEnv.websites.connexionswing.production; - app = pkgs.callPackage ./app { - composerEnv = pkgs.composerEnv.override { php = pkgs.php72; }; - environment = secrets.environment; - varDir = "/var/lib/connexionswing_production"; - secretsPath = config.secrets.fullPaths."websites/connexionswing/production"; - }; - cfg = config.myServices.websites.connexionswing.production; - pcfg = config.services.phpApplication; -in { - options.myServices.websites.connexionswing.production.enable = lib.mkEnableOption "enable Connexionswing's website in production"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "connexionswing.com"; } ]; - services.phpApplication.apps.connexionswing_production = { - websiteEnv = "production"; - httpdUser = config.services.httpd.Prod.user; - httpdGroup = config.services.httpd.Prod.group; - inherit (app) webRoot varDir; - varDirPaths = { - "medias" = "0700"; - "uploads" = "0700"; - "var" = "0700"; - }; - inherit app; - serviceDeps = [ "mysql.service" ]; - preStartActions = [ - "./bin/console --env=${app.environment} cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" "/run/wrappers/bin/sendmail" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "dynamic"; - "pm.max_children" = "20"; - "pm.start_servers" = "2"; - "pm.min_spare_servers" = "1"; - "pm.max_spare_servers" = "3"; - }; - phpWatchFiles = [ - config.secrets.fullPaths."websites/connexionswing/production" - ]; - phpPackage = pkgs.php72; - }; - - secrets.keys."websites/connexionswing/production" = { - user = config.services.httpd.Prod.user; - group = config.services.httpd.Prod.group; - permissions = "0400"; - text = '' - # This file is auto-generated during the composer install - parameters: - database_host: ${secrets.mysql.host} - database_port: ${secrets.mysql.port} - database_name: ${secrets.mysql.database} - database_user: ${secrets.mysql.user} - database_password: ${secrets.mysql.password} - database_server_version: ${pkgs.mariadb.mysqlVersion} - mailer_transport: sendmail - mailer_host: null - mailer_user: null - mailer_password: null - subscription_email: ${secrets.email} - allow_robots: true - secret: ${secrets.secret} - services: - swiftmailer.mailer.default.transport: - class: Swift_SendmailTransport - arguments: ['/run/wrappers/bin/sendmail -bs'] - ''; - }; - - services.websites.env.production.vhostConfs.connexionswing_production = { - certName = "connexionswing"; - certMainHost = "connexionswing.com"; - hosts = ["connexionswing.com" "sandetludo.com" "www.connexionswing.com" "www.sandetludo.com" ]; - root = app.webRoot; - extraConfig = [ - '' - - SetHandler "proxy:unix:${pcfg.phpListenPaths.connexionswing_production}|fcgi://localhost" - - - - Options FollowSymLinks - AllowOverride None - Require all granted - - - - Options FollowSymLinks - AllowOverride None - Require all granted - - - Use Stats connexionswing.com - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/denise/aventuriers.nix b/modules/private/websites/denise/aventuriers.nix deleted file mode 100644 index 2bbf7bf..0000000 --- a/modules/private/websites/denise/aventuriers.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ lib, config, pkgs, ... }: -let - cfg = config.myServices.websites.denise.aventuriers; - varDir = "/var/lib/buildbot/outputs/denise/aventuriers"; -in { - options.myServices.websites.denise.aventuriers.enable = lib.mkEnableOption "enable Denise's Aventuriers website"; - - config = lib.mkIf cfg.enable { - services.websites.env.production.vhostConfs.denise_aventuriers = { - certName = "denise"; - addToCerts = true; - hosts = [ "aventuriers.syanni.eu" ]; - root = varDir; - extraConfig = [ - '' - - DirectoryIndex aventuriers.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/denise/bingo.nix b/modules/private/websites/denise/bingo.nix deleted file mode 100644 index 9130462..0000000 --- a/modules/private/websites/denise/bingo.nix +++ /dev/null @@ -1,100 +0,0 @@ -{ lib, config, pkgs, ... }: -let - cfg = config.myServices.websites.denise.bingo; - varDir = "/var/lib/buildbot/outputs/denise/bingo"; - varDirBeta = "/var/lib/buildbot/outputs/denise/bingo_beta"; - socket = "/run/denise_bingo/socket.sock"; - socket_beta = "/run/denise_bingo_beta/socket.sock"; -in { - options.myServices.websites.denise.bingo.enable = lib.mkEnableOption "enable Denise's bingo website"; - - config = lib.mkIf cfg.enable { - services.websites.env.production.vhostConfs.denise_bingo = { - certName = "denise"; - addToCerts = true; - hosts = [ "bingo.syanni.eu" ]; - root = null; - extraConfig = [ - '' - ProxyPreserveHost on - ProxyVia On - ProxyRequests Off - ProxyPassMatch ^/.well-known/acme-challenge ! - ProxyPass / unix://${socket}|http://bingo.syanni.eu/ - ProxyPassReverse / unix://${socket}|http://bingo.syanni.eu/ - '' - ]; - }; - - systemd.services.denise-bingo = { - description = "Denise bingo website"; - after = [ "network.target" ]; - wantedBy = [ "multi-user.target" ]; - - serviceConfig = { - Type = "simple"; - WorkingDirectory = varDir; - ExecStart = let - python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask p.matplotlib p.unidecode ]); - in - "${python}/bin/gunicorn -w4 -p /run/denise_bingo/gunicorn.pid --bind unix:${socket} app:app"; - User = "wwwrun"; - Restart = "always"; - RestartSec = "5s"; - PIDFile = "/run/denise_bingo/gunicorn.pid"; - RuntimeDirectory = "denise_bingo"; - StandardOutput = "journal"; - StandardError = "inherit"; - }; - }; - - security.sudo.extraRules = [ - { - commands = [ - { options = [ "NOPASSWD" ]; command = "${pkgs.systemd}/bin/systemctl restart denise-bingo-beta.service"; } - { options = [ "NOPASSWD" ]; command = "${pkgs.systemd}/bin/systemctl restart denise-bingo.service"; } - ]; - users = ["buildbot"]; - runAs = "root"; - } - ]; - services.websites.env.integration.vhostConfs.denise_bingo_beta = { - certName = "denise"; - addToCerts = true; - hosts = [ "beta.bingo.syanni.eu" ]; - root = null; - extraConfig = [ - '' - ProxyPreserveHost on - ProxyVia On - ProxyRequests Off - ProxyPassMatch ^/.well-known/acme-challenge ! - ProxyPass / unix://${socket_beta}|http://beta.bingo.syanni.eu/ - ProxyPassReverse / unix://${socket_beta}|http://beta.bingo.syanni.eu/ - '' - ]; - }; - - systemd.services.denise-bingo-beta = { - description = "Denise bingo beta website"; - after = [ "network.target" ]; - wantedBy = [ "multi-user.target" ]; - - serviceConfig = { - Type = "simple"; - WorkingDirectory = varDirBeta; - ExecStart = let - python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask ]); - in - "${python}/bin/gunicorn -w4 -p /run/denise_bingo_beta/gunicorn.pid --bind unix:${socket_beta} app:app"; - User = "wwwrun"; - Restart = "always"; - RestartSec = "5s"; - PIDFile = "/run/denise_bingo_beta/gunicorn.pid"; - RuntimeDirectory = "denise_bingo_beta"; - StandardOutput = "journal"; - StandardError = "inherit"; - }; - }; - }; -} diff --git a/modules/private/websites/denise/denisejerome.nix b/modules/private/websites/denise/denisejerome.nix deleted file mode 100644 index a75e591..0000000 --- a/modules/private/websites/denise/denisejerome.nix +++ /dev/null @@ -1,31 +0,0 @@ -{ lib, config, ... }: -let - cfg = config.myServices.websites.denise.denisejerome; - varDir = "/var/lib/ftp/denise/denisejerome"; - env = config.myEnv.websites.denisejerome; -in { - options.myServices.websites.denise.denisejerome.enable = lib.mkEnableOption "enable Denise Jerome's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "denisejerome.piedsjaloux.fr"; } ]; - - services.websites.env.production.vhostConfs.denise_denisejerome = { - certName = "denise"; - certMainHost = "denisejerome.piedsjaloux.fr"; - hosts = ["denisejerome.piedsjaloux.fr" ]; - root = varDir; - extraConfig = [ - '' - Use Stats denisejerome.piedsjaloux.fr - - - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride AuthConfig - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/denise/evariste.nix b/modules/private/websites/denise/evariste.nix deleted file mode 100644 index 42f9b2e..0000000 --- a/modules/private/websites/denise/evariste.nix +++ /dev/null @@ -1,104 +0,0 @@ -{ lib, config, pkgs, ... }: -let - cfg = config.myServices.websites.denise.evariste; - nsiVarDir = "/var/lib/ftp/denise/nsievariste"; - stmgVarDir = "/var/lib/ftp/denise/stmgevariste"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.denise.evariste.enable = lib.mkEnableOption "enable NSI/STMG Evariste website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ - { name = "nsievariste.immae.eu"; } - { name = "stmgevariste.immae.eu"; } - ]; - - services.websites.env.production.modules = [ "proxy_fcgi" ]; - system.activationScripts.denise_evariste = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/denise_nsievariste - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/denise_stmgevariste - ''; - }; - services.phpfpm.pools.denise_nsievariste = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/denise_nsievariste:${nsiVarDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/denise_nsievariste"; - }; - phpPackage = pkgs.php72; - }; - services.websites.env.production.vhostConfs.denise_nsievariste = { - certName = "denise_evariste"; - addToCerts = true; - certMainHost = "nsievariste.immae.eu"; - hosts = ["nsievariste.immae.eu" ]; - root = nsiVarDir; - extraConfig = [ - '' - Use Stats nsievariste.immae.eu - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.denise_nsievariste.socket}|fcgi://localhost" - - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - - services.phpfpm.pools.denise_stmgevariste = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/denise_stmgevariste:${stmgVarDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/denise_stmgevariste"; - }; - phpPackage = pkgs.php72; - }; - services.websites.env.production.vhostConfs.denise_stmgevariste = { - certName = "denise_evariste"; - addToCerts = true; - hosts = ["stmgevariste.immae.eu" ]; - root = stmgVarDir; - extraConfig = [ - '' - Use Stats stmgevariste.immae.eu - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.denise_stmgevariste.socket}|fcgi://localhost" - - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/denise/oms.nix b/modules/private/websites/denise/oms.nix deleted file mode 100644 index 2f18037..0000000 --- a/modules/private/websites/denise/oms.nix +++ /dev/null @@ -1,100 +0,0 @@ -{ lib, config, pkgs, ... }: -let - cfg = config.myServices.websites.denise.oms; - varDir = "/var/lib/buildbot/outputs/denise/oms"; - varDirBeta = "/var/lib/buildbot/outputs/denise/oms_beta"; - socket = "/run/denise_oms/socket.sock"; - socket_beta = "/run/denise_oms_beta/socket.sock"; -in { - options.myServices.websites.denise.oms.enable = lib.mkEnableOption "enable Denise's OMS website"; - - config = lib.mkIf cfg.enable { - services.websites.env.production.vhostConfs.denise_oms = { - certName = "denise"; - addToCerts = true; - hosts = [ "oms.syanni.eu" ]; - root = null; - extraConfig = [ - '' - ProxyPreserveHost on - ProxyVia On - ProxyRequests Off - ProxyPassMatch ^/.well-known/acme-challenge ! - ProxyPass / unix://${socket}|http://oms.syanni.eu/ - ProxyPassReverse / unix://${socket}|http://oms.syanni.eu/ - '' - ]; - }; - - systemd.services.denise-oms = { - description = "Denise OMS website"; - after = [ "network.target" ]; - wantedBy = [ "multi-user.target" ]; - - serviceConfig = { - Type = "simple"; - WorkingDirectory = varDir; - ExecStart = let - python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask p.matplotlib p.unidecode ]); - in - "${python}/bin/gunicorn -w4 -p /run/denise_oms/gunicorn.pid --bind unix:${socket} app:app"; - User = "wwwrun"; - Restart = "always"; - RestartSec = "5s"; - PIDFile = "/run/denise_oms/gunicorn.pid"; - RuntimeDirectory = "denise_oms"; - StandardOutput = "journal"; - StandardError = "inherit"; - }; - }; - - security.sudo.extraRules = [ - { - commands = [ - { options = [ "NOPASSWD" ]; command = "${pkgs.systemd}/bin/systemctl restart denise-oms-beta.service"; } - { options = [ "NOPASSWD" ]; command = "${pkgs.systemd}/bin/systemctl restart denise-oms.service"; } - ]; - users = ["buildbot"]; - runAs = "root"; - } - ]; - services.websites.env.integration.vhostConfs.denise_oms_beta = { - certName = "denise"; - addToCerts = true; - hosts = [ "beta.oms.syanni.eu" ]; - root = null; - extraConfig = [ - '' - ProxyPreserveHost on - ProxyVia On - ProxyRequests Off - ProxyPassMatch ^/.well-known/acme-challenge ! - ProxyPass / unix://${socket_beta}|http://beta.oms.syanni.eu/ - ProxyPassReverse / unix://${socket_beta}|http://beta.oms.syanni.eu/ - '' - ]; - }; - - systemd.services.denise-oms-beta = { - description = "Denise OMS beta website"; - after = [ "network.target" ]; - wantedBy = [ "multi-user.target" ]; - - serviceConfig = { - Type = "simple"; - WorkingDirectory = varDirBeta; - ExecStart = let - python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask p.matplotlib p.unidecode ]); - in - "${python}/bin/gunicorn -w4 -p /run/denise_oms_beta/gunicorn.pid --bind unix:${socket_beta} app:app"; - User = "wwwrun"; - Restart = "always"; - RestartSec = "5s"; - PIDFile = "/run/denise_oms_beta/gunicorn.pid"; - RuntimeDirectory = "denise_oms_beta"; - StandardOutput = "journal"; - StandardError = "inherit"; - }; - }; - }; -} diff --git a/modules/private/websites/denise/production.nix b/modules/private/websites/denise/production.nix deleted file mode 100644 index 9b28e9e..0000000 --- a/modules/private/websites/denise/production.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ lib, config, pkgs, ... }: -let - cfg = config.myServices.websites.denise.production; -in { - options.myServices.websites.denise.production.enable = lib.mkEnableOption "enable Denise's website"; - - config = lib.mkIf cfg.enable { - services.websites.env.production.vhostConfs.denise_production = { - certName = "denise"; - addToCerts = true; - hosts = [ "syanni.eu" "www.syanni.eu" ]; - root = ../_www; - extraConfig = [ - '' - - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride AuthConfig - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/emilia/atelierfringant.nix b/modules/private/websites/emilia/atelierfringant.nix deleted file mode 100644 index b47452f..0000000 --- a/modules/private/websites/emilia/atelierfringant.nix +++ /dev/null @@ -1,65 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.emilia.atelierfringant; - varDir = "/var/lib/ftp/emilia/atelierfringant"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.emilia.atelierfringant.enable = lib.mkEnableOption "enable Émilia's website"; - - config = lib.mkIf cfg.enable { - system.activationScripts.emilia_atelierfringant = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/ftp/emilia/atelierfringant - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/emilia - ''; - }; - systemd.services.phpfpm-emilia_atelierfringant.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-emilia_atelierfringant.wants = [ "mysql.service" ]; - services.phpfpm.pools.emilia_atelierfringant = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/emilia:${varDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/emilia"; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - disable_functions = "mail" - ''; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.emilia_atelierfringant = { - certName = "emilia"; - certMainHost = "atelierfringant.org"; - hosts = ["atelierfringant.org" "www.atelierfringant.org" ]; - root = varDir; - extraConfig = [ - '' - - SetHandler "proxy:unix:${config.services.phpfpm.pools.emilia_atelierfringant.socket}|fcgi://localhost" - - - - AllowOverride None - Require all denied - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride all - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/emilia/moodle.nix b/modules/private/websites/emilia/moodle.nix deleted file mode 100644 index 779c460..0000000 --- a/modules/private/websites/emilia/moodle.nix +++ /dev/null @@ -1,65 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.emilia.moodle; - env = config.myEnv.websites.emilia; - varDir = "/var/lib/emilia_moodle"; - siteDir = ./moodle; - # php_admin_value[upload_max_filesize] = 50000000 - # php_admin_value[post_max_size] = 50000000 - configFile = '' - dbtype = 'pgsql'; - $CFG->dblibrary = 'native'; - $CFG->dbhost = '${env.postgresql.host}'; - $CFG->dbname = '${env.postgresql.database}'; - $CFG->dbuser = '${env.postgresql.user}'; - $CFG->dbpass = '${env.postgresql.password}'; - $CFG->prefix = 'mdl_'; - $CFG->dboptions = array ( - 'dbpersist' => 0, - 'dbport' => '${env.postgreesql.port}', - 'dbsocket' => '${env.postgresql.password}', - ); - - $CFG->wwwroot = 'https://www.saison-photo.org'; - $CFG->dataroot = '${varDir}'; - $CFG->admin = 'admin'; - - $CFG->directorypermissions = 02777; - - require_once(__DIR__ . '/lib/setup.php'); - - // There is no php closing tag in this file, - // it is intentional because it prevents trailing whitespace problems! - ''; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.emilia.moodle.enable = lib.mkEnableOption "enable Emilia's website"; - - config = lib.mkIf cfg.enable { - system.activationScripts.emilia_moodle = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${varDir} - ''; - services.websites.env.production.vhostConfs.emilia_moodle = { - certName = "emilia"; - certMainHost = "saison-photo.org"; - hosts = [ "saison-photo.org" "www.saison-photo.org" ]; - root = siteDir; - extraConfig = [ - '' - - DirectoryIndex pause.html - Options Indexes FollowSymLinks MultiViews Includes - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/emilia/moodle/pause.html b/modules/private/websites/emilia/moodle/pause.html deleted file mode 100644 index 8b99c59..0000000 --- a/modules/private/websites/emilia/moodle/pause.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - Pause - - - - -
-

Site web en pause !

-
-

Le site et les cours de photographie sont actuellement en pause.

-
-
- - diff --git a/modules/private/websites/florian/app.nix b/modules/private/websites/florian/app.nix deleted file mode 100644 index 2df344f..0000000 --- a/modules/private/websites/florian/app.nix +++ /dev/null @@ -1,142 +0,0 @@ -{ lib, pkgs, config, ... }: -let - adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; }; - secrets = config.myEnv.websites.tellesflorian.integration; - webRoot = "/var/lib/ftp/immae/florian/web"; - cfg = config.myServices.websites.florian.app; - pcfg = config.services.phpApplication; -in { - options.myServices.websites.florian.app.enable = lib.mkEnableOption "enable Florian's app in integration"; - - config = lib.mkIf cfg.enable { - services.phpApplication.apps.florian_app = { - websiteEnv = "integration"; - httpdUser = config.services.httpd.Inte.user; - httpdGroup = config.services.httpd.Inte.group; - inherit webRoot; - varDir = "/var/lib/ftp/immae/florian_var"; - varDirPaths = { - "var" = "0700"; - }; - app = "/var/lib/ftp/immae/florian"; - serviceDeps = [ "mysql.service" ]; - preStartActions = [ - "./bin/console --env=dev cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - }; - phpEnv = { - SYMFONY_DEBUG_MODE = "\"yes\""; - }; - phpWatchFiles = [ - config.secrets.fullPaths."websites/florian/app" - ]; - phpPackage = pkgs.php72; - }; - - secrets.keys = { - "websites/florian/app_passwords" = { - user = config.services.httpd.Inte.user; - group = config.services.httpd.Inte.group; - permissions = "0400"; - text = '' - invite:${secrets.invite_passwords} - ''; - }; - "websites/florian/app" = { - user = config.services.httpd.Inte.user; - group = config.services.httpd.Inte.group; - permissions = "0400"; - text = '' - # This file is auto-generated during the composer install - parameters: - database_host: ${secrets.mysql.host} - database_port: ${secrets.mysql.port} - database_name: ${secrets.mysql.database} - database_user: ${secrets.mysql.user} - database_password: ${secrets.mysql.password} - mailer_transport: smtp - mailer_host: 127.0.0.1 - mailer_user: null - mailer_password: null - secret: ${secrets.secret} - ''; - }; - }; - - services.websites.env.integration.modules = adminer.apache.modules; - services.websites.env.integration.vhostConfs.florian_app = { - certName = "integration"; - addToCerts = true; - hosts = [ "app.tellesflorian.com" ]; - root = webRoot; - extraConfig = [ - '' - - SetHandler "proxy:unix:${pcfg.phpListenPaths.florian_app}|fcgi://localhost" - - - - AuthBasicProvider file ldap - Use LDAPConnect - Require ldap-group cn=app.tellesflorian.com,cn=httpd,ou=services,dc=immae,dc=eu - - AuthUserFile "${config.secrets.fullPaths."websites/florian/app_passwords"}" - Require user "invite" - - ErrorDocument 401 "" - - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - DirectoryIndex app_dev.php - - - Options -MultiViews - - - - RewriteEngine On - - RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ - RewriteRule ^(.*) - [E=BASE:%1] - - # Maintenance script - RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f - RewriteCond %{SCRIPT_FILENAME} !maintenance.php - RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L] - ErrorDocument 503 /maintenance.php - - # Sets the HTTP_AUTHORIZATION header removed by Apache - RewriteCond %{HTTP:Authorization} . - RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - RewriteCond %{ENV:REDIRECT_STATUS} ^$ - RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] - - # If the requested filename exists, simply serve it. - # We only want to let Apache serve files and not directories. - RewriteCond %{REQUEST_FILENAME} -f - RewriteRule ^ - [L] - - # Rewrite all other queries to the front controller. - RewriteRule ^ %{ENV:BASE}/app_dev.php [L] - - - - '' - (adminer.apache.vhostConf null) - ]; - }; - }; -} diff --git a/modules/private/websites/florian/app/default.nix b/modules/private/websites/florian/app/default.nix deleted file mode 100644 index 28a7ec1..0000000 --- a/modules/private/websites/florian/app/default.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ environment, varDir, secretsPath -, composerEnv, fetchurl, sources }: -let - app = composerEnv.buildPackage ( - import ./php-packages.nix { inherit composerEnv fetchurl; } // - rec { - version = sources.websites-florian-app.version; - pname = "tellesflorian"; - name = "${pname}-${version}"; - src = sources.websites-florian-app; - noDev = (environment == "prod"); - preInstall = '' - export SYMFONY_ENV="${environment}" - ''; - postInstall = '' - cd $out - rm app/config/parameters.yml - ln -sf ${secretsPath} app/config/parameters.yml - rm -rf var/{logs,cache} - ln -sf ${varDir}/var/{logs,cache,sessions} var/ - ''; - passthru = { - inherit varDir environment; - webRoot = "${app}/web"; - }; - }); -in app diff --git a/modules/private/websites/florian/app/php-packages.nix b/modules/private/websites/florian/app/php-packages.nix deleted file mode 100644 index 0c7e00c..0000000 --- a/modules/private/websites/florian/app/php-packages.nix +++ /dev/null @@ -1,389 +0,0 @@ -# Generated with composer2nix and adapted to return only the list of -# packages -{ composerEnv, fetchurl }: -{ - packages = { - "composer/ca-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "composer-ca-bundle-943b2c4fcad1ef178d16a713c2468bf7e579c288"; - src = fetchurl { - url = https://api.github.com/repos/composer/ca-bundle/zipball/943b2c4fcad1ef178d16a713c2468bf7e579c288; - sha256 = "1gljia7akifp57w4rjzyh1km23kwymmvglz0mgafdgqzczcw0m6w"; - }; - }; - }; - "doctrine/annotations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-annotations-f25c8aab83e0c3e976fd7d19875f198ccf2f7535"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535; - sha256 = "08vm22fqq8r4bg2fk06y4inqnc8x0yfmsss28w5ra2011x2phq4z"; - }; - }; - }; - "doctrine/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-cache-eb152c5100571c7a45470ff2a35095ab3f3b900b"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b; - sha256 = "0iq0qqv1smlqz63jhj2fpjy54c5dwfwxyf5c89iky6i0yb81gwyd"; - }; - }; - }; - "doctrine/collections" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-collections-6c1e4eef75f310ea1b3e30945e9f06e652128b8a"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a; - sha256 = "1dkxr2vjycykpcnnmq68rcnn1ww0kbpizd5pxxm6x9i2ilj8cbn7"; - }; - }; - }; - "doctrine/common" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-common-7bce00698899aa2c06fe7365c76e4d78ddb15fa3"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/common/zipball/7bce00698899aa2c06fe7365c76e4d78ddb15fa3; - sha256 = "12yizcsxsbhhi8hwaik4zalr12n5nxbpld05zygqhx6miyr92jyd"; - }; - }; - }; - "doctrine/dbal" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873; - sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3"; - }; - }; - }; - "doctrine/doctrine-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-bundle-eb6e4fb904a459be28872765ab6e2d246aac7c87"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/eb6e4fb904a459be28872765ab6e2d246aac7c87; - sha256 = "0kkisgyblc9hf9x3zpbb1wif51fa8mi6svyd44nls38k9k93dp17"; - }; - }; - }; - "doctrine/doctrine-cache-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-cache-bundle-9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1; - sha256 = "08bqz18vk4673pnm2r2pcph6pdchc36zajnma1p9c6dp21sv7iki"; - }; - }; - }; - "doctrine/inflector" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-inflector-90b2128806bfde671b6952ab8bea493942c1fdae"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae; - sha256 = "01vmclj3k7xil51jg329fznshh8d07pvm4mr89lvfn1d7fyrq6qw"; - }; - }; - }; - "doctrine/instantiator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-instantiator-8e884e78f9f0eb1329e445619e04456e64d8051d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d; - sha256 = "15dcja45rnwya431pcm826l68k1g8f1fabl7rih69alcdyvdlln4"; - }; - }; - }; - "doctrine/lexer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c; - sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74"; - }; - }; - }; - "doctrine/orm" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-orm-810a7baf81462a5ddf10e8baa8cb94b6eec02754"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/doctrine2/zipball/810a7baf81462a5ddf10e8baa8cb94b6eec02754; - sha256 = "1hmkc7917kgnav9hmlgvlp7qwm3zjj910ci71g9yqwjh6s28wrf1"; - }; - }; - }; - "fig/link-util" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac; - sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64"; - }; - }; - }; - "incenteev/composer-parameter-handler" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550"; - src = fetchurl { - url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550; - sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm"; - }; - }; - }; - "jdorn/sql-formatter" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc"; - src = fetchurl { - url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc; - sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi"; - }; - }; - }; - "monolog/monolog" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "monolog-monolog-fd8c787753b3a2ad11bc60c063cff1358a32a3b4"; - src = fetchurl { - url = https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4; - sha256 = "0avf3y8raw23krwdb7kw9qb5bsr5ls4i7qd2vh7hcds3qjixg3h9"; - }; - }; - }; - "paragonie/random_compat" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "paragonie-random_compat-5da4d3c796c275c55f057af5a643ae297d96b4d8"; - src = fetchurl { - url = https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8; - sha256 = "1hp6pin4923c300yi85m7qk04gsrbygv52wv5zm7giyyf0k0g073"; - }; - }; - }; - "psr/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8; - sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz"; - }; - }; - }; - "psr/container" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f; - sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j"; - }; - }; - }; - "psr/link" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562; - sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13"; - }; - }; - }; - "psr/log" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-log-4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d; - sha256 = "1mlcv17fjw39bjpck176ah1z393b6pnbw3jqhhrblj27c70785md"; - }; - }; - }; - "psr/simple-cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b; - sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw"; - }; - }; - }; - "sensio/distribution-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-distribution-bundle-eb6266b3b472e4002538610b28a0a04bcf94891a"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/eb6266b3b472e4002538610b28a0a04bcf94891a; - sha256 = "0wyffqj924lz9cv0vbahyngjw1g850v0p34swygzzgp3cr0ank13"; - }; - }; - }; - "sensio/framework-extra-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-framework-extra-bundle-bf4940572e43af679aaa13be98f3446a1c237bd8"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bf4940572e43af679aaa13be98f3446a1c237bd8; - sha256 = "1kb1n5w3kfc0kf4pslqdx5pgp0g4hmaag0i00wvjj2n3pjfm5lhf"; - }; - }; - }; - "sensiolabs/security-checker" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensiolabs-security-checker-dc270d5fec418cc6ac983671dba5d80ffaffb142"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/security-checker/zipball/dc270d5fec418cc6ac983671dba5d80ffaffb142; - sha256 = "0fnshyd6f8j91a7y604nh6sqgscjl48mfa0727g2r4hkdfz8hpd1"; - }; - }; - }; - "swiftmailer/swiftmailer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "swiftmailer-swiftmailer-7ffc1ea296ed14bf8260b6ef11b80208dbadba91"; - src = fetchurl { - url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91; - sha256 = "1vl5pzgvr2yfrj1yfs02mi917b0gr56v76ibi40r51a3346zhp6v"; - }; - }; - }; - "symfony/monolog-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-monolog-bundle-8781649349fe418d51d194f8c9d212c0b97c40dd"; - src = fetchurl { - url = https://api.github.com/repos/symfony/monolog-bundle/zipball/8781649349fe418d51d194f8c9d212c0b97c40dd; - sha256 = "0wcqhg1vfdj3mxacr3fxpgqwy1rk9znjg9bmzx4jymk8l16i7bq8"; - }; - }; - }; - "symfony/polyfill-apcu" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-apcu-e8ae2136ddb53dea314df56fcd88e318ab936c00"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/e8ae2136ddb53dea314df56fcd88e318ab936c00; - sha256 = "07wdszb9ircnidjk3fp3cvcrggxv3sfm996jzd0a9pm6vfz9hymv"; - }; - }; - }; - "symfony/polyfill-intl-icu" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-intl-icu-254919c03761d46c29291616576ed003f10e91c1"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/254919c03761d46c29291616576ed003f10e91c1; - sha256 = "01yivzv7p55fzrkkyvgd57zpyz82zn1qp0h6nzr77k01rkv3w0ds"; - }; - }; - }; - "symfony/polyfill-mbstring" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-mbstring-78be803ce01e55d3491c1397cf1c64beb9c1b63b"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/78be803ce01e55d3491c1397cf1c64beb9c1b63b; - sha256 = "0cqr8ni6wpbaxa9gyr40y5bsv54pa2g8kdarlfw3qg2rgzmk0yz1"; - }; - }; - }; - "symfony/polyfill-php56" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php56-ebc999ce5f14204c5150b9bd15f8f04e621409d8"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php56/zipball/ebc999ce5f14204c5150b9bd15f8f04e621409d8; - sha256 = "0b2j56l6d6rdggx7vr20d527df4pjfp4lgxpglsgbf5912rcyf83"; - }; - }; - }; - "symfony/polyfill-php70" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php70-3532bfcd8f933a7816f3a0a59682fc404776600f"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php70/zipball/3532bfcd8f933a7816f3a0a59682fc404776600f; - sha256 = "151m76lc9w0kxnnwk4zdcjlmj7fppibnp8jisgpvvq32ml3fizdi"; - }; - }; - }; - "symfony/polyfill-util" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-util-e17c808ec4228026d4f5a8832afa19be85979563"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-util/zipball/e17c808ec4228026d4f5a8832afa19be85979563; - sha256 = "17sdpdidc0b701f9rippjv1grfci7wrdpy2i1inlwwpr6zy782cq"; - }; - }; - }; - "symfony/swiftmailer-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec"; - src = fetchurl { - url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec; - sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01"; - }; - }; - }; - "symfony/symfony" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-symfony-874d4d659774d7bab90538072c83ed532dd17dc5"; - src = fetchurl { - url = https://api.github.com/repos/symfony/symfony/zipball/874d4d659774d7bab90538072c83ed532dd17dc5; - sha256 = "02rsn3sc34jh107n576jfbh666k06y44yr7hw61nir0d864k8api"; - }; - }; - }; - "twig/twig" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "twig-twig-9c24f2cd39dc1906b76879e099970b7e53724601"; - src = fetchurl { - url = https://api.github.com/repos/twigphp/Twig/zipball/9c24f2cd39dc1906b76879e099970b7e53724601; - sha256 = "0brfj2lahrrw1322zy6jyd380hjks1ynzzkmq3875a282gzrfkdz"; - }; - }; - }; - }; - devPackages = { - "sensio/generator-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65; - sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3"; - }; - }; - }; - "symfony/phpunit-bridge" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-phpunit-bridge-32b06d2b0babf3216e55acfce42249321a304f03"; - src = fetchurl { - url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/32b06d2b0babf3216e55acfce42249321a304f03; - sha256 = "0vw4q3lvz8gfs0r93ds8yymz8586k0czwa01c7d172rc8x02v0qq"; - }; - }; - }; - }; -} diff --git a/modules/private/websites/florian/integration.nix b/modules/private/websites/florian/integration.nix deleted file mode 100644 index 8ac1f46..0000000 --- a/modules/private/websites/florian/integration.nix +++ /dev/null @@ -1,34 +0,0 @@ -{ lib, pkgs, config, ... }: -let - adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; }; - cfg = config.myServices.websites.florian.integration; - varDir = "/var/lib/ftp/florian/www.ft.immae.dev"; - env = config.myEnv.websites.florian; -in { - options.myServices.websites.florian.integration.enable = lib.mkEnableOption "enable Florian's website integration"; - - config = lib.mkIf cfg.enable { - security.acme.certs."ftp".extraDomains."ft.immae.dev" = null; - - services.websites.env.integration.modules = adminer.apache.modules; - services.websites.env.integration.vhostConfs.florian_integration = { - certName = "integration"; - addToCerts = true; - hosts = [ "www.ft.immae.dev" ]; - root = varDir; - extraConfig = [ - (adminer.apache.vhostConf null) - '' - ServerAdmin ${env.server_admin} - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/florian/production.nix b/modules/private/websites/florian/production.nix deleted file mode 100644 index 1c5ffa6..0000000 --- a/modules/private/websites/florian/production.nix +++ /dev/null @@ -1,34 +0,0 @@ -{ lib, pkgs, config, ... }: -let - adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; }; - cfg = config.myServices.websites.florian.production; - varDir = "/var/lib/ftp/florian/tellesflorian.com"; - env = config.myEnv.websites.florian; -in { - options.myServices.websites.florian.production.enable = lib.mkEnableOption "enable Florian's website production"; - - config = lib.mkIf cfg.enable { - security.acme.certs."ftp".extraDomains."tellesflorian.com" = null; - - services.websites.env.production.modules = adminer.apache.modules; - services.websites.env.production.vhostConfs.florian_production = { - certName = "florian"; - certMainHost = "tellesflorian.com"; - hosts = [ "tellesflorian.com" "www.tellesflorian.com" ]; - root = varDir; - extraConfig = [ - (adminer.apache.vhostConf null) - '' - ServerAdmin ${env.server_admin} - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/immae/chatons/immae-eu.properties b/modules/private/websites/immae/chatons/immae-eu.properties deleted file mode 100644 index 32b2d47..0000000 --- a/modules/private/websites/immae/chatons/immae-eu.properties +++ /dev/null @@ -1,46 +0,0 @@ -# https://framagit.org/chatons/chatonsinfos/-/blob/master/MODELES/organization.properties - -# [File] -file.class = organization -file.protocol = ChatonsInfos-0.1 -file.datetime = 2021-01-11T22:23:00 -file.generator = Immae avec ses doigts - -# [Organisation] -organization.country.name = France -organization.country.code = FR -organization.name = ImmaeEu -organization.description = ImmaeEu est un CHATONS des Alpes Maritimes -organization.website = https://www.immae.eu -organization.logo = https://assets.immae.eu/logo.jpg -organization.socialnetworks.diaspora = https://diaspora.immae.eu/people/1a185f29cc76cb35 -organization.socialnetworks.facebook = https://www.facebook.com/ismael.bouya -organization.socialnetworks.mastodon = https://mastodon.immae.eu/@immae -organization.socialnetworks.peertube = https://peertube.immae.eu/accounts/immae/ -organization.socialnetworks.twitter = https://twitter.com/_immae -organization.chatrooms.xmpp = ismael@immae.fr -organization.chatrooms.irc = immae@freenode -organization.chatrooms.matrix = @immae:matrix.org -organization.owner.name = Ismaël Bouya -organization.owner.website = https://www.immae.eu -organization.owner.logo = https://assets.immae.eu/logo.jpg -organization.contact.url = https://www.immae.eu/contacts_fr.html -organization.contact.email = contact@mail.immae.eu -organization.legal.url = https://www.immae.eu/mentions.html -organization.guide.technical = https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/ -organization.status.level = ACTIVE -organization.status.description = En activité -organization.startdate = 01/01/2019 - -organization.memberof.chatons.startdate = 01/07/2019 -organization.memberof.chatons.status.level = ACTIVE -organization.memberof.chatons.status.description = Participe au collectif - -# [Subs] -# Un lien vers un fichier properties complémentaire (type URL, optionnel, ex. https://www.chapril.org/.well-known/chapril.properties). -subs.etherpad = https://www.immae.eu/.well-known/chatonsinfos/service-etherpad.properties - - -# [Metrics] -#metrics.http.total.2020 = - diff --git a/modules/private/websites/immae/chatons/service-etherpad.properties b/modules/private/websites/immae/chatons/service-etherpad.properties deleted file mode 100644 index cfcab1d..0000000 --- a/modules/private/websites/immae/chatons/service-etherpad.properties +++ /dev/null @@ -1,164 +0,0 @@ -# service.properties - -# [File] -# Classe du fichier (valeur parmi Federation/Organization/Service/Device, obligatoire). -file.class = service - -# Version de l'ontologie utilisée utilisé (type STRING, recommandé). -file.protocol = ChatonsInfos-0.1 - -# Date et horaire de génération du fichier (type DATETIME, recommandé). -file.datetime = 2021-01-04T00:01:00 - -# Nom du générateur du fichier (type STRING, recommandé). Exemple : Florian avec ses doigts -file.generator = Immae avec ses doigts - - -# [Service] -# Nom du service (type STRING, obligatoire). Exemple : Pad Exemple -service.name = Etherpard - -# Description du service (type STRING, recommandé). -service.description = Éditeur de texte collaboratif en temps réel. on peut y écrire simultanément. - -# Lien du site web du service (type URL, recommandé). Exemple : https://pad.exemple.ext -service.website = https://ether.immae.eu - -# Lien du logo du service (type URL, recommandé, ex. https://www.chapril.org/.well-known/statoolinfos/chapril-logo-mini.png. -service.logo = https://ether.immae.eu/favicon.ico - -# Lien de la page web des mentions légales du service (type URL, recommandé). Exemple : https://pad.exemple.ext/cgu.html -service.legal.url = https://www.immae.eu/mentions.html - -# Lien de la documentation web du service (type URL, recommandé). -service.guide.technical = https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/ - -# Lien des aides web pour le service (type URL, recommandé). -service.guide.user = - -# Lien de la page de support du service (type URL, recommandé). Exemple : https://exemple.ext/contact.html -service.contact.url = https://www.immae.eu/contacts_fr.html - -# Courriel du support du service (type EMAIL, recommandé). Exemple : contact@exemple.ext -service.contact.email = contact@mail.immae.eu - -# Date d'ouverture du service (type DATE, recommandé). Exemple : 20/03/2020 -service.startdate = 01/01/2019 - -# Date de fermeture du service (type DATE, optionnel). -service.enddate = - -# Statut du service (un parmi {OK,WARNING,ALERT,ERROR,OVER,VOID}, obligatoire). -service.status.level = OK - -# Description du statut du service (type STRING, optionnel, exemple : mise à jour en cours) -service.status.description = OK - -# Inscriptions requises pour utiliser le service (parmi None;Free;Member;Client, obligatoire). -service.registration = None - -# [Software] -# Nom du logiciel (type STRING, obligatoire). -software.name = Etherpad - -# Lien du site web du logiciel (type URL, recommandé). -software.website = https://etherpad.org/ - -# Lien web vers la licence du logiciel (type URL, obligatoire). -software.license.url = https://github.com/ether/etherpad-lite/blob/develop/LICENSE - -# Nom de la licence du logiciel (type STRING, obligatoire). -software.license.name = Apache License Version 2.0 - -# Version du logiciel (type STRING, recommandé). -software.version = 1.8.3 - -# Lien web vers les sources du logiciel (type URL, recommandé). -software.source.url = https://github.com/ether/etherpad-lite - -# Liste de modules optionnels installés (type VALUES, optionnel, ex. Nextcloud-Calendar,Nextcloud-Talk). -software.modules = ep_align,ep_bookmark,ep_colors,ep_comments_page,ep_cursortrace,ep_delete_empty_pads,ep_embedmedia,ep_font_size,ep_headings2,ep_immae_buttons,ep_ldapauth,ep_line_height,ep_markdown,ep_mypads,ep_page_view,ep_previewimages,ep_ruler,ep_scrollto,ep_set_title_on_pad,ep_subscript_and_superscript,ep_timesliderdiff - - -# [Host] -# Nom de l'hébergeur de la machine qui fait tourner le service, dans le cas d'un auto-hébergement c'est vous ! (type STRING, obligatoire). Exemple : OVH. -host.name = Hetzner - -# Description de l'hébergeur (type STRING, optionnel). -host.description = - -# Type de serveur (un parmi NANO, PHYSICAL, VIRTUAL, SHARED, CLOUD, obligatoire, ex. PHYSICAL). -# NANO : nano-ordinateur (Raspberry Pi, Olimex…) -# PHYSICAL : machine physique -# VIRTUAL : machine virtuelle -# SHARED : hébergement mutualisé -# CLOUD : infrastructure multi-serveurs -host.server.type = PHYSICAL - -# Type d'hébergement (un parmi HOME, HOSTEDBAY, HOSTEDSERVER, OUTSOURCED, obligatoire, ex. HOSTEDSERVER). -# HOME : hébergement à domicile -# HOSTEDBAY : serveur personnel hébergé dans une baie d'un fournisseur -# HOSTEDSERVER : serveur d'un fournisseur -# OUTSOURCED : infrastructure totalement sous-traitée -host.provider.type = HOSTEDSERVER - -# Si vous avez du mal à remplir les champs précédents, ce tableau pourra vous aider : -# NANO PHYSICAL VIRTUAL SHARED CLOUD -# HOME pm pm vm shared cloud -# HOSTEDBAY -- pm vm shared cloud -# HOSTEDSERVER -- pm vm shared cloud -# OUTSOURCED -- -- vps shared cloud -# Légendes : pm : physical machine ; vm : virtual machine ; vps : virtual private server. - -# Pays de l'hébergeur (type STRING, recommandé). Exemple : France -host.country.name = Allemagne - -# Code pays de l'hébergeur (type STRING, recommandé). Exemple : FR -host.country.code = DE - - - -# [Subs] -# Un lien vers un fichier properties complémentaire (type URL, optionnel). Exemple : https:// -subs.foo = - -# [Metrics] -# Nom du métrique (type STRING, recommandé). -metrics.http.total.name = Nombre total de requêtes HTTP - -# Description du métrique (type STRING, recommandé). -metrics.http.total.description = Somme des requêtes HTTP ipv4 et ipv6. - -# Métrique à valeur anuelle (type NUMERIC, optionnel). -metrics.http.total.2020 = - -# Métrique à valeur mensuelle (type MONTHS, optionnel). -metrics.http.total.2020.months= - -# Métrique à valeur hebdomadaire (type WEEKS, optionnel). -metrics.http.total.2020.weeks= - -# Métrique à valeur quotidienne (type DAYS, optionnel). -metrics.http.total.2020.days= - - -# Nom du métrique (type STRING, recommandé). -metrics.visitors.total.name = Nombre total de visiteurs - -# Description du métrique (type STRING, recommandé). -metrics.visitors.total.description = - -# Métrique à valeur anuelle (type NUMERIC, optionnel). -metrics.visitors.total.2020 = - -# Métrique à valeur mensuelle (type MONTHS, optionnel). -metrics.visitors.total.2020.months= - -# Métrique à valeur hebdomadaire (type WEEKS, optionnel). -metrics.visitors.total.2020.weeks= - -# Métrique à valeur quotidienne (type DAYS, optionnel). -metrics.visitors.total.2020.days= - - -# [Metrics spécifiques au service] diff --git a/modules/private/websites/immae/temp.nix b/modules/private/websites/immae/temp.nix deleted file mode 100644 index 19aef1a..0000000 --- a/modules/private/websites/immae/temp.nix +++ /dev/null @@ -1,64 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.immae.temp; - varDir = "/var/lib/immae_temp"; - env = config.myEnv.websites.immae.temp; -in { - options.myServices.websites.immae.temp.enable = lib.mkEnableOption "enable Temp' website"; - - config = lib.mkIf cfg.enable { - services.websites.env.production.vhostConfs.immae_temp = { - certName = "immae"; - addToCerts = true; - hosts = [ "temp.immae.eu" ]; - root = null; - extraConfig = [ '' - ProxyVia On - ProxyRequests Off - ProxyPreserveHost On - ProxyPass / unix:///run/surfer/listen.sock|http://temp.immae.eu/ - ProxyPassReverse / unix:///run/surfer/listen.sock|http://temp.immae.eu/ - - Options FollowSymLinks MultiViews - AllowOverride None - Require all granted - - '' ]; - }; - - secrets.keys."webapps/surfer" = { - permissions = "0400"; - user = "wwwrun"; - group = "wwwrun"; - text = '' - CLOUDRON_LDAP_URL=ldaps://${env.ldap.host} - CLOUDRON_LDAP_USERS_BASE_DN=${env.ldap.base} - TOKENSTORE_FILE=/var/lib/surfer/tokens.json - CLOUDRON_LDAP_BIND_DN=${env.ldap.dn} - CLOUDRON_LDAP_BIND_PASSWORD=${env.ldap.password} - CLOUDRON_LDAP_USERS_BASE_DN=${env.ldap.base} - CLOUDRON_LDAP_FILTER="${env.ldap.filter}" - LISTEN=/run/surfer/listen.sock - ''; - }; - - systemd.services.surfer = { - description = "Surfer"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - - script = '' - exec ${pkgs.webapps.surfer}/bin/surfer-server ${varDir} - ''; - serviceConfig = { - EnvironmentFile = config.secrets.fullPaths."webapps/surfer"; - User = "wwwrun"; - Group = "wwwrun"; - StateDirectory = "surfer"; - RuntimeDirectory = "surfer"; - Type = "simple"; - }; - }; - }; -} - diff --git a/modules/private/websites/isabelle/aten_app/default.nix b/modules/private/websites/isabelle/aten_app/default.nix deleted file mode 100644 index f967b9a..0000000 --- a/modules/private/websites/isabelle/aten_app/default.nix +++ /dev/null @@ -1,61 +0,0 @@ -{ environment ? "prod" -, varDir ? "/var/lib/aten_${environment}" -, composerEnv, fetchgit, runCommand, nodejs-10_x, jq, libsass, python, fetchurl, yarn2nix-moretea, yarn, sources }: -let - yarn2nix-moretea' = yarn2nix-moretea.override({ - yarn = yarn.override({ nodejs = nodejs-10_x; }); - nodejs = nodejs-10_x; - }); - packagesource = sources.websites-isabelle-aten; - packagejson = runCommand "package.json" { buildInputs = [ jq ]; } '' - cat ${packagesource}/package.json | jq -r '.version = "v1.0.0"|.name="aten"' > $out - ''; - yarnModules = yarn2nix-moretea'.mkYarnModules rec { - name = "aten-yarn"; - pname = name; - version = "v1.0.0"; - packageJSON = packagejson; - yarnLock = "${packagesource}/yarn.lock"; - yarnNix = ./yarn-packages.nix; - pkgConfig = { - node-sass = { - buildInputs = [ libsass python ]; - postInstall = let - nodeHeaders = fetchurl { - url = "https://nodejs.org/download/release/v${nodejs-10_x.version}/node-v${nodejs-10_x.version}-headers.tar.gz"; - sha256 = "15hkcbs328d3rc1s14rmky8lh8d3rr86l8k0bia0ggxzwl23lj9c"; - }; - in - '' - node scripts/build.js --tarball=${nodeHeaders} - ''; - }; - }; - }; - app = composerEnv.buildPackage ( - import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } // - rec { - version = packagesource.version; - pname = "aten"; - name = "${pname}-${version}"; - src = packagesource; - noDev = (environment == "prod"); - preInstall = '' - export SYMFONY_ENV="${environment}" - export APP_ENV="${environment}" - ''; - postInstall = '' - ln -sf ${yarnModules}/node_modules . - yarn run --offline encore production - rm -rf var/{log,cache} - ln -sf ${varDir}/{log,cache} var/ - ''; - buildInputs = [ yarnModules yarn2nix-moretea'.yarn ]; - passthru = { - inherit varDir; - inherit environment; - webRoot = "${app}/public"; - }; - } - ); -in app diff --git a/modules/private/websites/isabelle/aten_app/php-packages.nix b/modules/private/websites/isabelle/aten_app/php-packages.nix deleted file mode 100644 index 3647938..0000000 --- a/modules/private/websites/isabelle/aten_app/php-packages.nix +++ /dev/null @@ -1,740 +0,0 @@ -# Generated with composer2nix and adapted to return only the list of -# packages -{ composerEnv, fetchurl, fetchgit ? null }: -{ - packages = { - "behat/transliterator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c"; - src = fetchurl { - url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c; - sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0"; - }; - }; - }; - "doctrine/annotations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-annotations-c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5; - sha256 = "0b80xpqd3j99xgm0c41kbgy0k6knrfnd29223c93295sb12112g7"; - }; - }; - }; - "doctrine/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-cache-d768d58baee9a4862ca783840eca1b9add7a7f57"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57; - sha256 = "1kljhw4gqp12iz88h6ymsrlfir2fis7icn6dffyizfc1csyb4s2i"; - }; - }; - }; - "doctrine/collections" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-collections-a01ee38fcd999f34d9bfbcee59dbda5105449cbf"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf; - sha256 = "0d36zc21ka0pdac9xpkxsgf5zzw9gp0m9lk3r3xs5y70j0lkkkis"; - }; - }; - }; - "doctrine/common" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-common-30e33f60f64deec87df728c02b107f82cdafad9d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d; - sha256 = "0s4vv14ibyx62a9aj3wn5cs2bbxd72fajmfmi8qb5l11gx0375na"; - }; - }; - }; - "doctrine/dbal" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-dbal-22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9; - sha256 = "0kbahs699jd8pxf512dgg7arv49dc7qzi3mx8snxqm4h15n5brnj"; - }; - }; - }; - "doctrine/doctrine-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-bundle-82d2c63cd09acbde2332f55d9aa7b28aefe4983d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/82d2c63cd09acbde2332f55d9aa7b28aefe4983d; - sha256 = "0gzrigv360rp50yxpwidbkf8vlagym0w1if010yz5xcfrz37cpn3"; - }; - }; - }; - "doctrine/doctrine-cache-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-cache-bundle-5514c90d9fb595e1095e6d66ebb98ce9ef049927"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927; - sha256 = "04njrfhw4fc2ifacd9h0wd9i14l7ycv3hanbqrw5ilsai02j6asa"; - }; - }; - }; - "doctrine/doctrine-migrations-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-migrations-bundle-49fa399181db4bf4f9f725126bd1cb65c4398dce"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce; - sha256 = "1a73xjhjrjlvkh8d253kfc2rbxd2h4hwafhv5078dy7rg6x9blyn"; - }; - }; - }; - "doctrine/event-manager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-event-manager-a520bc093a0170feeb6b14e9d83f3a14452e64b3"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3; - sha256 = "165cxvw4idqj01l63nya2whpdb3fz6ld54rx198b71bzwfrydl88"; - }; - }; - }; - "doctrine/inflector" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-inflector-5527a48b7313d15261292c149e55e26eae771b0a"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a; - sha256 = "0ng6vlwjr8h6hqwa32ynykz1mhlfsff5hirjidlk086ab6njppa5"; - }; - }; - }; - "doctrine/instantiator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-instantiator-185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda; - sha256 = "1mah9a6mb30qad1zryzjain2dxw29d8h4bjkbcs3srpm3p891msy"; - }; - }; - }; - "doctrine/lexer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c; - sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74"; - }; - }; - }; - "doctrine/migrations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-migrations-215438c0eef3e5f9b7da7d09c6b90756071b43e6"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6; - sha256 = "0k6sgw65vji9rgib10mq2m634m41a67inspkrcw4qixig2lnb3ld"; - }; - }; - }; - "doctrine/orm" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-orm-434820973cadf2da2d66e7184be370084cc32ca8"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8; - sha256 = "114fyq8kaf5qzfkp8sdygqflf3z94va1cs5c3scycfpg9cmi4gls"; - }; - }; - }; - "doctrine/persistence" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-persistence-c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38; - sha256 = "0xdm5n38rjas1mlyxc15sg1as5h7y012mdb0j9lr6cvphgnaxxv7"; - }; - }; - }; - "doctrine/reflection" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-reflection-02538d3f95e88eb397a5f86274deb2c6175c2ab6"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6; - sha256 = "12n9zik4lxb9lx1jf0nbvg9vl9nv958a7z1yjx48scfxd1d1sxjy"; - }; - }; - }; - "gedmo/doctrine-extensions" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "gedmo-doctrine-extensions-87c78ff9fd4b90460386f753d95622f6fbbfcb27"; - src = fetchurl { - url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/87c78ff9fd4b90460386f753d95622f6fbbfcb27; - sha256 = "1i33xy9s18rncc1fllwi2qi7hrxj8g762fvgl9np7xndxa7kclyb"; - }; - }; - }; - "giggsey/libphonenumber-for-php" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "giggsey-libphonenumber-for-php-a71f260c2efce10ded8af030a20fa13edfb0e9be"; - src = fetchurl { - url = https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/a71f260c2efce10ded8af030a20fa13edfb0e9be; - sha256 = "15id03c1msyhri7j4i63r535g3g56n3x99i8301as63w7m1ybfj5"; - }; - }; - }; - "giggsey/locale" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "giggsey-locale-da6845720b5d104d319d7e84576f54e44dd9e4f5"; - src = fetchurl { - url = https://api.github.com/repos/giggsey/Locale/zipball/da6845720b5d104d319d7e84576f54e44dd9e4f5; - sha256 = "0gc8im06h5l794a0drd74s3inps22jr1zr5wnw0b89m06d4nw42j"; - }; - }; - }; - "jdorn/sql-formatter" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc"; - src = fetchurl { - url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc; - sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi"; - }; - }; - }; - "ocramius/package-versions" = { - targetDir = ""; - needsModifyRights = true; - src = composerEnv.buildZipPackage { - name = "ocramius-package-versions-4489d5002c49d55576fa0ba786f42dbb009be46f"; - src = fetchurl { - url = https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f; - sha256 = "039c404g9597x45xh04bnn8kmcyknkbnr57yb9s7vf29vfrg4881"; - }; - }; - }; - "ocramius/proxy-manager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "ocramius-proxy-manager-14b137b06b0f911944132df9d51e445a35920ab1"; - src = fetchurl { - url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1; - sha256 = "10y5msgh2jdlw4w075fasv40yq01szjy15m3f0wgc89hlfmqz0sn"; - }; - }; - }; - "opensoft/doctrine-postgres-types" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "opensoft-doctrine-postgres-types-7e69bdfeb2ae61c2f1e90872370cdf0135fb3006"; - src = fetchurl { - url = https://api.github.com/repos/opensoft/doctrine-postgres-types/zipball/7e69bdfeb2ae61c2f1e90872370cdf0135fb3006; - sha256 = "1v9rjq82dxnpnb6bir6irkj54324a02qlybayvq2gf2807241bjj"; - }; - }; - }; - "presta/sitemap-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "presta-sitemap-bundle-16a2c0eae7320e3647013e48026a6a6bd14f75df"; - src = fetchurl { - url = https://api.github.com/repos/prestaconcept/PrestaSitemapBundle/zipball/16a2c0eae7320e3647013e48026a6a6bd14f75df; - sha256 = "1hqh144awazafa2vpv091h9pyqrppbalcvzf9c1n6h387jwwj5l8"; - }; - }; - }; - "psr/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8; - sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz"; - }; - }; - }; - "psr/container" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f; - sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j"; - }; - }; - }; - "psr/log" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-log-6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd; - sha256 = "1i351p3gd1pgjcjxv7mwwkiw79f1xiqr38irq22156h05zlcx80d"; - }; - }; - }; - "psr/simple-cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b; - sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw"; - }; - }; - }; - "sensio/framework-extra-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-framework-extra-bundle-1fdf591c4b388e62dbb2579de89c1560b33f865d"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/1fdf591c4b388e62dbb2579de89c1560b33f865d; - sha256 = "0hhw3lsvgm78rqphgmdrg2inc9997lwx0290x71hsixk08khnlb1"; - }; - }; - }; - "symfony/asset" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-asset-fb06338fd3762f8615b51a58e5e9299ccca03876"; - src = fetchurl { - url = https://api.github.com/repos/symfony/asset/zipball/fb06338fd3762f8615b51a58e5e9299ccca03876; - sha256 = "19fbnz2h4z5nxzcy8n3bfbcjwgncabwdlxh70qfkr7bswpsxr6p3"; - }; - }; - }; - "symfony/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-cache-5c4b50d6ba4f1c8955c3454444c1e3cfddaaad41"; - src = fetchurl { - url = https://api.github.com/repos/symfony/cache/zipball/5c4b50d6ba4f1c8955c3454444c1e3cfddaaad41; - sha256 = "1wn2rd3n5nj300vsygh60vbjh2k9lh7s9c3ayl614hahrfcfb29s"; - }; - }; - }; - "symfony/config" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-config-005d9a083d03f588677d15391a716b1ac9b887c0"; - src = fetchurl { - url = https://api.github.com/repos/symfony/config/zipball/005d9a083d03f588677d15391a716b1ac9b887c0; - sha256 = "1h20qhkzsl5xwzs3rg1yyaq5yn8rg92krfzmpmfgv7d3jp1v03as"; - }; - }; - }; - "symfony/console" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-console-4dff24e5d01e713818805c1862d2e3f901ee7dd0"; - src = fetchurl { - url = https://api.github.com/repos/symfony/console/zipball/4dff24e5d01e713818805c1862d2e3f901ee7dd0; - sha256 = "016l3hxcbvyxz3kkkynk12gi8949hl3x09dwsh0x5wqikgnp64c2"; - }; - }; - }; - "symfony/contracts" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-contracts-1aa7ab2429c3d594dd70689604b5cf7421254cdf"; - src = fetchurl { - url = https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf; - sha256 = "0jhav49lngmrjg4r5kdpmc7lhmasn2fzkmbvhw62l4i1vnm5r5bm"; - }; - }; - }; - "symfony/debug" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-debug-e0a2b92ee0b5b934f973d90c2f58e18af109d276"; - src = fetchurl { - url = https://api.github.com/repos/symfony/debug/zipball/e0a2b92ee0b5b934f973d90c2f58e18af109d276; - sha256 = "0yzyaprsrmbc93gzwr1wdjx05kin7b4hqy5w74zkcxyab09pan7f"; - }; - }; - }; - "symfony/dependency-injection" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-dependency-injection-e4adc57a48d3fa7f394edfffa9e954086d7740e5"; - src = fetchurl { - url = https://api.github.com/repos/symfony/dependency-injection/zipball/e4adc57a48d3fa7f394edfffa9e954086d7740e5; - sha256 = "0g8ssf7qm0jf0anvflp033xwdim9z4g73k3kz1vs3smw4pffl6nv"; - }; - }; - }; - "symfony/doctrine-bridge" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-doctrine-bridge-3466c911438e176c20e1943c529131889432d12f"; - src = fetchurl { - url = https://api.github.com/repos/symfony/doctrine-bridge/zipball/3466c911438e176c20e1943c529131889432d12f; - sha256 = "0qq644z7l9j9fyydlj68p9f43a9i20rnmxy8pkq5sn4r0yn06bb8"; - }; - }; - }; - "symfony/event-dispatcher" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-event-dispatcher-921f49c3158a276d27c0d770a5a347a3b718b328"; - src = fetchurl { - url = https://api.github.com/repos/symfony/event-dispatcher/zipball/921f49c3158a276d27c0d770a5a347a3b718b328; - sha256 = "05i8syqbzhh11cf2i9d64s8b5x41mfsribfa62rvc0mhbqk7ifzf"; - }; - }; - }; - "symfony/filesystem" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-filesystem-2f4c8b999b3b7cadb2a69390b01af70886753710"; - src = fetchurl { - url = https://api.github.com/repos/symfony/filesystem/zipball/2f4c8b999b3b7cadb2a69390b01af70886753710; - sha256 = "1gi14q8gf250a3rzmr6arb08ljpzpfg868vm0z21fgmf0zh0dqr6"; - }; - }; - }; - "symfony/finder" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-finder-e53d477d7b5c4982d0e1bfd2298dbee63d01441d"; - src = fetchurl { - url = https://api.github.com/repos/symfony/finder/zipball/e53d477d7b5c4982d0e1bfd2298dbee63d01441d; - sha256 = "1mpxwgvfqzng36xbdvda6nk1zidyr9dgswccmr4z15k0i9gi0qsj"; - }; - }; - }; - "symfony/flex" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-flex-955774ecf07b10230bb5b44e150ba078b45f68fa"; - src = fetchurl { - url = https://api.github.com/repos/symfony/flex/zipball/955774ecf07b10230bb5b44e150ba078b45f68fa; - sha256 = "069v1s810mq5kqvx68x87lmlz0h9b2kgla1znnibnbh6j6k4qg6d"; - }; - }; - }; - "symfony/form" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-form-5ab767b7732154ca6f45c92e30e081178edf30ad"; - src = fetchurl { - url = https://api.github.com/repos/symfony/form/zipball/5ab767b7732154ca6f45c92e30e081178edf30ad; - sha256 = "1g65a7hl1kk6rpa6q52fyzy6vkjafr3233hi2qiggyp0qys20kcc"; - }; - }; - }; - "symfony/framework-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-framework-bundle-eb32d67140510f04fe9cc5fb9ad38fda09591db1"; - src = fetchurl { - url = https://api.github.com/repos/symfony/framework-bundle/zipball/eb32d67140510f04fe9cc5fb9ad38fda09591db1; - sha256 = "06dpqppwyngq1frww0q0zjs0gj8na0fi67czlhqf2x2lizgz6wjd"; - }; - }; - }; - "symfony/http-foundation" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-http-foundation-1b31f3017fadd8cb05cf2c8aebdbf3b12a943851"; - src = fetchurl { - url = https://api.github.com/repos/symfony/http-foundation/zipball/1b31f3017fadd8cb05cf2c8aebdbf3b12a943851; - sha256 = "0s6mx79gl6sp39bk8213xcdzx4ld5xim38s8lckm7wqnkvx94mfl"; - }; - }; - }; - "symfony/http-kernel" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-http-kernel-b39ceffc0388232c309cbde3a7c3685f2ec0a624"; - src = fetchurl { - url = https://api.github.com/repos/symfony/http-kernel/zipball/b39ceffc0388232c309cbde3a7c3685f2ec0a624; - sha256 = "17rb1hl9r8rlqw1cv9qx2ckvz81g2ylppirq035mya1a848y5ym5"; - }; - }; - }; - "symfony/inflector" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-inflector-f9a637c0359f74404d44cf0da0a3ce53bae0787e"; - src = fetchurl { - url = https://api.github.com/repos/symfony/inflector/zipball/f9a637c0359f74404d44cf0da0a3ce53bae0787e; - sha256 = "1sp1pk716biyplqpakcpq71ik2h2m1bvsz9cfj9zd63y2723xna3"; - }; - }; - }; - "symfony/intl" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-intl-748a1c54903344385f88fef75da293915b16a207"; - src = fetchurl { - url = https://api.github.com/repos/symfony/intl/zipball/748a1c54903344385f88fef75da293915b16a207; - sha256 = "1vwa2n7fglxs8rv1yrbxn6vgizg73asimg794igk27i90xdybfmc"; - }; - }; - }; - "symfony/lts" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-lts-c1affae45b78aee036effa1759237e7fa96d4af2"; - src = fetchurl { - url = https://api.github.com/repos/symfony/lts/zipball/c1affae45b78aee036effa1759237e7fa96d4af2; - sha256 = "0vk9pn4xl7ascvllak0gschdd1w2mxma3ng04j3r1n13zccxc33s"; - }; - }; - }; - "symfony/options-resolver" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-options-resolver-a9c38e8a3da2c03b3e71fdffa6efb0bda51390ba"; - src = fetchurl { - url = https://api.github.com/repos/symfony/options-resolver/zipball/a9c38e8a3da2c03b3e71fdffa6efb0bda51390ba; - sha256 = "1fjjlp09mwkjcxg98bihqlq4miq24k13691051f5p39lcy03zmb3"; - }; - }; - }; - "symfony/orm-pack" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-orm-pack-1b58f752cd917a08c9c8df020781d9c46a2275b1"; - src = fetchurl { - url = https://api.github.com/repos/symfony/orm-pack/zipball/1b58f752cd917a08c9c8df020781d9c46a2275b1; - sha256 = "1sk8jchaw29lmpq76yb24mc1csmifnkvbjdrgjdgqs6x5i39plli"; - }; - }; - }; - "symfony/polyfill-intl-icu" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-intl-icu-f22a90256d577c7ef7efad8df1f0201663d57644"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644; - sha256 = "0x7h8l248l1gc07xmvfixq6p80ifdaa29qympfq3jzfb79k69slq"; - }; - }; - }; - "symfony/polyfill-mbstring" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-mbstring-c79c051f5b3a46be09205c73b80b346e4153e494"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494; - sha256 = "18v2777cky55ah6xi4dh383mp4iddwzmnvx81qd86y1kgfykwhpi"; - }; - }; - }; - "symfony/property-access" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-property-access-b6df4e1849f389468edb36e2e59877d4a8170723"; - src = fetchurl { - url = https://api.github.com/repos/symfony/property-access/zipball/b6df4e1849f389468edb36e2e59877d4a8170723; - sha256 = "16pbnv3x56gp5wxakmbphf3d4igkjyr3v693n3cjm62h72z4dxf3"; - }; - }; - }; - "symfony/routing" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-routing-649460207e77da6c545326c7f53618d23ad2c866"; - src = fetchurl { - url = https://api.github.com/repos/symfony/routing/zipball/649460207e77da6c545326c7f53618d23ad2c866; - sha256 = "1qjkgghs0kp4lk4711d3gx26vvilrrrjbbz02navzfqy4xjrf0sw"; - }; - }; - }; - "symfony/translation" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-translation-c0e2191e9bed845946ab3d99767513b56ca7dcd6"; - src = fetchurl { - url = https://api.github.com/repos/symfony/translation/zipball/c0e2191e9bed845946ab3d99767513b56ca7dcd6; - sha256 = "0gzq7f2izsiam9blha85bzvg7x6zc4f3x3bkwhzma6x6ipjfkla2"; - }; - }; - }; - "symfony/twig-bridge" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-twig-bridge-2e928d6c8244e7f3b32bcfac5814095a83179e60"; - src = fetchurl { - url = https://api.github.com/repos/symfony/twig-bridge/zipball/2e928d6c8244e7f3b32bcfac5814095a83179e60; - sha256 = "1f902j8b0lyqjss9r2mf7j63apv5z8ki57vmcdcw5jlqagbmw1y1"; - }; - }; - }; - "symfony/twig-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-twig-bundle-024820cbb4aeffc4843c4170b69c057fb4840fb3"; - src = fetchurl { - url = https://api.github.com/repos/symfony/twig-bundle/zipball/024820cbb4aeffc4843c4170b69c057fb4840fb3; - sha256 = "1qqfpxw228lc024whpr4j6aa6k9ly290nxz9c9ds826lllg2l1zh"; - }; - }; - }; - "symfony/validator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-validator-cd35bb14a0e81bd99835e36cac4db1e72ad1939b"; - src = fetchurl { - url = https://api.github.com/repos/symfony/validator/zipball/cd35bb14a0e81bd99835e36cac4db1e72ad1939b; - sha256 = "1809yz483mv5mmrw14v3b371dmjab7i455gxkrqm0z8n0wjdn6i3"; - }; - }; - }; - "symfony/var-exporter" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-var-exporter-a39222e357362424b61dcde50e2f7b5a7d3306db"; - src = fetchurl { - url = https://api.github.com/repos/symfony/var-exporter/zipball/a39222e357362424b61dcde50e2f7b5a7d3306db; - sha256 = "1ys2sc3ivgfxq7kj8cydxqh5179d3niqxsy10lgg18c5a6bsj41j"; - }; - }; - }; - "symfony/webpack-encore-pack" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-webpack-encore-pack-8d7f51379d7ae17aea7cf501d910a11896895ac4"; - src = fetchurl { - url = https://api.github.com/repos/symfony/webpack-encore-pack/zipball/8d7f51379d7ae17aea7cf501d910a11896895ac4; - sha256 = "0k6xavcyihx45dsrm1r2r1lbn7vryy463akz66w4gycx5dcqrw0j"; - }; - }; - }; - "symfony/yaml" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-yaml-c41175c801e3edfda90f32e292619d10c27103d7"; - src = fetchurl { - url = https://api.github.com/repos/symfony/yaml/zipball/c41175c801e3edfda90f32e292619d10c27103d7; - sha256 = "0bh9365mmvzhdk1m0b1xarlg0swx9pv916m7xifcmdrxn67w552p"; - }; - }; - }; - "twig/twig" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "twig-twig-a11dd39f5b6589e14f0ff3b36675d06047c589b1"; - src = fetchurl { - url = https://api.github.com/repos/twigphp/Twig/zipball/a11dd39f5b6589e14f0ff3b36675d06047c589b1; - sha256 = "0rnwam9379gj5m4ik0fh6c81dbr7kwj2b3x1gnmpf6awa5fm261n"; - }; - }; - }; - "zendframework/zend-code" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-code-c21db169075c6ec4b342149f446e7b7b724f95eb"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb; - sha256 = "031mfsahjkl63348020wq05273kvszx0dv2766zmzncnd6fcggw1"; - }; - }; - }; - "zendframework/zend-eventmanager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd; - sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n"; - }; - }; - }; - }; - devPackages = { - "nikic/php-parser" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "nikic-php-parser-8aae5b59b83bb4d0dbf07b0a835f2680a658f610"; - src = fetchurl { - url = https://api.github.com/repos/nikic/PHP-Parser/zipball/8aae5b59b83bb4d0dbf07b0a835f2680a658f610; - sha256 = "103ix4bsvrwyc4wxh9cqd38xffn25kq3phnpgk8b3z7dqvvr2pss"; - }; - }; - }; - "symfony/dotenv" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-dotenv-97f135ab40f969cbeae27d482ff63acbc33dbe2a"; - src = fetchurl { - url = https://api.github.com/repos/symfony/dotenv/zipball/97f135ab40f969cbeae27d482ff63acbc33dbe2a; - sha256 = "1jwpxb4w0mi5p89k51l1g84hnnj9s8kjl9jsx3xj39hhc3dy44pc"; - }; - }; - }; - "symfony/maker-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-maker-bundle-24b19cccad0c658eca516b35b08668d123fabf92"; - src = fetchurl { - url = https://api.github.com/repos/symfony/maker-bundle/zipball/24b19cccad0c658eca516b35b08668d123fabf92; - sha256 = "1wm17jl3gk0m5ma7nz40y7ryxgm0qncrxcrqdqg5x6afwla85grp"; - }; - }; - }; - "symfony/polyfill-php72" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php72-9050816e2ca34a8e916c3a0ae8b9c2fccf68b631"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php72/zipball/9050816e2ca34a8e916c3a0ae8b9c2fccf68b631; - sha256 = "1smd08fw64mf89s9ma099ayfjlz26wrix9hfr6kh5w4d0rzrhmlw"; - }; - }; - }; - "symfony/profiler-pack" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-profiler-pack-99c4370632c2a59bb0444852f92140074ef02209"; - src = fetchurl { - url = https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209; - sha256 = "12xisnrqq6q5l0v8bric0p23bsaxh50x43fq7wn2adnsz24nv9pi"; - }; - }; - }; - "symfony/stopwatch" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-stopwatch-ec076716412274e51f8a7ea675d9515e5c311123"; - src = fetchurl { - url = https://api.github.com/repos/symfony/stopwatch/zipball/ec076716412274e51f8a7ea675d9515e5c311123; - sha256 = "0fzh2bh7lm8f222hk5ihfkpi697babfrz1r0dghlws17hfbgzgax"; - }; - }; - }; - "symfony/var-dumper" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-var-dumper-db61258540350725f4beb6b84006e32398acd120"; - src = fetchurl { - url = https://api.github.com/repos/symfony/var-dumper/zipball/db61258540350725f4beb6b84006e32398acd120; - sha256 = "0pw3hf4mcc1q9miswrjbgr32x0a2dfjvpi16pjzw173xmf79i4iz"; - }; - }; - }; - "symfony/web-profiler-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-web-profiler-bundle-198cb0a6b85346bbab5e1bc74a0eb175b9fa2d08"; - src = fetchurl { - url = https://api.github.com/repos/symfony/web-profiler-bundle/zipball/198cb0a6b85346bbab5e1bc74a0eb175b9fa2d08; - sha256 = "0r4r3zf22860mdx8b2l72ghz8liyi3l39cc1934b2lkh2kghlsi6"; - }; - }; - }; - }; -} diff --git a/modules/private/websites/isabelle/aten_app/yarn-packages.nix b/modules/private/websites/isabelle/aten_app/yarn-packages.nix deleted file mode 100644 index c16d9dc..0000000 --- a/modules/private/websites/isabelle/aten_app/yarn-packages.nix +++ /dev/null @@ -1,7871 +0,0 @@ -{fetchurl, linkFarm}: rec { - offline_cache = linkFarm "offline" packages; - packages = [ - - { - name = "_symfony_webpack_encore___webpack_encore_0.19.0.tgz"; - path = fetchurl { - name = "_symfony_webpack_encore___webpack_encore_0.19.0.tgz"; - url = "https://registry.yarnpkg.com/@symfony/webpack-encore/-/webpack-encore-0.19.0.tgz"; - sha1 = "f0725dbbede5ff9d9fdbd7a07f84accafc83ca14"; - }; - } - - { - name = "_types_node___node_10.5.3.tgz"; - path = fetchurl { - name = "_types_node___node_10.5.3.tgz"; - url = "https://registry.yarnpkg.com/@types/node/-/node-10.5.3.tgz"; - sha1 = "5bcfaf088ad17894232012877669634c06b20cc5"; - }; - } - - { - name = "_types_tapable___tapable_0.2.5.tgz"; - path = fetchurl { - name = "_types_tapable___tapable_0.2.5.tgz"; - url = "https://registry.yarnpkg.com/@types/tapable/-/tapable-0.2.5.tgz"; - sha1 = "2443fc12da514c81346b1a665675559cee21fa75"; - }; - } - - { - name = "_types_uglify_js___uglify_js_3.0.3.tgz"; - path = fetchurl { - name = "_types_uglify_js___uglify_js_3.0.3.tgz"; - url = "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.3.tgz"; - sha1 = "801a5ca1dc642861f47c46d14b700ed2d610840b"; - }; - } - - { - name = "_types_webpack___webpack_3.8.14.tgz"; - path = fetchurl { - name = "_types_webpack___webpack_3.8.14.tgz"; - url = "https://registry.yarnpkg.com/@types/webpack/-/webpack-3.8.14.tgz"; - sha1 = "e2bfdf7f604b3f7dc776eaa17446d7f7538f3de7"; - }; - } - - { - name = "abbrev___abbrev_1.1.1.tgz"; - path = fetchurl { - name = "abbrev___abbrev_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz"; - sha1 = "f8f2c887ad10bf67f634f005b6987fed3179aac8"; - }; - } - - { - name = "accepts___accepts_1.3.5.tgz"; - path = fetchurl { - name = "accepts___accepts_1.3.5.tgz"; - url = "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz"; - sha1 = "eb777df6011723a3b14e8a72c0805c8e86746bd2"; - }; - } - - { - name = "acorn_dynamic_import___acorn_dynamic_import_2.0.2.tgz"; - path = fetchurl { - name = "acorn_dynamic_import___acorn_dynamic_import_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz"; - sha1 = "c752bd210bef679501b6c6cb7fc84f8f47158cc4"; - }; - } - - { - name = "acorn___acorn_4.0.13.tgz"; - path = fetchurl { - name = "acorn___acorn_4.0.13.tgz"; - url = "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz"; - sha1 = "105495ae5361d697bd195c825192e1ad7f253787"; - }; - } - - { - name = "acorn___acorn_5.7.1.tgz"; - path = fetchurl { - name = "acorn___acorn_5.7.1.tgz"; - url = "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz"; - sha1 = "f095829297706a7c9776958c0afc8930a9b9d9d8"; - }; - } - - { - name = "adjust_sourcemap_loader___adjust_sourcemap_loader_1.2.0.tgz"; - path = fetchurl { - name = "adjust_sourcemap_loader___adjust_sourcemap_loader_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz"; - sha1 = "e33fde95e50db9f2a802e3647e311d2fc5000c69"; - }; - } - - { - name = "ajv_keywords___ajv_keywords_3.2.0.tgz"; - path = fetchurl { - name = "ajv_keywords___ajv_keywords_3.2.0.tgz"; - url = "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz"; - sha1 = "e86b819c602cf8821ad637413698f1dec021847a"; - }; - } - - { - name = "ajv___ajv_4.11.8.tgz"; - path = fetchurl { - name = "ajv___ajv_4.11.8.tgz"; - url = "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz"; - sha1 = "82ffb02b29e662ae53bdc20af15947706739c536"; - }; - } - - { - name = "ajv___ajv_5.5.2.tgz"; - path = fetchurl { - name = "ajv___ajv_5.5.2.tgz"; - url = "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz"; - sha1 = "73b5eeca3fab653e3d3f9422b341ad42205dc965"; - }; - } - - { - name = "ajv___ajv_6.5.2.tgz"; - path = fetchurl { - name = "ajv___ajv_6.5.2.tgz"; - url = "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz"; - sha1 = "678495f9b82f7cca6be248dd92f59bff5e1f4360"; - }; - } - - { - name = "align_text___align_text_0.1.4.tgz"; - path = fetchurl { - name = "align_text___align_text_0.1.4.tgz"; - url = "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz"; - sha1 = "0cd90a561093f35d0a99256c22b7069433fad117"; - }; - } - - { - name = "alphanum_sort___alphanum_sort_1.0.2.tgz"; - path = fetchurl { - name = "alphanum_sort___alphanum_sort_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz"; - sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3"; - }; - } - - { - name = "amdefine___amdefine_1.0.1.tgz"; - path = fetchurl { - name = "amdefine___amdefine_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz"; - sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5"; - }; - } - - { - name = "ansi_html___ansi_html_0.0.7.tgz"; - path = fetchurl { - name = "ansi_html___ansi_html_0.0.7.tgz"; - url = "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz"; - sha1 = "813584021962a9e9e6fd039f940d12f56ca7859e"; - }; - } - - { - name = "ansi_regex___ansi_regex_2.1.1.tgz"; - path = fetchurl { - name = "ansi_regex___ansi_regex_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz"; - sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df"; - }; - } - - { - name = "ansi_regex___ansi_regex_3.0.0.tgz"; - path = fetchurl { - name = "ansi_regex___ansi_regex_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz"; - sha1 = "ed0317c322064f79466c02966bddb605ab37d998"; - }; - } - - { - name = "ansi_styles___ansi_styles_2.2.1.tgz"; - path = fetchurl { - name = "ansi_styles___ansi_styles_2.2.1.tgz"; - url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz"; - sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe"; - }; - } - - { - name = "ansi_styles___ansi_styles_3.2.1.tgz"; - path = fetchurl { - name = "ansi_styles___ansi_styles_3.2.1.tgz"; - url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz"; - sha1 = "41fbb20243e50b12be0f04b8dedbf07520ce841d"; - }; - } - - { - name = "anymatch___anymatch_2.0.0.tgz"; - path = fetchurl { - name = "anymatch___anymatch_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz"; - sha1 = "bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"; - }; - } - - { - name = "aproba___aproba_1.2.0.tgz"; - path = fetchurl { - name = "aproba___aproba_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz"; - sha1 = "6802e6264efd18c790a1b0d517f0f2627bf2c94a"; - }; - } - - { - name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz"; - path = fetchurl { - name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz"; - url = "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz"; - sha1 = "4b35c2944f062a8bfcda66410760350fe9ddfc21"; - }; - } - - { - name = "argparse___argparse_1.0.10.tgz"; - path = fetchurl { - name = "argparse___argparse_1.0.10.tgz"; - url = "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz"; - sha1 = "bcd6791ea5ae09725e17e5ad988134cd40b3d911"; - }; - } - - { - name = "arr_diff___arr_diff_2.0.0.tgz"; - path = fetchurl { - name = "arr_diff___arr_diff_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz"; - sha1 = "8f3b827f955a8bd669697e4a4256ac3ceae356cf"; - }; - } - - { - name = "arr_diff___arr_diff_4.0.0.tgz"; - path = fetchurl { - name = "arr_diff___arr_diff_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz"; - sha1 = "d6461074febfec71e7e15235761a329a5dc7c520"; - }; - } - - { - name = "arr_flatten___arr_flatten_1.1.0.tgz"; - path = fetchurl { - name = "arr_flatten___arr_flatten_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz"; - sha1 = "36048bbff4e7b47e136644316c99669ea5ae91f1"; - }; - } - - { - name = "arr_union___arr_union_3.1.0.tgz"; - path = fetchurl { - name = "arr_union___arr_union_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz"; - sha1 = "e39b09aea9def866a8f206e288af63919bae39c4"; - }; - } - - { - name = "array_find_index___array_find_index_1.0.2.tgz"; - path = fetchurl { - name = "array_find_index___array_find_index_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz"; - sha1 = "df010aa1287e164bbda6f9723b0a96a1ec4187a1"; - }; - } - - { - name = "array_flatten___array_flatten_1.1.1.tgz"; - path = fetchurl { - name = "array_flatten___array_flatten_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz"; - sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2"; - }; - } - - { - name = "array_flatten___array_flatten_2.1.1.tgz"; - path = fetchurl { - name = "array_flatten___array_flatten_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz"; - sha1 = "426bb9da84090c1838d812c8150af20a8331e296"; - }; - } - - { - name = "array_includes___array_includes_3.0.3.tgz"; - path = fetchurl { - name = "array_includes___array_includes_3.0.3.tgz"; - url = "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz"; - sha1 = "184b48f62d92d7452bb31b323165c7f8bd02266d"; - }; - } - - { - name = "array_union___array_union_1.0.2.tgz"; - path = fetchurl { - name = "array_union___array_union_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz"; - sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39"; - }; - } - - { - name = "array_uniq___array_uniq_1.0.3.tgz"; - path = fetchurl { - name = "array_uniq___array_uniq_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz"; - sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6"; - }; - } - - { - name = "array_unique___array_unique_0.2.1.tgz"; - path = fetchurl { - name = "array_unique___array_unique_0.2.1.tgz"; - url = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz"; - sha1 = "a1d97ccafcbc2625cc70fadceb36a50c58b01a53"; - }; - } - - { - name = "array_unique___array_unique_0.3.2.tgz"; - path = fetchurl { - name = "array_unique___array_unique_0.3.2.tgz"; - url = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz"; - sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"; - }; - } - - { - name = "asn1.js___asn1.js_4.10.1.tgz"; - path = fetchurl { - name = "asn1.js___asn1.js_4.10.1.tgz"; - url = "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz"; - sha1 = "b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"; - }; - } - - { - name = "asn1___asn1_0.2.3.tgz"; - path = fetchurl { - name = "asn1___asn1_0.2.3.tgz"; - url = "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz"; - sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86"; - }; - } - - { - name = "assert_plus___assert_plus_1.0.0.tgz"; - path = fetchurl { - name = "assert_plus___assert_plus_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz"; - sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"; - }; - } - - { - name = "assert_plus___assert_plus_0.2.0.tgz"; - path = fetchurl { - name = "assert_plus___assert_plus_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz"; - sha1 = "d74e1b87e7affc0db8aadb7021f3fe48101ab234"; - }; - } - - { - name = "assert___assert_1.4.1.tgz"; - path = fetchurl { - name = "assert___assert_1.4.1.tgz"; - url = "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz"; - sha1 = "99912d591836b5a6f5b345c0f07eefc08fc65d91"; - }; - } - - { - name = "assign_symbols___assign_symbols_1.0.0.tgz"; - path = fetchurl { - name = "assign_symbols___assign_symbols_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz"; - sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"; - }; - } - - { - name = "async_each___async_each_1.0.1.tgz"; - path = fetchurl { - name = "async_each___async_each_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz"; - sha1 = "19d386a1d9edc6e7c1c85d388aedbcc56d33602d"; - }; - } - - { - name = "async_foreach___async_foreach_0.1.3.tgz"; - path = fetchurl { - name = "async_foreach___async_foreach_0.1.3.tgz"; - url = "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz"; - sha1 = "36121f845c0578172de419a97dbeb1d16ec34542"; - }; - } - - { - name = "async___async_1.5.2.tgz"; - path = fetchurl { - name = "async___async_1.5.2.tgz"; - url = "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz"; - sha1 = "ec6a61ae56480c0c3cb241c95618e20892f9672a"; - }; - } - - { - name = "async___async_2.6.1.tgz"; - path = fetchurl { - name = "async___async_2.6.1.tgz"; - url = "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz"; - sha1 = "b245a23ca71930044ec53fa46aa00a3e87c6a610"; - }; - } - - { - name = "asynckit___asynckit_0.4.0.tgz"; - path = fetchurl { - name = "asynckit___asynckit_0.4.0.tgz"; - url = "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz"; - sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"; - }; - } - - { - name = "atob___atob_2.1.1.tgz"; - path = fetchurl { - name = "atob___atob_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz"; - sha1 = "ae2d5a729477f289d60dd7f96a6314a22dd6c22a"; - }; - } - - { - name = "autoprefixer___autoprefixer_6.7.7.tgz"; - path = fetchurl { - name = "autoprefixer___autoprefixer_6.7.7.tgz"; - url = "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz"; - sha1 = "1dbd1c835658e35ce3f9984099db00585c782014"; - }; - } - - { - name = "aws_sign2___aws_sign2_0.6.0.tgz"; - path = fetchurl { - name = "aws_sign2___aws_sign2_0.6.0.tgz"; - url = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz"; - sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f"; - }; - } - - { - name = "aws_sign2___aws_sign2_0.7.0.tgz"; - path = fetchurl { - name = "aws_sign2___aws_sign2_0.7.0.tgz"; - url = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz"; - sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"; - }; - } - - { - name = "aws4___aws4_1.7.0.tgz"; - path = fetchurl { - name = "aws4___aws4_1.7.0.tgz"; - url = "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz"; - sha1 = "d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"; - }; - } - - { - name = "babel_code_frame___babel_code_frame_6.26.0.tgz"; - path = fetchurl { - name = "babel_code_frame___babel_code_frame_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz"; - sha1 = "63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"; - }; - } - - { - name = "babel_core___babel_core_6.26.3.tgz"; - path = fetchurl { - name = "babel_core___babel_core_6.26.3.tgz"; - url = "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz"; - sha1 = "b2e2f09e342d0f0c88e2f02e067794125e75c207"; - }; - } - - { - name = "babel_generator___babel_generator_6.26.1.tgz"; - path = fetchurl { - name = "babel_generator___babel_generator_6.26.1.tgz"; - url = "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz"; - sha1 = "1844408d3b8f0d35a404ea7ac180f087a601bd90"; - }; - } - - { - name = "babel_helper_builder_binary_assignment_operator_visitor___babel_helper_builder_binary_assignment_operator_visitor_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_builder_binary_assignment_operator_visitor___babel_helper_builder_binary_assignment_operator_visitor_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz"; - sha1 = "cce4517ada356f4220bcae8a02c2b346f9a56664"; - }; - } - - { - name = "babel_helper_call_delegate___babel_helper_call_delegate_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_call_delegate___babel_helper_call_delegate_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz"; - sha1 = "ece6aacddc76e41c3461f88bfc575bd0daa2df8d"; - }; - } - - { - name = "babel_helper_define_map___babel_helper_define_map_6.26.0.tgz"; - path = fetchurl { - name = "babel_helper_define_map___babel_helper_define_map_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz"; - sha1 = "a5f56dab41a25f97ecb498c7ebaca9819f95be5f"; - }; - } - - { - name = "babel_helper_explode_assignable_expression___babel_helper_explode_assignable_expression_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_explode_assignable_expression___babel_helper_explode_assignable_expression_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz"; - sha1 = "f25b82cf7dc10433c55f70592d5746400ac22caa"; - }; - } - - { - name = "babel_helper_function_name___babel_helper_function_name_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_function_name___babel_helper_function_name_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz"; - sha1 = "d3475b8c03ed98242a25b48351ab18399d3580a9"; - }; - } - - { - name = "babel_helper_get_function_arity___babel_helper_get_function_arity_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_get_function_arity___babel_helper_get_function_arity_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz"; - sha1 = "8f7782aa93407c41d3aa50908f89b031b1b6853d"; - }; - } - - { - name = "babel_helper_hoist_variables___babel_helper_hoist_variables_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_hoist_variables___babel_helper_hoist_variables_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz"; - sha1 = "1ecb27689c9d25513eadbc9914a73f5408be7a76"; - }; - } - - { - name = "babel_helper_optimise_call_expression___babel_helper_optimise_call_expression_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_optimise_call_expression___babel_helper_optimise_call_expression_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz"; - sha1 = "f7a13427ba9f73f8f4fa993c54a97882d1244257"; - }; - } - - { - name = "babel_helper_regex___babel_helper_regex_6.26.0.tgz"; - path = fetchurl { - name = "babel_helper_regex___babel_helper_regex_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz"; - sha1 = "325c59f902f82f24b74faceed0363954f6495e72"; - }; - } - - { - name = "babel_helper_remap_async_to_generator___babel_helper_remap_async_to_generator_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_remap_async_to_generator___babel_helper_remap_async_to_generator_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz"; - sha1 = "5ec581827ad723fecdd381f1c928390676e4551b"; - }; - } - - { - name = "babel_helper_replace_supers___babel_helper_replace_supers_6.24.1.tgz"; - path = fetchurl { - name = "babel_helper_replace_supers___babel_helper_replace_supers_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz"; - sha1 = "bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"; - }; - } - - { - name = "babel_helpers___babel_helpers_6.24.1.tgz"; - path = fetchurl { - name = "babel_helpers___babel_helpers_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz"; - sha1 = "3471de9caec388e5c850e597e58a26ddf37602b2"; - }; - } - - { - name = "babel_loader___babel_loader_7.1.5.tgz"; - path = fetchurl { - name = "babel_loader___babel_loader_7.1.5.tgz"; - url = "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz"; - sha1 = "e3ee0cd7394aa557e013b02d3e492bfd07aa6d68"; - }; - } - - { - name = "babel_messages___babel_messages_6.23.0.tgz"; - path = fetchurl { - name = "babel_messages___babel_messages_6.23.0.tgz"; - url = "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz"; - sha1 = "f3cdf4703858035b2a2951c6ec5edf6c62f2630e"; - }; - } - - { - name = "babel_plugin_check_es2015_constants___babel_plugin_check_es2015_constants_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_check_es2015_constants___babel_plugin_check_es2015_constants_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz"; - sha1 = "35157b101426fd2ffd3da3f75c7d1e91835bbf8a"; - }; - } - - { - name = "babel_plugin_syntax_async_functions___babel_plugin_syntax_async_functions_6.13.0.tgz"; - path = fetchurl { - name = "babel_plugin_syntax_async_functions___babel_plugin_syntax_async_functions_6.13.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz"; - sha1 = "cad9cad1191b5ad634bf30ae0872391e0647be95"; - }; - } - - { - name = "babel_plugin_syntax_exponentiation_operator___babel_plugin_syntax_exponentiation_operator_6.13.0.tgz"; - path = fetchurl { - name = "babel_plugin_syntax_exponentiation_operator___babel_plugin_syntax_exponentiation_operator_6.13.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz"; - sha1 = "9ee7e8337290da95288201a6a57f4170317830de"; - }; - } - - { - name = "babel_plugin_syntax_trailing_function_commas___babel_plugin_syntax_trailing_function_commas_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_syntax_trailing_function_commas___babel_plugin_syntax_trailing_function_commas_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz"; - sha1 = "ba0360937f8d06e40180a43fe0d5616fff532cf3"; - }; - } - - { - name = "babel_plugin_transform_async_to_generator___babel_plugin_transform_async_to_generator_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_async_to_generator___babel_plugin_transform_async_to_generator_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz"; - sha1 = "6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"; - }; - } - - { - name = "babel_plugin_transform_es2015_arrow_functions___babel_plugin_transform_es2015_arrow_functions_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_arrow_functions___babel_plugin_transform_es2015_arrow_functions_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz"; - sha1 = "452692cb711d5f79dc7f85e440ce41b9f244d221"; - }; - } - - { - name = "babel_plugin_transform_es2015_block_scoped_functions___babel_plugin_transform_es2015_block_scoped_functions_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_block_scoped_functions___babel_plugin_transform_es2015_block_scoped_functions_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz"; - sha1 = "bbc51b49f964d70cb8d8e0b94e820246ce3a6141"; - }; - } - - { - name = "babel_plugin_transform_es2015_block_scoping___babel_plugin_transform_es2015_block_scoping_6.26.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_block_scoping___babel_plugin_transform_es2015_block_scoping_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz"; - sha1 = "d70f5299c1308d05c12f463813b0a09e73b1895f"; - }; - } - - { - name = "babel_plugin_transform_es2015_classes___babel_plugin_transform_es2015_classes_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_classes___babel_plugin_transform_es2015_classes_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz"; - sha1 = "5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"; - }; - } - - { - name = "babel_plugin_transform_es2015_computed_properties___babel_plugin_transform_es2015_computed_properties_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_computed_properties___babel_plugin_transform_es2015_computed_properties_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz"; - sha1 = "6fe2a8d16895d5634f4cd999b6d3480a308159b3"; - }; - } - - { - name = "babel_plugin_transform_es2015_destructuring___babel_plugin_transform_es2015_destructuring_6.23.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_destructuring___babel_plugin_transform_es2015_destructuring_6.23.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz"; - sha1 = "997bb1f1ab967f682d2b0876fe358d60e765c56d"; - }; - } - - { - name = "babel_plugin_transform_es2015_duplicate_keys___babel_plugin_transform_es2015_duplicate_keys_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_duplicate_keys___babel_plugin_transform_es2015_duplicate_keys_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz"; - sha1 = "73eb3d310ca969e3ef9ec91c53741a6f1576423e"; - }; - } - - { - name = "babel_plugin_transform_es2015_for_of___babel_plugin_transform_es2015_for_of_6.23.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_for_of___babel_plugin_transform_es2015_for_of_6.23.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz"; - sha1 = "f47c95b2b613df1d3ecc2fdb7573623c75248691"; - }; - } - - { - name = "babel_plugin_transform_es2015_function_name___babel_plugin_transform_es2015_function_name_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_function_name___babel_plugin_transform_es2015_function_name_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz"; - sha1 = "834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"; - }; - } - - { - name = "babel_plugin_transform_es2015_literals___babel_plugin_transform_es2015_literals_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_literals___babel_plugin_transform_es2015_literals_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz"; - sha1 = "4f54a02d6cd66cf915280019a31d31925377ca2e"; - }; - } - - { - name = "babel_plugin_transform_es2015_modules_amd___babel_plugin_transform_es2015_modules_amd_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_modules_amd___babel_plugin_transform_es2015_modules_amd_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz"; - sha1 = "3b3e54017239842d6d19c3011c4bd2f00a00d154"; - }; - } - - { - name = "babel_plugin_transform_es2015_modules_commonjs___babel_plugin_transform_es2015_modules_commonjs_6.26.2.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_modules_commonjs___babel_plugin_transform_es2015_modules_commonjs_6.26.2.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz"; - sha1 = "58a793863a9e7ca870bdc5a881117ffac27db6f3"; - }; - } - - { - name = "babel_plugin_transform_es2015_modules_systemjs___babel_plugin_transform_es2015_modules_systemjs_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_modules_systemjs___babel_plugin_transform_es2015_modules_systemjs_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz"; - sha1 = "ff89a142b9119a906195f5f106ecf305d9407d23"; - }; - } - - { - name = "babel_plugin_transform_es2015_modules_umd___babel_plugin_transform_es2015_modules_umd_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_modules_umd___babel_plugin_transform_es2015_modules_umd_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz"; - sha1 = "ac997e6285cd18ed6176adb607d602344ad38468"; - }; - } - - { - name = "babel_plugin_transform_es2015_object_super___babel_plugin_transform_es2015_object_super_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_object_super___babel_plugin_transform_es2015_object_super_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz"; - sha1 = "24cef69ae21cb83a7f8603dad021f572eb278f8d"; - }; - } - - { - name = "babel_plugin_transform_es2015_parameters___babel_plugin_transform_es2015_parameters_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_parameters___babel_plugin_transform_es2015_parameters_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz"; - sha1 = "57ac351ab49caf14a97cd13b09f66fdf0a625f2b"; - }; - } - - { - name = "babel_plugin_transform_es2015_shorthand_properties___babel_plugin_transform_es2015_shorthand_properties_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_shorthand_properties___babel_plugin_transform_es2015_shorthand_properties_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz"; - sha1 = "24f875d6721c87661bbd99a4622e51f14de38aa0"; - }; - } - - { - name = "babel_plugin_transform_es2015_spread___babel_plugin_transform_es2015_spread_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_spread___babel_plugin_transform_es2015_spread_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz"; - sha1 = "d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"; - }; - } - - { - name = "babel_plugin_transform_es2015_sticky_regex___babel_plugin_transform_es2015_sticky_regex_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_sticky_regex___babel_plugin_transform_es2015_sticky_regex_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz"; - sha1 = "00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"; - }; - } - - { - name = "babel_plugin_transform_es2015_template_literals___babel_plugin_transform_es2015_template_literals_6.22.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_template_literals___babel_plugin_transform_es2015_template_literals_6.22.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz"; - sha1 = "a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"; - }; - } - - { - name = "babel_plugin_transform_es2015_typeof_symbol___babel_plugin_transform_es2015_typeof_symbol_6.23.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_typeof_symbol___babel_plugin_transform_es2015_typeof_symbol_6.23.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz"; - sha1 = "dec09f1cddff94b52ac73d505c84df59dcceb372"; - }; - } - - { - name = "babel_plugin_transform_es2015_unicode_regex___babel_plugin_transform_es2015_unicode_regex_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_es2015_unicode_regex___babel_plugin_transform_es2015_unicode_regex_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz"; - sha1 = "d38b12f42ea7323f729387f18a7c5ae1faeb35e9"; - }; - } - - { - name = "babel_plugin_transform_exponentiation_operator___babel_plugin_transform_exponentiation_operator_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_exponentiation_operator___babel_plugin_transform_exponentiation_operator_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz"; - sha1 = "2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"; - }; - } - - { - name = "babel_plugin_transform_regenerator___babel_plugin_transform_regenerator_6.26.0.tgz"; - path = fetchurl { - name = "babel_plugin_transform_regenerator___babel_plugin_transform_regenerator_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz"; - sha1 = "e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"; - }; - } - - { - name = "babel_plugin_transform_strict_mode___babel_plugin_transform_strict_mode_6.24.1.tgz"; - path = fetchurl { - name = "babel_plugin_transform_strict_mode___babel_plugin_transform_strict_mode_6.24.1.tgz"; - url = "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz"; - sha1 = "d5faf7aa578a65bbe591cf5edae04a0c67020758"; - }; - } - - { - name = "babel_preset_env___babel_preset_env_1.7.0.tgz"; - path = fetchurl { - name = "babel_preset_env___babel_preset_env_1.7.0.tgz"; - url = "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz"; - sha1 = "dea79fa4ebeb883cd35dab07e260c1c9c04df77a"; - }; - } - - { - name = "babel_register___babel_register_6.26.0.tgz"; - path = fetchurl { - name = "babel_register___babel_register_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz"; - sha1 = "6ed021173e2fcb486d7acb45c6009a856f647071"; - }; - } - - { - name = "babel_runtime___babel_runtime_6.26.0.tgz"; - path = fetchurl { - name = "babel_runtime___babel_runtime_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz"; - sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe"; - }; - } - - { - name = "babel_template___babel_template_6.26.0.tgz"; - path = fetchurl { - name = "babel_template___babel_template_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz"; - sha1 = "de03e2d16396b069f46dd9fff8521fb1a0e35e02"; - }; - } - - { - name = "babel_traverse___babel_traverse_6.26.0.tgz"; - path = fetchurl { - name = "babel_traverse___babel_traverse_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz"; - sha1 = "46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"; - }; - } - - { - name = "babel_types___babel_types_6.26.0.tgz"; - path = fetchurl { - name = "babel_types___babel_types_6.26.0.tgz"; - url = "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz"; - sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497"; - }; - } - - { - name = "babylon___babylon_6.18.0.tgz"; - path = fetchurl { - name = "babylon___babylon_6.18.0.tgz"; - url = "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz"; - sha1 = "af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"; - }; - } - - { - name = "balanced_match___balanced_match_0.4.2.tgz"; - path = fetchurl { - name = "balanced_match___balanced_match_0.4.2.tgz"; - url = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz"; - sha1 = "cb3f3e3c732dc0f01ee70b403f302e61d7709838"; - }; - } - - { - name = "balanced_match___balanced_match_1.0.0.tgz"; - path = fetchurl { - name = "balanced_match___balanced_match_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz"; - sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767"; - }; - } - - { - name = "base64_js___base64_js_1.3.0.tgz"; - path = fetchurl { - name = "base64_js___base64_js_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz"; - sha1 = "cab1e6118f051095e58b5281aea8c1cd22bfc0e3"; - }; - } - - { - name = "base___base_0.11.2.tgz"; - path = fetchurl { - name = "base___base_0.11.2.tgz"; - url = "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz"; - sha1 = "7bde5ced145b6d551a90db87f83c558b4eb48a8f"; - }; - } - - { - name = "batch___batch_0.6.1.tgz"; - path = fetchurl { - name = "batch___batch_0.6.1.tgz"; - url = "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz"; - sha1 = "dc34314f4e679318093fc760272525f94bf25c16"; - }; - } - - { - name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz"; - path = fetchurl { - name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz"; - sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"; - }; - } - - { - name = "big.js___big.js_3.2.0.tgz"; - path = fetchurl { - name = "big.js___big.js_3.2.0.tgz"; - url = "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz"; - sha1 = "a5fc298b81b9e0dca2e458824784b65c52ba588e"; - }; - } - - { - name = "binary_extensions___binary_extensions_1.11.0.tgz"; - path = fetchurl { - name = "binary_extensions___binary_extensions_1.11.0.tgz"; - url = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz"; - sha1 = "46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"; - }; - } - - { - name = "block_stream___block_stream_0.0.9.tgz"; - path = fetchurl { - name = "block_stream___block_stream_0.0.9.tgz"; - url = "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz"; - sha1 = "13ebfe778a03205cfe03751481ebb4b3300c126a"; - }; - } - - { - name = "bn.js___bn.js_4.11.8.tgz"; - path = fetchurl { - name = "bn.js___bn.js_4.11.8.tgz"; - url = "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz"; - sha1 = "2cde09eb5ee341f484746bb0309b3253b1b1442f"; - }; - } - - { - name = "body_parser___body_parser_1.18.2.tgz"; - path = fetchurl { - name = "body_parser___body_parser_1.18.2.tgz"; - url = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz"; - sha1 = "87678a19d84b47d859b83199bd59bce222b10454"; - }; - } - - { - name = "bonjour___bonjour_3.5.0.tgz"; - path = fetchurl { - name = "bonjour___bonjour_3.5.0.tgz"; - url = "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz"; - sha1 = "8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"; - }; - } - - { - name = "boolbase___boolbase_1.0.0.tgz"; - path = fetchurl { - name = "boolbase___boolbase_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz"; - sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"; - }; - } - - { - name = "boom___boom_2.10.1.tgz"; - path = fetchurl { - name = "boom___boom_2.10.1.tgz"; - url = "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz"; - sha1 = "39c8918ceff5799f83f9492a848f625add0c766f"; - }; - } - - { - name = "bootstrap___bootstrap_4.1.3.tgz"; - path = fetchurl { - name = "bootstrap___bootstrap_4.1.3.tgz"; - url = "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.3.tgz"; - sha1 = "0eb371af2c8448e8c210411d0cb824a6409a12be"; - }; - } - - { - name = "brace_expansion___brace_expansion_1.1.11.tgz"; - path = fetchurl { - name = "brace_expansion___brace_expansion_1.1.11.tgz"; - url = "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz"; - sha1 = "3c7fcbf529d87226f3d2f52b966ff5271eb441dd"; - }; - } - - { - name = "braces___braces_1.8.5.tgz"; - path = fetchurl { - name = "braces___braces_1.8.5.tgz"; - url = "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz"; - sha1 = "ba77962e12dff969d6b76711e914b737857bf6a7"; - }; - } - - { - name = "braces___braces_2.3.2.tgz"; - path = fetchurl { - name = "braces___braces_2.3.2.tgz"; - url = "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz"; - sha1 = "5979fd3f14cd531565e5fa2df1abfff1dfaee729"; - }; - } - - { - name = "brorand___brorand_1.1.0.tgz"; - path = fetchurl { - name = "brorand___brorand_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz"; - sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f"; - }; - } - - { - name = "browserify_aes___browserify_aes_1.2.0.tgz"; - path = fetchurl { - name = "browserify_aes___browserify_aes_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz"; - sha1 = "326734642f403dabc3003209853bb70ad428ef48"; - }; - } - - { - name = "browserify_cipher___browserify_cipher_1.0.1.tgz"; - path = fetchurl { - name = "browserify_cipher___browserify_cipher_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz"; - sha1 = "8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"; - }; - } - - { - name = "browserify_des___browserify_des_1.0.2.tgz"; - path = fetchurl { - name = "browserify_des___browserify_des_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz"; - sha1 = "3af4f1f59839403572f1c66204375f7a7f703e9c"; - }; - } - - { - name = "browserify_rsa___browserify_rsa_4.0.1.tgz"; - path = fetchurl { - name = "browserify_rsa___browserify_rsa_4.0.1.tgz"; - url = "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz"; - sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524"; - }; - } - - { - name = "browserify_sign___browserify_sign_4.0.4.tgz"; - path = fetchurl { - name = "browserify_sign___browserify_sign_4.0.4.tgz"; - url = "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz"; - sha1 = "aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"; - }; - } - - { - name = "browserify_zlib___browserify_zlib_0.2.0.tgz"; - path = fetchurl { - name = "browserify_zlib___browserify_zlib_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz"; - sha1 = "2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"; - }; - } - - { - name = "browserslist___browserslist_1.7.7.tgz"; - path = fetchurl { - name = "browserslist___browserslist_1.7.7.tgz"; - url = "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz"; - sha1 = "0bd76704258be829b2398bb50e4b62d1a166b0b9"; - }; - } - - { - name = "browserslist___browserslist_3.2.8.tgz"; - path = fetchurl { - name = "browserslist___browserslist_3.2.8.tgz"; - url = "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz"; - sha1 = "b0005361d6471f0f5952797a76fc985f1f978fc6"; - }; - } - - { - name = "buffer_indexof___buffer_indexof_1.1.1.tgz"; - path = fetchurl { - name = "buffer_indexof___buffer_indexof_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz"; - sha1 = "52fabcc6a606d1a00302802648ef68f639da268c"; - }; - } - - { - name = "buffer_xor___buffer_xor_1.0.3.tgz"; - path = fetchurl { - name = "buffer_xor___buffer_xor_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz"; - sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9"; - }; - } - - { - name = "buffer___buffer_4.9.1.tgz"; - path = fetchurl { - name = "buffer___buffer_4.9.1.tgz"; - url = "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz"; - sha1 = "6d1bb601b07a4efced97094132093027c95bc298"; - }; - } - - { - name = "builtin_modules___builtin_modules_1.1.1.tgz"; - path = fetchurl { - name = "builtin_modules___builtin_modules_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz"; - sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f"; - }; - } - - { - name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz"; - path = fetchurl { - name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz"; - sha1 = "85982878e21b98e1c66425e03d0174788f569ee8"; - }; - } - - { - name = "bytes___bytes_3.0.0.tgz"; - path = fetchurl { - name = "bytes___bytes_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz"; - sha1 = "d32815404d689699f85a4ea4fa8755dd13a96048"; - }; - } - - { - name = "cache_base___cache_base_1.0.1.tgz"; - path = fetchurl { - name = "cache_base___cache_base_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz"; - sha1 = "0a7f46416831c8b662ee36fe4e7c59d76f666ab2"; - }; - } - - { - name = "camelcase_keys___camelcase_keys_2.1.0.tgz"; - path = fetchurl { - name = "camelcase_keys___camelcase_keys_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz"; - sha1 = "308beeaffdf28119051efa1d932213c91b8f92e7"; - }; - } - - { - name = "camelcase___camelcase_1.2.1.tgz"; - path = fetchurl { - name = "camelcase___camelcase_1.2.1.tgz"; - url = "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz"; - sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"; - }; - } - - { - name = "camelcase___camelcase_2.1.1.tgz"; - path = fetchurl { - name = "camelcase___camelcase_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz"; - sha1 = "7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"; - }; - } - - { - name = "camelcase___camelcase_3.0.0.tgz"; - path = fetchurl { - name = "camelcase___camelcase_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz"; - sha1 = "32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"; - }; - } - - { - name = "camelcase___camelcase_4.1.0.tgz"; - path = fetchurl { - name = "camelcase___camelcase_4.1.0.tgz"; - url = "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz"; - sha1 = "d545635be1e33c542649c69173e5de6acfae34dd"; - }; - } - - { - name = "caniuse_api___caniuse_api_1.6.1.tgz"; - path = fetchurl { - name = "caniuse_api___caniuse_api_1.6.1.tgz"; - url = "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz"; - sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"; - }; - } - - { - name = "caniuse_db___caniuse_db_1.0.30000871.tgz"; - path = fetchurl { - name = "caniuse_db___caniuse_db_1.0.30000871.tgz"; - url = "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000871.tgz"; - sha1 = "f1995c1fe31892649a7605957a80c92518423d4d"; - }; - } - - { - name = "caniuse_lite___caniuse_lite_1.0.30000865.tgz"; - path = fetchurl { - name = "caniuse_lite___caniuse_lite_1.0.30000865.tgz"; - url = "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz"; - sha1 = "70026616e8afe6e1442f8bb4e1092987d81a2f25"; - }; - } - - { - name = "caseless___caseless_0.12.0.tgz"; - path = fetchurl { - name = "caseless___caseless_0.12.0.tgz"; - url = "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz"; - sha1 = "1b681c21ff84033c826543090689420d187151dc"; - }; - } - - { - name = "center_align___center_align_0.1.3.tgz"; - path = fetchurl { - name = "center_align___center_align_0.1.3.tgz"; - url = "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz"; - sha1 = "aa0d32629b6ee972200411cbd4461c907bc2b7ad"; - }; - } - - { - name = "chalk___chalk_1.1.3.tgz"; - path = fetchurl { - name = "chalk___chalk_1.1.3.tgz"; - url = "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz"; - sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98"; - }; - } - - { - name = "chalk___chalk_2.4.1.tgz"; - path = fetchurl { - name = "chalk___chalk_2.4.1.tgz"; - url = "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz"; - sha1 = "18c49ab16a037b6eb0152cc83e3471338215b66e"; - }; - } - - { - name = "chokidar___chokidar_2.0.4.tgz"; - path = fetchurl { - name = "chokidar___chokidar_2.0.4.tgz"; - url = "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz"; - sha1 = "356ff4e2b0e8e43e322d18a372460bbcf3accd26"; - }; - } - - { - name = "chownr___chownr_1.0.1.tgz"; - path = fetchurl { - name = "chownr___chownr_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz"; - sha1 = "e2a75042a9551908bebd25b8523d5f9769d79181"; - }; - } - - { - name = "cipher_base___cipher_base_1.0.4.tgz"; - path = fetchurl { - name = "cipher_base___cipher_base_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz"; - sha1 = "8760e4ecc272f4c363532f926d874aae2c1397de"; - }; - } - - { - name = "clap___clap_1.2.3.tgz"; - path = fetchurl { - name = "clap___clap_1.2.3.tgz"; - url = "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz"; - sha1 = "4f36745b32008492557f46412d66d50cb99bce51"; - }; - } - - { - name = "class_utils___class_utils_0.3.6.tgz"; - path = fetchurl { - name = "class_utils___class_utils_0.3.6.tgz"; - url = "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz"; - sha1 = "f93369ae8b9a7ce02fd41faad0ca83033190c463"; - }; - } - - { - name = "clean_webpack_plugin___clean_webpack_plugin_0.1.19.tgz"; - path = fetchurl { - name = "clean_webpack_plugin___clean_webpack_plugin_0.1.19.tgz"; - url = "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz"; - sha1 = "ceda8bb96b00fe168e9b080272960d20fdcadd6d"; - }; - } - - { - name = "cliui___cliui_2.1.0.tgz"; - path = fetchurl { - name = "cliui___cliui_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz"; - sha1 = "4b475760ff80264c762c3a1719032e91c7fea0d1"; - }; - } - - { - name = "cliui___cliui_3.2.0.tgz"; - path = fetchurl { - name = "cliui___cliui_3.2.0.tgz"; - url = "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz"; - sha1 = "120601537a916d29940f934da3b48d585a39213d"; - }; - } - - { - name = "clone_deep___clone_deep_2.0.2.tgz"; - path = fetchurl { - name = "clone_deep___clone_deep_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz"; - sha1 = "00db3a1e173656730d1188c3d6aced6d7ea97713"; - }; - } - - { - name = "clone___clone_1.0.4.tgz"; - path = fetchurl { - name = "clone___clone_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz"; - sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e"; - }; - } - - { - name = "co___co_4.6.0.tgz"; - path = fetchurl { - name = "co___co_4.6.0.tgz"; - url = "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz"; - sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"; - }; - } - - { - name = "coa___coa_1.0.4.tgz"; - path = fetchurl { - name = "coa___coa_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz"; - sha1 = "a9ef153660d6a86a8bdec0289a5c684d217432fd"; - }; - } - - { - name = "code_point_at___code_point_at_1.1.0.tgz"; - path = fetchurl { - name = "code_point_at___code_point_at_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz"; - sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"; - }; - } - - { - name = "collection_visit___collection_visit_1.0.0.tgz"; - path = fetchurl { - name = "collection_visit___collection_visit_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz"; - sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0"; - }; - } - - { - name = "color_convert___color_convert_1.9.2.tgz"; - path = fetchurl { - name = "color_convert___color_convert_1.9.2.tgz"; - url = "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz"; - sha1 = "49881b8fba67df12a96bdf3f56c0aab9e7913147"; - }; - } - - { - name = "color_name___color_name_1.1.1.tgz"; - path = fetchurl { - name = "color_name___color_name_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz"; - sha1 = "4b1415304cf50028ea81643643bd82ea05803689"; - }; - } - - { - name = "color_name___color_name_1.1.3.tgz"; - path = fetchurl { - name = "color_name___color_name_1.1.3.tgz"; - url = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz"; - sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25"; - }; - } - - { - name = "color_string___color_string_0.3.0.tgz"; - path = fetchurl { - name = "color_string___color_string_0.3.0.tgz"; - url = "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz"; - sha1 = "27d46fb67025c5c2fa25993bfbf579e47841b991"; - }; - } - - { - name = "color___color_0.11.4.tgz"; - path = fetchurl { - name = "color___color_0.11.4.tgz"; - url = "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz"; - sha1 = "6d7b5c74fb65e841cd48792ad1ed5e07b904d764"; - }; - } - - { - name = "colormin___colormin_1.1.2.tgz"; - path = fetchurl { - name = "colormin___colormin_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz"; - sha1 = "ea2f7420a72b96881a38aae59ec124a6f7298133"; - }; - } - - { - name = "colors___colors_1.1.2.tgz"; - path = fetchurl { - name = "colors___colors_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz"; - sha1 = "168a4701756b6a7f51a12ce0c97bfa28c084ed63"; - }; - } - - { - name = "combined_stream___combined_stream_1.0.6.tgz"; - path = fetchurl { - name = "combined_stream___combined_stream_1.0.6.tgz"; - url = "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz"; - sha1 = "723e7df6e801ac5613113a7e445a9b69cb632818"; - }; - } - - { - name = "commondir___commondir_1.0.1.tgz"; - path = fetchurl { - name = "commondir___commondir_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz"; - sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b"; - }; - } - - { - name = "component_emitter___component_emitter_1.2.1.tgz"; - path = fetchurl { - name = "component_emitter___component_emitter_1.2.1.tgz"; - url = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz"; - sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6"; - }; - } - - { - name = "compressible___compressible_2.0.14.tgz"; - path = fetchurl { - name = "compressible___compressible_2.0.14.tgz"; - url = "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz"; - sha1 = "326c5f507fbb055f54116782b969a81b67a29da7"; - }; - } - - { - name = "compression___compression_1.7.3.tgz"; - path = fetchurl { - name = "compression___compression_1.7.3.tgz"; - url = "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz"; - sha1 = "27e0e176aaf260f7f2c2813c3e440adb9f1993db"; - }; - } - - { - name = "concat_map___concat_map_0.0.1.tgz"; - path = fetchurl { - name = "concat_map___concat_map_0.0.1.tgz"; - url = "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz"; - sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b"; - }; - } - - { - name = "connect_history_api_fallback___connect_history_api_fallback_1.5.0.tgz"; - path = fetchurl { - name = "connect_history_api_fallback___connect_history_api_fallback_1.5.0.tgz"; - url = "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz"; - sha1 = "b06873934bc5e344fef611a196a6faae0aee015a"; - }; - } - - { - name = "console_browserify___console_browserify_1.1.0.tgz"; - path = fetchurl { - name = "console_browserify___console_browserify_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz"; - sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10"; - }; - } - - { - name = "console_control_strings___console_control_strings_1.1.0.tgz"; - path = fetchurl { - name = "console_control_strings___console_control_strings_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz"; - sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e"; - }; - } - - { - name = "constants_browserify___constants_browserify_1.0.0.tgz"; - path = fetchurl { - name = "constants_browserify___constants_browserify_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz"; - sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75"; - }; - } - - { - name = "content_disposition___content_disposition_0.5.2.tgz"; - path = fetchurl { - name = "content_disposition___content_disposition_0.5.2.tgz"; - url = "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz"; - sha1 = "0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"; - }; - } - - { - name = "content_type___content_type_1.0.4.tgz"; - path = fetchurl { - name = "content_type___content_type_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz"; - sha1 = "e138cc75e040c727b1966fe5e5f8c9aee256fe3b"; - }; - } - - { - name = "convert_source_map___convert_source_map_0.3.5.tgz"; - path = fetchurl { - name = "convert_source_map___convert_source_map_0.3.5.tgz"; - url = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz"; - sha1 = "f1d802950af7dd2631a1febe0596550c86ab3190"; - }; - } - - { - name = "convert_source_map___convert_source_map_1.5.1.tgz"; - path = fetchurl { - name = "convert_source_map___convert_source_map_1.5.1.tgz"; - url = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz"; - sha1 = "b8278097b9bc229365de5c62cf5fcaed8b5599e5"; - }; - } - - { - name = "cookie_signature___cookie_signature_1.0.6.tgz"; - path = fetchurl { - name = "cookie_signature___cookie_signature_1.0.6.tgz"; - url = "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz"; - sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c"; - }; - } - - { - name = "cookie___cookie_0.3.1.tgz"; - path = fetchurl { - name = "cookie___cookie_0.3.1.tgz"; - url = "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz"; - sha1 = "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"; - }; - } - - { - name = "copy_descriptor___copy_descriptor_0.1.1.tgz"; - path = fetchurl { - name = "copy_descriptor___copy_descriptor_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz"; - sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d"; - }; - } - - { - name = "core_js___core_js_2.5.7.tgz"; - path = fetchurl { - name = "core_js___core_js_2.5.7.tgz"; - url = "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz"; - sha1 = "f972608ff0cead68b841a16a932d0b183791814e"; - }; - } - - { - name = "core_util_is___core_util_is_1.0.2.tgz"; - path = fetchurl { - name = "core_util_is___core_util_is_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz"; - sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7"; - }; - } - - { - name = "create_ecdh___create_ecdh_4.0.3.tgz"; - path = fetchurl { - name = "create_ecdh___create_ecdh_4.0.3.tgz"; - url = "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz"; - sha1 = "c9111b6f33045c4697f144787f9254cdc77c45ff"; - }; - } - - { - name = "create_hash___create_hash_1.2.0.tgz"; - path = fetchurl { - name = "create_hash___create_hash_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz"; - sha1 = "889078af11a63756bcfb59bd221996be3a9ef196"; - }; - } - - { - name = "create_hmac___create_hmac_1.1.7.tgz"; - path = fetchurl { - name = "create_hmac___create_hmac_1.1.7.tgz"; - url = "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz"; - sha1 = "69170c78b3ab957147b2b8b04572e47ead2243ff"; - }; - } - - { - name = "cross_spawn___cross_spawn_3.0.1.tgz"; - path = fetchurl { - name = "cross_spawn___cross_spawn_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz"; - sha1 = "1256037ecb9f0c5f79e3d6ef135e30770184b982"; - }; - } - - { - name = "cross_spawn___cross_spawn_5.1.0.tgz"; - path = fetchurl { - name = "cross_spawn___cross_spawn_5.1.0.tgz"; - url = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz"; - sha1 = "e8bd0efee58fcff6f8f94510a0a554bbfa235449"; - }; - } - - { - name = "cryptiles___cryptiles_2.0.5.tgz"; - path = fetchurl { - name = "cryptiles___cryptiles_2.0.5.tgz"; - url = "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz"; - sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8"; - }; - } - - { - name = "crypto_browserify___crypto_browserify_3.12.0.tgz"; - path = fetchurl { - name = "crypto_browserify___crypto_browserify_3.12.0.tgz"; - url = "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz"; - sha1 = "396cf9f3137f03e4b8e532c58f698254e00f80ec"; - }; - } - - { - name = "css_color_names___css_color_names_0.0.4.tgz"; - path = fetchurl { - name = "css_color_names___css_color_names_0.0.4.tgz"; - url = "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz"; - sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0"; - }; - } - - { - name = "css_loader___css_loader_0.26.4.tgz"; - path = fetchurl { - name = "css_loader___css_loader_0.26.4.tgz"; - url = "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.4.tgz"; - sha1 = "b61e9e30db94303e6ffc892f10ecd09ad025a1fd"; - }; - } - - { - name = "css_select___css_select_1.2.0.tgz"; - path = fetchurl { - name = "css_select___css_select_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz"; - sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858"; - }; - } - - { - name = "css_selector_tokenizer___css_selector_tokenizer_0.7.0.tgz"; - path = fetchurl { - name = "css_selector_tokenizer___css_selector_tokenizer_0.7.0.tgz"; - url = "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz"; - sha1 = "e6988474ae8c953477bf5e7efecfceccd9cf4c86"; - }; - } - - { - name = "css_what___css_what_2.1.0.tgz"; - path = fetchurl { - name = "css_what___css_what_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz"; - sha1 = "9467d032c38cfaefb9f2d79501253062f87fa1bd"; - }; - } - - { - name = "css___css_2.2.3.tgz"; - path = fetchurl { - name = "css___css_2.2.3.tgz"; - url = "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz"; - sha1 = "f861f4ba61e79bedc962aa548e5780fd95cbc6be"; - }; - } - - { - name = "cssesc___cssesc_0.1.0.tgz"; - path = fetchurl { - name = "cssesc___cssesc_0.1.0.tgz"; - url = "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz"; - sha1 = "c814903e45623371a0477b40109aaafbeeaddbb4"; - }; - } - - { - name = "cssnano___cssnano_3.10.0.tgz"; - path = fetchurl { - name = "cssnano___cssnano_3.10.0.tgz"; - url = "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz"; - sha1 = "4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"; - }; - } - - { - name = "csso___csso_2.3.2.tgz"; - path = fetchurl { - name = "csso___csso_2.3.2.tgz"; - url = "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz"; - sha1 = "ddd52c587033f49e94b71fc55569f252e8ff5f85"; - }; - } - - { - name = "currently_unhandled___currently_unhandled_0.4.1.tgz"; - path = fetchurl { - name = "currently_unhandled___currently_unhandled_0.4.1.tgz"; - url = "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz"; - sha1 = "988df33feab191ef799a61369dd76c17adf957ea"; - }; - } - - { - name = "d___d_1.0.0.tgz"; - path = fetchurl { - name = "d___d_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz"; - sha1 = "754bb5bfe55451da69a58b94d45f4c5b0462d58f"; - }; - } - - { - name = "dashdash___dashdash_1.14.1.tgz"; - path = fetchurl { - name = "dashdash___dashdash_1.14.1.tgz"; - url = "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz"; - sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"; - }; - } - - { - name = "date_now___date_now_0.1.4.tgz"; - path = fetchurl { - name = "date_now___date_now_0.1.4.tgz"; - url = "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz"; - sha1 = "eaf439fd4d4848ad74e5cc7dbef200672b9e345b"; - }; - } - - { - name = "debug___debug_2.6.9.tgz"; - path = fetchurl { - name = "debug___debug_2.6.9.tgz"; - url = "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz"; - sha1 = "5d128515df134ff327e90a4c93f4e077a536341f"; - }; - } - - { - name = "debug___debug_3.1.0.tgz"; - path = fetchurl { - name = "debug___debug_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz"; - sha1 = "5bb5a0672628b64149566ba16819e61518c67261"; - }; - } - - { - name = "decamelize___decamelize_1.2.0.tgz"; - path = fetchurl { - name = "decamelize___decamelize_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz"; - sha1 = "f6534d15148269b20352e7bee26f501f9a191290"; - }; - } - - { - name = "decode_uri_component___decode_uri_component_0.2.0.tgz"; - path = fetchurl { - name = "decode_uri_component___decode_uri_component_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz"; - sha1 = "eb3913333458775cb84cd1a1fae062106bb87545"; - }; - } - - { - name = "deep_equal___deep_equal_1.0.1.tgz"; - path = fetchurl { - name = "deep_equal___deep_equal_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz"; - sha1 = "f5d260292b660e084eff4cdbc9f08ad3247448b5"; - }; - } - - { - name = "deep_extend___deep_extend_0.6.0.tgz"; - path = fetchurl { - name = "deep_extend___deep_extend_0.6.0.tgz"; - url = "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz"; - sha1 = "c4fa7c95404a17a9c3e8ca7e1537312b736330ac"; - }; - } - - { - name = "define_properties___define_properties_1.1.2.tgz"; - path = fetchurl { - name = "define_properties___define_properties_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz"; - sha1 = "83a73f2fea569898fb737193c8f873caf6d45c94"; - }; - } - - { - name = "define_property___define_property_0.2.5.tgz"; - path = fetchurl { - name = "define_property___define_property_0.2.5.tgz"; - url = "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz"; - sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116"; - }; - } - - { - name = "define_property___define_property_1.0.0.tgz"; - path = fetchurl { - name = "define_property___define_property_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz"; - sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"; - }; - } - - { - name = "define_property___define_property_2.0.2.tgz"; - path = fetchurl { - name = "define_property___define_property_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz"; - sha1 = "d459689e8d654ba77e02a817f8710d702cb16e9d"; - }; - } - - { - name = "defined___defined_1.0.0.tgz"; - path = fetchurl { - name = "defined___defined_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz"; - sha1 = "c98d9bcef75674188e110969151199e39b1fa693"; - }; - } - - { - name = "del___del_3.0.0.tgz"; - path = fetchurl { - name = "del___del_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz"; - sha1 = "53ecf699ffcbcb39637691ab13baf160819766e5"; - }; - } - - { - name = "delayed_stream___delayed_stream_1.0.0.tgz"; - path = fetchurl { - name = "delayed_stream___delayed_stream_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz"; - sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619"; - }; - } - - { - name = "delegates___delegates_1.0.0.tgz"; - path = fetchurl { - name = "delegates___delegates_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz"; - sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a"; - }; - } - - { - name = "depd___depd_1.1.1.tgz"; - path = fetchurl { - name = "depd___depd_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz"; - sha1 = "5783b4e1c459f06fa5ca27f991f3d06e7a310359"; - }; - } - - { - name = "depd___depd_1.1.2.tgz"; - path = fetchurl { - name = "depd___depd_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz"; - sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9"; - }; - } - - { - name = "des.js___des.js_1.0.0.tgz"; - path = fetchurl { - name = "des.js___des.js_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz"; - sha1 = "c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"; - }; - } - - { - name = "destroy___destroy_1.0.4.tgz"; - path = fetchurl { - name = "destroy___destroy_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz"; - sha1 = "978857442c44749e4206613e37946205826abd80"; - }; - } - - { - name = "detect_indent___detect_indent_4.0.0.tgz"; - path = fetchurl { - name = "detect_indent___detect_indent_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz"; - sha1 = "f76d064352cdf43a1cb6ce619c4ee3a9475de208"; - }; - } - - { - name = "detect_libc___detect_libc_1.0.3.tgz"; - path = fetchurl { - name = "detect_libc___detect_libc_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz"; - sha1 = "fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"; - }; - } - - { - name = "detect_node___detect_node_2.0.3.tgz"; - path = fetchurl { - name = "detect_node___detect_node_2.0.3.tgz"; - url = "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz"; - sha1 = "a2033c09cc8e158d37748fbde7507832bd6ce127"; - }; - } - - { - name = "diffie_hellman___diffie_hellman_5.0.3.tgz"; - path = fetchurl { - name = "diffie_hellman___diffie_hellman_5.0.3.tgz"; - url = "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz"; - sha1 = "40e8ee98f55a2149607146921c63e1ae5f3d2875"; - }; - } - - { - name = "dns_equal___dns_equal_1.0.0.tgz"; - path = fetchurl { - name = "dns_equal___dns_equal_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz"; - sha1 = "b39e7f1da6eb0a75ba9c17324b34753c47e0654d"; - }; - } - - { - name = "dns_packet___dns_packet_1.3.1.tgz"; - path = fetchurl { - name = "dns_packet___dns_packet_1.3.1.tgz"; - url = "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz"; - sha1 = "12aa426981075be500b910eedcd0b47dd7deda5a"; - }; - } - - { - name = "dns_txt___dns_txt_2.0.2.tgz"; - path = fetchurl { - name = "dns_txt___dns_txt_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz"; - sha1 = "b91d806f5d27188e4ab3e7d107d881a1cc4642b6"; - }; - } - - { - name = "dom_converter___dom_converter_0.1.4.tgz"; - path = fetchurl { - name = "dom_converter___dom_converter_0.1.4.tgz"; - url = "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz"; - sha1 = "a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b"; - }; - } - - { - name = "dom_serializer___dom_serializer_0.1.0.tgz"; - path = fetchurl { - name = "dom_serializer___dom_serializer_0.1.0.tgz"; - url = "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz"; - sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82"; - }; - } - - { - name = "domain_browser___domain_browser_1.2.0.tgz"; - path = fetchurl { - name = "domain_browser___domain_browser_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz"; - sha1 = "3d31f50191a6749dd1375a7f522e823d42e54eda"; - }; - } - - { - name = "domelementtype___domelementtype_1.3.0.tgz"; - path = fetchurl { - name = "domelementtype___domelementtype_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz"; - sha1 = "b17aed82e8ab59e52dd9c19b1756e0fc187204c2"; - }; - } - - { - name = "domelementtype___domelementtype_1.1.3.tgz"; - path = fetchurl { - name = "domelementtype___domelementtype_1.1.3.tgz"; - url = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz"; - sha1 = "bd28773e2642881aec51544924299c5cd822185b"; - }; - } - - { - name = "domhandler___domhandler_2.1.0.tgz"; - path = fetchurl { - name = "domhandler___domhandler_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz"; - sha1 = "d2646f5e57f6c3bab11cf6cb05d3c0acf7412594"; - }; - } - - { - name = "domutils___domutils_1.1.6.tgz"; - path = fetchurl { - name = "domutils___domutils_1.1.6.tgz"; - url = "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz"; - sha1 = "bddc3de099b9a2efacc51c623f28f416ecc57485"; - }; - } - - { - name = "domutils___domutils_1.5.1.tgz"; - path = fetchurl { - name = "domutils___domutils_1.5.1.tgz"; - url = "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz"; - sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf"; - }; - } - - { - name = "ecc_jsbn___ecc_jsbn_0.1.1.tgz"; - path = fetchurl { - name = "ecc_jsbn___ecc_jsbn_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz"; - sha1 = "0fc73a9ed5f0d53c38193398523ef7e543777505"; - }; - } - - { - name = "ee_first___ee_first_1.1.1.tgz"; - path = fetchurl { - name = "ee_first___ee_first_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz"; - sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d"; - }; - } - - { - name = "electron_to_chromium___electron_to_chromium_1.3.52.tgz"; - path = fetchurl { - name = "electron_to_chromium___electron_to_chromium_1.3.52.tgz"; - url = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz"; - sha1 = "d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0"; - }; - } - - { - name = "elliptic___elliptic_6.4.0.tgz"; - path = fetchurl { - name = "elliptic___elliptic_6.4.0.tgz"; - url = "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz"; - sha1 = "cac9af8762c85836187003c8dfe193e5e2eae5df"; - }; - } - - { - name = "emojis_list___emojis_list_2.1.0.tgz"; - path = fetchurl { - name = "emojis_list___emojis_list_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz"; - sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389"; - }; - } - - { - name = "encodeurl___encodeurl_1.0.2.tgz"; - path = fetchurl { - name = "encodeurl___encodeurl_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz"; - sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"; - }; - } - - { - name = "enhanced_resolve___enhanced_resolve_3.4.1.tgz"; - path = fetchurl { - name = "enhanced_resolve___enhanced_resolve_3.4.1.tgz"; - url = "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz"; - sha1 = "0421e339fd71419b3da13d129b3979040230476e"; - }; - } - - { - name = "entities___entities_1.1.1.tgz"; - path = fetchurl { - name = "entities___entities_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz"; - sha1 = "6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"; - }; - } - - { - name = "errno___errno_0.1.7.tgz"; - path = fetchurl { - name = "errno___errno_0.1.7.tgz"; - url = "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz"; - sha1 = "4684d71779ad39af177e3f007996f7c67c852618"; - }; - } - - { - name = "error_ex___error_ex_1.3.2.tgz"; - path = fetchurl { - name = "error_ex___error_ex_1.3.2.tgz"; - url = "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz"; - sha1 = "b4ac40648107fdcdcfae242f428bea8a14d4f1bf"; - }; - } - - { - name = "error_stack_parser___error_stack_parser_2.0.2.tgz"; - path = fetchurl { - name = "error_stack_parser___error_stack_parser_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.2.tgz"; - sha1 = "4ae8dbaa2bf90a8b450707b9149dcabca135520d"; - }; - } - - { - name = "es_abstract___es_abstract_1.12.0.tgz"; - path = fetchurl { - name = "es_abstract___es_abstract_1.12.0.tgz"; - url = "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz"; - sha1 = "9dbbdd27c6856f0001421ca18782d786bf8a6165"; - }; - } - - { - name = "es_to_primitive___es_to_primitive_1.1.1.tgz"; - path = fetchurl { - name = "es_to_primitive___es_to_primitive_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz"; - sha1 = "45355248a88979034b6792e19bb81f2b7975dd0d"; - }; - } - - { - name = "es5_ext___es5_ext_0.10.45.tgz"; - path = fetchurl { - name = "es5_ext___es5_ext_0.10.45.tgz"; - url = "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz"; - sha1 = "0bfdf7b473da5919d5adf3bd25ceb754fccc3653"; - }; - } - - { - name = "es6_iterator___es6_iterator_2.0.3.tgz"; - path = fetchurl { - name = "es6_iterator___es6_iterator_2.0.3.tgz"; - url = "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz"; - sha1 = "a7de889141a05a94b0854403b2d0a0fbfa98f3b7"; - }; - } - - { - name = "es6_map___es6_map_0.1.5.tgz"; - path = fetchurl { - name = "es6_map___es6_map_0.1.5.tgz"; - url = "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz"; - sha1 = "9136e0503dcc06a301690f0bb14ff4e364e949f0"; - }; - } - - { - name = "es6_set___es6_set_0.1.5.tgz"; - path = fetchurl { - name = "es6_set___es6_set_0.1.5.tgz"; - url = "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz"; - sha1 = "d2b3ec5d4d800ced818db538d28974db0a73ccb1"; - }; - } - - { - name = "es6_symbol___es6_symbol_3.1.1.tgz"; - path = fetchurl { - name = "es6_symbol___es6_symbol_3.1.1.tgz"; - url = "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz"; - sha1 = "bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"; - }; - } - - { - name = "es6_weak_map___es6_weak_map_2.0.2.tgz"; - path = fetchurl { - name = "es6_weak_map___es6_weak_map_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz"; - sha1 = "5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"; - }; - } - - { - name = "escape_html___escape_html_1.0.3.tgz"; - path = fetchurl { - name = "escape_html___escape_html_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz"; - sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988"; - }; - } - - { - name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz"; - path = fetchurl { - name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz"; - url = "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"; - sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"; - }; - } - - { - name = "escope___escope_3.6.0.tgz"; - path = fetchurl { - name = "escope___escope_3.6.0.tgz"; - url = "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz"; - sha1 = "e01975e812781a163a6dadfdd80398dc64c889c3"; - }; - } - - { - name = "esprima___esprima_2.7.3.tgz"; - path = fetchurl { - name = "esprima___esprima_2.7.3.tgz"; - url = "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz"; - sha1 = "96e3b70d5779f6ad49cd032673d1c312767ba581"; - }; - } - - { - name = "esrecurse___esrecurse_4.2.1.tgz"; - path = fetchurl { - name = "esrecurse___esrecurse_4.2.1.tgz"; - url = "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz"; - sha1 = "007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"; - }; - } - - { - name = "estraverse___estraverse_4.2.0.tgz"; - path = fetchurl { - name = "estraverse___estraverse_4.2.0.tgz"; - url = "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz"; - sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13"; - }; - } - - { - name = "esutils___esutils_2.0.2.tgz"; - path = fetchurl { - name = "esutils___esutils_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz"; - sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"; - }; - } - - { - name = "etag___etag_1.8.1.tgz"; - path = fetchurl { - name = "etag___etag_1.8.1.tgz"; - url = "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz"; - sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887"; - }; - } - - { - name = "event_emitter___event_emitter_0.3.5.tgz"; - path = fetchurl { - name = "event_emitter___event_emitter_0.3.5.tgz"; - url = "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz"; - sha1 = "df8c69eef1647923c7157b9ce83840610b02cc39"; - }; - } - - { - name = "eventemitter3___eventemitter3_3.1.0.tgz"; - path = fetchurl { - name = "eventemitter3___eventemitter3_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz"; - sha1 = "090b4d6cdbd645ed10bf750d4b5407942d7ba163"; - }; - } - - { - name = "events___events_1.1.1.tgz"; - path = fetchurl { - name = "events___events_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz"; - sha1 = "9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"; - }; - } - - { - name = "eventsource___eventsource_0.1.6.tgz"; - path = fetchurl { - name = "eventsource___eventsource_0.1.6.tgz"; - url = "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz"; - sha1 = "0acede849ed7dd1ccc32c811bb11b944d4f29232"; - }; - } - - { - name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz"; - path = fetchurl { - name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz"; - sha1 = "7fcbdb198dc71959432efe13842684e0525acb02"; - }; - } - - { - name = "execa___execa_0.7.0.tgz"; - path = fetchurl { - name = "execa___execa_0.7.0.tgz"; - url = "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz"; - sha1 = "944becd34cc41ee32a63a9faf27ad5a65fc59777"; - }; - } - - { - name = "expand_brackets___expand_brackets_0.1.5.tgz"; - path = fetchurl { - name = "expand_brackets___expand_brackets_0.1.5.tgz"; - url = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz"; - sha1 = "df07284e342a807cd733ac5af72411e581d1177b"; - }; - } - - { - name = "expand_brackets___expand_brackets_2.1.4.tgz"; - path = fetchurl { - name = "expand_brackets___expand_brackets_2.1.4.tgz"; - url = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz"; - sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622"; - }; - } - - { - name = "expand_range___expand_range_1.8.2.tgz"; - path = fetchurl { - name = "expand_range___expand_range_1.8.2.tgz"; - url = "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz"; - sha1 = "a299effd335fe2721ebae8e257ec79644fc85337"; - }; - } - - { - name = "express___express_4.16.3.tgz"; - path = fetchurl { - name = "express___express_4.16.3.tgz"; - url = "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz"; - sha1 = "6af8a502350db3246ecc4becf6b5a34d22f7ed53"; - }; - } - - { - name = "extend_shallow___extend_shallow_2.0.1.tgz"; - path = fetchurl { - name = "extend_shallow___extend_shallow_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz"; - sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f"; - }; - } - - { - name = "extend_shallow___extend_shallow_3.0.2.tgz"; - path = fetchurl { - name = "extend_shallow___extend_shallow_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz"; - sha1 = "26a71aaf073b39fb2127172746131c2704028db8"; - }; - } - - { - name = "extend___extend_3.0.2.tgz"; - path = fetchurl { - name = "extend___extend_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz"; - sha1 = "f8b1136b4071fbd8eb140aff858b1019ec2915fa"; - }; - } - - { - name = "extglob___extglob_0.3.2.tgz"; - path = fetchurl { - name = "extglob___extglob_0.3.2.tgz"; - url = "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz"; - sha1 = "2e18ff3d2f49ab2765cec9023f011daa8d8349a1"; - }; - } - - { - name = "extglob___extglob_2.0.4.tgz"; - path = fetchurl { - name = "extglob___extglob_2.0.4.tgz"; - url = "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz"; - sha1 = "ad00fe4dc612a9232e8718711dc5cb5ab0285543"; - }; - } - - { - name = "extract_text_webpack_plugin___extract_text_webpack_plugin_3.0.2.tgz"; - path = fetchurl { - name = "extract_text_webpack_plugin___extract_text_webpack_plugin_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz"; - sha1 = "5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7"; - }; - } - - { - name = "extsprintf___extsprintf_1.3.0.tgz"; - path = fetchurl { - name = "extsprintf___extsprintf_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz"; - sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05"; - }; - } - - { - name = "extsprintf___extsprintf_1.4.0.tgz"; - path = fetchurl { - name = "extsprintf___extsprintf_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz"; - sha1 = "e2689f8f356fad62cca65a3a91c5df5f9551692f"; - }; - } - - { - name = "fast_deep_equal___fast_deep_equal_1.1.0.tgz"; - path = fetchurl { - name = "fast_deep_equal___fast_deep_equal_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz"; - sha1 = "c053477817c86b51daa853c81e059b733d023614"; - }; - } - - { - name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz"; - path = fetchurl { - name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz"; - sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"; - }; - } - - { - name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz"; - path = fetchurl { - name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz"; - sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2"; - }; - } - - { - name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz"; - path = fetchurl { - name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz"; - url = "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"; - sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917"; - }; - } - - { - name = "fastparse___fastparse_1.1.1.tgz"; - path = fetchurl { - name = "fastparse___fastparse_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz"; - sha1 = "d1e2643b38a94d7583b479060e6c4affc94071f8"; - }; - } - - { - name = "faye_websocket___faye_websocket_0.10.0.tgz"; - path = fetchurl { - name = "faye_websocket___faye_websocket_0.10.0.tgz"; - url = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz"; - sha1 = "4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"; - }; - } - - { - name = "faye_websocket___faye_websocket_0.11.1.tgz"; - path = fetchurl { - name = "faye_websocket___faye_websocket_0.11.1.tgz"; - url = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz"; - sha1 = "f0efe18c4f56e4f40afc7e06c719fd5ee6188f38"; - }; - } - - { - name = "file_loader___file_loader_0.10.1.tgz"; - path = fetchurl { - name = "file_loader___file_loader_0.10.1.tgz"; - url = "https://registry.yarnpkg.com/file-loader/-/file-loader-0.10.1.tgz"; - sha1 = "815034119891fc6441fb5a64c11bc93c22ddd842"; - }; - } - - { - name = "filename_regex___filename_regex_2.0.1.tgz"; - path = fetchurl { - name = "filename_regex___filename_regex_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz"; - sha1 = "c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"; - }; - } - - { - name = "fill_range___fill_range_2.2.4.tgz"; - path = fetchurl { - name = "fill_range___fill_range_2.2.4.tgz"; - url = "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz"; - sha1 = "eb1e773abb056dcd8df2bfdf6af59b8b3a936565"; - }; - } - - { - name = "fill_range___fill_range_4.0.0.tgz"; - path = fetchurl { - name = "fill_range___fill_range_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz"; - sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7"; - }; - } - - { - name = "finalhandler___finalhandler_1.1.1.tgz"; - path = fetchurl { - name = "finalhandler___finalhandler_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz"; - sha1 = "eebf4ed840079c83f4249038c9d703008301b105"; - }; - } - - { - name = "find_cache_dir___find_cache_dir_1.0.0.tgz"; - path = fetchurl { - name = "find_cache_dir___find_cache_dir_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz"; - sha1 = "9288e3e9e3cc3748717d39eade17cf71fc30ee6f"; - }; - } - - { - name = "find_up___find_up_1.1.2.tgz"; - path = fetchurl { - name = "find_up___find_up_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz"; - sha1 = "6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"; - }; - } - - { - name = "find_up___find_up_2.1.0.tgz"; - path = fetchurl { - name = "find_up___find_up_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz"; - sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7"; - }; - } - - { - name = "flatten___flatten_1.0.2.tgz"; - path = fetchurl { - name = "flatten___flatten_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz"; - sha1 = "dae46a9d78fbe25292258cc1e780a41d95c03782"; - }; - } - - { - name = "follow_redirects___follow_redirects_1.5.1.tgz"; - path = fetchurl { - name = "follow_redirects___follow_redirects_1.5.1.tgz"; - url = "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.1.tgz"; - sha1 = "67a8f14f5a1f67f962c2c46469c79eaec0a90291"; - }; - } - - { - name = "for_in___for_in_0.1.8.tgz"; - path = fetchurl { - name = "for_in___for_in_0.1.8.tgz"; - url = "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz"; - sha1 = "d8773908e31256109952b1fdb9b3fa867d2775e1"; - }; - } - - { - name = "for_in___for_in_1.0.2.tgz"; - path = fetchurl { - name = "for_in___for_in_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz"; - sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80"; - }; - } - - { - name = "for_own___for_own_0.1.5.tgz"; - path = fetchurl { - name = "for_own___for_own_0.1.5.tgz"; - url = "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz"; - sha1 = "5265c681a4f294dabbf17c9509b6763aa84510ce"; - }; - } - - { - name = "for_own___for_own_1.0.0.tgz"; - path = fetchurl { - name = "for_own___for_own_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz"; - sha1 = "c63332f415cedc4b04dbfe70cf836494c53cb44b"; - }; - } - - { - name = "foreach___foreach_2.0.5.tgz"; - path = fetchurl { - name = "foreach___foreach_2.0.5.tgz"; - url = "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz"; - sha1 = "0bee005018aeb260d0a3af3ae658dd0136ec1b99"; - }; - } - - { - name = "forever_agent___forever_agent_0.6.1.tgz"; - path = fetchurl { - name = "forever_agent___forever_agent_0.6.1.tgz"; - url = "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz"; - sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"; - }; - } - - { - name = "form_data___form_data_2.1.4.tgz"; - path = fetchurl { - name = "form_data___form_data_2.1.4.tgz"; - url = "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz"; - sha1 = "33c183acf193276ecaa98143a69e94bfee1750d1"; - }; - } - - { - name = "form_data___form_data_2.3.2.tgz"; - path = fetchurl { - name = "form_data___form_data_2.3.2.tgz"; - url = "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz"; - sha1 = "4970498be604c20c005d4f5c23aecd21d6b49099"; - }; - } - - { - name = "forwarded___forwarded_0.1.2.tgz"; - path = fetchurl { - name = "forwarded___forwarded_0.1.2.tgz"; - url = "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz"; - sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84"; - }; - } - - { - name = "fragment_cache___fragment_cache_0.2.1.tgz"; - path = fetchurl { - name = "fragment_cache___fragment_cache_0.2.1.tgz"; - url = "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz"; - sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19"; - }; - } - - { - name = "fresh___fresh_0.5.2.tgz"; - path = fetchurl { - name = "fresh___fresh_0.5.2.tgz"; - url = "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz"; - sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7"; - }; - } - - { - name = "friendly_errors_webpack_plugin___friendly_errors_webpack_plugin_1.7.0.tgz"; - path = fetchurl { - name = "friendly_errors_webpack_plugin___friendly_errors_webpack_plugin_1.7.0.tgz"; - url = "https://registry.yarnpkg.com/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz"; - sha1 = "efc86cbb816224565861a1be7a9d84d0aafea136"; - }; - } - - { - name = "fs_extra___fs_extra_2.1.2.tgz"; - path = fetchurl { - name = "fs_extra___fs_extra_2.1.2.tgz"; - url = "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz"; - sha1 = "046c70163cef9aad46b0e4a7fa467fb22d71de35"; - }; - } - - { - name = "fs_minipass___fs_minipass_1.2.5.tgz"; - path = fetchurl { - name = "fs_minipass___fs_minipass_1.2.5.tgz"; - url = "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz"; - sha1 = "06c277218454ec288df77ada54a03b8702aacb9d"; - }; - } - - { - name = "fs.realpath___fs.realpath_1.0.0.tgz"; - path = fetchurl { - name = "fs.realpath___fs.realpath_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz"; - sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f"; - }; - } - - { - name = "fsevents___fsevents_1.2.4.tgz"; - path = fetchurl { - name = "fsevents___fsevents_1.2.4.tgz"; - url = "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz"; - sha1 = "f41dcb1af2582af3692da36fc55cbd8e1041c426"; - }; - } - - { - name = "fstream___fstream_1.0.11.tgz"; - path = fetchurl { - name = "fstream___fstream_1.0.11.tgz"; - url = "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz"; - sha1 = "5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"; - }; - } - - { - name = "function_bind___function_bind_1.1.1.tgz"; - path = fetchurl { - name = "function_bind___function_bind_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz"; - sha1 = "a56899d3ea3c9bab874bb9773b7c5ede92f4895d"; - }; - } - - { - name = "gauge___gauge_2.7.4.tgz"; - path = fetchurl { - name = "gauge___gauge_2.7.4.tgz"; - url = "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz"; - sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7"; - }; - } - - { - name = "gaze___gaze_1.1.3.tgz"; - path = fetchurl { - name = "gaze___gaze_1.1.3.tgz"; - url = "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz"; - sha1 = "c441733e13b927ac8c0ff0b4c3b033f28812924a"; - }; - } - - { - name = "get_caller_file___get_caller_file_1.0.3.tgz"; - path = fetchurl { - name = "get_caller_file___get_caller_file_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz"; - sha1 = "f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"; - }; - } - - { - name = "get_stdin___get_stdin_4.0.1.tgz"; - path = fetchurl { - name = "get_stdin___get_stdin_4.0.1.tgz"; - url = "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz"; - sha1 = "b968c6b0a04384324902e8bf1a5df32579a450fe"; - }; - } - - { - name = "get_stream___get_stream_3.0.0.tgz"; - path = fetchurl { - name = "get_stream___get_stream_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz"; - sha1 = "8e943d1358dc37555054ecbe2edb05aa174ede14"; - }; - } - - { - name = "get_value___get_value_2.0.6.tgz"; - path = fetchurl { - name = "get_value___get_value_2.0.6.tgz"; - url = "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz"; - sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28"; - }; - } - - { - name = "getpass___getpass_0.1.7.tgz"; - path = fetchurl { - name = "getpass___getpass_0.1.7.tgz"; - url = "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz"; - sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa"; - }; - } - - { - name = "glob_base___glob_base_0.3.0.tgz"; - path = fetchurl { - name = "glob_base___glob_base_0.3.0.tgz"; - url = "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz"; - sha1 = "dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"; - }; - } - - { - name = "glob_parent___glob_parent_2.0.0.tgz"; - path = fetchurl { - name = "glob_parent___glob_parent_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz"; - sha1 = "81383d72db054fcccf5336daa902f182f6edbb28"; - }; - } - - { - name = "glob_parent___glob_parent_3.1.0.tgz"; - path = fetchurl { - name = "glob_parent___glob_parent_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz"; - sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae"; - }; - } - - { - name = "glob___glob_6.0.4.tgz"; - path = fetchurl { - name = "glob___glob_6.0.4.tgz"; - url = "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz"; - sha1 = "0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"; - }; - } - - { - name = "glob___glob_7.1.2.tgz"; - path = fetchurl { - name = "glob___glob_7.1.2.tgz"; - url = "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz"; - sha1 = "c19c9df9a028702d678612384a6552404c636d15"; - }; - } - - { - name = "globals___globals_9.18.0.tgz"; - path = fetchurl { - name = "globals___globals_9.18.0.tgz"; - url = "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz"; - sha1 = "aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"; - }; - } - - { - name = "globby___globby_6.1.0.tgz"; - path = fetchurl { - name = "globby___globby_6.1.0.tgz"; - url = "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz"; - sha1 = "f5a6d70e8395e21c858fb0489d64df02424d506c"; - }; - } - - { - name = "globule___globule_1.2.1.tgz"; - path = fetchurl { - name = "globule___globule_1.2.1.tgz"; - url = "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz"; - sha1 = "5dffb1b191f22d20797a9369b49eab4e9839696d"; - }; - } - - { - name = "graceful_fs___graceful_fs_4.1.11.tgz"; - path = fetchurl { - name = "graceful_fs___graceful_fs_4.1.11.tgz"; - url = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz"; - sha1 = "0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"; - }; - } - - { - name = "handle_thing___handle_thing_1.2.5.tgz"; - path = fetchurl { - name = "handle_thing___handle_thing_1.2.5.tgz"; - url = "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz"; - sha1 = "fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"; - }; - } - - { - name = "har_schema___har_schema_1.0.5.tgz"; - path = fetchurl { - name = "har_schema___har_schema_1.0.5.tgz"; - url = "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz"; - sha1 = "d263135f43307c02c602afc8fe95970c0151369e"; - }; - } - - { - name = "har_schema___har_schema_2.0.0.tgz"; - path = fetchurl { - name = "har_schema___har_schema_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz"; - sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92"; - }; - } - - { - name = "har_validator___har_validator_4.2.1.tgz"; - path = fetchurl { - name = "har_validator___har_validator_4.2.1.tgz"; - url = "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz"; - sha1 = "33481d0f1bbff600dd203d75812a6a5fba002e2a"; - }; - } - - { - name = "har_validator___har_validator_5.0.3.tgz"; - path = fetchurl { - name = "har_validator___har_validator_5.0.3.tgz"; - url = "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz"; - sha1 = "ba402c266194f15956ef15e0fcf242993f6a7dfd"; - }; - } - - { - name = "has_ansi___has_ansi_2.0.0.tgz"; - path = fetchurl { - name = "has_ansi___has_ansi_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz"; - sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91"; - }; - } - - { - name = "has_flag___has_flag_1.0.0.tgz"; - path = fetchurl { - name = "has_flag___has_flag_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz"; - sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa"; - }; - } - - { - name = "has_flag___has_flag_2.0.0.tgz"; - path = fetchurl { - name = "has_flag___has_flag_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz"; - sha1 = "e8207af1cc7b30d446cc70b734b5e8be18f88d51"; - }; - } - - { - name = "has_flag___has_flag_3.0.0.tgz"; - path = fetchurl { - name = "has_flag___has_flag_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz"; - sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd"; - }; - } - - { - name = "has_unicode___has_unicode_2.0.1.tgz"; - path = fetchurl { - name = "has_unicode___has_unicode_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz"; - sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9"; - }; - } - - { - name = "has_value___has_value_0.3.1.tgz"; - path = fetchurl { - name = "has_value___has_value_0.3.1.tgz"; - url = "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz"; - sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f"; - }; - } - - { - name = "has_value___has_value_1.0.0.tgz"; - path = fetchurl { - name = "has_value___has_value_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz"; - sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177"; - }; - } - - { - name = "has_values___has_values_0.1.4.tgz"; - path = fetchurl { - name = "has_values___has_values_0.1.4.tgz"; - url = "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz"; - sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771"; - }; - } - - { - name = "has_values___has_values_1.0.0.tgz"; - path = fetchurl { - name = "has_values___has_values_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz"; - sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f"; - }; - } - - { - name = "has___has_1.0.3.tgz"; - path = fetchurl { - name = "has___has_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz"; - sha1 = "722d7cbfc1f6aa8241f16dd814e011e1f41e8796"; - }; - } - - { - name = "hash_base___hash_base_3.0.4.tgz"; - path = fetchurl { - name = "hash_base___hash_base_3.0.4.tgz"; - url = "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz"; - sha1 = "5fc8686847ecd73499403319a6b0a3f3f6ae4918"; - }; - } - - { - name = "hash.js___hash.js_1.1.5.tgz"; - path = fetchurl { - name = "hash.js___hash.js_1.1.5.tgz"; - url = "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz"; - sha1 = "e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"; - }; - } - - { - name = "hawk___hawk_3.1.3.tgz"; - path = fetchurl { - name = "hawk___hawk_3.1.3.tgz"; - url = "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz"; - sha1 = "078444bd7c1640b0fe540d2c9b73d59678e8e1c4"; - }; - } - - { - name = "hmac_drbg___hmac_drbg_1.0.1.tgz"; - path = fetchurl { - name = "hmac_drbg___hmac_drbg_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz"; - sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1"; - }; - } - - { - name = "hoek___hoek_2.16.3.tgz"; - path = fetchurl { - name = "hoek___hoek_2.16.3.tgz"; - url = "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz"; - sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed"; - }; - } - - { - name = "home_or_tmp___home_or_tmp_2.0.0.tgz"; - path = fetchurl { - name = "home_or_tmp___home_or_tmp_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz"; - sha1 = "e36c3f2d2cae7d746a857e38d18d5f32a7882db8"; - }; - } - - { - name = "hosted_git_info___hosted_git_info_2.7.1.tgz"; - path = fetchurl { - name = "hosted_git_info___hosted_git_info_2.7.1.tgz"; - url = "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz"; - sha1 = "97f236977bd6e125408930ff6de3eec6281ec047"; - }; - } - - { - name = "hpack.js___hpack.js_2.1.6.tgz"; - path = fetchurl { - name = "hpack.js___hpack.js_2.1.6.tgz"; - url = "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz"; - sha1 = "87774c0949e513f42e84575b3c45681fade2a0b2"; - }; - } - - { - name = "html_comment_regex___html_comment_regex_1.1.1.tgz"; - path = fetchurl { - name = "html_comment_regex___html_comment_regex_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz"; - sha1 = "668b93776eaae55ebde8f3ad464b307a4963625e"; - }; - } - - { - name = "html_entities___html_entities_1.2.1.tgz"; - path = fetchurl { - name = "html_entities___html_entities_1.2.1.tgz"; - url = "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz"; - sha1 = "0df29351f0721163515dfb9e5543e5f6eed5162f"; - }; - } - - { - name = "htmlparser2___htmlparser2_3.3.0.tgz"; - path = fetchurl { - name = "htmlparser2___htmlparser2_3.3.0.tgz"; - url = "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz"; - sha1 = "cc70d05a59f6542e43f0e685c982e14c924a9efe"; - }; - } - - { - name = "http_deceiver___http_deceiver_1.2.7.tgz"; - path = fetchurl { - name = "http_deceiver___http_deceiver_1.2.7.tgz"; - url = "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz"; - sha1 = "fa7168944ab9a519d337cb0bec7284dc3e723d87"; - }; - } - - { - name = "http_errors___http_errors_1.6.2.tgz"; - path = fetchurl { - name = "http_errors___http_errors_1.6.2.tgz"; - url = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz"; - sha1 = "0a002cc85707192a7e7946ceedc11155f60ec736"; - }; - } - - { - name = "http_errors___http_errors_1.6.3.tgz"; - path = fetchurl { - name = "http_errors___http_errors_1.6.3.tgz"; - url = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz"; - sha1 = "8b55680bb4be283a0b5bf4ea2e38580be1d9320d"; - }; - } - - { - name = "http_parser_js___http_parser_js_0.4.13.tgz"; - path = fetchurl { - name = "http_parser_js___http_parser_js_0.4.13.tgz"; - url = "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz"; - sha1 = "3bd6d6fde6e3172c9334c3b33b6c193d80fe1137"; - }; - } - - { - name = "http_proxy_middleware___http_proxy_middleware_0.17.4.tgz"; - path = fetchurl { - name = "http_proxy_middleware___http_proxy_middleware_0.17.4.tgz"; - url = "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz"; - sha1 = "642e8848851d66f09d4f124912846dbaeb41b833"; - }; - } - - { - name = "http_proxy___http_proxy_1.17.0.tgz"; - path = fetchurl { - name = "http_proxy___http_proxy_1.17.0.tgz"; - url = "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz"; - sha1 = "7ad38494658f84605e2f6db4436df410f4e5be9a"; - }; - } - - { - name = "http_signature___http_signature_1.1.1.tgz"; - path = fetchurl { - name = "http_signature___http_signature_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz"; - sha1 = "df72e267066cd0ac67fb76adf8e134a8fbcf91bf"; - }; - } - - { - name = "http_signature___http_signature_1.2.0.tgz"; - path = fetchurl { - name = "http_signature___http_signature_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz"; - sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1"; - }; - } - - { - name = "https_browserify___https_browserify_1.0.0.tgz"; - path = fetchurl { - name = "https_browserify___https_browserify_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz"; - sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"; - }; - } - - { - name = "iconv_lite___iconv_lite_0.4.19.tgz"; - path = fetchurl { - name = "iconv_lite___iconv_lite_0.4.19.tgz"; - url = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz"; - sha1 = "f7468f60135f5e5dad3399c0a81be9a1603a082b"; - }; - } - - { - name = "iconv_lite___iconv_lite_0.4.23.tgz"; - path = fetchurl { - name = "iconv_lite___iconv_lite_0.4.23.tgz"; - url = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz"; - sha1 = "297871f63be507adcfbfca715d0cd0eed84e9a63"; - }; - } - - { - name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz"; - path = fetchurl { - name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz"; - sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded"; - }; - } - - { - name = "ieee754___ieee754_1.1.12.tgz"; - path = fetchurl { - name = "ieee754___ieee754_1.1.12.tgz"; - url = "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz"; - sha1 = "50bf24e5b9c8bb98af4964c941cdb0918da7b60b"; - }; - } - - { - name = "ignore_walk___ignore_walk_3.0.1.tgz"; - path = fetchurl { - name = "ignore_walk___ignore_walk_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz"; - sha1 = "a83e62e7d272ac0e3b551aaa82831a19b69f82f8"; - }; - } - - { - name = "import_local___import_local_1.0.0.tgz"; - path = fetchurl { - name = "import_local___import_local_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz"; - sha1 = "5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"; - }; - } - - { - name = "in_publish___in_publish_2.0.0.tgz"; - path = fetchurl { - name = "in_publish___in_publish_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz"; - sha1 = "e20ff5e3a2afc2690320b6dc552682a9c7fadf51"; - }; - } - - { - name = "indent_string___indent_string_2.1.0.tgz"; - path = fetchurl { - name = "indent_string___indent_string_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz"; - sha1 = "8e2d48348742121b4a8218b7a137e9a52049dc80"; - }; - } - - { - name = "indexes_of___indexes_of_1.0.1.tgz"; - path = fetchurl { - name = "indexes_of___indexes_of_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz"; - sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607"; - }; - } - - { - name = "indexof___indexof_0.0.1.tgz"; - path = fetchurl { - name = "indexof___indexof_0.0.1.tgz"; - url = "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz"; - sha1 = "82dc336d232b9062179d05ab3293a66059fd435d"; - }; - } - - { - name = "inflight___inflight_1.0.6.tgz"; - path = fetchurl { - name = "inflight___inflight_1.0.6.tgz"; - url = "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz"; - sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9"; - }; - } - - { - name = "inherits___inherits_2.0.3.tgz"; - path = fetchurl { - name = "inherits___inherits_2.0.3.tgz"; - url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz"; - sha1 = "633c2c83e3da42a502f52466022480f4208261de"; - }; - } - - { - name = "inherits___inherits_2.0.1.tgz"; - path = fetchurl { - name = "inherits___inherits_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz"; - sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1"; - }; - } - - { - name = "ini___ini_1.3.5.tgz"; - path = fetchurl { - name = "ini___ini_1.3.5.tgz"; - url = "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz"; - sha1 = "eee25f56db1c9ec6085e0c22778083f596abf927"; - }; - } - - { - name = "internal_ip___internal_ip_1.2.0.tgz"; - path = fetchurl { - name = "internal_ip___internal_ip_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz"; - sha1 = "ae9fbf93b984878785d50a8de1b356956058cf5c"; - }; - } - - { - name = "interpret___interpret_1.1.0.tgz"; - path = fetchurl { - name = "interpret___interpret_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz"; - sha1 = "7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"; - }; - } - - { - name = "invariant___invariant_2.2.4.tgz"; - path = fetchurl { - name = "invariant___invariant_2.2.4.tgz"; - url = "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz"; - sha1 = "610f3c92c9359ce1db616e538008d23ff35158e6"; - }; - } - - { - name = "invert_kv___invert_kv_1.0.0.tgz"; - path = fetchurl { - name = "invert_kv___invert_kv_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz"; - sha1 = "104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"; - }; - } - - { - name = "ip___ip_1.1.5.tgz"; - path = fetchurl { - name = "ip___ip_1.1.5.tgz"; - url = "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz"; - sha1 = "bdded70114290828c0a039e72ef25f5aaec4354a"; - }; - } - - { - name = "ipaddr.js___ipaddr.js_1.8.0.tgz"; - path = fetchurl { - name = "ipaddr.js___ipaddr.js_1.8.0.tgz"; - url = "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz"; - sha1 = "eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"; - }; - } - - { - name = "is_absolute_url___is_absolute_url_2.1.0.tgz"; - path = fetchurl { - name = "is_absolute_url___is_absolute_url_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz"; - sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"; - }; - } - - { - name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz"; - path = fetchurl { - name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz"; - url = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz"; - sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"; - }; - } - - { - name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz"; - path = fetchurl { - name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz"; - sha1 = "169c2f6d3df1f992618072365c9b0ea1f6878656"; - }; - } - - { - name = "is_arrayish___is_arrayish_0.2.1.tgz"; - path = fetchurl { - name = "is_arrayish___is_arrayish_0.2.1.tgz"; - url = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz"; - sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d"; - }; - } - - { - name = "is_binary_path___is_binary_path_1.0.1.tgz"; - path = fetchurl { - name = "is_binary_path___is_binary_path_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz"; - sha1 = "75f16642b480f187a711c814161fd3a4a7655898"; - }; - } - - { - name = "is_buffer___is_buffer_1.1.6.tgz"; - path = fetchurl { - name = "is_buffer___is_buffer_1.1.6.tgz"; - url = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz"; - sha1 = "efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"; - }; - } - - { - name = "is_builtin_module___is_builtin_module_1.0.0.tgz"; - path = fetchurl { - name = "is_builtin_module___is_builtin_module_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz"; - sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe"; - }; - } - - { - name = "is_callable___is_callable_1.1.4.tgz"; - path = fetchurl { - name = "is_callable___is_callable_1.1.4.tgz"; - url = "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz"; - sha1 = "1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"; - }; - } - - { - name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz"; - path = fetchurl { - name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz"; - url = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz"; - sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56"; - }; - } - - { - name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz"; - path = fetchurl { - name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz"; - sha1 = "d84876321d0e7add03990406abbbbd36ba9268c7"; - }; - } - - { - name = "is_date_object___is_date_object_1.0.1.tgz"; - path = fetchurl { - name = "is_date_object___is_date_object_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz"; - sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"; - }; - } - - { - name = "is_descriptor___is_descriptor_0.1.6.tgz"; - path = fetchurl { - name = "is_descriptor___is_descriptor_0.1.6.tgz"; - url = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz"; - sha1 = "366d8240dde487ca51823b1ab9f07a10a78251ca"; - }; - } - - { - name = "is_descriptor___is_descriptor_1.0.2.tgz"; - path = fetchurl { - name = "is_descriptor___is_descriptor_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz"; - sha1 = "3b159746a66604b04f8c81524ba365c5f14d86ec"; - }; - } - - { - name = "is_dotfile___is_dotfile_1.0.3.tgz"; - path = fetchurl { - name = "is_dotfile___is_dotfile_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz"; - sha1 = "a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"; - }; - } - - { - name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz"; - path = fetchurl { - name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz"; - url = "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz"; - sha1 = "2238098fc221de0bcfa5d9eac4c45d638aa1c534"; - }; - } - - { - name = "is_extendable___is_extendable_0.1.1.tgz"; - path = fetchurl { - name = "is_extendable___is_extendable_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz"; - sha1 = "62b110e289a471418e3ec36a617d472e301dfc89"; - }; - } - - { - name = "is_extendable___is_extendable_1.0.1.tgz"; - path = fetchurl { - name = "is_extendable___is_extendable_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz"; - sha1 = "a7470f9e426733d81bd81e1155264e3a3507cab4"; - }; - } - - { - name = "is_extglob___is_extglob_1.0.0.tgz"; - path = fetchurl { - name = "is_extglob___is_extglob_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz"; - sha1 = "ac468177c4943405a092fc8f29760c6ffc6206c0"; - }; - } - - { - name = "is_extglob___is_extglob_2.1.1.tgz"; - path = fetchurl { - name = "is_extglob___is_extglob_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz"; - sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2"; - }; - } - - { - name = "is_finite___is_finite_1.0.2.tgz"; - path = fetchurl { - name = "is_finite___is_finite_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz"; - sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa"; - }; - } - - { - name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz"; - path = fetchurl { - name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz"; - sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb"; - }; - } - - { - name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz"; - path = fetchurl { - name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz"; - sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f"; - }; - } - - { - name = "is_glob___is_glob_2.0.1.tgz"; - path = fetchurl { - name = "is_glob___is_glob_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz"; - sha1 = "d096f926a3ded5600f3fdfd91198cb0888c2d863"; - }; - } - - { - name = "is_glob___is_glob_3.1.0.tgz"; - path = fetchurl { - name = "is_glob___is_glob_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz"; - sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a"; - }; - } - - { - name = "is_glob___is_glob_4.0.0.tgz"; - path = fetchurl { - name = "is_glob___is_glob_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz"; - sha1 = "9521c76845cc2610a85203ddf080a958c2ffabc0"; - }; - } - - { - name = "is_number___is_number_2.1.0.tgz"; - path = fetchurl { - name = "is_number___is_number_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz"; - sha1 = "01fcbbb393463a548f2f466cce16dece49db908f"; - }; - } - - { - name = "is_number___is_number_3.0.0.tgz"; - path = fetchurl { - name = "is_number___is_number_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz"; - sha1 = "24fd6201a4782cf50561c810276afc7d12d71195"; - }; - } - - { - name = "is_number___is_number_4.0.0.tgz"; - path = fetchurl { - name = "is_number___is_number_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz"; - sha1 = "0026e37f5454d73e356dfe6564699867c6a7f0ff"; - }; - } - - { - name = "is_path_cwd___is_path_cwd_1.0.0.tgz"; - path = fetchurl { - name = "is_path_cwd___is_path_cwd_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz"; - sha1 = "d225ec23132e89edd38fda767472e62e65f1106d"; - }; - } - - { - name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz"; - path = fetchurl { - name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz"; - sha1 = "5ac48b345ef675339bd6c7a48a912110b241cf52"; - }; - } - - { - name = "is_path_inside___is_path_inside_1.0.1.tgz"; - path = fetchurl { - name = "is_path_inside___is_path_inside_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz"; - sha1 = "8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"; - }; - } - - { - name = "is_plain_obj___is_plain_obj_1.1.0.tgz"; - path = fetchurl { - name = "is_plain_obj___is_plain_obj_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz"; - sha1 = "71a50c8429dfca773c92a390a4a03b39fcd51d3e"; - }; - } - - { - name = "is_plain_object___is_plain_object_2.0.4.tgz"; - path = fetchurl { - name = "is_plain_object___is_plain_object_2.0.4.tgz"; - url = "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz"; - sha1 = "2c163b3fafb1b606d9d17928f05c2a1c38e07677"; - }; - } - - { - name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz"; - path = fetchurl { - name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz"; - sha1 = "3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"; - }; - } - - { - name = "is_primitive___is_primitive_2.0.0.tgz"; - path = fetchurl { - name = "is_primitive___is_primitive_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz"; - sha1 = "207bab91638499c07b2adf240a41a87210034575"; - }; - } - - { - name = "is_regex___is_regex_1.0.4.tgz"; - path = fetchurl { - name = "is_regex___is_regex_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz"; - sha1 = "5517489b547091b0930e095654ced25ee97e9491"; - }; - } - - { - name = "is_stream___is_stream_1.1.0.tgz"; - path = fetchurl { - name = "is_stream___is_stream_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz"; - sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"; - }; - } - - { - name = "is_svg___is_svg_2.1.0.tgz"; - path = fetchurl { - name = "is_svg___is_svg_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz"; - sha1 = "cf61090da0d9efbcab8722deba6f032208dbb0e9"; - }; - } - - { - name = "is_symbol___is_symbol_1.0.1.tgz"; - path = fetchurl { - name = "is_symbol___is_symbol_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz"; - sha1 = "3cc59f00025194b6ab2e38dbae6689256b660572"; - }; - } - - { - name = "is_typedarray___is_typedarray_1.0.0.tgz"; - path = fetchurl { - name = "is_typedarray___is_typedarray_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz"; - sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a"; - }; - } - - { - name = "is_utf8___is_utf8_0.2.1.tgz"; - path = fetchurl { - name = "is_utf8___is_utf8_0.2.1.tgz"; - url = "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz"; - sha1 = "4b0da1442104d1b336340e80797e865cf39f7d72"; - }; - } - - { - name = "is_windows___is_windows_1.0.2.tgz"; - path = fetchurl { - name = "is_windows___is_windows_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz"; - sha1 = "d1850eb9791ecd18e6182ce12a30f396634bb19d"; - }; - } - - { - name = "is_wsl___is_wsl_1.1.0.tgz"; - path = fetchurl { - name = "is_wsl___is_wsl_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz"; - sha1 = "1f16e4aa22b04d1336b66188a66af3c600c3a66d"; - }; - } - - { - name = "isarray___isarray_0.0.1.tgz"; - path = fetchurl { - name = "isarray___isarray_0.0.1.tgz"; - url = "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz"; - sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf"; - }; - } - - { - name = "isarray___isarray_1.0.0.tgz"; - path = fetchurl { - name = "isarray___isarray_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz"; - sha1 = "bb935d48582cba168c06834957a54a3e07124f11"; - }; - } - - { - name = "isexe___isexe_2.0.0.tgz"; - path = fetchurl { - name = "isexe___isexe_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz"; - sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10"; - }; - } - - { - name = "isobject___isobject_2.1.0.tgz"; - path = fetchurl { - name = "isobject___isobject_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz"; - sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89"; - }; - } - - { - name = "isobject___isobject_3.0.1.tgz"; - path = fetchurl { - name = "isobject___isobject_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz"; - sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"; - }; - } - - { - name = "isstream___isstream_0.1.2.tgz"; - path = fetchurl { - name = "isstream___isstream_0.1.2.tgz"; - url = "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz"; - sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a"; - }; - } - - { - name = "jquery___jquery_3.3.1.tgz"; - path = fetchurl { - name = "jquery___jquery_3.3.1.tgz"; - url = "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz"; - sha1 = "958ce29e81c9790f31be7792df5d4d95fc57fbca"; - }; - } - - { - name = "js_base64___js_base64_2.4.8.tgz"; - path = fetchurl { - name = "js_base64___js_base64_2.4.8.tgz"; - url = "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz"; - sha1 = "57a9b130888f956834aa40c5b165ba59c758f033"; - }; - } - - { - name = "js_tokens___js_tokens_4.0.0.tgz"; - path = fetchurl { - name = "js_tokens___js_tokens_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz"; - sha1 = "19203fb59991df98e3a287050d4647cdeaf32499"; - }; - } - - { - name = "js_tokens___js_tokens_3.0.2.tgz"; - path = fetchurl { - name = "js_tokens___js_tokens_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz"; - sha1 = "9866df395102130e38f7f996bceb65443209c25b"; - }; - } - - { - name = "js_yaml___js_yaml_3.7.0.tgz"; - path = fetchurl { - name = "js_yaml___js_yaml_3.7.0.tgz"; - url = "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz"; - sha1 = "5c967ddd837a9bfdca5f2de84253abe8a1c03b80"; - }; - } - - { - name = "jsbn___jsbn_0.1.1.tgz"; - path = fetchurl { - name = "jsbn___jsbn_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz"; - sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"; - }; - } - - { - name = "jsesc___jsesc_1.3.0.tgz"; - path = fetchurl { - name = "jsesc___jsesc_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz"; - sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b"; - }; - } - - { - name = "jsesc___jsesc_0.5.0.tgz"; - path = fetchurl { - name = "jsesc___jsesc_0.5.0.tgz"; - url = "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz"; - sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d"; - }; - } - - { - name = "json_loader___json_loader_0.5.7.tgz"; - path = fetchurl { - name = "json_loader___json_loader_0.5.7.tgz"; - url = "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz"; - sha1 = "dca14a70235ff82f0ac9a3abeb60d337a365185d"; - }; - } - - { - name = "json_schema_traverse___json_schema_traverse_0.3.1.tgz"; - path = fetchurl { - name = "json_schema_traverse___json_schema_traverse_0.3.1.tgz"; - url = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz"; - sha1 = "349a6d44c53a51de89b40805c5d5e59b417d3340"; - }; - } - - { - name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz"; - path = fetchurl { - name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz"; - url = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"; - sha1 = "69f6a87d9513ab8bb8fe63bdb0979c448e684660"; - }; - } - - { - name = "json_schema___json_schema_0.2.3.tgz"; - path = fetchurl { - name = "json_schema___json_schema_0.2.3.tgz"; - url = "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz"; - sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13"; - }; - } - - { - name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz"; - path = fetchurl { - name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz"; - sha1 = "9a759d39c5f2ff503fd5300646ed445f88c4f9af"; - }; - } - - { - name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz"; - path = fetchurl { - name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz"; - url = "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"; - sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"; - }; - } - - { - name = "json3___json3_3.3.2.tgz"; - path = fetchurl { - name = "json3___json3_3.3.2.tgz"; - url = "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz"; - sha1 = "3c0434743df93e2f5c42aee7b19bcb483575f4e1"; - }; - } - - { - name = "json5___json5_0.5.1.tgz"; - path = fetchurl { - name = "json5___json5_0.5.1.tgz"; - url = "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz"; - sha1 = "1eade7acc012034ad84e2396767ead9fa5495821"; - }; - } - - { - name = "jsonfile___jsonfile_2.4.0.tgz"; - path = fetchurl { - name = "jsonfile___jsonfile_2.4.0.tgz"; - url = "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz"; - sha1 = "3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"; - }; - } - - { - name = "jsonify___jsonify_0.0.0.tgz"; - path = fetchurl { - name = "jsonify___jsonify_0.0.0.tgz"; - url = "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz"; - sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73"; - }; - } - - { - name = "jsprim___jsprim_1.4.1.tgz"; - path = fetchurl { - name = "jsprim___jsprim_1.4.1.tgz"; - url = "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz"; - sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"; - }; - } - - { - name = "killable___killable_1.0.0.tgz"; - path = fetchurl { - name = "killable___killable_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz"; - sha1 = "da8b84bd47de5395878f95d64d02f2449fe05e6b"; - }; - } - - { - name = "kind_of___kind_of_3.2.2.tgz"; - path = fetchurl { - name = "kind_of___kind_of_3.2.2.tgz"; - url = "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz"; - sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64"; - }; - } - - { - name = "kind_of___kind_of_4.0.0.tgz"; - path = fetchurl { - name = "kind_of___kind_of_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz"; - sha1 = "20813df3d712928b207378691a45066fae72dd57"; - }; - } - - { - name = "kind_of___kind_of_5.1.0.tgz"; - path = fetchurl { - name = "kind_of___kind_of_5.1.0.tgz"; - url = "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz"; - sha1 = "729c91e2d857b7a419a1f9aa65685c4c33f5845d"; - }; - } - - { - name = "kind_of___kind_of_6.0.2.tgz"; - path = fetchurl { - name = "kind_of___kind_of_6.0.2.tgz"; - url = "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz"; - sha1 = "01146b36a6218e64e58f3a8d66de5d7fc6f6d051"; - }; - } - - { - name = "lazy_cache___lazy_cache_1.0.4.tgz"; - path = fetchurl { - name = "lazy_cache___lazy_cache_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz"; - sha1 = "a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"; - }; - } - - { - name = "lcid___lcid_1.0.0.tgz"; - path = fetchurl { - name = "lcid___lcid_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz"; - sha1 = "308accafa0bc483a3867b4b6f2b9506251d1b835"; - }; - } - - { - name = "load_json_file___load_json_file_1.1.0.tgz"; - path = fetchurl { - name = "load_json_file___load_json_file_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz"; - sha1 = "956905708d58b4bab4c2261b04f59f31c99374c0"; - }; - } - - { - name = "load_json_file___load_json_file_2.0.0.tgz"; - path = fetchurl { - name = "load_json_file___load_json_file_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz"; - sha1 = "7947e42149af80d696cbf797bcaabcfe1fe29ca8"; - }; - } - - { - name = "loader_runner___loader_runner_2.3.0.tgz"; - path = fetchurl { - name = "loader_runner___loader_runner_2.3.0.tgz"; - url = "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz"; - sha1 = "f482aea82d543e07921700d5a46ef26fdac6b8a2"; - }; - } - - { - name = "loader_utils___loader_utils_1.1.0.tgz"; - path = fetchurl { - name = "loader_utils___loader_utils_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz"; - sha1 = "c98aef488bcceda2ffb5e2de646d6a754429f5cd"; - }; - } - - { - name = "locate_path___locate_path_2.0.0.tgz"; - path = fetchurl { - name = "locate_path___locate_path_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz"; - sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"; - }; - } - - { - name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz"; - path = fetchurl { - name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz"; - url = "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz"; - sha1 = "8c38a099500f215ad09e59f1722fd0c52bfe0a4e"; - }; - } - - { - name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz"; - path = fetchurl { - name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz"; - sha1 = "8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"; - }; - } - - { - name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz"; - path = fetchurl { - name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz"; - sha1 = "e531c27644cf8b57a99e17ed95b35c748789392e"; - }; - } - - { - name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz"; - path = fetchurl { - name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz"; - url = "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz"; - sha1 = "838a5bae2fdaca63ac22dee8e19fa4e6d6970b11"; - }; - } - - { - name = "lodash._getnative___lodash._getnative_3.9.1.tgz"; - path = fetchurl { - name = "lodash._getnative___lodash._getnative_3.9.1.tgz"; - url = "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz"; - sha1 = "570bc7dede46d61cdcde687d65d3eecbaa3aaff5"; - }; - } - - { - name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz"; - path = fetchurl { - name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz"; - url = "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz"; - sha1 = "5203ad7ba425fae842460e696db9cf3e6aac057c"; - }; - } - - { - name = "lodash.assign___lodash.assign_3.2.0.tgz"; - path = fetchurl { - name = "lodash.assign___lodash.assign_3.2.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz"; - sha1 = "3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa"; - }; - } - - { - name = "lodash.assign___lodash.assign_4.2.0.tgz"; - path = fetchurl { - name = "lodash.assign___lodash.assign_4.2.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz"; - sha1 = "0d99f3ccd7a6d261d19bdaeb9245005d285808e7"; - }; - } - - { - name = "lodash.camelcase___lodash.camelcase_4.3.0.tgz"; - path = fetchurl { - name = "lodash.camelcase___lodash.camelcase_4.3.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz"; - sha1 = "b28aa6288a2b9fc651035c7711f65ab6190331a6"; - }; - } - - { - name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz"; - path = fetchurl { - name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz"; - sha1 = "e23f3f9c4f8fbdde872529c1071857a086e5ccef"; - }; - } - - { - name = "lodash.debounce___lodash.debounce_4.0.8.tgz"; - path = fetchurl { - name = "lodash.debounce___lodash.debounce_4.0.8.tgz"; - url = "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz"; - sha1 = "82d79bff30a67c4005ffd5e2515300ad9ca4d7af"; - }; - } - - { - name = "lodash.defaults___lodash.defaults_3.1.2.tgz"; - path = fetchurl { - name = "lodash.defaults___lodash.defaults_3.1.2.tgz"; - url = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz"; - sha1 = "c7308b18dbf8bc9372d701a73493c61192bd2e2c"; - }; - } - - { - name = "lodash.defaults___lodash.defaults_4.2.0.tgz"; - path = fetchurl { - name = "lodash.defaults___lodash.defaults_4.2.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz"; - sha1 = "d09178716ffea4dde9e5fb7b37f6f0802274580c"; - }; - } - - { - name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz"; - path = fetchurl { - name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz"; - sha1 = "2f573d85c6a24289ff00663b491c1d338ff3458a"; - }; - } - - { - name = "lodash.isarray___lodash.isarray_3.0.4.tgz"; - path = fetchurl { - name = "lodash.isarray___lodash.isarray_3.0.4.tgz"; - url = "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz"; - sha1 = "79e4eb88c36a8122af86f844aa9bcd851b5fbb55"; - }; - } - - { - name = "lodash.keys___lodash.keys_3.1.2.tgz"; - path = fetchurl { - name = "lodash.keys___lodash.keys_3.1.2.tgz"; - url = "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz"; - sha1 = "4dbc0472b156be50a0b286855d1bd0b0c656098a"; - }; - } - - { - name = "lodash.memoize___lodash.memoize_4.1.2.tgz"; - path = fetchurl { - name = "lodash.memoize___lodash.memoize_4.1.2.tgz"; - url = "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz"; - sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe"; - }; - } - - { - name = "lodash.mergewith___lodash.mergewith_4.6.1.tgz"; - path = fetchurl { - name = "lodash.mergewith___lodash.mergewith_4.6.1.tgz"; - url = "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz"; - sha1 = "639057e726c3afbdb3e7d42741caa8d6e4335927"; - }; - } - - { - name = "lodash.restparam___lodash.restparam_3.6.1.tgz"; - path = fetchurl { - name = "lodash.restparam___lodash.restparam_3.6.1.tgz"; - url = "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz"; - sha1 = "936a4e309ef330a7645ed4145986c85ae5b20805"; - }; - } - - { - name = "lodash.tail___lodash.tail_4.1.1.tgz"; - path = fetchurl { - name = "lodash.tail___lodash.tail_4.1.1.tgz"; - url = "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz"; - sha1 = "d2333a36d9e7717c8ad2f7cacafec7c32b444664"; - }; - } - - { - name = "lodash.uniq___lodash.uniq_4.5.0.tgz"; - path = fetchurl { - name = "lodash.uniq___lodash.uniq_4.5.0.tgz"; - url = "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz"; - sha1 = "d0225373aeb652adc1bc82e4945339a842754773"; - }; - } - - { - name = "lodash___lodash_4.17.10.tgz"; - path = fetchurl { - name = "lodash___lodash_4.17.10.tgz"; - url = "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz"; - sha1 = "1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"; - }; - } - - { - name = "loglevel___loglevel_1.6.1.tgz"; - path = fetchurl { - name = "loglevel___loglevel_1.6.1.tgz"; - url = "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz"; - sha1 = "e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"; - }; - } - - { - name = "longest___longest_1.0.1.tgz"; - path = fetchurl { - name = "longest___longest_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz"; - sha1 = "30a0b2da38f73770e8294a0d22e6625ed77d0097"; - }; - } - - { - name = "loose_envify___loose_envify_1.4.0.tgz"; - path = fetchurl { - name = "loose_envify___loose_envify_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz"; - sha1 = "71ee51fa7be4caec1a63839f7e682d8132d30caf"; - }; - } - - { - name = "loud_rejection___loud_rejection_1.6.0.tgz"; - path = fetchurl { - name = "loud_rejection___loud_rejection_1.6.0.tgz"; - url = "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz"; - sha1 = "5b46f80147edee578870f086d04821cf998e551f"; - }; - } - - { - name = "lru_cache___lru_cache_4.1.3.tgz"; - path = fetchurl { - name = "lru_cache___lru_cache_4.1.3.tgz"; - url = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz"; - sha1 = "a1175cf3496dfc8436c156c334b4955992bce69c"; - }; - } - - { - name = "make_dir___make_dir_1.3.0.tgz"; - path = fetchurl { - name = "make_dir___make_dir_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz"; - sha1 = "79c1033b80515bd6d24ec9933e860ca75ee27f0c"; - }; - } - - { - name = "map_cache___map_cache_0.2.2.tgz"; - path = fetchurl { - name = "map_cache___map_cache_0.2.2.tgz"; - url = "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz"; - sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"; - }; - } - - { - name = "map_obj___map_obj_1.0.1.tgz"; - path = fetchurl { - name = "map_obj___map_obj_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz"; - sha1 = "d933ceb9205d82bdcf4886f6742bdc2b4dea146d"; - }; - } - - { - name = "map_visit___map_visit_1.0.0.tgz"; - path = fetchurl { - name = "map_visit___map_visit_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz"; - sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"; - }; - } - - { - name = "math_expression_evaluator___math_expression_evaluator_1.2.17.tgz"; - path = fetchurl { - name = "math_expression_evaluator___math_expression_evaluator_1.2.17.tgz"; - url = "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz"; - sha1 = "de819fdbcd84dccd8fae59c6aeb79615b9d266ac"; - }; - } - - { - name = "math_random___math_random_1.0.1.tgz"; - path = fetchurl { - name = "math_random___math_random_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz"; - sha1 = "8b3aac588b8a66e4975e3cdea67f7bb329601fac"; - }; - } - - { - name = "md5.js___md5.js_1.3.4.tgz"; - path = fetchurl { - name = "md5.js___md5.js_1.3.4.tgz"; - url = "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz"; - sha1 = "e9bdbde94a20a5ac18b04340fc5764d5b09d901d"; - }; - } - - { - name = "media_typer___media_typer_0.3.0.tgz"; - path = fetchurl { - name = "media_typer___media_typer_0.3.0.tgz"; - url = "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz"; - sha1 = "8710d7af0aa626f8fffa1ce00168545263255748"; - }; - } - - { - name = "mem___mem_1.1.0.tgz"; - path = fetchurl { - name = "mem___mem_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz"; - sha1 = "5edd52b485ca1d900fe64895505399a0dfa45f76"; - }; - } - - { - name = "memory_fs___memory_fs_0.4.1.tgz"; - path = fetchurl { - name = "memory_fs___memory_fs_0.4.1.tgz"; - url = "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz"; - sha1 = "3a9a20b8462523e447cfbc7e8bb80ed667bfc552"; - }; - } - - { - name = "meow___meow_3.7.0.tgz"; - path = fetchurl { - name = "meow___meow_3.7.0.tgz"; - url = "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz"; - sha1 = "72cb668b425228290abbfa856892587308a801fb"; - }; - } - - { - name = "merge_descriptors___merge_descriptors_1.0.1.tgz"; - path = fetchurl { - name = "merge_descriptors___merge_descriptors_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz"; - sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61"; - }; - } - - { - name = "methods___methods_1.1.2.tgz"; - path = fetchurl { - name = "methods___methods_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz"; - sha1 = "5529a4d67654134edcc5266656835b0f851afcee"; - }; - } - - { - name = "micromatch___micromatch_2.3.11.tgz"; - path = fetchurl { - name = "micromatch___micromatch_2.3.11.tgz"; - url = "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz"; - sha1 = "86677c97d1720b363431d04d0d15293bd38c1565"; - }; - } - - { - name = "micromatch___micromatch_3.1.10.tgz"; - path = fetchurl { - name = "micromatch___micromatch_3.1.10.tgz"; - url = "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz"; - sha1 = "70859bc95c9840952f359a068a3fc49f9ecfac23"; - }; - } - - { - name = "miller_rabin___miller_rabin_4.0.1.tgz"; - path = fetchurl { - name = "miller_rabin___miller_rabin_4.0.1.tgz"; - url = "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz"; - sha1 = "f080351c865b0dc562a8462966daa53543c78a4d"; - }; - } - - { - name = "mime_db___mime_db_1.35.0.tgz"; - path = fetchurl { - name = "mime_db___mime_db_1.35.0.tgz"; - url = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz"; - sha1 = "0569d657466491283709663ad379a99b90d9ab47"; - }; - } - - { - name = "mime_types___mime_types_2.1.19.tgz"; - path = fetchurl { - name = "mime_types___mime_types_2.1.19.tgz"; - url = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz"; - sha1 = "71e464537a7ef81c15f2db9d97e913fc0ff606f0"; - }; - } - - { - name = "mime___mime_1.4.1.tgz"; - path = fetchurl { - name = "mime___mime_1.4.1.tgz"; - url = "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz"; - sha1 = "121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"; - }; - } - - { - name = "mime___mime_1.6.0.tgz"; - path = fetchurl { - name = "mime___mime_1.6.0.tgz"; - url = "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz"; - sha1 = "32cd9e5c64553bd58d19a568af452acff04981b1"; - }; - } - - { - name = "mimic_fn___mimic_fn_1.2.0.tgz"; - path = fetchurl { - name = "mimic_fn___mimic_fn_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz"; - sha1 = "820c86a39334640e99516928bd03fca88057d022"; - }; - } - - { - name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz"; - path = fetchurl { - name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"; - sha1 = "2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"; - }; - } - - { - name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz"; - path = fetchurl { - name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"; - sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"; - }; - } - - { - name = "minimatch___minimatch_3.0.4.tgz"; - path = fetchurl { - name = "minimatch___minimatch_3.0.4.tgz"; - url = "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz"; - sha1 = "5166e286457f03306064be5497e8dbb0c3d32083"; - }; - } - - { - name = "minimist___minimist_0.0.8.tgz"; - path = fetchurl { - name = "minimist___minimist_0.0.8.tgz"; - url = "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz"; - sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d"; - }; - } - - { - name = "minimist___minimist_1.2.0.tgz"; - path = fetchurl { - name = "minimist___minimist_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz"; - sha1 = "a35008b20f41383eec1fb914f4cd5df79a264284"; - }; - } - - { - name = "minipass___minipass_2.3.3.tgz"; - path = fetchurl { - name = "minipass___minipass_2.3.3.tgz"; - url = "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz"; - sha1 = "a7dcc8b7b833f5d368759cce544dccb55f50f233"; - }; - } - - { - name = "minizlib___minizlib_1.1.0.tgz"; - path = fetchurl { - name = "minizlib___minizlib_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz"; - sha1 = "11e13658ce46bc3a70a267aac58359d1e0c29ceb"; - }; - } - - { - name = "mixin_deep___mixin_deep_1.3.1.tgz"; - path = fetchurl { - name = "mixin_deep___mixin_deep_1.3.1.tgz"; - url = "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz"; - sha1 = "a49e7268dce1a0d9698e45326c5626df3543d0fe"; - }; - } - - { - name = "mixin_object___mixin_object_2.0.1.tgz"; - path = fetchurl { - name = "mixin_object___mixin_object_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz"; - sha1 = "4fb949441dab182540f1fe035ba60e1947a5e57e"; - }; - } - - { - name = "mkdirp___mkdirp_0.5.1.tgz"; - path = fetchurl { - name = "mkdirp___mkdirp_0.5.1.tgz"; - url = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz"; - sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903"; - }; - } - - { - name = "ms___ms_2.0.0.tgz"; - path = fetchurl { - name = "ms___ms_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz"; - sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8"; - }; - } - - { - name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz"; - path = fetchurl { - name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz"; - sha1 = "899f11d9686e5e05cb91b35d5f0e63b773cfc901"; - }; - } - - { - name = "multicast_dns___multicast_dns_6.2.3.tgz"; - path = fetchurl { - name = "multicast_dns___multicast_dns_6.2.3.tgz"; - url = "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz"; - sha1 = "a0ec7bd9055c4282f790c3c82f4e28db3b31b229"; - }; - } - - { - name = "nan___nan_2.10.0.tgz"; - path = fetchurl { - name = "nan___nan_2.10.0.tgz"; - url = "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz"; - sha1 = "96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"; - }; - } - - { - name = "nanomatch___nanomatch_1.2.13.tgz"; - path = fetchurl { - name = "nanomatch___nanomatch_1.2.13.tgz"; - url = "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz"; - sha1 = "b87a8aa4fc0de8fe6be88895b38983ff265bd119"; - }; - } - - { - name = "needle___needle_2.2.1.tgz"; - path = fetchurl { - name = "needle___needle_2.2.1.tgz"; - url = "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz"; - sha1 = "b5e325bd3aae8c2678902fa296f729455d1d3a7d"; - }; - } - - { - name = "negotiator___negotiator_0.6.1.tgz"; - path = fetchurl { - name = "negotiator___negotiator_0.6.1.tgz"; - url = "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz"; - sha1 = "2b327184e8992101177b28563fb5e7102acd0ca9"; - }; - } - - { - name = "neo_async___neo_async_2.5.1.tgz"; - path = fetchurl { - name = "neo_async___neo_async_2.5.1.tgz"; - url = "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz"; - sha1 = "acb909e327b1e87ec9ef15f41b8a269512ad41ee"; - }; - } - - { - name = "next_tick___next_tick_1.0.0.tgz"; - path = fetchurl { - name = "next_tick___next_tick_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz"; - sha1 = "ca86d1fe8828169b0120208e3dc8424b9db8342c"; - }; - } - - { - name = "node_forge___node_forge_0.7.5.tgz"; - path = fetchurl { - name = "node_forge___node_forge_0.7.5.tgz"; - url = "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz"; - sha1 = "6c152c345ce11c52f465c2abd957e8639cd674df"; - }; - } - - { - name = "node_gyp___node_gyp_3.7.0.tgz"; - path = fetchurl { - name = "node_gyp___node_gyp_3.7.0.tgz"; - url = "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz"; - sha1 = "789478e8f6c45e277aa014f3e28f958f286f9203"; - }; - } - - { - name = "node_libs_browser___node_libs_browser_2.1.0.tgz"; - path = fetchurl { - name = "node_libs_browser___node_libs_browser_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz"; - sha1 = "5f94263d404f6e44767d726901fff05478d600df"; - }; - } - - { - name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz"; - path = fetchurl { - name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz"; - url = "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz"; - sha1 = "3070040716afdc778747b61b6887bf78880b80fc"; - }; - } - - { - name = "node_sass___node_sass_4.9.2.tgz"; - path = fetchurl { - name = "node_sass___node_sass_4.9.2.tgz"; - url = "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.2.tgz"; - sha1 = "5e63fe6bd0f2ae3ac9d6c14ede8620e2b8bdb437"; - }; - } - - { - name = "nopt___nopt_3.0.6.tgz"; - path = fetchurl { - name = "nopt___nopt_3.0.6.tgz"; - url = "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz"; - sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9"; - }; - } - - { - name = "nopt___nopt_4.0.1.tgz"; - path = fetchurl { - name = "nopt___nopt_4.0.1.tgz"; - url = "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz"; - sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d"; - }; - } - - { - name = "normalize_package_data___normalize_package_data_2.4.0.tgz"; - path = fetchurl { - name = "normalize_package_data___normalize_package_data_2.4.0.tgz"; - url = "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz"; - sha1 = "12f95a307d58352075a04907b84ac8be98ac012f"; - }; - } - - { - name = "normalize_path___normalize_path_2.1.1.tgz"; - path = fetchurl { - name = "normalize_path___normalize_path_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz"; - sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"; - }; - } - - { - name = "normalize_range___normalize_range_0.1.2.tgz"; - path = fetchurl { - name = "normalize_range___normalize_range_0.1.2.tgz"; - url = "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz"; - sha1 = "2d10c06bdfd312ea9777695a4d28439456b75942"; - }; - } - - { - name = "normalize_url___normalize_url_1.9.1.tgz"; - path = fetchurl { - name = "normalize_url___normalize_url_1.9.1.tgz"; - url = "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz"; - sha1 = "2cc0d66b31ea23036458436e3620d85954c66c3c"; - }; - } - - { - name = "npm_bundled___npm_bundled_1.0.3.tgz"; - path = fetchurl { - name = "npm_bundled___npm_bundled_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz"; - sha1 = "7e71703d973af3370a9591bafe3a63aca0be2308"; - }; - } - - { - name = "npm_packlist___npm_packlist_1.1.11.tgz"; - path = fetchurl { - name = "npm_packlist___npm_packlist_1.1.11.tgz"; - url = "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz"; - sha1 = "84e8c683cbe7867d34b1d357d893ce29e28a02de"; - }; - } - - { - name = "npm_run_path___npm_run_path_2.0.2.tgz"; - path = fetchurl { - name = "npm_run_path___npm_run_path_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz"; - sha1 = "35a9232dfa35d7067b4cb2ddf2357b1871536c5f"; - }; - } - - { - name = "npmlog___npmlog_4.1.2.tgz"; - path = fetchurl { - name = "npmlog___npmlog_4.1.2.tgz"; - url = "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz"; - sha1 = "08a7f2a8bf734604779a9efa4ad5cc717abb954b"; - }; - } - - { - name = "nth_check___nth_check_1.0.1.tgz"; - path = fetchurl { - name = "nth_check___nth_check_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz"; - sha1 = "9929acdf628fc2c41098deab82ac580cf149aae4"; - }; - } - - { - name = "num2fraction___num2fraction_1.2.2.tgz"; - path = fetchurl { - name = "num2fraction___num2fraction_1.2.2.tgz"; - url = "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz"; - sha1 = "6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"; - }; - } - - { - name = "number_is_nan___number_is_nan_1.0.1.tgz"; - path = fetchurl { - name = "number_is_nan___number_is_nan_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz"; - sha1 = "097b602b53422a522c1afb8790318336941a011d"; - }; - } - - { - name = "oauth_sign___oauth_sign_0.8.2.tgz"; - path = fetchurl { - name = "oauth_sign___oauth_sign_0.8.2.tgz"; - url = "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz"; - sha1 = "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"; - }; - } - - { - name = "object_assign___object_assign_4.1.1.tgz"; - path = fetchurl { - name = "object_assign___object_assign_4.1.1.tgz"; - url = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz"; - sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863"; - }; - } - - { - name = "object_copy___object_copy_0.1.0.tgz"; - path = fetchurl { - name = "object_copy___object_copy_0.1.0.tgz"; - url = "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz"; - sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c"; - }; - } - - { - name = "object_keys___object_keys_1.0.12.tgz"; - path = fetchurl { - name = "object_keys___object_keys_1.0.12.tgz"; - url = "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz"; - sha1 = "09c53855377575310cca62f55bb334abff7b3ed2"; - }; - } - - { - name = "object_path___object_path_0.9.2.tgz"; - path = fetchurl { - name = "object_path___object_path_0.9.2.tgz"; - url = "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz"; - sha1 = "0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5"; - }; - } - - { - name = "object_visit___object_visit_1.0.1.tgz"; - path = fetchurl { - name = "object_visit___object_visit_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz"; - sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb"; - }; - } - - { - name = "object.omit___object.omit_2.0.1.tgz"; - path = fetchurl { - name = "object.omit___object.omit_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz"; - sha1 = "1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"; - }; - } - - { - name = "object.pick___object.pick_1.3.0.tgz"; - path = fetchurl { - name = "object.pick___object.pick_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz"; - sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747"; - }; - } - - { - name = "obuf___obuf_1.1.2.tgz"; - path = fetchurl { - name = "obuf___obuf_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz"; - sha1 = "09bea3343d41859ebd446292d11c9d4db619084e"; - }; - } - - { - name = "on_finished___on_finished_2.3.0.tgz"; - path = fetchurl { - name = "on_finished___on_finished_2.3.0.tgz"; - url = "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz"; - sha1 = "20f1336481b083cd75337992a16971aa2d906947"; - }; - } - - { - name = "on_headers___on_headers_1.0.1.tgz"; - path = fetchurl { - name = "on_headers___on_headers_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz"; - sha1 = "928f5d0f470d49342651ea6794b0857c100693f7"; - }; - } - - { - name = "once___once_1.4.0.tgz"; - path = fetchurl { - name = "once___once_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz"; - sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1"; - }; - } - - { - name = "open_iconic___open_iconic_1.1.1.tgz"; - path = fetchurl { - name = "open_iconic___open_iconic_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/open-iconic/-/open-iconic-1.1.1.tgz"; - sha1 = "9dcfc8c7cd3c61cdb4a236b1a347894c97adc0c6"; - }; - } - - { - name = "opn___opn_5.3.0.tgz"; - path = fetchurl { - name = "opn___opn_5.3.0.tgz"; - url = "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz"; - sha1 = "64871565c863875f052cfdf53d3e3cb5adb53b1c"; - }; - } - - { - name = "original___original_1.0.1.tgz"; - path = fetchurl { - name = "original___original_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/original/-/original-1.0.1.tgz"; - sha1 = "b0a53ff42ba997a8c9cd1fb5daaeb42b9d693190"; - }; - } - - { - name = "os_browserify___os_browserify_0.3.0.tgz"; - path = fetchurl { - name = "os_browserify___os_browserify_0.3.0.tgz"; - url = "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz"; - sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27"; - }; - } - - { - name = "os_homedir___os_homedir_1.0.2.tgz"; - path = fetchurl { - name = "os_homedir___os_homedir_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz"; - sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3"; - }; - } - - { - name = "os_locale___os_locale_1.4.0.tgz"; - path = fetchurl { - name = "os_locale___os_locale_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz"; - sha1 = "20f9f17ae29ed345e8bde583b13d2009803c14d9"; - }; - } - - { - name = "os_locale___os_locale_2.1.0.tgz"; - path = fetchurl { - name = "os_locale___os_locale_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz"; - sha1 = "42bc2900a6b5b8bd17376c8e882b65afccf24bf2"; - }; - } - - { - name = "os_tmpdir___os_tmpdir_1.0.2.tgz"; - path = fetchurl { - name = "os_tmpdir___os_tmpdir_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz"; - sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274"; - }; - } - - { - name = "osenv___osenv_0.1.5.tgz"; - path = fetchurl { - name = "osenv___osenv_0.1.5.tgz"; - url = "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz"; - sha1 = "85cdfafaeb28e8677f416e287592b5f3f49ea410"; - }; - } - - { - name = "p_finally___p_finally_1.0.0.tgz"; - path = fetchurl { - name = "p_finally___p_finally_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz"; - sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae"; - }; - } - - { - name = "p_limit___p_limit_1.3.0.tgz"; - path = fetchurl { - name = "p_limit___p_limit_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz"; - sha1 = "b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"; - }; - } - - { - name = "p_locate___p_locate_2.0.0.tgz"; - path = fetchurl { - name = "p_locate___p_locate_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz"; - sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43"; - }; - } - - { - name = "p_map___p_map_1.2.0.tgz"; - path = fetchurl { - name = "p_map___p_map_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz"; - sha1 = "e4e94f311eabbc8633a1e79908165fca26241b6b"; - }; - } - - { - name = "p_try___p_try_1.0.0.tgz"; - path = fetchurl { - name = "p_try___p_try_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz"; - sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"; - }; - } - - { - name = "pako___pako_1.0.6.tgz"; - path = fetchurl { - name = "pako___pako_1.0.6.tgz"; - url = "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz"; - sha1 = "0101211baa70c4bca4a0f63f2206e97b7dfaf258"; - }; - } - - { - name = "parse_asn1___parse_asn1_5.1.1.tgz"; - path = fetchurl { - name = "parse_asn1___parse_asn1_5.1.1.tgz"; - url = "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz"; - sha1 = "f6bf293818332bd0dab54efb16087724745e6ca8"; - }; - } - - { - name = "parse_glob___parse_glob_3.0.4.tgz"; - path = fetchurl { - name = "parse_glob___parse_glob_3.0.4.tgz"; - url = "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz"; - sha1 = "b2c376cfb11f35513badd173ef0bb6e3a388391c"; - }; - } - - { - name = "parse_json___parse_json_2.2.0.tgz"; - path = fetchurl { - name = "parse_json___parse_json_2.2.0.tgz"; - url = "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz"; - sha1 = "f480f40434ef80741f8469099f8dea18f55a4dc9"; - }; - } - - { - name = "parseurl___parseurl_1.3.2.tgz"; - path = fetchurl { - name = "parseurl___parseurl_1.3.2.tgz"; - url = "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz"; - sha1 = "fc289d4ed8993119460c156253262cdc8de65bf3"; - }; - } - - { - name = "pascalcase___pascalcase_0.1.1.tgz"; - path = fetchurl { - name = "pascalcase___pascalcase_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz"; - sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14"; - }; - } - - { - name = "path_browserify___path_browserify_0.0.0.tgz"; - path = fetchurl { - name = "path_browserify___path_browserify_0.0.0.tgz"; - url = "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz"; - sha1 = "a0b870729aae214005b7d5032ec2cbbb0fb4451a"; - }; - } - - { - name = "path_dirname___path_dirname_1.0.2.tgz"; - path = fetchurl { - name = "path_dirname___path_dirname_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz"; - sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0"; - }; - } - - { - name = "path_exists___path_exists_2.1.0.tgz"; - path = fetchurl { - name = "path_exists___path_exists_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz"; - sha1 = "0feb6c64f0fc518d9a754dd5efb62c7022761f4b"; - }; - } - - { - name = "path_exists___path_exists_3.0.0.tgz"; - path = fetchurl { - name = "path_exists___path_exists_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz"; - sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"; - }; - } - - { - name = "path_is_absolute___path_is_absolute_1.0.1.tgz"; - path = fetchurl { - name = "path_is_absolute___path_is_absolute_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz"; - sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"; - }; - } - - { - name = "path_is_inside___path_is_inside_1.0.2.tgz"; - path = fetchurl { - name = "path_is_inside___path_is_inside_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz"; - sha1 = "365417dede44430d1c11af61027facf074bdfc53"; - }; - } - - { - name = "path_key___path_key_2.0.1.tgz"; - path = fetchurl { - name = "path_key___path_key_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz"; - sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40"; - }; - } - - { - name = "path_to_regexp___path_to_regexp_0.1.7.tgz"; - path = fetchurl { - name = "path_to_regexp___path_to_regexp_0.1.7.tgz"; - url = "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz"; - sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c"; - }; - } - - { - name = "path_type___path_type_1.1.0.tgz"; - path = fetchurl { - name = "path_type___path_type_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz"; - sha1 = "59c44f7ee491da704da415da5a4070ba4f8fe441"; - }; - } - - { - name = "path_type___path_type_2.0.0.tgz"; - path = fetchurl { - name = "path_type___path_type_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz"; - sha1 = "f012ccb8415b7096fc2daa1054c3d72389594c73"; - }; - } - - { - name = "pbkdf2___pbkdf2_3.0.16.tgz"; - path = fetchurl { - name = "pbkdf2___pbkdf2_3.0.16.tgz"; - url = "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz"; - sha1 = "7404208ec6b01b62d85bf83853a8064f8d9c2a5c"; - }; - } - - { - name = "performance_now___performance_now_0.2.0.tgz"; - path = fetchurl { - name = "performance_now___performance_now_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz"; - sha1 = "33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"; - }; - } - - { - name = "performance_now___performance_now_2.1.0.tgz"; - path = fetchurl { - name = "performance_now___performance_now_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz"; - sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"; - }; - } - - { - name = "pify___pify_2.3.0.tgz"; - path = fetchurl { - name = "pify___pify_2.3.0.tgz"; - url = "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz"; - sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c"; - }; - } - - { - name = "pify___pify_3.0.0.tgz"; - path = fetchurl { - name = "pify___pify_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz"; - sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"; - }; - } - - { - name = "pinkie_promise___pinkie_promise_2.0.1.tgz"; - path = fetchurl { - name = "pinkie_promise___pinkie_promise_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz"; - sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa"; - }; - } - - { - name = "pinkie___pinkie_2.0.4.tgz"; - path = fetchurl { - name = "pinkie___pinkie_2.0.4.tgz"; - url = "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz"; - sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870"; - }; - } - - { - name = "pkg_dir___pkg_dir_2.0.0.tgz"; - path = fetchurl { - name = "pkg_dir___pkg_dir_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz"; - sha1 = "f6d5d1109e19d63edf428e0bd57e12777615334b"; - }; - } - - { - name = "pkg_up___pkg_up_1.0.0.tgz"; - path = fetchurl { - name = "pkg_up___pkg_up_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz"; - sha1 = "3e08fb461525c4421624a33b9f7e6d0af5b05a26"; - }; - } - - { - name = "popper.js___popper.js_1.14.4.tgz"; - path = fetchurl { - name = "popper.js___popper.js_1.14.4.tgz"; - url = "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.4.tgz"; - sha1 = "8eec1d8ff02a5a3a152dd43414a15c7b79fd69b6"; - }; - } - - { - name = "portfinder___portfinder_1.0.13.tgz"; - path = fetchurl { - name = "portfinder___portfinder_1.0.13.tgz"; - url = "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz"; - sha1 = "bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9"; - }; - } - - { - name = "posix_character_classes___posix_character_classes_0.1.1.tgz"; - path = fetchurl { - name = "posix_character_classes___posix_character_classes_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz"; - sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"; - }; - } - - { - name = "postcss_calc___postcss_calc_5.3.1.tgz"; - path = fetchurl { - name = "postcss_calc___postcss_calc_5.3.1.tgz"; - url = "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz"; - sha1 = "77bae7ca928ad85716e2fda42f261bf7c1d65b5e"; - }; - } - - { - name = "postcss_colormin___postcss_colormin_2.2.2.tgz"; - path = fetchurl { - name = "postcss_colormin___postcss_colormin_2.2.2.tgz"; - url = "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz"; - sha1 = "6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"; - }; - } - - { - name = "postcss_convert_values___postcss_convert_values_2.6.1.tgz"; - path = fetchurl { - name = "postcss_convert_values___postcss_convert_values_2.6.1.tgz"; - url = "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz"; - sha1 = "bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"; - }; - } - - { - name = "postcss_discard_comments___postcss_discard_comments_2.0.4.tgz"; - path = fetchurl { - name = "postcss_discard_comments___postcss_discard_comments_2.0.4.tgz"; - url = "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz"; - sha1 = "befe89fafd5b3dace5ccce51b76b81514be00e3d"; - }; - } - - { - name = "postcss_discard_duplicates___postcss_discard_duplicates_2.1.0.tgz"; - path = fetchurl { - name = "postcss_discard_duplicates___postcss_discard_duplicates_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz"; - sha1 = "b9abf27b88ac188158a5eb12abcae20263b91932"; - }; - } - - { - name = "postcss_discard_empty___postcss_discard_empty_2.1.0.tgz"; - path = fetchurl { - name = "postcss_discard_empty___postcss_discard_empty_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz"; - sha1 = "d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"; - }; - } - - { - name = "postcss_discard_overridden___postcss_discard_overridden_0.1.1.tgz"; - path = fetchurl { - name = "postcss_discard_overridden___postcss_discard_overridden_0.1.1.tgz"; - url = "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz"; - sha1 = "8b1eaf554f686fb288cd874c55667b0aa3668d58"; - }; - } - - { - name = "postcss_discard_unused___postcss_discard_unused_2.2.3.tgz"; - path = fetchurl { - name = "postcss_discard_unused___postcss_discard_unused_2.2.3.tgz"; - url = "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz"; - sha1 = "bce30b2cc591ffc634322b5fb3464b6d934f4433"; - }; - } - - { - name = "postcss_filter_plugins___postcss_filter_plugins_2.0.3.tgz"; - path = fetchurl { - name = "postcss_filter_plugins___postcss_filter_plugins_2.0.3.tgz"; - url = "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz"; - sha1 = "82245fdf82337041645e477114d8e593aa18b8ec"; - }; - } - - { - name = "postcss_merge_idents___postcss_merge_idents_2.1.7.tgz"; - path = fetchurl { - name = "postcss_merge_idents___postcss_merge_idents_2.1.7.tgz"; - url = "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz"; - sha1 = "4c5530313c08e1d5b3bbf3d2bbc747e278eea270"; - }; - } - - { - name = "postcss_merge_longhand___postcss_merge_longhand_2.0.2.tgz"; - path = fetchurl { - name = "postcss_merge_longhand___postcss_merge_longhand_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz"; - sha1 = "23d90cd127b0a77994915332739034a1a4f3d658"; - }; - } - - { - name = "postcss_merge_rules___postcss_merge_rules_2.1.2.tgz"; - path = fetchurl { - name = "postcss_merge_rules___postcss_merge_rules_2.1.2.tgz"; - url = "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz"; - sha1 = "d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"; - }; - } - - { - name = "postcss_message_helpers___postcss_message_helpers_2.0.0.tgz"; - path = fetchurl { - name = "postcss_message_helpers___postcss_message_helpers_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz"; - sha1 = "a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"; - }; - } - - { - name = "postcss_minify_font_values___postcss_minify_font_values_1.0.5.tgz"; - path = fetchurl { - name = "postcss_minify_font_values___postcss_minify_font_values_1.0.5.tgz"; - url = "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz"; - sha1 = "4b58edb56641eba7c8474ab3526cafd7bbdecb69"; - }; - } - - { - name = "postcss_minify_gradients___postcss_minify_gradients_1.0.5.tgz"; - path = fetchurl { - name = "postcss_minify_gradients___postcss_minify_gradients_1.0.5.tgz"; - url = "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz"; - sha1 = "5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"; - }; - } - - { - name = "postcss_minify_params___postcss_minify_params_1.2.2.tgz"; - path = fetchurl { - name = "postcss_minify_params___postcss_minify_params_1.2.2.tgz"; - url = "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz"; - sha1 = "ad2ce071373b943b3d930a3fa59a358c28d6f1f3"; - }; - } - - { - name = "postcss_minify_selectors___postcss_minify_selectors_2.1.1.tgz"; - path = fetchurl { - name = "postcss_minify_selectors___postcss_minify_selectors_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz"; - sha1 = "b2c6a98c0072cf91b932d1a496508114311735bf"; - }; - } - - { - name = "postcss_modules_extract_imports___postcss_modules_extract_imports_1.1.0.tgz"; - path = fetchurl { - name = "postcss_modules_extract_imports___postcss_modules_extract_imports_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz"; - sha1 = "b614c9720be6816eaee35fb3a5faa1dba6a05ddb"; - }; - } - - { - name = "postcss_modules_local_by_default___postcss_modules_local_by_default_1.2.0.tgz"; - path = fetchurl { - name = "postcss_modules_local_by_default___postcss_modules_local_by_default_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz"; - sha1 = "f7d80c398c5a393fa7964466bd19500a7d61c069"; - }; - } - - { - name = "postcss_modules_scope___postcss_modules_scope_1.1.0.tgz"; - path = fetchurl { - name = "postcss_modules_scope___postcss_modules_scope_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz"; - sha1 = "d6ea64994c79f97b62a72b426fbe6056a194bb90"; - }; - } - - { - name = "postcss_modules_values___postcss_modules_values_1.3.0.tgz"; - path = fetchurl { - name = "postcss_modules_values___postcss_modules_values_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz"; - sha1 = "ecffa9d7e192518389f42ad0e83f72aec456ea20"; - }; - } - - { - name = "postcss_normalize_charset___postcss_normalize_charset_1.1.1.tgz"; - path = fetchurl { - name = "postcss_normalize_charset___postcss_normalize_charset_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz"; - sha1 = "ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"; - }; - } - - { - name = "postcss_normalize_url___postcss_normalize_url_3.0.8.tgz"; - path = fetchurl { - name = "postcss_normalize_url___postcss_normalize_url_3.0.8.tgz"; - url = "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz"; - sha1 = "108f74b3f2fcdaf891a2ffa3ea4592279fc78222"; - }; - } - - { - name = "postcss_ordered_values___postcss_ordered_values_2.2.3.tgz"; - path = fetchurl { - name = "postcss_ordered_values___postcss_ordered_values_2.2.3.tgz"; - url = "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz"; - sha1 = "eec6c2a67b6c412a8db2042e77fe8da43f95c11d"; - }; - } - - { - name = "postcss_reduce_idents___postcss_reduce_idents_2.4.0.tgz"; - path = fetchurl { - name = "postcss_reduce_idents___postcss_reduce_idents_2.4.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz"; - sha1 = "c2c6d20cc958284f6abfbe63f7609bf409059ad3"; - }; - } - - { - name = "postcss_reduce_initial___postcss_reduce_initial_1.0.1.tgz"; - path = fetchurl { - name = "postcss_reduce_initial___postcss_reduce_initial_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz"; - sha1 = "68f80695f045d08263a879ad240df8dd64f644ea"; - }; - } - - { - name = "postcss_reduce_transforms___postcss_reduce_transforms_1.0.4.tgz"; - path = fetchurl { - name = "postcss_reduce_transforms___postcss_reduce_transforms_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz"; - sha1 = "ff76f4d8212437b31c298a42d2e1444025771ae1"; - }; - } - - { - name = "postcss_selector_parser___postcss_selector_parser_2.2.3.tgz"; - path = fetchurl { - name = "postcss_selector_parser___postcss_selector_parser_2.2.3.tgz"; - url = "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz"; - sha1 = "f9437788606c3c9acee16ffe8d8b16297f27bb90"; - }; - } - - { - name = "postcss_svgo___postcss_svgo_2.1.6.tgz"; - path = fetchurl { - name = "postcss_svgo___postcss_svgo_2.1.6.tgz"; - url = "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz"; - sha1 = "b6df18aa613b666e133f08adb5219c2684ac108d"; - }; - } - - { - name = "postcss_unique_selectors___postcss_unique_selectors_2.0.2.tgz"; - path = fetchurl { - name = "postcss_unique_selectors___postcss_unique_selectors_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz"; - sha1 = "981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"; - }; - } - - { - name = "postcss_value_parser___postcss_value_parser_3.3.0.tgz"; - path = fetchurl { - name = "postcss_value_parser___postcss_value_parser_3.3.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz"; - sha1 = "87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"; - }; - } - - { - name = "postcss_zindex___postcss_zindex_2.2.0.tgz"; - path = fetchurl { - name = "postcss_zindex___postcss_zindex_2.2.0.tgz"; - url = "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz"; - sha1 = "d2109ddc055b91af67fc4cb3b025946639d2af22"; - }; - } - - { - name = "postcss___postcss_5.2.18.tgz"; - path = fetchurl { - name = "postcss___postcss_5.2.18.tgz"; - url = "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz"; - sha1 = "badfa1497d46244f6390f58b319830d9107853c5"; - }; - } - - { - name = "postcss___postcss_6.0.23.tgz"; - path = fetchurl { - name = "postcss___postcss_6.0.23.tgz"; - url = "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz"; - sha1 = "61c82cc328ac60e677645f979054eb98bc0e3324"; - }; - } - - { - name = "prepend_http___prepend_http_1.0.4.tgz"; - path = fetchurl { - name = "prepend_http___prepend_http_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz"; - sha1 = "d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"; - }; - } - - { - name = "preserve___preserve_0.2.0.tgz"; - path = fetchurl { - name = "preserve___preserve_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz"; - sha1 = "815ed1f6ebc65926f865b310c0713bcb3315ce4b"; - }; - } - - { - name = "pretty_error___pretty_error_2.1.1.tgz"; - path = fetchurl { - name = "pretty_error___pretty_error_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz"; - sha1 = "5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"; - }; - } - - { - name = "private___private_0.1.8.tgz"; - path = fetchurl { - name = "private___private_0.1.8.tgz"; - url = "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz"; - sha1 = "2381edb3689f7a53d653190060fcf822d2f368ff"; - }; - } - - { - name = "process_nextick_args___process_nextick_args_2.0.0.tgz"; - path = fetchurl { - name = "process_nextick_args___process_nextick_args_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz"; - sha1 = "a37d732f4271b4ab1ad070d35508e8290788ffaa"; - }; - } - - { - name = "process___process_0.11.10.tgz"; - path = fetchurl { - name = "process___process_0.11.10.tgz"; - url = "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz"; - sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182"; - }; - } - - { - name = "proxy_addr___proxy_addr_2.0.4.tgz"; - path = fetchurl { - name = "proxy_addr___proxy_addr_2.0.4.tgz"; - url = "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz"; - sha1 = "ecfc733bf22ff8c6f407fa275327b9ab67e48b93"; - }; - } - - { - name = "prr___prr_1.0.1.tgz"; - path = fetchurl { - name = "prr___prr_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz"; - sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476"; - }; - } - - { - name = "pseudomap___pseudomap_1.0.2.tgz"; - path = fetchurl { - name = "pseudomap___pseudomap_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz"; - sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3"; - }; - } - - { - name = "public_encrypt___public_encrypt_4.0.2.tgz"; - path = fetchurl { - name = "public_encrypt___public_encrypt_4.0.2.tgz"; - url = "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz"; - sha1 = "46eb9107206bf73489f8b85b69d91334c6610994"; - }; - } - - { - name = "punycode___punycode_1.3.2.tgz"; - path = fetchurl { - name = "punycode___punycode_1.3.2.tgz"; - url = "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz"; - sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d"; - }; - } - - { - name = "punycode___punycode_1.4.1.tgz"; - path = fetchurl { - name = "punycode___punycode_1.4.1.tgz"; - url = "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz"; - sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"; - }; - } - - { - name = "punycode___punycode_2.1.1.tgz"; - path = fetchurl { - name = "punycode___punycode_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz"; - sha1 = "b58b010ac40c22c5657616c8d2c2c02c7bf479ec"; - }; - } - - { - name = "q___q_1.5.1.tgz"; - path = fetchurl { - name = "q___q_1.5.1.tgz"; - url = "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz"; - sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7"; - }; - } - - { - name = "qs___qs_6.5.1.tgz"; - path = fetchurl { - name = "qs___qs_6.5.1.tgz"; - url = "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz"; - sha1 = "349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"; - }; - } - - { - name = "qs___qs_6.4.0.tgz"; - path = fetchurl { - name = "qs___qs_6.4.0.tgz"; - url = "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz"; - sha1 = "13e26d28ad6b0ffaa91312cd3bf708ed351e7233"; - }; - } - - { - name = "qs___qs_6.5.2.tgz"; - path = fetchurl { - name = "qs___qs_6.5.2.tgz"; - url = "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz"; - sha1 = "cb3ae806e8740444584ef154ce8ee98d403f3e36"; - }; - } - - { - name = "query_string___query_string_4.3.4.tgz"; - path = fetchurl { - name = "query_string___query_string_4.3.4.tgz"; - url = "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz"; - sha1 = "bbb693b9ca915c232515b228b1a02b609043dbeb"; - }; - } - - { - name = "querystring_es3___querystring_es3_0.2.1.tgz"; - path = fetchurl { - name = "querystring_es3___querystring_es3_0.2.1.tgz"; - url = "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz"; - sha1 = "9ec61f79049875707d69414596fd907a4d711e73"; - }; - } - - { - name = "querystring___querystring_0.2.0.tgz"; - path = fetchurl { - name = "querystring___querystring_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz"; - sha1 = "b209849203bb25df820da756e747005878521620"; - }; - } - - { - name = "querystringify___querystringify_2.0.0.tgz"; - path = fetchurl { - name = "querystringify___querystringify_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz"; - sha1 = "fa3ed6e68eb15159457c89b37bc6472833195755"; - }; - } - - { - name = "randomatic___randomatic_3.0.0.tgz"; - path = fetchurl { - name = "randomatic___randomatic_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz"; - sha1 = "d35490030eb4f7578de292ce6dfb04a91a128923"; - }; - } - - { - name = "randombytes___randombytes_2.0.6.tgz"; - path = fetchurl { - name = "randombytes___randombytes_2.0.6.tgz"; - url = "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz"; - sha1 = "d302c522948588848a8d300c932b44c24231da80"; - }; - } - - { - name = "randomfill___randomfill_1.0.4.tgz"; - path = fetchurl { - name = "randomfill___randomfill_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz"; - sha1 = "c92196fc86ab42be983f1bf31778224931d61458"; - }; - } - - { - name = "range_parser___range_parser_1.2.0.tgz"; - path = fetchurl { - name = "range_parser___range_parser_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz"; - sha1 = "f49be6b487894ddc40dcc94a322f611092e00d5e"; - }; - } - - { - name = "raw_body___raw_body_2.3.2.tgz"; - path = fetchurl { - name = "raw_body___raw_body_2.3.2.tgz"; - url = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz"; - sha1 = "bcd60c77d3eb93cde0050295c3f379389bc88f89"; - }; - } - - { - name = "rc___rc_1.2.8.tgz"; - path = fetchurl { - name = "rc___rc_1.2.8.tgz"; - url = "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz"; - sha1 = "cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"; - }; - } - - { - name = "read_pkg_up___read_pkg_up_1.0.1.tgz"; - path = fetchurl { - name = "read_pkg_up___read_pkg_up_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz"; - sha1 = "9d63c13276c065918d57f002a57f40a1b643fb02"; - }; - } - - { - name = "read_pkg_up___read_pkg_up_2.0.0.tgz"; - path = fetchurl { - name = "read_pkg_up___read_pkg_up_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz"; - sha1 = "6b72a8048984e0c41e79510fd5e9fa99b3b549be"; - }; - } - - { - name = "read_pkg___read_pkg_1.1.0.tgz"; - path = fetchurl { - name = "read_pkg___read_pkg_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz"; - sha1 = "f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"; - }; - } - - { - name = "read_pkg___read_pkg_2.0.0.tgz"; - path = fetchurl { - name = "read_pkg___read_pkg_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz"; - sha1 = "8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"; - }; - } - - { - name = "readable_stream___readable_stream_1.0.34.tgz"; - path = fetchurl { - name = "readable_stream___readable_stream_1.0.34.tgz"; - url = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz"; - sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c"; - }; - } - - { - name = "readable_stream___readable_stream_2.3.6.tgz"; - path = fetchurl { - name = "readable_stream___readable_stream_2.3.6.tgz"; - url = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz"; - sha1 = "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"; - }; - } - - { - name = "readdirp___readdirp_2.1.0.tgz"; - path = fetchurl { - name = "readdirp___readdirp_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz"; - sha1 = "4ed0ad060df3073300c48440373f72d1cc642d78"; - }; - } - - { - name = "redent___redent_1.0.0.tgz"; - path = fetchurl { - name = "redent___redent_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz"; - sha1 = "cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"; - }; - } - - { - name = "reduce_css_calc___reduce_css_calc_1.3.0.tgz"; - path = fetchurl { - name = "reduce_css_calc___reduce_css_calc_1.3.0.tgz"; - url = "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz"; - sha1 = "747c914e049614a4c9cfbba629871ad1d2927716"; - }; - } - - { - name = "reduce_function_call___reduce_function_call_1.0.2.tgz"; - path = fetchurl { - name = "reduce_function_call___reduce_function_call_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz"; - sha1 = "5a200bf92e0e37751752fe45b0ab330fd4b6be99"; - }; - } - - { - name = "regenerate___regenerate_1.4.0.tgz"; - path = fetchurl { - name = "regenerate___regenerate_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz"; - sha1 = "4a856ec4b56e4077c557589cae85e7a4c8869a11"; - }; - } - - { - name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz"; - path = fetchurl { - name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz"; - url = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz"; - sha1 = "be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"; - }; - } - - { - name = "regenerator_transform___regenerator_transform_0.10.1.tgz"; - path = fetchurl { - name = "regenerator_transform___regenerator_transform_0.10.1.tgz"; - url = "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz"; - sha1 = "1e4996837231da8b7f3cf4114d71b5691a0680dd"; - }; - } - - { - name = "regex_cache___regex_cache_0.4.4.tgz"; - path = fetchurl { - name = "regex_cache___regex_cache_0.4.4.tgz"; - url = "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz"; - sha1 = "75bdc58a2a1496cec48a12835bc54c8d562336dd"; - }; - } - - { - name = "regex_not___regex_not_1.0.2.tgz"; - path = fetchurl { - name = "regex_not___regex_not_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz"; - sha1 = "1f4ece27e00b0b65e0247a6810e6a85d83a5752c"; - }; - } - - { - name = "regex_parser___regex_parser_2.2.9.tgz"; - path = fetchurl { - name = "regex_parser___regex_parser_2.2.9.tgz"; - url = "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.9.tgz"; - sha1 = "a372f45a248b62976a568037c1b6e60a60599192"; - }; - } - - { - name = "regexpu_core___regexpu_core_1.0.0.tgz"; - path = fetchurl { - name = "regexpu_core___regexpu_core_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz"; - sha1 = "86a763f58ee4d7c2f6b102e4764050de7ed90c6b"; - }; - } - - { - name = "regexpu_core___regexpu_core_2.0.0.tgz"; - path = fetchurl { - name = "regexpu_core___regexpu_core_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz"; - sha1 = "49d038837b8dcf8bfa5b9a42139938e6ea2ae240"; - }; - } - - { - name = "regjsgen___regjsgen_0.2.0.tgz"; - path = fetchurl { - name = "regjsgen___regjsgen_0.2.0.tgz"; - url = "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz"; - sha1 = "6c016adeac554f75823fe37ac05b92d5a4edb1f7"; - }; - } - - { - name = "regjsparser___regjsparser_0.1.5.tgz"; - path = fetchurl { - name = "regjsparser___regjsparser_0.1.5.tgz"; - url = "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz"; - sha1 = "7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"; - }; - } - - { - name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz"; - path = fetchurl { - name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz"; - sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef"; - }; - } - - { - name = "renderkid___renderkid_2.0.1.tgz"; - path = fetchurl { - name = "renderkid___renderkid_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz"; - sha1 = "898cabfc8bede4b7b91135a3ffd323e58c0db319"; - }; - } - - { - name = "repeat_element___repeat_element_1.1.2.tgz"; - path = fetchurl { - name = "repeat_element___repeat_element_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz"; - sha1 = "ef089a178d1483baae4d93eb98b4f9e4e11d990a"; - }; - } - - { - name = "repeat_string___repeat_string_1.6.1.tgz"; - path = fetchurl { - name = "repeat_string___repeat_string_1.6.1.tgz"; - url = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz"; - sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637"; - }; - } - - { - name = "repeating___repeating_2.0.1.tgz"; - path = fetchurl { - name = "repeating___repeating_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz"; - sha1 = "5214c53a926d3552707527fbab415dbc08d06dda"; - }; - } - - { - name = "request___request_2.87.0.tgz"; - path = fetchurl { - name = "request___request_2.87.0.tgz"; - url = "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz"; - sha1 = "32f00235cd08d482b4d0d68db93a829c0ed5756e"; - }; - } - - { - name = "request___request_2.81.0.tgz"; - path = fetchurl { - name = "request___request_2.81.0.tgz"; - url = "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz"; - sha1 = "c6928946a0e06c5f8d6f8a9333469ffda46298a0"; - }; - } - - { - name = "require_directory___require_directory_2.1.1.tgz"; - path = fetchurl { - name = "require_directory___require_directory_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz"; - sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"; - }; - } - - { - name = "require_main_filename___require_main_filename_1.0.1.tgz"; - path = fetchurl { - name = "require_main_filename___require_main_filename_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz"; - sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1"; - }; - } - - { - name = "requires_port___requires_port_1.0.0.tgz"; - path = fetchurl { - name = "requires_port___requires_port_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz"; - sha1 = "925d2601d39ac485e091cf0da5c6e694dc3dcaff"; - }; - } - - { - name = "resolve_cwd___resolve_cwd_2.0.0.tgz"; - path = fetchurl { - name = "resolve_cwd___resolve_cwd_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz"; - sha1 = "00a9f7387556e27038eae232caa372a6a59b665a"; - }; - } - - { - name = "resolve_from___resolve_from_3.0.0.tgz"; - path = fetchurl { - name = "resolve_from___resolve_from_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz"; - sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748"; - }; - } - - { - name = "resolve_url_loader___resolve_url_loader_2.3.0.tgz"; - path = fetchurl { - name = "resolve_url_loader___resolve_url_loader_2.3.0.tgz"; - url = "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-2.3.0.tgz"; - sha1 = "e1b37034d48f22f8cfb9f04c026faaa070fdaf26"; - }; - } - - { - name = "resolve_url___resolve_url_0.2.1.tgz"; - path = fetchurl { - name = "resolve_url___resolve_url_0.2.1.tgz"; - url = "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz"; - sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a"; - }; - } - - { - name = "ret___ret_0.1.15.tgz"; - path = fetchurl { - name = "ret___ret_0.1.15.tgz"; - url = "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz"; - sha1 = "b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"; - }; - } - - { - name = "rework_visit___rework_visit_1.0.0.tgz"; - path = fetchurl { - name = "rework_visit___rework_visit_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz"; - sha1 = "9945b2803f219e2f7aca00adb8bc9f640f842c9a"; - }; - } - - { - name = "rework___rework_1.0.1.tgz"; - path = fetchurl { - name = "rework___rework_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz"; - sha1 = "30806a841342b54510aa4110850cd48534144aa7"; - }; - } - - { - name = "right_align___right_align_0.1.3.tgz"; - path = fetchurl { - name = "right_align___right_align_0.1.3.tgz"; - url = "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz"; - sha1 = "61339b722fe6a3515689210d24e14c96148613ef"; - }; - } - - { - name = "rimraf___rimraf_2.6.2.tgz"; - path = fetchurl { - name = "rimraf___rimraf_2.6.2.tgz"; - url = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz"; - sha1 = "2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"; - }; - } - - { - name = "ripemd160___ripemd160_2.0.2.tgz"; - path = fetchurl { - name = "ripemd160___ripemd160_2.0.2.tgz"; - url = "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz"; - sha1 = "a1c1a6f624751577ba5d07914cbc92850585890c"; - }; - } - - { - name = "safe_buffer___safe_buffer_5.1.1.tgz"; - path = fetchurl { - name = "safe_buffer___safe_buffer_5.1.1.tgz"; - url = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz"; - sha1 = "893312af69b2123def71f57889001671eeb2c853"; - }; - } - - { - name = "safe_buffer___safe_buffer_5.1.2.tgz"; - path = fetchurl { - name = "safe_buffer___safe_buffer_5.1.2.tgz"; - url = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz"; - sha1 = "991ec69d296e0313747d59bdfd2b745c35f8828d"; - }; - } - - { - name = "safe_regex___safe_regex_1.1.0.tgz"; - path = fetchurl { - name = "safe_regex___safe_regex_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz"; - sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e"; - }; - } - - { - name = "safer_buffer___safer_buffer_2.1.2.tgz"; - path = fetchurl { - name = "safer_buffer___safer_buffer_2.1.2.tgz"; - url = "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz"; - sha1 = "44fa161b0187b9549dd84bb91802f9bd8385cd6a"; - }; - } - - { - name = "sass_graph___sass_graph_2.2.4.tgz"; - path = fetchurl { - name = "sass_graph___sass_graph_2.2.4.tgz"; - url = "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz"; - sha1 = "13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"; - }; - } - - { - name = "sass_loader___sass_loader_7.0.3.tgz"; - path = fetchurl { - name = "sass_loader___sass_loader_7.0.3.tgz"; - url = "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.3.tgz"; - sha1 = "6ca10871a1cc7549f8143db5a9958242c4e4ca2a"; - }; - } - - { - name = "sax___sax_1.2.4.tgz"; - path = fetchurl { - name = "sax___sax_1.2.4.tgz"; - url = "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz"; - sha1 = "2816234e2378bddc4e5354fab5caa895df7100d9"; - }; - } - - { - name = "schema_utils___schema_utils_0.3.0.tgz"; - path = fetchurl { - name = "schema_utils___schema_utils_0.3.0.tgz"; - url = "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz"; - sha1 = "f5877222ce3e931edae039f17eb3716e7137f8cf"; - }; - } - - { - name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz"; - path = fetchurl { - name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz"; - url = "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz"; - sha1 = "8eb06db9a9723333824d3f5530641149847ce5d1"; - }; - } - - { - name = "select_hose___select_hose_2.0.0.tgz"; - path = fetchurl { - name = "select_hose___select_hose_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz"; - sha1 = "625d8658f865af43ec962bfc376a37359a4994ca"; - }; - } - - { - name = "selfsigned___selfsigned_1.10.3.tgz"; - path = fetchurl { - name = "selfsigned___selfsigned_1.10.3.tgz"; - url = "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz"; - sha1 = "d628ecf9e3735f84e8bafba936b3cf85bea43823"; - }; - } - - { - name = "semver___semver_5.5.0.tgz"; - path = fetchurl { - name = "semver___semver_5.5.0.tgz"; - url = "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz"; - sha1 = "dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"; - }; - } - - { - name = "semver___semver_5.3.0.tgz"; - path = fetchurl { - name = "semver___semver_5.3.0.tgz"; - url = "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz"; - sha1 = "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"; - }; - } - - { - name = "send___send_0.16.2.tgz"; - path = fetchurl { - name = "send___send_0.16.2.tgz"; - url = "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz"; - sha1 = "6ecca1e0f8c156d141597559848df64730a6bbc1"; - }; - } - - { - name = "serve_index___serve_index_1.9.1.tgz"; - path = fetchurl { - name = "serve_index___serve_index_1.9.1.tgz"; - url = "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz"; - sha1 = "d3768d69b1e7d82e5ce050fff5b453bea12a9239"; - }; - } - - { - name = "serve_static___serve_static_1.13.2.tgz"; - path = fetchurl { - name = "serve_static___serve_static_1.13.2.tgz"; - url = "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz"; - sha1 = "095e8472fd5b46237db50ce486a43f4b86c6cec1"; - }; - } - - { - name = "set_blocking___set_blocking_2.0.0.tgz"; - path = fetchurl { - name = "set_blocking___set_blocking_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz"; - sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7"; - }; - } - - { - name = "set_immediate_shim___set_immediate_shim_1.0.1.tgz"; - path = fetchurl { - name = "set_immediate_shim___set_immediate_shim_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz"; - sha1 = "4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"; - }; - } - - { - name = "set_value___set_value_0.4.3.tgz"; - path = fetchurl { - name = "set_value___set_value_0.4.3.tgz"; - url = "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz"; - sha1 = "7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"; - }; - } - - { - name = "set_value___set_value_2.0.0.tgz"; - path = fetchurl { - name = "set_value___set_value_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz"; - sha1 = "71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"; - }; - } - - { - name = "setimmediate___setimmediate_1.0.5.tgz"; - path = fetchurl { - name = "setimmediate___setimmediate_1.0.5.tgz"; - url = "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz"; - sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285"; - }; - } - - { - name = "setprototypeof___setprototypeof_1.0.3.tgz"; - path = fetchurl { - name = "setprototypeof___setprototypeof_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz"; - sha1 = "66567e37043eeb4f04d91bd658c0cbefb55b8e04"; - }; - } - - { - name = "setprototypeof___setprototypeof_1.1.0.tgz"; - path = fetchurl { - name = "setprototypeof___setprototypeof_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz"; - sha1 = "d0bd85536887b6fe7c0d818cb962d9d91c54e656"; - }; - } - - { - name = "sha.js___sha.js_2.4.11.tgz"; - path = fetchurl { - name = "sha.js___sha.js_2.4.11.tgz"; - url = "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz"; - sha1 = "37a5cf0b81ecbc6943de109ba2960d1b26584ae7"; - }; - } - - { - name = "shallow_clone___shallow_clone_1.0.0.tgz"; - path = fetchurl { - name = "shallow_clone___shallow_clone_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz"; - sha1 = "4480cd06e882ef68b2ad88a3ea54832e2c48b571"; - }; - } - - { - name = "shebang_command___shebang_command_1.2.0.tgz"; - path = fetchurl { - name = "shebang_command___shebang_command_1.2.0.tgz"; - url = "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz"; - sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea"; - }; - } - - { - name = "shebang_regex___shebang_regex_1.0.0.tgz"; - path = fetchurl { - name = "shebang_regex___shebang_regex_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz"; - sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3"; - }; - } - - { - name = "signal_exit___signal_exit_3.0.2.tgz"; - path = fetchurl { - name = "signal_exit___signal_exit_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz"; - sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d"; - }; - } - - { - name = "slash___slash_1.0.0.tgz"; - path = fetchurl { - name = "slash___slash_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz"; - sha1 = "c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"; - }; - } - - { - name = "snapdragon_node___snapdragon_node_2.1.1.tgz"; - path = fetchurl { - name = "snapdragon_node___snapdragon_node_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz"; - sha1 = "6c175f86ff14bdb0724563e8f3c1b021a286853b"; - }; - } - - { - name = "snapdragon_util___snapdragon_util_3.0.1.tgz"; - path = fetchurl { - name = "snapdragon_util___snapdragon_util_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz"; - sha1 = "f956479486f2acd79700693f6f7b805e45ab56e2"; - }; - } - - { - name = "snapdragon___snapdragon_0.8.2.tgz"; - path = fetchurl { - name = "snapdragon___snapdragon_0.8.2.tgz"; - url = "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz"; - sha1 = "64922e7c565b0e14204ba1aa7d6964278d25182d"; - }; - } - - { - name = "sntp___sntp_1.0.9.tgz"; - path = fetchurl { - name = "sntp___sntp_1.0.9.tgz"; - url = "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz"; - sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198"; - }; - } - - { - name = "sockjs_client___sockjs_client_1.1.4.tgz"; - path = fetchurl { - name = "sockjs_client___sockjs_client_1.1.4.tgz"; - url = "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz"; - sha1 = "5babe386b775e4cf14e7520911452654016c8b12"; - }; - } - - { - name = "sockjs___sockjs_0.3.19.tgz"; - path = fetchurl { - name = "sockjs___sockjs_0.3.19.tgz"; - url = "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz"; - sha1 = "d976bbe800af7bd20ae08598d582393508993c0d"; - }; - } - - { - name = "sort_keys___sort_keys_1.1.2.tgz"; - path = fetchurl { - name = "sort_keys___sort_keys_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz"; - sha1 = "441b6d4d346798f1b4e49e8920adfba0e543f9ad"; - }; - } - - { - name = "source_list_map___source_list_map_0.1.8.tgz"; - path = fetchurl { - name = "source_list_map___source_list_map_0.1.8.tgz"; - url = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz"; - sha1 = "c550b2ab5427f6b3f21f5afead88c4f5587b2106"; - }; - } - - { - name = "source_list_map___source_list_map_2.0.0.tgz"; - path = fetchurl { - name = "source_list_map___source_list_map_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz"; - sha1 = "aaa47403f7b245a92fbc97ea08f250d6087ed085"; - }; - } - - { - name = "source_map_resolve___source_map_resolve_0.5.2.tgz"; - path = fetchurl { - name = "source_map_resolve___source_map_resolve_0.5.2.tgz"; - url = "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz"; - sha1 = "72e2cc34095543e43b2c62b2c4c10d4a9054f259"; - }; - } - - { - name = "source_map_support___source_map_support_0.4.18.tgz"; - path = fetchurl { - name = "source_map_support___source_map_support_0.4.18.tgz"; - url = "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz"; - sha1 = "0286a6de8be42641338594e97ccea75f0a2c585f"; - }; - } - - { - name = "source_map_url___source_map_url_0.4.0.tgz"; - path = fetchurl { - name = "source_map_url___source_map_url_0.4.0.tgz"; - url = "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz"; - sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3"; - }; - } - - { - name = "source_map___source_map_0.1.43.tgz"; - path = fetchurl { - name = "source_map___source_map_0.1.43.tgz"; - url = "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz"; - sha1 = "c24bc146ca517c1471f5dacbe2571b2b7f9e3346"; - }; - } - - { - name = "source_map___source_map_0.4.4.tgz"; - path = fetchurl { - name = "source_map___source_map_0.4.4.tgz"; - url = "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz"; - sha1 = "eba4f5da9c0dc999de68032d8b4f76173652036b"; - }; - } - - { - name = "source_map___source_map_0.5.7.tgz"; - path = fetchurl { - name = "source_map___source_map_0.5.7.tgz"; - url = "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz"; - sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"; - }; - } - - { - name = "source_map___source_map_0.6.1.tgz"; - path = fetchurl { - name = "source_map___source_map_0.6.1.tgz"; - url = "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz"; - sha1 = "74722af32e9614e9c287a8d0bbde48b5e2f1a263"; - }; - } - - { - name = "spdx_correct___spdx_correct_3.0.0.tgz"; - path = fetchurl { - name = "spdx_correct___spdx_correct_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz"; - sha1 = "05a5b4d7153a195bc92c3c425b69f3b2a9524c82"; - }; - } - - { - name = "spdx_exceptions___spdx_exceptions_2.1.0.tgz"; - path = fetchurl { - name = "spdx_exceptions___spdx_exceptions_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz"; - sha1 = "2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"; - }; - } - - { - name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz"; - path = fetchurl { - name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz"; - sha1 = "99e119b7a5da00e05491c9fa338b7904823b41d0"; - }; - } - - { - name = "spdx_license_ids___spdx_license_ids_3.0.0.tgz"; - path = fetchurl { - name = "spdx_license_ids___spdx_license_ids_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz"; - sha1 = "7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"; - }; - } - - { - name = "spdy_transport___spdy_transport_2.1.0.tgz"; - path = fetchurl { - name = "spdy_transport___spdy_transport_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz"; - sha1 = "4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1"; - }; - } - - { - name = "spdy___spdy_3.4.7.tgz"; - path = fetchurl { - name = "spdy___spdy_3.4.7.tgz"; - url = "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz"; - sha1 = "42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc"; - }; - } - - { - name = "split_string___split_string_3.1.0.tgz"; - path = fetchurl { - name = "split_string___split_string_3.1.0.tgz"; - url = "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz"; - sha1 = "7cb09dda3a86585705c64b39a6466038682e8fe2"; - }; - } - - { - name = "sprintf_js___sprintf_js_1.0.3.tgz"; - path = fetchurl { - name = "sprintf_js___sprintf_js_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz"; - sha1 = "04e6926f662895354f3dd015203633b857297e2c"; - }; - } - - { - name = "sshpk___sshpk_1.14.2.tgz"; - path = fetchurl { - name = "sshpk___sshpk_1.14.2.tgz"; - url = "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz"; - sha1 = "c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98"; - }; - } - - { - name = "stackframe___stackframe_1.0.4.tgz"; - path = fetchurl { - name = "stackframe___stackframe_1.0.4.tgz"; - url = "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz"; - sha1 = "357b24a992f9427cba6b545d96a14ed2cbca187b"; - }; - } - - { - name = "static_extend___static_extend_0.1.2.tgz"; - path = fetchurl { - name = "static_extend___static_extend_0.1.2.tgz"; - url = "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz"; - sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6"; - }; - } - - { - name = "statuses___statuses_1.5.0.tgz"; - path = fetchurl { - name = "statuses___statuses_1.5.0.tgz"; - url = "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz"; - sha1 = "161c7dac177659fd9811f43771fa99381478628c"; - }; - } - - { - name = "statuses___statuses_1.4.0.tgz"; - path = fetchurl { - name = "statuses___statuses_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz"; - sha1 = "bb73d446da2796106efcc1b601a253d6c46bd087"; - }; - } - - { - name = "stdout_stream___stdout_stream_1.4.0.tgz"; - path = fetchurl { - name = "stdout_stream___stdout_stream_1.4.0.tgz"; - url = "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz"; - sha1 = "a2c7c8587e54d9427ea9edb3ac3f2cd522df378b"; - }; - } - - { - name = "stream_browserify___stream_browserify_2.0.1.tgz"; - path = fetchurl { - name = "stream_browserify___stream_browserify_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz"; - sha1 = "66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"; - }; - } - - { - name = "stream_http___stream_http_2.8.3.tgz"; - path = fetchurl { - name = "stream_http___stream_http_2.8.3.tgz"; - url = "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz"; - sha1 = "b2d242469288a5a27ec4fe8933acf623de6514fc"; - }; - } - - { - name = "strict_uri_encode___strict_uri_encode_1.1.0.tgz"; - path = fetchurl { - name = "strict_uri_encode___strict_uri_encode_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz"; - sha1 = "279b225df1d582b1f54e65addd4352e18faa0713"; - }; - } - - { - name = "string_width___string_width_1.0.2.tgz"; - path = fetchurl { - name = "string_width___string_width_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz"; - sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"; - }; - } - - { - name = "string_width___string_width_2.1.1.tgz"; - path = fetchurl { - name = "string_width___string_width_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz"; - sha1 = "ab93f27a8dc13d28cac815c462143a6d9012ae9e"; - }; - } - - { - name = "string_decoder___string_decoder_1.1.1.tgz"; - path = fetchurl { - name = "string_decoder___string_decoder_1.1.1.tgz"; - url = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz"; - sha1 = "9cf1611ba62685d7030ae9e4ba34149c3af03fc8"; - }; - } - - { - name = "string_decoder___string_decoder_0.10.31.tgz"; - path = fetchurl { - name = "string_decoder___string_decoder_0.10.31.tgz"; - url = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz"; - sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94"; - }; - } - - { - name = "stringstream___stringstream_0.0.6.tgz"; - path = fetchurl { - name = "stringstream___stringstream_0.0.6.tgz"; - url = "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz"; - sha1 = "7880225b0d4ad10e30927d167a1d6f2fd3b33a72"; - }; - } - - { - name = "strip_ansi___strip_ansi_3.0.1.tgz"; - path = fetchurl { - name = "strip_ansi___strip_ansi_3.0.1.tgz"; - url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz"; - sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"; - }; - } - - { - name = "strip_ansi___strip_ansi_4.0.0.tgz"; - path = fetchurl { - name = "strip_ansi___strip_ansi_4.0.0.tgz"; - url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz"; - sha1 = "a8479022eb1ac368a871389b635262c505ee368f"; - }; - } - - { - name = "strip_bom___strip_bom_2.0.0.tgz"; - path = fetchurl { - name = "strip_bom___strip_bom_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz"; - sha1 = "6219a85616520491f35788bdbf1447a99c7e6b0e"; - }; - } - - { - name = "strip_bom___strip_bom_3.0.0.tgz"; - path = fetchurl { - name = "strip_bom___strip_bom_3.0.0.tgz"; - url = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz"; - sha1 = "2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"; - }; - } - - { - name = "strip_eof___strip_eof_1.0.0.tgz"; - path = fetchurl { - name = "strip_eof___strip_eof_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz"; - sha1 = "bb43ff5598a6eb05d89b59fcd129c983313606bf"; - }; - } - - { - name = "strip_indent___strip_indent_1.0.1.tgz"; - path = fetchurl { - name = "strip_indent___strip_indent_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz"; - sha1 = "0c7962a6adefa7bbd4ac366460a638552ae1a0a2"; - }; - } - - { - name = "strip_json_comments___strip_json_comments_2.0.1.tgz"; - path = fetchurl { - name = "strip_json_comments___strip_json_comments_2.0.1.tgz"; - url = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz"; - sha1 = "3c531942e908c2697c0ec344858c286c7ca0a60a"; - }; - } - - { - name = "style_loader___style_loader_0.13.2.tgz"; - path = fetchurl { - name = "style_loader___style_loader_0.13.2.tgz"; - url = "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz"; - sha1 = "74533384cf698c7104c7951150b49717adc2f3bb"; - }; - } - - { - name = "summernote___summernote_0.8.10.tgz"; - path = fetchurl { - name = "summernote___summernote_0.8.10.tgz"; - url = "https://registry.yarnpkg.com/summernote/-/summernote-0.8.10.tgz"; - sha1 = "21a5d7f18a3b07500b58b60d5907417a54897520"; - }; - } - - { - name = "supports_color___supports_color_2.0.0.tgz"; - path = fetchurl { - name = "supports_color___supports_color_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz"; - sha1 = "535d045ce6b6363fa40117084629995e9df324c7"; - }; - } - - { - name = "supports_color___supports_color_3.2.3.tgz"; - path = fetchurl { - name = "supports_color___supports_color_3.2.3.tgz"; - url = "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz"; - sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"; - }; - } - - { - name = "supports_color___supports_color_4.5.0.tgz"; - path = fetchurl { - name = "supports_color___supports_color_4.5.0.tgz"; - url = "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz"; - sha1 = "be7a0de484dec5c5cddf8b3d59125044912f635b"; - }; - } - - { - name = "supports_color___supports_color_5.4.0.tgz"; - path = fetchurl { - name = "supports_color___supports_color_5.4.0.tgz"; - url = "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz"; - sha1 = "1c6b337402c2137605efe19f10fec390f6faab54"; - }; - } - - { - name = "svgo___svgo_0.7.2.tgz"; - path = fetchurl { - name = "svgo___svgo_0.7.2.tgz"; - url = "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz"; - sha1 = "9f5772413952135c6fefbf40afe6a4faa88b4bb5"; - }; - } - - { - name = "tapable___tapable_0.2.8.tgz"; - path = fetchurl { - name = "tapable___tapable_0.2.8.tgz"; - url = "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz"; - sha1 = "99372a5c999bf2df160afc0d74bed4f47948cd22"; - }; - } - - { - name = "tar___tar_2.2.1.tgz"; - path = fetchurl { - name = "tar___tar_2.2.1.tgz"; - url = "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz"; - sha1 = "8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"; - }; - } - - { - name = "tar___tar_4.4.4.tgz"; - path = fetchurl { - name = "tar___tar_4.4.4.tgz"; - url = "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz"; - sha1 = "ec8409fae9f665a4355cc3b4087d0820232bb8cd"; - }; - } - - { - name = "thunky___thunky_1.0.2.tgz"; - path = fetchurl { - name = "thunky___thunky_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz"; - sha1 = "a862e018e3fb1ea2ec3fce5d55605cf57f247371"; - }; - } - - { - name = "time_stamp___time_stamp_2.0.0.tgz"; - path = fetchurl { - name = "time_stamp___time_stamp_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz"; - sha1 = "95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"; - }; - } - - { - name = "timers_browserify___timers_browserify_2.0.10.tgz"; - path = fetchurl { - name = "timers_browserify___timers_browserify_2.0.10.tgz"; - url = "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz"; - sha1 = "1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"; - }; - } - - { - name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz"; - path = fetchurl { - name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz"; - sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43"; - }; - } - - { - name = "to_fast_properties___to_fast_properties_1.0.3.tgz"; - path = fetchurl { - name = "to_fast_properties___to_fast_properties_1.0.3.tgz"; - url = "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz"; - sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47"; - }; - } - - { - name = "to_object_path___to_object_path_0.3.0.tgz"; - path = fetchurl { - name = "to_object_path___to_object_path_0.3.0.tgz"; - url = "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz"; - sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af"; - }; - } - - { - name = "to_regex_range___to_regex_range_2.1.1.tgz"; - path = fetchurl { - name = "to_regex_range___to_regex_range_2.1.1.tgz"; - url = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz"; - sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38"; - }; - } - - { - name = "to_regex___to_regex_3.0.2.tgz"; - path = fetchurl { - name = "to_regex___to_regex_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz"; - sha1 = "13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"; - }; - } - - { - name = "tough_cookie___tough_cookie_2.3.4.tgz"; - path = fetchurl { - name = "tough_cookie___tough_cookie_2.3.4.tgz"; - url = "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz"; - sha1 = "ec60cee38ac675063ffc97a5c18970578ee83655"; - }; - } - - { - name = "trim_newlines___trim_newlines_1.0.0.tgz"; - path = fetchurl { - name = "trim_newlines___trim_newlines_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz"; - sha1 = "5887966bb582a4503a41eb524f7d35011815a613"; - }; - } - - { - name = "trim_right___trim_right_1.0.1.tgz"; - path = fetchurl { - name = "trim_right___trim_right_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz"; - sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003"; - }; - } - - { - name = "true_case_path___true_case_path_1.0.2.tgz"; - path = fetchurl { - name = "true_case_path___true_case_path_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz"; - sha1 = "7ec91130924766c7f573be3020c34f8fdfd00d62"; - }; - } - - { - name = "tty_browserify___tty_browserify_0.0.0.tgz"; - path = fetchurl { - name = "tty_browserify___tty_browserify_0.0.0.tgz"; - url = "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz"; - sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6"; - }; - } - - { - name = "tunnel_agent___tunnel_agent_0.6.0.tgz"; - path = fetchurl { - name = "tunnel_agent___tunnel_agent_0.6.0.tgz"; - url = "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz"; - sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd"; - }; - } - - { - name = "tweetnacl___tweetnacl_0.14.5.tgz"; - path = fetchurl { - name = "tweetnacl___tweetnacl_0.14.5.tgz"; - url = "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz"; - sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64"; - }; - } - - { - name = "type_is___type_is_1.6.16.tgz"; - path = fetchurl { - name = "type_is___type_is_1.6.16.tgz"; - url = "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz"; - sha1 = "f89ce341541c672b25ee7ae3c73dee3b2be50194"; - }; - } - - { - name = "uglify_js___uglify_js_2.8.29.tgz"; - path = fetchurl { - name = "uglify_js___uglify_js_2.8.29.tgz"; - url = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz"; - sha1 = "29c5733148057bb4e1f75df35b7a9cb72e6a59dd"; - }; - } - - { - name = "uglify_to_browserify___uglify_to_browserify_1.0.2.tgz"; - path = fetchurl { - name = "uglify_to_browserify___uglify_to_browserify_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz"; - sha1 = "6e0924d6bda6b5afe349e39a6d632850a0f882b7"; - }; - } - - { - name = "uglifyjs_webpack_plugin___uglifyjs_webpack_plugin_0.4.6.tgz"; - path = fetchurl { - name = "uglifyjs_webpack_plugin___uglifyjs_webpack_plugin_0.4.6.tgz"; - url = "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz"; - sha1 = "b951f4abb6bd617e66f63eb891498e391763e309"; - }; - } - - { - name = "union_value___union_value_1.0.0.tgz"; - path = fetchurl { - name = "union_value___union_value_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz"; - sha1 = "5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"; - }; - } - - { - name = "uniq___uniq_1.0.1.tgz"; - path = fetchurl { - name = "uniq___uniq_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz"; - sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff"; - }; - } - - { - name = "uniqs___uniqs_2.0.0.tgz"; - path = fetchurl { - name = "uniqs___uniqs_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz"; - sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02"; - }; - } - - { - name = "unpipe___unpipe_1.0.0.tgz"; - path = fetchurl { - name = "unpipe___unpipe_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz"; - sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec"; - }; - } - - { - name = "unset_value___unset_value_1.0.0.tgz"; - path = fetchurl { - name = "unset_value___unset_value_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz"; - sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"; - }; - } - - { - name = "upath___upath_1.1.0.tgz"; - path = fetchurl { - name = "upath___upath_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz"; - sha1 = "35256597e46a581db4793d0ce47fa9aebfc9fabd"; - }; - } - - { - name = "uri_js___uri_js_4.2.2.tgz"; - path = fetchurl { - name = "uri_js___uri_js_4.2.2.tgz"; - url = "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz"; - sha1 = "94c540e1ff772956e2299507c010aea6c8838eb0"; - }; - } - - { - name = "urix___urix_0.1.0.tgz"; - path = fetchurl { - name = "urix___urix_0.1.0.tgz"; - url = "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz"; - sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72"; - }; - } - - { - name = "url_parse___url_parse_1.4.1.tgz"; - path = fetchurl { - name = "url_parse___url_parse_1.4.1.tgz"; - url = "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.1.tgz"; - sha1 = "4dec9dad3dc8585f862fed461d2e19bbf623df30"; - }; - } - - { - name = "url___url_0.11.0.tgz"; - path = fetchurl { - name = "url___url_0.11.0.tgz"; - url = "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz"; - sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"; - }; - } - - { - name = "use___use_3.1.1.tgz"; - path = fetchurl { - name = "use___use_3.1.1.tgz"; - url = "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz"; - sha1 = "d50c8cac79a19fbc20f2911f56eb973f4e10070f"; - }; - } - - { - name = "util_deprecate___util_deprecate_1.0.2.tgz"; - path = fetchurl { - name = "util_deprecate___util_deprecate_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz"; - sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf"; - }; - } - - { - name = "util___util_0.10.3.tgz"; - path = fetchurl { - name = "util___util_0.10.3.tgz"; - url = "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz"; - sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9"; - }; - } - - { - name = "util___util_0.10.4.tgz"; - path = fetchurl { - name = "util___util_0.10.4.tgz"; - url = "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz"; - sha1 = "3aa0125bfe668a4672de58857d3ace27ecb76901"; - }; - } - - { - name = "utila___utila_0.3.3.tgz"; - path = fetchurl { - name = "utila___utila_0.3.3.tgz"; - url = "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz"; - sha1 = "d7e8e7d7e309107092b05f8d9688824d633a4226"; - }; - } - - { - name = "utila___utila_0.4.0.tgz"; - path = fetchurl { - name = "utila___utila_0.4.0.tgz"; - url = "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz"; - sha1 = "8a16a05d445657a3aea5eecc5b12a4fa5379772c"; - }; - } - - { - name = "utils_merge___utils_merge_1.0.1.tgz"; - path = fetchurl { - name = "utils_merge___utils_merge_1.0.1.tgz"; - url = "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz"; - sha1 = "9f95710f50a267947b2ccc124741c1028427e713"; - }; - } - - { - name = "uuid___uuid_3.3.2.tgz"; - path = fetchurl { - name = "uuid___uuid_3.3.2.tgz"; - url = "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz"; - sha1 = "1b4af4955eb3077c501c23872fc6513811587131"; - }; - } - - { - name = "validate_npm_package_license___validate_npm_package_license_3.0.3.tgz"; - path = fetchurl { - name = "validate_npm_package_license___validate_npm_package_license_3.0.3.tgz"; - url = "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz"; - sha1 = "81643bcbef1bdfecd4623793dc4648948ba98338"; - }; - } - - { - name = "vary___vary_1.1.2.tgz"; - path = fetchurl { - name = "vary___vary_1.1.2.tgz"; - url = "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz"; - sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc"; - }; - } - - { - name = "vendors___vendors_1.0.2.tgz"; - path = fetchurl { - name = "vendors___vendors_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz"; - sha1 = "7fcb5eef9f5623b156bcea89ec37d63676f21801"; - }; - } - - { - name = "verror___verror_1.10.0.tgz"; - path = fetchurl { - name = "verror___verror_1.10.0.tgz"; - url = "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz"; - sha1 = "3a105ca17053af55d6e270c1f8288682e18da400"; - }; - } - - { - name = "vm_browserify___vm_browserify_0.0.4.tgz"; - path = fetchurl { - name = "vm_browserify___vm_browserify_0.0.4.tgz"; - url = "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz"; - sha1 = "5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"; - }; - } - - { - name = "watchpack___watchpack_1.6.0.tgz"; - path = fetchurl { - name = "watchpack___watchpack_1.6.0.tgz"; - url = "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz"; - sha1 = "4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"; - }; - } - - { - name = "wbuf___wbuf_1.7.3.tgz"; - path = fetchurl { - name = "wbuf___wbuf_1.7.3.tgz"; - url = "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz"; - sha1 = "c1d8d149316d3ea852848895cb6a0bfe887b87df"; - }; - } - - { - name = "webpack_chunk_hash___webpack_chunk_hash_0.5.0.tgz"; - path = fetchurl { - name = "webpack_chunk_hash___webpack_chunk_hash_0.5.0.tgz"; - url = "https://registry.yarnpkg.com/webpack-chunk-hash/-/webpack-chunk-hash-0.5.0.tgz"; - sha1 = "1dba38203d73c1e6ab069b6810a5a37402399dec"; - }; - } - - { - name = "webpack_dev_middleware___webpack_dev_middleware_1.12.2.tgz"; - path = fetchurl { - name = "webpack_dev_middleware___webpack_dev_middleware_1.12.2.tgz"; - url = "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz"; - sha1 = "f8fc1120ce3b4fc5680ceecb43d777966b21105e"; - }; - } - - { - name = "webpack_dev_server___webpack_dev_server_2.11.2.tgz"; - path = fetchurl { - name = "webpack_dev_server___webpack_dev_server_2.11.2.tgz"; - url = "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz"; - sha1 = "1f4f4c78bf1895378f376815910812daf79a216f"; - }; - } - - { - name = "webpack_sources___webpack_sources_1.1.0.tgz"; - path = fetchurl { - name = "webpack_sources___webpack_sources_1.1.0.tgz"; - url = "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz"; - sha1 = "a101ebae59d6507354d71d8013950a3a8b7a5a54"; - }; - } - - { - name = "webpack___webpack_3.12.0.tgz"; - path = fetchurl { - name = "webpack___webpack_3.12.0.tgz"; - url = "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz"; - sha1 = "3f9e34360370602fcf639e97939db486f4ec0d74"; - }; - } - - { - name = "websocket_driver___websocket_driver_0.7.0.tgz"; - path = fetchurl { - name = "websocket_driver___websocket_driver_0.7.0.tgz"; - url = "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz"; - sha1 = "0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb"; - }; - } - - { - name = "websocket_extensions___websocket_extensions_0.1.3.tgz"; - path = fetchurl { - name = "websocket_extensions___websocket_extensions_0.1.3.tgz"; - url = "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz"; - sha1 = "5d2ff22977003ec687a4b87073dfbbac146ccf29"; - }; - } - - { - name = "whet.extend___whet.extend_0.9.9.tgz"; - path = fetchurl { - name = "whet.extend___whet.extend_0.9.9.tgz"; - url = "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz"; - sha1 = "f877d5bf648c97e5aa542fadc16d6a259b9c11a1"; - }; - } - - { - name = "which_module___which_module_1.0.0.tgz"; - path = fetchurl { - name = "which_module___which_module_1.0.0.tgz"; - url = "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz"; - sha1 = "bba63ca861948994ff307736089e3b96026c2a4f"; - }; - } - - { - name = "which_module___which_module_2.0.0.tgz"; - path = fetchurl { - name = "which_module___which_module_2.0.0.tgz"; - url = "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz"; - sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"; - }; - } - - { - name = "which___which_1.3.1.tgz"; - path = fetchurl { - name = "which___which_1.3.1.tgz"; - url = "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz"; - sha1 = "a45043d54f5805316da8d62f9f50918d3da70b0a"; - }; - } - - { - name = "wide_align___wide_align_1.1.3.tgz"; - path = fetchurl { - name = "wide_align___wide_align_1.1.3.tgz"; - url = "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz"; - sha1 = "ae074e6bdc0c14a431e804e624549c633b000457"; - }; - } - - { - name = "window_size___window_size_0.1.0.tgz"; - path = fetchurl { - name = "window_size___window_size_0.1.0.tgz"; - url = "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz"; - sha1 = "5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"; - }; - } - - { - name = "wordwrap___wordwrap_0.0.2.tgz"; - path = fetchurl { - name = "wordwrap___wordwrap_0.0.2.tgz"; - url = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz"; - sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f"; - }; - } - - { - name = "wrap_ansi___wrap_ansi_2.1.0.tgz"; - path = fetchurl { - name = "wrap_ansi___wrap_ansi_2.1.0.tgz"; - url = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz"; - sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85"; - }; - } - - { - name = "wrappy___wrappy_1.0.2.tgz"; - path = fetchurl { - name = "wrappy___wrappy_1.0.2.tgz"; - url = "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz"; - sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"; - }; - } - - { - name = "xtend___xtend_4.0.1.tgz"; - path = fetchurl { - name = "xtend___xtend_4.0.1.tgz"; - url = "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz"; - sha1 = "a5c6d532be656e23db820efb943a1f04998d63af"; - }; - } - - { - name = "y18n___y18n_3.2.1.tgz"; - path = fetchurl { - name = "y18n___y18n_3.2.1.tgz"; - url = "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz"; - sha1 = "6d15fba884c08679c0d77e88e7759e811e07fa41"; - }; - } - - { - name = "yallist___yallist_2.1.2.tgz"; - path = fetchurl { - name = "yallist___yallist_2.1.2.tgz"; - url = "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz"; - sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52"; - }; - } - - { - name = "yallist___yallist_3.0.2.tgz"; - path = fetchurl { - name = "yallist___yallist_3.0.2.tgz"; - url = "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz"; - sha1 = "8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"; - }; - } - - { - name = "yargs_parser___yargs_parser_4.2.1.tgz"; - path = fetchurl { - name = "yargs_parser___yargs_parser_4.2.1.tgz"; - url = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz"; - sha1 = "29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"; - }; - } - - { - name = "yargs_parser___yargs_parser_5.0.0.tgz"; - path = fetchurl { - name = "yargs_parser___yargs_parser_5.0.0.tgz"; - url = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz"; - sha1 = "275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"; - }; - } - - { - name = "yargs_parser___yargs_parser_7.0.0.tgz"; - path = fetchurl { - name = "yargs_parser___yargs_parser_7.0.0.tgz"; - url = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz"; - sha1 = "8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"; - }; - } - - { - name = "yargs___yargs_6.6.0.tgz"; - path = fetchurl { - name = "yargs___yargs_6.6.0.tgz"; - url = "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz"; - sha1 = "782ec21ef403345f830a808ca3d513af56065208"; - }; - } - - { - name = "yargs___yargs_7.1.0.tgz"; - path = fetchurl { - name = "yargs___yargs_7.1.0.tgz"; - url = "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz"; - sha1 = "6ba318eb16961727f5d284f8ea003e8d6154d0c8"; - }; - } - - { - name = "yargs___yargs_8.0.2.tgz"; - path = fetchurl { - name = "yargs___yargs_8.0.2.tgz"; - url = "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz"; - sha1 = "6299a9055b1cefc969ff7e79c1d918dceb22c360"; - }; - } - - { - name = "yargs___yargs_3.10.0.tgz"; - path = fetchurl { - name = "yargs___yargs_3.10.0.tgz"; - url = "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz"; - sha1 = "f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"; - }; - } - ]; -} diff --git a/modules/private/websites/isabelle/aten_integration.nix b/modules/private/websites/isabelle/aten_integration.nix deleted file mode 100644 index c55ef92..0000000 --- a/modules/private/websites/isabelle/aten_integration.nix +++ /dev/null @@ -1,91 +0,0 @@ -{ lib, pkgs, config, ... }: -let - secrets = config.myEnv.websites.isabelle.aten_integration; - webRoot = "/var/lib/ftp/immae/aten/public"; - cfg = config.myServices.websites.isabelle.aten_integration; - pcfg = config.services.phpApplication; -in { - options.myServices.websites.isabelle.aten_integration.enable = lib.mkEnableOption "enable Aten's website in integration"; - - config = lib.mkIf cfg.enable { - services.phpApplication.apps.isabelle_aten_integration = { - websiteEnv = "integration"; - httpdUser = config.services.httpd.Inte.user; - httpdGroup = config.services.httpd.Inte.group; - httpdWatchFiles = [ - config.secrets.fullPaths."websites/isabelle/aten_integration" - ]; - inherit webRoot; - varDir = "/var/lib/ftp/immae/aten_var"; - app = "/var/lib/ftp/immae/aten"; - serviceDeps = [ "postgresql.service" ]; - preStartActions = [ - "APP_ENV=dev ./bin/console --env=dev cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - }; - phpEnv = { - SYMFONY_DEBUG_MODE = "\"yes\""; - }; - phpPackage = pkgs.php72; - }; - - secrets.keys."websites/isabelle/aten_integration" = { - user = config.services.httpd.Inte.user; - group = config.services.httpd.Inte.group; - permissions = "0400"; - text = let - # cf: - # https://secure.php.net/manual/fr/function.parse-url.php - # vendor/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php#parseDatabaseUrlQuery - psql_url = with secrets.postgresql; "pdo-pgsql://${user}:${password}@invalid:${port}/${database}?host=${socket}"; - in '' - SetEnv APP_ENV "dev" - SetEnv APP_SECRET "${secrets.secret}" - SetEnv DATABASE_URL "${psql_url}" - ''; - }; - services.websites.env.integration.vhostConfs.isabelle_aten_integration = { - certName = "integration"; - addToCerts = true; - hosts = [ "aten.ic.immae.dev" ]; - root = webRoot; - extraConfig = [ - '' - - SetHandler "proxy:unix:${pcfg.phpListenPaths.isabelle_aten_integration}|fcgi://localhost" - - - Include ${config.secrets.fullPaths."websites/isabelle/aten_integration"} - - - Use LDAPConnect - Require ldap-group cn=ic.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu - ErrorDocument 401 "" - - - - Use LDAPConnect - Require ldap-group cn=ic.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu - ErrorDocument 401 "" - - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - DirectoryIndex index.php - FallbackResource /index.php - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/isabelle/aten_production.nix b/modules/private/websites/isabelle/aten_production.nix deleted file mode 100644 index 928a815..0000000 --- a/modules/private/websites/isabelle/aten_production.nix +++ /dev/null @@ -1,90 +0,0 @@ -{ lib, pkgs, config, ... }: -let - secrets = config.myEnv.websites.isabelle.aten_production; - app = pkgs.callPackage ./aten_app { - composerEnv = pkgs.composerEnv.override { php = pkgs.php72; }; - environment = secrets.environment; - varDir = "/var/lib/isabelle_aten_production"; - }; - cfg = config.myServices.websites.isabelle.aten_production; - pcfg = config.services.phpApplication; -in { - options.myServices.websites.isabelle.aten_production.enable = lib.mkEnableOption "enable Aten's website in production"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "aten.pro"; } ]; - services.phpApplication.apps.isabelle_aten_production = { - websiteEnv = "production"; - httpdUser = config.services.httpd.Prod.user; - httpdGroup = config.services.httpd.Prod.group; - httpdWatchFiles = [ - config.secrets.fullPaths."websites/isabelle/aten_production" - ]; - inherit (app) webRoot varDir; - inherit app; - serviceDeps = [ "postgresql.service" ]; - preStartActions = [ - "APP_ENV=${app.environment} ./bin/console --env=${app.environment} cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "dynamic"; - "pm.max_children" = "20"; - "pm.start_servers" = "2"; - "pm.min_spare_servers" = "1"; - "pm.max_spare_servers" = "3"; - }; - phpPackage = pkgs.php72; - }; - - secrets.keys."websites/isabelle/aten_production" = { - user = config.services.httpd.Prod.user; - group = config.services.httpd.Prod.group; - permissions = "0400"; - text = let - # cf: - # https://secure.php.net/manual/fr/function.parse-url.php - # vendor/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php#parseDatabaseUrlQuery - psql_url = with secrets.postgresql; "pdo-pgsql://${user}:${password}@invalid:${port}/${database}?host=${socket}"; - in '' - SetEnv APP_ENV "${app.environment}" - SetEnv APP_SECRET "${secrets.secret}" - SetEnv DATABASE_URL "${psql_url}" - ''; - }; - services.websites.env.production.vhostConfs.isabelle_aten_production = { - certName = "isabelle"; - certMainHost = "aten.pro"; - hosts = [ "aten.pro" "www.aten.pro" ]; - root = app.webRoot; - extraConfig = [ - '' - - SetHandler "proxy:unix:${pcfg.phpListenPaths.isabelle_aten_production}|fcgi://localhost" - - - Include ${config.secrets.fullPaths."websites/isabelle/aten_production"} - - Use Stats aten.pro - - - Use LDAPConnect - Require ldap-group cn=aten.pro,cn=httpd,ou=services,dc=immae,dc=eu - ErrorDocument 401 "" - - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - DirectoryIndex index.php - FallbackResource /index.php - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/isabelle/config/chmod.php b/modules/private/websites/isabelle/config/chmod.php deleted file mode 100644 index aae16cd..0000000 --- a/modules/private/websites/isabelle/config/chmod.php +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/modules/private/websites/isabelle/config/connect.php b/modules/private/websites/isabelle/config/connect.php deleted file mode 100644 index 18b0933..0000000 --- a/modules/private/websites/isabelle/config/connect.php +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/modules/private/websites/isabelle/config/ldap.php b/modules/private/websites/isabelle/config/ldap.php deleted file mode 100644 index 825b7ed..0000000 --- a/modules/private/websites/isabelle/config/ldap.php +++ /dev/null @@ -1,9 +0,0 @@ - array('sAMAccountName','uid','login','userid','cn','sn'),'nom' => 'cn','email' => 'mail','bio' => 'description',); -$GLOBALS['ldap_search'] = getenv("SPIP_LDAP_SEARCH"); -?> diff --git a/modules/private/websites/isabelle/iridologie.nix b/modules/private/websites/isabelle/iridologie.nix deleted file mode 100644 index cd733c1..0000000 --- a/modules/private/websites/isabelle/iridologie.nix +++ /dev/null @@ -1,113 +0,0 @@ -{ lib, pkgs, config, ... }: -let - icfg = config.myEnv.websites.isabelle.iridologie; - cfg = config.myServices.websites.isabelle.iridologie; - app = pkgs.callPackage ./iridologie_app { - inherit (icfg) environment; - inherit (pkgs.webapps) spip; - varDir = "/var/lib/isabelle_iridologie"; - }; - - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; - secretsPath = config.secrets.fullPaths."websites/isabelle/iridologie"; -in { - options.myServices.websites.isabelle.iridologie.enable = lib.mkEnableOption "enable Iridologie's website"; - - config = lib.mkIf cfg.enable { - secrets.keys."websites/isabelle/iridologie" = { - user = apacheUser; - group = apacheGroup; - permissions = "0400"; - text = '' - SetEnv SPIP_CONFIG_DIR "${./config}" - SetEnv SPIP_VAR_DIR "${app.varDir}" - SetEnv SPIP_SITE "iridologie-${app.environment}" - SetEnv SPIP_LDAP_BASE "dc=immae,dc=eu" - SetEnv SPIP_LDAP_HOST "ldaps://ldap.immae.eu" - SetEnv SPIP_LDAP_SEARCH_DN "${icfg.ldap.dn}" - SetEnv SPIP_LDAP_SEARCH_PW "${icfg.ldap.password}" - SetEnv SPIP_LDAP_SEARCH "${icfg.ldap.filter}" - SetEnv SPIP_MYSQL_HOST "${icfg.mysql.host}" - SetEnv SPIP_MYSQL_PORT "${icfg.mysql.port}" - SetEnv SPIP_MYSQL_DB "${icfg.mysql.database}" - SetEnv SPIP_MYSQL_USER "${icfg.mysql.user}" - SetEnv SPIP_MYSQL_PASSWORD "${icfg.mysql.password}" - ''; - }; - services.webstats.sites = [ { name = "iridologie.icommandeur.org"; } ]; - - systemd.services.phpfpm-isabelle_iridologie.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-isabelle_iridologie.wants = [ "mysql.service" ]; - services.phpfpm.pools.isabelle_iridologie = { - user = config.services.httpd.Prod.user; - group = config.services.httpd.Prod.group; - settings = { - "listen.owner" = "${apacheUser}"; - "listen.group" = "${apacheGroup}"; - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "php_admin_value[open_basedir]" = "${app.spipConfig}:${./config}:${app}:${app.varDir}:/tmp"; - "php_admin_value[session.save_path]" = "${app.varDir}/phpSessions"; - "pm" = "dynamic"; - "pm.max_children" = "20"; - "pm.start_servers" = "2"; - "pm.min_spare_servers" = "1"; - "pm.max_spare_servers" = "3"; - }; - phpPackage = pkgs.php72; - }; - system.activationScripts.isabelle_iridologie = { - deps = [ "wrappers" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir} ${app.varDir}/IMG ${app.varDir}/tmp ${app.varDir}/local - install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions - ''; - }; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.isabelle_iridologie = { - certName = "isabelle"; - addToCerts = true; - hosts = [ "iridologie.icommandeur.org" "icommandeur.org" "www.icommandeur.org" ]; - root = app.webRoot; - extraConfig = [ - '' - RewriteEngine On - RewriteCond "%{HTTP_HOST}" "!^iridologie\.icommandeur\.org$" [NC] - RewriteRule ^(.+)$ https://iridologie.icommandeur.org$1 [R=302,L] - - Include ${secretsPath} - - RewriteEngine On - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.isabelle_iridologie.socket}|fcgi://localhost" - - - - DirectoryIndex index.php index.htm index.html - Options -Indexes +FollowSymLinks +MultiViews +Includes - Include ${app.webRoot}/htaccess.txt - - AllowOverride AuthConfig FileInfo Limit - Require all granted - - - - Require all denied - - - - Require all denied - - - Use Stats iridologie.icommandeur.org - '' - ]; - }; - services.websites.env.production.watchPaths = [ - secretsPath - ]; - }; -} diff --git a/modules/private/websites/isabelle/iridologie_app/default.nix b/modules/private/websites/isabelle/iridologie_app/default.nix deleted file mode 100644 index edb7eef..0000000 --- a/modules/private/websites/isabelle/iridologie_app/default.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ environment ? "prod" -, varDir ? "/var/lib/iridologie_${environment}" -, spip, stdenv, sassc, sources }: -let - siteDir = stdenv.mkDerivation rec { - version = sources.websites-isabelle-iridologie.version; - pname = "iridologie"; - name = "${pname}-${version}"; - src = sources.websites-isabelle-iridologie; - installPhase = '' - cp -a . $out - ''; - }; -in -spip.override { - ldap = true; - siteName = "iridologie"; - inherit environment siteDir varDir; -} diff --git a/modules/private/websites/jerome/naturaloutil.nix b/modules/private/websites/jerome/naturaloutil.nix deleted file mode 100644 index 0974ce3..0000000 --- a/modules/private/websites/jerome/naturaloutil.nix +++ /dev/null @@ -1,97 +0,0 @@ -{ lib, pkgs, config, ... }: -let - adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; }; - cfg = config.myServices.websites.jerome.naturaloutil; - varDir = "/var/lib/ftp/jerome"; - env = config.myEnv.websites.jerome; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; - secretsPath = config.secrets.fullPaths."websites/jerome/naturaloutil"; -in { - options.myServices.websites.jerome.naturaloutil.enable = lib.mkEnableOption "enable Jerome Naturaloutil's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "naturaloutil.immae.eu"; } ]; - - security.acme.certs."ftp".extraDomains."naturaloutil.immae.eu" = null; - - secrets.keys."websites/jerome/naturaloutil" = { - user = apacheUser; - group = apacheGroup; - permissions = "0400"; - text = '' - ssl_set(NULL, NULL, "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt", NULL, NULL); - '' else ""} - $database = connect_db($db, $mysql_server, $mysql_base, $mysql_user, $mysql_password); - ?> - ''; - }; - system.activationScripts.jerome_naturaloutil = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/jerome_naturaloutil - ''; - }; - systemd.services.phpfpm-jerome_naturaloutil.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-jerome_naturaloutil.wants = [ "mysql.service" ]; - services.phpfpm.pools.jerome_naturaloutil = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/jerome_naturaloutil:${secretsPath}:${varDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/jerome_naturaloutil"; - }; - phpEnv = { - BDD_CONNECT = secretsPath; - }; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = adminer.apache.modules ++ [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.jerome_naturaloutil = { - certName = "jerome"; - certMainHost = "naturaloutil.immae.eu"; - hosts = ["naturaloutil.immae.eu" ]; - root = varDir; - extraConfig = [ - (adminer.apache.vhostConf null) - '' - Use Stats naturaloutil.immae.eu - ServerAdmin ${env.server_admin} - ErrorLog "${varDir}/logs/error_log" - CustomLog "${varDir}/logs/access_log" combined - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.jerome_naturaloutil.socket}|fcgi://localhost" - - - - AllowOverride None - Require all denied - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/leila/production.nix b/modules/private/websites/leila/production.nix deleted file mode 100644 index 8385bc7..0000000 --- a/modules/private/websites/leila/production.nix +++ /dev/null @@ -1,114 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.leila.production; - varDir = "/var/lib/ftp/leila"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.leila.production.enable = lib.mkEnableOption "enable Leila's websites in production"; - - config = lib.mkIf cfg.enable { - services.phpfpm.pools.leila = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "${varDir}:/tmp"; - "php_admin_value[max_execution_time]" = "1800"; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - disable_functions = "mail" - ''; - phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.imagick ]); - phpEnv = { - PATH = lib.makeBinPath [ pkgs.imagemagick ]; - }; - }; - - services.webstats.sites = [ - { name = "leila.bouya.org"; } - { name = "chorale.leila.bouya.org"; } - { name = "syrwennecreation.bouya.org"; } - ]; - - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.leila_chorale = { - certName = "leila"; - addToCerts = true; - hosts = [ "chorale.leila.bouya.org" "chorale-vocanta.fr.nf" "www.chorale-vocanta.fr.nf" ]; - root = "${varDir}/Chorale"; - extraConfig = [ - '' - Use Stats chorale.leila.bouya.org - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - - Use LDAPConnect - Require ldap-group cn=chorale.leila.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.leila.socket}|fcgi://localhost" - - - '' - ]; - }; - services.websites.env.production.vhostConfs.leila_syrwenne = { - certName = "leila"; - addToCerts = true; - hosts = [ "syrwennecreation.bouya.org" ]; - root = "${varDir}/Syrwennecreation"; - extraConfig = [ - '' - Use Stats syrwennecreation.bouya.org - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.leila.socket}|fcgi://localhost" - - - '' - ]; - }; - services.websites.env.production.vhostConfs.leila = { - certName = "leila"; - certMainHost = "leila.bouya.org"; - hosts = [ "leila.bouya.org" ]; - root = varDir; - extraConfig = [ - '' - Use Stats leila.bouya.org - - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - - Use LDAPConnect - Require ldap-group cn=chorale.leila.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.leila.socket}|fcgi://localhost" - - - - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/ludivine/app/default.nix b/modules/private/websites/ludivine/app/default.nix deleted file mode 100644 index 323b6e0..0000000 --- a/modules/private/websites/ludivine/app/default.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ environment, varDir, secretsPath -, composerEnv, fetchurl, fetchgit, imagemagick, sass, ruby, sources }: -let - app = composerEnv.buildPackage ( - import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } // - rec { - name = "${pname}-${version}"; - pname = "ludivinecassal"; - version = sources.websites-ludivine-app.version; - src = sources.websites-ludivine-app; - noDev = (environment == "prod"); - preInstall = '' - export SYMFONY_ENV="${environment}" - cp app/config/parameters.yml.dist app/config/parameters.yml - cat >> app/config/parameters.yml < - SetHandler "proxy:unix:${pcfg.phpListenPaths.ludivine_integration}|fcgi://localhost" - - - - Use LDAPConnect - Require ldap-group cn=lc.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu - ErrorDocument 401 "" - - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - DirectoryIndex app_dev.php - - - Options -MultiViews - - - - RewriteEngine On - - RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ - RewriteRule ^(.*) - [E=BASE:%1] - - # Maintenance script - RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f - RewriteCond %{SCRIPT_FILENAME} !maintenance.php - RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L] - ErrorDocument 503 /maintenance.php - - # Sets the HTTP_AUTHORIZATION header removed by Apache - RewriteCond %{HTTP:Authorization} . - RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - RewriteCond %{ENV:REDIRECT_STATUS} ^$ - RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] - - # If the requested filename exists, simply serve it. - # We only want to let Apache serve files and not directories. - RewriteCond %{REQUEST_FILENAME} -f - RewriteRule ^ - [L] - - # Rewrite all other queries to the front controller. - RewriteRule ^ %{ENV:BASE}/app_dev.php [L] - - - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/ludivine/production.nix b/modules/private/websites/ludivine/production.nix deleted file mode 100644 index 7a18b88..0000000 --- a/modules/private/websites/ludivine/production.nix +++ /dev/null @@ -1,116 +0,0 @@ -{ lib, pkgs, config, ... }: -let - secrets = config.myEnv.websites.ludivine.production; - app = pkgs.callPackage ./app { - composerEnv = pkgs.composerEnv.override { php = pkgs.php72; }; - environment = secrets.environment; - varDir = "/var/lib/ludivine_production"; - secretsPath = config.secrets.fullPaths."websites/ludivine/production"; - }; - pcfg = config.services.phpApplication; - cfg = config.myServices.websites.ludivine.production; -in { - options.myServices.websites.ludivine.production.enable = lib.mkEnableOption "enable Ludivine's website in production"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "ludivinecassal.com"; } ]; - services.phpApplication.apps.ludivine_production = { - websiteEnv = "production"; - httpdUser = config.services.httpd.Prod.user; - httpdGroup = config.services.httpd.Prod.group; - inherit (app) webRoot varDir; - varDirPaths = { - "tmp" = "0700"; - }; - inherit app; - serviceDeps = [ "mysql.service" ]; - preStartActions = [ - "./bin/console --env=${app.environment} cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "dynamic"; - "pm.max_children" = "20"; - "pm.start_servers" = "2"; - "pm.min_spare_servers" = "1"; - "pm.max_spare_servers" = "3"; - }; - phpWatchFiles = [ - config.secrets.fullPaths."websites/ludivine/production" - ]; - phpEnv = { - PATH = lib.makeBinPath [ - # below ones don't need to be in the PATH but they’re used in - # secrets - pkgs.imagemagick pkgs.sass pkgs.ruby - ]; - }; - phpPackage = pkgs.php72; - }; - - secrets.keys."websites/ludivine/production" = { - user = config.services.httpd.Prod.user; - group = config.services.httpd.Prod.group; - permissions = "0400"; - text = '' - # This file is auto-generated during the composer install - parameters: - database_host: ${secrets.mysql.host} - database_port: ${secrets.mysql.port} - database_name: ${secrets.mysql.database} - database_user: ${secrets.mysql.user} - database_password: ${secrets.mysql.password} - database_server_version: ${pkgs.mariadb.mysqlVersion} - mailer_transport: smtp - mailer_host: 127.0.0.1 - mailer_user: null - mailer_password: null - secret: ${secrets.secret} - ldap_host: ldap.immae.eu - ldap_port: 636 - ldap_version: 3 - ldap_ssl: true - ldap_tls: false - ldap_user_bind: 'uid={username},ou=users,dc=immae,dc=eu' - ldap_base_dn: 'dc=immae,dc=eu' - ldap_search_dn: '${secrets.ldap.dn}' - ldap_search_password: '${secrets.ldap.password}' - ldap_search_filter: '${secrets.ldap.filter}' - leapt_im: - binary_path: ${pkgs.imagemagick}/bin - assetic: - sass: ${pkgs.sass}/bin/sass - ruby: ${pkgs.ruby}/bin/ruby - ''; - }; - - services.websites.env.production.vhostConfs.ludivine_production = { - certName = "ludivine"; - certMainHost = "ludivinecassal.com"; - hosts = ["ludivinecassal.com" "www.ludivinecassal.com" ]; - root = app.webRoot; - extraConfig = [ - '' - RewriteEngine on - RewriteCond "%{HTTP_HOST}" "!^ludivinecassal\.com$" [NC] - RewriteRule ^(.+)$ https://ludivinecassal.com$1 [R=302,L] - - - SetHandler "proxy:unix:${pcfg.phpListenPaths.ludivine_production}|fcgi://localhost" - - - Use Stats ludivinecassal.com - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/nassime/production.nix b/modules/private/websites/nassime/production.nix deleted file mode 100644 index 1179351..0000000 --- a/modules/private/websites/nassime/production.nix +++ /dev/null @@ -1,35 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.nassime.production; - varDir = "/var/lib/ftp/nassime"; - env = config.myEnv.websites.nassime; - domain = "nassime.bouya.org"; -in { - options.myServices.websites.nassime.production.enable = lib.mkEnableOption "enable Nassime's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = domain; } ]; - - security.acme.certs."ftp".extraDomains."${domain}" = null; - - services.websites.env.production.vhostConfs.nassime = { - certName = "nassime"; - certMainHost = domain; - hosts = [ domain ]; - root = varDir; - extraConfig = [ - '' - Use Stats ${domain} - ServerAdmin ${env.server_admin} - - - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/nath/villon.nix b/modules/private/websites/nath/villon.nix deleted file mode 100644 index 57a1df5..0000000 --- a/modules/private/websites/nath/villon.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.nath.villon; - varDir = "/var/lib/ftp/nath"; - env = config.myEnv.websites.nath; - domain = "sntvillon.immae.eu"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.nath.villon.enable = lib.mkEnableOption "enable Nath's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = domain; } ]; - - system.activationScripts.nath_villon = { - deps = [ "users" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${varDir} - ''; - }; - security.acme.certs."ftp".extraDomains."${domain}" = null; - - services.websites.env.production.vhostConfs.nath_villon = { - certName = "nath"; - certMainHost = domain; - hosts = [ domain ]; - root = varDir; - extraConfig = [ - '' - Use Stats ${domain} - - - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/papa/maison_bbc.nix b/modules/private/websites/papa/maison_bbc.nix deleted file mode 100644 index 3eb736e..0000000 --- a/modules/private/websites/papa/maison_bbc.nix +++ /dev/null @@ -1,28 +0,0 @@ -{ lib, config, ... }: -let - cfg = config.myServices.websites.papa.maison_bbc; -in { - options.myServices.websites.papa.maison_bbc.enable = lib.mkEnableOption "enable Papa Maison bbc website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "maison.bbc.bouya.org"; } ]; - - services.websites.env.production.vhostConfs.papa_maison_bbc = { - certName = "papa"; - addToCerts = true; - hosts = [ "maison.bbc.bouya.org" ]; - root = ./maison_bbc_static; - extraConfig = [ - '' - ErrorDocument 404 /index.html - - DirectoryIndex index.htm index.html - AllowOverride None - Require all granted - - '' - ]; - }; - }; -} - diff --git a/modules/private/websites/papa/maison_bbc_static/data.json b/modules/private/websites/papa/maison_bbc_static/data.json deleted file mode 100644 index 1784d27..0000000 --- a/modules/private/websites/papa/maison_bbc_static/data.json +++ /dev/null @@ -1,4101 +0,0 @@ -{ - "mean_consumption": { - "data": [ - { - "x": "2010-01-01 00:00:00", - "y": 0 - }, - { - "x": "2012-06-01 00:00:00", - "y": 0.3 - }, - { - "x": "2012-07-01 00:00:00", - "y": 0.3 - }, - { - "x": "2012-08-01 00:00:00", - "y": 0.5 - }, - { - "x": "2012-09-01 00:00:00", - "y": 0.4 - }, - { - "x": "2012-10-01 00:00:00", - "y": 0.4 - }, - { - "x": "2012-11-01 00:00:00", - "y": 0.5 - }, - { - "x": "2012-12-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-01-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-02-01 00:00:00", - "y": 0.4 - }, - { - "x": "2013-03-01 00:00:00", - "y": 0.6 - }, - { - "x": "2013-04-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-05-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-06-01 00:00:00", - "y": 0.4 - }, - { - "x": "2013-07-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-08-01 00:00:00", - "y": 0.4 - }, - { - "x": "2013-09-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-10-01 00:00:00", - "y": 0.5 - }, - { - "x": "2013-11-01 00:00:00", - "y": 0.6 - }, - { - "x": "2013-12-01 00:00:00", - "y": 0.6 - }, - { - "x": "2014-01-01 00:00:00", - "y": 0.6 - }, - { - "x": "2014-02-01 00:00:00", - "y": 0.5 - }, - { - "x": "2014-03-01 00:00:00", - "y": 0.6 - }, - { - "x": "2014-04-01 00:00:00", - "y": 0.5 - }, - { - "x": "2014-05-01 00:00:00", - "y": 0.6 - }, - { - "x": "2014-10-01 00:00:00", - "y": 0.7 - }, - { - "x": "2014-12-01 00:00:00", - "y": 8.1 - }, - { - "x": "2015-01-01 00:00:00", - "y": 8.8 - }, - { - "x": "2015-02-01 00:00:00", - "y": 8.2 - }, - { - "x": "2015-03-01 00:00:00", - "y": 7.2 - }, - { - "x": "2015-04-01 00:00:00", - "y": 1.2 - }, - { - "x": "2015-05-01 00:00:00", - "y": 0.6 - }, - { - "x": "2015-06-01 00:00:00", - "y": 0.6 - }, - { - "x": "2015-07-01 00:00:00", - "y": 0.5 - }, - { - "x": "2015-08-01 00:00:00", - "y": 0.6 - }, - { - "x": "2015-09-01 00:00:00", - "y": 0.5 - }, - { - "x": "2016-02-01 00:00:00", - "y": 0 - }, - { - "x": "2016-03-01 00:00:00", - "y": 0 - }, - { - "x": "2016-04-01 00:00:00", - "y": 0 - }, - { - "x": "2016-05-01 00:00:00", - "y": 0 - }, - { - "x": "2016-06-01 00:00:00", - "y": 0 - }, - { - "x": "2016-07-01 00:00:00", - "y": 0 - }, - { - "x": "2016-08-01 00:00:00", - "y": 0 - }, - { - "x": "2016-09-01 00:00:00", - "y": 0 - }, - { - "x": "2017-04-01 00:00:00", - "y": 0.4 - }, - { - "x": "2017-05-01 00:00:00", - "y": 0.5 - }, - { - "x": "2017-06-01 00:00:00", - "y": 0.4 - }, - { - "x": "2017-07-01 00:00:00", - "y": 0.6 - }, - { - "x": "2017-08-01 00:00:00", - "y": 0.4 - }, - { - "x": "2017-09-01 00:00:00", - "y": 0.5 - }, - { - "x": "2017-10-01 00:00:00", - "y": 0.4 - }, - { - "x": "2017-11-01 00:00:00", - "y": 0.5 - }, - { - "x": "2017-12-01 00:00:00", - "y": 0.6 - }, - { - "x": "2018-01-01 00:00:00", - "y": 0.6 - }, - { - "x": "2018-02-01 00:00:00", - "y": 0.6 - }, - { - "x": "2018-03-01 00:00:00", - "y": 0.6 - }, - { - "x": "2018-04-01 00:00:00", - "y": 0.5 - }, - { - "x": "2018-05-01 00:00:00", - "y": 0.4 - }, - { - "x": "2018-06-01 00:00:00", - "y": 0.5 - }, - { - "x": "2018-07-01 00:00:00", - "y": 0.5 - }, - { - "x": "2018-08-01 00:00:00", - "y": 0.8 - }, - { - "x": "2019-03-01 00:00:00", - "y": 0.6 - }, - { - "x": "2019-04-01 00:00:00", - "y": 0.6 - }, - { - "x": "2019-05-01 00:00:00", - "y": 0.4 - }, - { - "x": "2019-06-01 00:00:00", - "y": 0.4 - }, - { - "x": "2019-07-01 00:00:00", - "y": 0.4 - }, - { - "x": "2019-08-01 00:00:00", - "y": 0.6 - }, - { - "x": "2020-03-01 00:00:00", - "y": 0.5 - }, - { - "x": "2020-04-01 00:00:00", - "y": 0.5 - }, - { - "x": "2020-05-01 00:00:00", - "y": 0.5 - } - ], - "name": "Consommation moyenne", - "unit": "kW", - "hide": false - }, - "total_consumption": { - "data": [ - { - "x": "2010-01-01 00:00:00", - "y": 74.8 - }, - { - "x": "2012-08-01 00:00:00", - "y": 629 - }, - { - "x": "2012-09-01 00:00:00", - "y": 859.3 - }, - { - "x": "2012-10-01 00:00:00", - "y": 1150.7 - }, - { - "x": "2012-11-01 00:00:00", - "y": 1440.1 - }, - { - "x": "2012-12-01 00:00:00", - "y": 1829.6 - }, - { - "x": "2013-01-01 00:00:00", - "y": 2218.6 - }, - { - "x": "2013-02-01 00:00:00", - "y": 468.7 - }, - { - "x": "2013-03-01 00:00:00", - "y": 2924.1 - }, - { - "x": "2013-04-01 00:00:00", - "y": -3217.1 - }, - { - "x": "2013-05-01 00:00:00", - "y": -2847.2 - }, - { - "x": "2013-06-01 00:00:00", - "y": 224.6 - }, - { - "x": "2013-07-01 00:00:00", - "y": 536.5 - }, - { - "x": "2013-08-01 00:00:00", - "y": 882 - }, - { - "x": "2013-09-01 00:00:00", - "y": 1207.7 - }, - { - "x": "2013-10-01 00:00:00", - "y": 1565.4 - }, - { - "x": "2013-11-01 00:00:00", - "y": 1924.1 - }, - { - "x": "2013-12-01 00:00:00", - "y": 2323.5 - }, - { - "x": "2014-01-01 00:00:00", - "y": 2754.8 - }, - { - "x": "2014-02-01 00:00:00", - "y": 3176.7 - }, - { - "x": "2014-03-01 00:00:00", - "y": 3530.1 - }, - { - "x": "2014-04-01 00:00:00", - "y": 3975 - }, - { - "x": "2014-05-01 00:00:00", - "y": 4364.8 - }, - { - "x": "2014-10-01 00:00:00", - "y": 1485.8 - }, - { - "x": "2014-12-01 00:00:00", - "y": 9.3 - }, - { - "x": "2015-01-01 00:00:00", - "y": 6 - }, - { - "x": "2015-02-01 00:00:00", - "y": 10 - }, - { - "x": "2015-03-01 00:00:00", - "y": 10.9 - }, - { - "x": "2015-04-01 00:00:00", - "y": 13.1 - }, - { - "x": "2015-05-01 00:00:00", - "y": 1.6 - }, - { - "x": "2015-06-01 00:00:00", - "y": 2.1 - }, - { - "x": "2015-07-01 00:00:00", - "y": 2.8 - }, - { - "x": "2015-08-01 00:00:00", - "y": 2.2 - }, - { - "x": "2015-09-01 00:00:00", - "y": 2.8 - }, - { - "x": "2016-02-01 00:00:00", - "y": 0 - }, - { - "x": "2016-03-01 00:00:00", - "y": 2.1 - }, - { - "x": "2016-04-01 00:00:00", - "y": 43.2 - }, - { - "x": "2016-05-01 00:00:00", - "y": 78.6 - }, - { - "x": "2016-06-01 00:00:00", - "y": 118.2 - }, - { - "x": "2016-07-01 00:00:00", - "y": 155.2 - }, - { - "x": "2016-08-01 00:00:00", - "y": 203.1 - }, - { - "x": "2016-09-01 00:00:00", - "y": 213.7 - }, - { - "x": "2017-04-01 00:00:00", - "y": 4567.8 - }, - { - "x": "2017-05-01 00:00:00", - "y": 46.2 - }, - { - "x": "2017-06-01 00:00:00", - "y": 404.3 - }, - { - "x": "2017-07-01 00:00:00", - "y": 711.3 - }, - { - "x": "2017-08-01 00:00:00", - "y": 1098.7 - }, - { - "x": "2017-09-01 00:00:00", - "y": 1365.4 - }, - { - "x": "2017-10-01 00:00:00", - "y": 1705.3 - }, - { - "x": "2017-11-01 00:00:00", - "y": 2041.5 - }, - { - "x": "2017-12-01 00:00:00", - "y": 2400.8 - }, - { - "x": "2018-01-01 00:00:00", - "y": 2816.8 - }, - { - "x": "2018-02-01 00:00:00", - "y": 3236.5 - }, - { - "x": "2018-03-01 00:00:00", - "y": 3610 - }, - { - "x": "2018-04-01 00:00:00", - "y": 4047.8 - }, - { - "x": "2018-05-01 00:00:00", - "y": 4447.2 - }, - { - "x": "2018-06-01 00:00:00", - "y": 4704.1 - }, - { - "x": "2018-07-01 00:00:00", - "y": 260.9 - }, - { - "x": "2018-08-01 00:00:00", - "y": 502.7 - }, - { - "x": "2019-03-01 00:00:00", - "y": 896.9 - }, - { - "x": "2019-04-01 00:00:00", - "y": 1268.4 - }, - { - "x": "2019-05-01 00:00:00", - "y": 1625.5 - }, - { - "x": "2019-06-01 00:00:00", - "y": 1944.8 - }, - { - "x": "2019-07-01 00:00:00", - "y": 2256.8 - }, - { - "x": "2019-08-01 00:00:00", - "y": 2714.7 - }, - { - "x": "2020-03-01 00:00:00", - "y": 314.9 - }, - { - "x": "2020-04-01 00:00:00", - "y": 679.7 - }, - { - "x": "2020-05-01 00:00:00", - "y": 1084.7 - } - ], - "name": "Consommation totale", - "unit": "kWh", - "hide": false - }, - "Chambre_RDC_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 22.3 - }, - { - "x": "2012-07-01 00:00:00", - "y": 22.7 - }, - { - "x": "2012-08-01 00:00:00", - "y": 25.1 - }, - { - "x": "2012-09-01 00:00:00", - "y": 22.6 - }, - { - "x": "2012-10-01 00:00:00", - "y": 20.7 - }, - { - "x": "2012-11-01 00:00:00", - "y": 18 - }, - { - "x": "2012-12-01 00:00:00", - "y": 20 - }, - { - "x": "2013-01-01 00:00:00", - "y": 20.1 - }, - { - "x": "2013-02-01 00:00:00", - "y": 15.6 - }, - { - "x": "2013-03-01 00:00:00", - "y": 20.3 - }, - { - "x": "2013-04-01 00:00:00", - "y": 18.1 - }, - { - "x": "2013-05-01 00:00:00", - "y": 21.5 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22.3 - }, - { - "x": "2013-07-01 00:00:00", - "y": 25.1 - }, - { - "x": "2013-08-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-09-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-10-01 00:00:00", - "y": 21.4 - }, - { - "x": "2013-11-01 00:00:00", - "y": 20.3 - }, - { - "x": "2013-12-01 00:00:00", - "y": 20.4 - }, - { - "x": "2014-01-01 00:00:00", - "y": 20.5 - }, - { - "x": "2014-02-01 00:00:00", - "y": 19.8 - }, - { - "x": "2014-03-01 00:00:00", - "y": 20.6 - }, - { - "x": "2014-04-01 00:00:00", - "y": 21.3 - }, - { - "x": "2014-05-01 00:00:00", - "y": 21.9 - }, - { - "x": "2014-06-01 00:00:00", - "y": 25 - }, - { - "x": "2014-10-01 00:00:00", - "y": 22.4 - }, - { - "x": "2014-11-01 00:00:00", - "y": 20.6 - }, - { - "x": "2014-12-01 00:00:00", - "y": 18.2 - }, - { - "x": "2015-01-01 00:00:00", - "y": 20 - }, - { - "x": "2015-02-01 00:00:00", - "y": 20 - }, - { - "x": "2015-03-01 00:00:00", - "y": 19.6 - }, - { - "x": "2015-04-01 00:00:00", - "y": 21.4 - }, - { - "x": "2015-05-01 00:00:00", - "y": 20.4 - }, - { - "x": "2015-06-01 00:00:00", - "y": 24.2 - }, - { - "x": "2015-07-01 00:00:00", - "y": 24.5 - }, - { - "x": "2015-08-01 00:00:00", - "y": 23.6 - }, - { - "x": "2015-09-01 00:00:00", - "y": 22.2 - }, - { - "x": "2015-10-01 00:00:00", - "y": 20.9 - }, - { - "x": "2015-11-01 00:00:00", - "y": 20.6 - }, - { - "x": "2015-12-01 00:00:00", - "y": 19.5 - }, - { - "x": "2016-01-01 00:00:00", - "y": 19.8 - }, - { - "x": "2016-02-01 00:00:00", - "y": 20.4 - }, - { - "x": "2016-03-01 00:00:00", - "y": 19.8 - }, - { - "x": "2016-04-01 00:00:00", - "y": 19.5 - }, - { - "x": "2016-05-01 00:00:00", - "y": 21.3 - }, - { - "x": "2016-06-01 00:00:00", - "y": 22.9 - }, - { - "x": "2016-07-01 00:00:00", - "y": 24.4 - }, - { - "x": "2016-08-01 00:00:00", - "y": 24 - }, - { - "x": "2016-09-01 00:00:00", - "y": 23.5 - }, - { - "x": "2017-03-01 00:00:00", - "y": 21.1 - }, - { - "x": "2017-04-01 00:00:00", - "y": 20.6 - }, - { - "x": "2017-05-01 00:00:00", - "y": 22.2 - }, - { - "x": "2017-06-01 00:00:00", - "y": 23.7 - }, - { - "x": "2017-07-01 00:00:00", - "y": 23.9 - }, - { - "x": "2017-08-01 00:00:00", - "y": 23.4 - }, - { - "x": "2017-09-01 00:00:00", - "y": 22.9 - }, - { - "x": "2017-10-01 00:00:00", - "y": 22 - }, - { - "x": "2017-11-01 00:00:00", - "y": 19.7 - }, - { - "x": "2017-12-01 00:00:00", - "y": 20 - }, - { - "x": "2018-01-01 00:00:00", - "y": 20 - }, - { - "x": "2018-02-01 00:00:00", - "y": 20.2 - }, - { - "x": "2018-03-01 00:00:00", - "y": 19.9 - }, - { - "x": "2018-04-01 00:00:00", - "y": 21.1 - }, - { - "x": "2018-05-01 00:00:00", - "y": 22.3 - }, - { - "x": "2018-06-01 00:00:00", - "y": 23.5 - }, - { - "x": "2018-07-01 00:00:00", - "y": 23.8 - }, - { - "x": "2018-08-01 00:00:00", - "y": 23.5 - }, - { - "x": "2019-03-01 00:00:00", - "y": 21.7 - }, - { - "x": "2019-04-01 00:00:00", - "y": 21.7 - }, - { - "x": "2019-05-01 00:00:00", - "y": 21.7 - }, - { - "x": "2019-06-01 00:00:00", - "y": 23.6 - }, - { - "x": "2019-07-01 00:00:00", - "y": 24.4 - }, - { - "x": "2019-08-01 00:00:00", - "y": 23.3 - }, - { - "x": "2020-03-01 00:00:00", - "y": 22 - } - ], - "name": "Chambre_RDC", - "unit": "°C", - "hide": false - }, - "Exterieure_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 18.6 - }, - { - "x": "2012-07-01 00:00:00", - "y": 20.2 - }, - { - "x": "2012-08-01 00:00:00", - "y": 24.7 - }, - { - "x": "2012-09-01 00:00:00", - "y": 23.2 - }, - { - "x": "2012-10-01 00:00:00", - "y": 21.7 - }, - { - "x": "2012-11-01 00:00:00", - "y": 13.3 - }, - { - "x": "2012-12-01 00:00:00", - "y": 6.1 - }, - { - "x": "2013-01-01 00:00:00", - "y": 3.3 - }, - { - "x": "2013-02-01 00:00:00", - "y": 1.9 - }, - { - "x": "2013-03-01 00:00:00", - "y": 6.6 - }, - { - "x": "2013-04-01 00:00:00", - "y": 10.2 - }, - { - "x": "2013-05-01 00:00:00", - "y": 11.2 - }, - { - "x": "2013-06-01 00:00:00", - "y": 16.9 - }, - { - "x": "2013-07-01 00:00:00", - "y": 28.9 - }, - { - "x": "2013-10-01 00:00:00", - "y": 16.9 - }, - { - "x": "2013-11-01 00:00:00", - "y": 5.9 - }, - { - "x": "2013-12-01 00:00:00", - "y": 4.5 - }, - { - "x": "2014-01-01 00:00:00", - "y": 6.9 - }, - { - "x": "2014-02-01 00:00:00", - "y": 6.8 - }, - { - "x": "2014-03-01 00:00:00", - "y": 8.3 - }, - { - "x": "2014-04-01 00:00:00", - "y": 11.6 - }, - { - "x": "2014-05-01 00:00:00", - "y": 12 - }, - { - "x": "2014-06-01 00:00:00", - "y": 17.3 - }, - { - "x": "2014-10-01 00:00:00", - "y": 13.5 - }, - { - "x": "2014-11-01 00:00:00", - "y": 9.9 - }, - { - "x": "2014-12-01 00:00:00", - "y": 4.5 - }, - { - "x": "2015-01-01 00:00:00", - "y": 4.4 - }, - { - "x": "2015-02-01 00:00:00", - "y": 4.4 - }, - { - "x": "2015-03-01 00:00:00", - "y": 7.7 - }, - { - "x": "2015-04-01 00:00:00", - "y": 12.4 - }, - { - "x": "2015-05-01 00:00:00", - "y": 14.1 - }, - { - "x": "2015-06-01 00:00:00", - "y": 18.8 - }, - { - "x": "2015-07-01 00:00:00", - "y": 21.5 - }, - { - "x": "2015-08-01 00:00:00", - "y": 20.7 - }, - { - "x": "2015-09-01 00:00:00", - "y": 14.3 - }, - { - "x": "2015-10-01 00:00:00", - "y": 10.4 - }, - { - "x": "2015-11-01 00:00:00", - "y": 9.3 - }, - { - "x": "2015-12-01 00:00:00", - "y": 7.7 - }, - { - "x": "2016-01-01 00:00:00", - "y": 6 - }, - { - "x": "2016-02-01 00:00:00", - "y": 5.6 - }, - { - "x": "2016-03-01 00:00:00", - "y": 6.6 - }, - { - "x": "2016-04-01 00:00:00", - "y": 9.6 - }, - { - "x": "2016-05-01 00:00:00", - "y": 14.5 - }, - { - "x": "2016-06-01 00:00:00", - "y": 17.9 - }, - { - "x": "2016-07-01 00:00:00", - "y": 21.3 - }, - { - "x": "2016-08-01 00:00:00", - "y": 20.4 - }, - { - "x": "2017-03-01 00:00:00", - "y": 14.2 - }, - { - "x": "2017-04-01 00:00:00", - "y": 9.7 - }, - { - "x": "2017-05-01 00:00:00", - "y": 16.8 - }, - { - "x": "2017-06-01 00:00:00", - "y": 23.9 - }, - { - "x": "2017-07-01 00:00:00", - "y": 21.4 - }, - { - "x": "2017-08-01 00:00:00", - "y": 20.7 - }, - { - "x": "2017-09-01 00:00:00", - "y": 15.8 - }, - { - "x": "2017-10-01 00:00:00", - "y": 14.2 - }, - { - "x": "2017-11-01 00:00:00", - "y": 7.5 - }, - { - "x": "2017-12-01 00:00:00", - "y": 4.2 - }, - { - "x": "2018-03-01 00:00:00", - "y": 10.2 - }, - { - "x": "2018-04-01 00:00:00", - "y": 17.6 - }, - { - "x": "2018-05-01 00:00:00", - "y": 16.1 - }, - { - "x": "2018-06-01 00:00:00", - "y": 22.4 - }, - { - "x": "2018-07-01 00:00:00", - "y": 30 - }, - { - "x": "2018-08-01 00:00:00", - "y": 19.8 - } - ], - "name": "Exterieure", - "unit": "°C", - "hide": false - }, - "Sejour_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 22.8 - }, - { - "x": "2012-07-01 00:00:00", - "y": 23 - }, - { - "x": "2012-08-01 00:00:00", - "y": 25.3 - }, - { - "x": "2012-09-01 00:00:00", - "y": 23.3 - }, - { - "x": "2012-10-01 00:00:00", - "y": 21.7 - }, - { - "x": "2012-11-01 00:00:00", - "y": 19.9 - }, - { - "x": "2012-12-01 00:00:00", - "y": 20.1 - }, - { - "x": "2013-01-01 00:00:00", - "y": 20 - }, - { - "x": "2013-02-01 00:00:00", - "y": 15.8 - }, - { - "x": "2013-03-01 00:00:00", - "y": 20.5 - }, - { - "x": "2013-04-01 00:00:00", - "y": 20.8 - }, - { - "x": "2013-05-01 00:00:00", - "y": 20.9 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22 - }, - { - "x": "2013-07-01 00:00:00", - "y": 25 - }, - { - "x": "2013-08-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-09-01 00:00:00", - "y": 22.9 - }, - { - "x": "2013-10-01 00:00:00", - "y": 21.5 - }, - { - "x": "2013-11-01 00:00:00", - "y": 20.3 - }, - { - "x": "2013-12-01 00:00:00", - "y": 20.7 - }, - { - "x": "2014-01-01 00:00:00", - "y": 20.6 - }, - { - "x": "2014-02-01 00:00:00", - "y": 19.9 - }, - { - "x": "2014-03-01 00:00:00", - "y": 21.2 - }, - { - "x": "2014-04-01 00:00:00", - "y": 21.7 - }, - { - "x": "2014-05-01 00:00:00", - "y": 22.3 - }, - { - "x": "2014-06-01 00:00:00", - "y": 25.6 - }, - { - "x": "2014-10-01 00:00:00", - "y": 22.8 - }, - { - "x": "2014-11-01 00:00:00", - "y": 20.9 - }, - { - "x": "2014-12-01 00:00:00", - "y": 18 - }, - { - "x": "2015-01-01 00:00:00", - "y": 20 - }, - { - "x": "2015-02-01 00:00:00", - "y": 20 - }, - { - "x": "2015-03-01 00:00:00", - "y": 19.6 - }, - { - "x": "2015-04-01 00:00:00", - "y": 21.8 - }, - { - "x": "2015-05-01 00:00:00", - "y": 20.5 - }, - { - "x": "2015-06-01 00:00:00", - "y": 24.4 - }, - { - "x": "2015-07-01 00:00:00", - "y": 21.6 - }, - { - "x": "2015-08-01 00:00:00", - "y": 23.9 - }, - { - "x": "2015-09-01 00:00:00", - "y": 23.1 - }, - { - "x": "2015-10-01 00:00:00", - "y": 21.4 - }, - { - "x": "2015-11-01 00:00:00", - "y": 21.1 - }, - { - "x": "2015-12-01 00:00:00", - "y": 20.1 - }, - { - "x": "2016-01-01 00:00:00", - "y": 20.1 - }, - { - "x": "2016-02-01 00:00:00", - "y": 20.3 - }, - { - "x": "2016-03-01 00:00:00", - "y": 20.2 - }, - { - "x": "2016-04-01 00:00:00", - "y": 19.7 - }, - { - "x": "2016-05-01 00:00:00", - "y": 21.6 - }, - { - "x": "2016-06-01 00:00:00", - "y": 23.2 - }, - { - "x": "2016-07-01 00:00:00", - "y": 24.7 - }, - { - "x": "2016-08-01 00:00:00", - "y": 24.5 - }, - { - "x": "2016-09-01 00:00:00", - "y": 23.7 - }, - { - "x": "2017-03-01 00:00:00", - "y": 21.7 - }, - { - "x": "2017-04-01 00:00:00", - "y": 21 - }, - { - "x": "2017-05-01 00:00:00", - "y": 22.6 - }, - { - "x": "2017-06-01 00:00:00", - "y": 24 - }, - { - "x": "2017-07-01 00:00:00", - "y": 24.3 - }, - { - "x": "2017-08-01 00:00:00", - "y": 23.7 - }, - { - "x": "2017-09-01 00:00:00", - "y": 23.3 - }, - { - "x": "2017-10-01 00:00:00", - "y": 22.6 - }, - { - "x": "2017-11-01 00:00:00", - "y": 20.3 - }, - { - "x": "2017-12-01 00:00:00", - "y": 19.9 - }, - { - "x": "2018-01-01 00:00:00", - "y": 19.9 - }, - { - "x": "2018-02-01 00:00:00", - "y": 19.9 - }, - { - "x": "2018-03-01 00:00:00", - "y": 20.3 - }, - { - "x": "2018-04-01 00:00:00", - "y": 21.6 - }, - { - "x": "2018-05-01 00:00:00", - "y": 22.6 - }, - { - "x": "2018-06-01 00:00:00", - "y": 23.8 - }, - { - "x": "2018-07-01 00:00:00", - "y": 23.9 - }, - { - "x": "2018-08-01 00:00:00", - "y": 23.7 - }, - { - "x": "2019-03-01 00:00:00", - "y": 23.3 - }, - { - "x": "2019-04-01 00:00:00", - "y": 22.7 - }, - { - "x": "2019-05-01 00:00:00", - "y": 22.2 - }, - { - "x": "2019-06-01 00:00:00", - "y": 23.8 - }, - { - "x": "2019-07-01 00:00:00", - "y": 24.6 - }, - { - "x": "2019-08-01 00:00:00", - "y": 23.3 - }, - { - "x": "2020-03-01 00:00:00", - "y": 23.5 - } - ], - "name": "Sejour", - "unit": "°C", - "hide": false - }, - "Garage_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 20.2 - }, - { - "x": "2012-07-01 00:00:00", - "y": 19.4 - }, - { - "x": "2012-08-01 00:00:00", - "y": 22.2 - }, - { - "x": "2012-09-01 00:00:00", - "y": 17 - }, - { - "x": "2012-10-01 00:00:00", - "y": 13.8 - }, - { - "x": "2012-11-01 00:00:00", - "y": 9.2 - }, - { - "x": "2012-12-01 00:00:00", - "y": 7.6 - }, - { - "x": "2013-01-01 00:00:00", - "y": 5.3 - }, - { - "x": "2013-02-01 00:00:00", - "y": 3.4 - }, - { - "x": "2013-03-01 00:00:00", - "y": 7.3 - }, - { - "x": "2013-04-01 00:00:00", - "y": 10.7 - }, - { - "x": "2013-05-01 00:00:00", - "y": 12.4 - }, - { - "x": "2013-06-01 00:00:00", - "y": 17.2 - }, - { - "x": "2013-07-01 00:00:00", - "y": 23 - }, - { - "x": "2013-08-01 00:00:00", - "y": 20.2 - }, - { - "x": "2013-09-01 00:00:00", - "y": 17.1 - }, - { - "x": "2013-10-01 00:00:00", - "y": 14.5 - }, - { - "x": "2013-11-01 00:00:00", - "y": 8.2 - }, - { - "x": "2013-12-01 00:00:00", - "y": 5.9 - }, - { - "x": "2014-01-01 00:00:00", - "y": 7.9 - }, - { - "x": "2014-02-01 00:00:00", - "y": 7.6 - }, - { - "x": "2014-03-01 00:00:00", - "y": 9 - }, - { - "x": "2014-04-01 00:00:00", - "y": 12.6 - }, - { - "x": "2014-05-01 00:00:00", - "y": 14.2 - }, - { - "x": "2014-06-01 00:00:00", - "y": 21.5 - }, - { - "x": "2014-10-01 00:00:00", - "y": 14.6 - }, - { - "x": "2014-11-01 00:00:00", - "y": 11.2 - }, - { - "x": "2014-12-01 00:00:00", - "y": 6.7 - }, - { - "x": "2015-01-01 00:00:00", - "y": 6.3 - }, - { - "x": "2015-02-01 00:00:00", - "y": 5.1 - }, - { - "x": "2015-03-01 00:00:00", - "y": 8.6 - }, - { - "x": "2015-04-01 00:00:00", - "y": 13.3 - }, - { - "x": "2015-05-01 00:00:00", - "y": 14.2 - }, - { - "x": "2015-06-01 00:00:00", - "y": 20.9 - }, - { - "x": "2015-07-01 00:00:00", - "y": 23.2 - }, - { - "x": "2015-08-01 00:00:00", - "y": 21.8 - }, - { - "x": "2015-09-01 00:00:00", - "y": 16.3 - }, - { - "x": "2015-10-01 00:00:00", - "y": 12.5 - }, - { - "x": "2015-11-01 00:00:00", - "y": 10.8 - }, - { - "x": "2015-12-01 00:00:00", - "y": 7.5 - }, - { - "x": "2016-02-01 00:00:00", - "y": 55.6 - }, - { - "x": "2016-03-01 00:00:00", - "y": 8 - }, - { - "x": "2016-04-01 00:00:00", - "y": 11.4 - }, - { - "x": "2016-05-01 00:00:00", - "y": 15.2 - }, - { - "x": "2016-06-01 00:00:00", - "y": 18.5 - }, - { - "x": "2016-07-01 00:00:00", - "y": 21.3 - }, - { - "x": "2016-08-01 00:00:00", - "y": 22.6 - }, - { - "x": "2016-09-01 00:00:00", - "y": 18.8 - }, - { - "x": "2017-03-01 00:00:00", - "y": 15.2 - }, - { - "x": "2017-04-01 00:00:00", - "y": 11.5 - }, - { - "x": "2017-05-01 00:00:00", - "y": 16.7 - }, - { - "x": "2017-06-01 00:00:00", - "y": 21.7 - }, - { - "x": "2017-07-01 00:00:00", - "y": 21.5 - }, - { - "x": "2017-08-01 00:00:00", - "y": 21.1 - }, - { - "x": "2017-09-01 00:00:00", - "y": 16.4 - }, - { - "x": "2017-10-01 00:00:00", - "y": 14.2 - }, - { - "x": "2017-11-01 00:00:00", - "y": 9 - }, - { - "x": "2017-12-01 00:00:00", - "y": 7 - }, - { - "x": "2018-01-01 00:00:00", - "y": 9.3 - }, - { - "x": "2018-02-01 00:00:00", - "y": 4 - }, - { - "x": "2018-03-01 00:00:00", - "y": 9.4 - }, - { - "x": "2018-04-01 00:00:00", - "y": 12.9 - }, - { - "x": "2019-03-01 00:00:00", - "y": 13.9 - }, - { - "x": "2019-04-01 00:00:00", - "y": 14.1 - }, - { - "x": "2019-05-01 00:00:00", - "y": 16.4 - }, - { - "x": "2019-06-01 00:00:00", - "y": 24 - }, - { - "x": "2019-07-01 00:00:00", - "y": 24.2 - }, - { - "x": "2020-03-01 00:00:00", - "y": 21.3 - }, - { - "x": "2020-05-01 00:00:00", - "y": 21 - } - ], - "name": "Garage", - "unit": "°C", - "hide": true - }, - "Soufflage_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 22 - }, - { - "x": "2012-07-01 00:00:00", - "y": 22.3 - }, - { - "x": "2012-08-01 00:00:00", - "y": 24.1 - }, - { - "x": "2012-09-01 00:00:00", - "y": 20.7 - }, - { - "x": "2012-10-01 00:00:00", - "y": 18.1 - }, - { - "x": "2012-11-01 00:00:00", - "y": 14.6 - }, - { - "x": "2012-12-01 00:00:00", - "y": 16.5 - }, - { - "x": "2013-01-01 00:00:00", - "y": 16.7 - }, - { - "x": "2013-02-01 00:00:00", - "y": 13.4 - }, - { - "x": "2013-03-01 00:00:00", - "y": 18.2 - }, - { - "x": "2013-04-01 00:00:00", - "y": 19.8 - }, - { - "x": "2013-05-01 00:00:00", - "y": 20.4 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-07-01 00:00:00", - "y": 24.9 - }, - { - "x": "2013-08-01 00:00:00", - "y": 22.8 - }, - { - "x": "2013-09-01 00:00:00", - "y": 22.3 - }, - { - "x": "2013-10-01 00:00:00", - "y": 20.2 - }, - { - "x": "2013-11-01 00:00:00", - "y": 17 - }, - { - "x": "2013-12-01 00:00:00", - "y": 17.8 - }, - { - "x": "2014-01-01 00:00:00", - "y": 18.3 - }, - { - "x": "2014-02-01 00:00:00", - "y": 17.8 - }, - { - "x": "2014-03-01 00:00:00", - "y": 19.1 - }, - { - "x": "2014-04-01 00:00:00", - "y": 20.7 - }, - { - "x": "2014-11-01 00:00:00", - "y": 24.1 - }, - { - "x": "2014-12-01 00:00:00", - "y": 6.6 - }, - { - "x": "2015-01-01 00:00:00", - "y": 6.4 - }, - { - "x": "2015-02-01 00:00:00", - "y": 4.8 - }, - { - "x": "2015-03-01 00:00:00", - "y": 9.9 - }, - { - "x": "2015-04-01 00:00:00", - "y": 15.3 - }, - { - "x": "2015-05-01 00:00:00", - "y": 15.8 - }, - { - "x": "2015-06-01 00:00:00", - "y": 20.1 - }, - { - "x": "2015-07-01 00:00:00", - "y": 21.8 - }, - { - "x": "2015-08-01 00:00:00", - "y": 21.9 - }, - { - "x": "2015-09-01 00:00:00", - "y": 17.1 - }, - { - "x": "2015-10-01 00:00:00", - "y": 13.2 - }, - { - "x": "2015-11-01 00:00:00", - "y": 12.8 - }, - { - "x": "2015-12-01 00:00:00", - "y": 11.1 - }, - { - "x": "2016-01-01 00:00:00", - "y": 11.7 - }, - { - "x": "2016-02-01 00:00:00", - "y": 11.3 - }, - { - "x": "2017-03-01 00:00:00", - "y": 24.2 - }, - { - "x": "2017-04-01 00:00:00", - "y": 18.5 - }, - { - "x": "2017-05-01 00:00:00", - "y": 22.2 - }, - { - "x": "2017-06-01 00:00:00", - "y": 24.2 - }, - { - "x": "2017-07-01 00:00:00", - "y": 23.8 - }, - { - "x": "2017-08-01 00:00:00", - "y": 23 - }, - { - "x": "2017-09-01 00:00:00", - "y": 20.9 - }, - { - "x": "2017-10-01 00:00:00", - "y": 19.3 - }, - { - "x": "2017-11-01 00:00:00", - "y": 14.6 - }, - { - "x": "2017-12-01 00:00:00", - "y": 14.9 - }, - { - "x": "2018-01-01 00:00:00", - "y": 16.4 - }, - { - "x": "2018-02-01 00:00:00", - "y": 13.5 - }, - { - "x": "2018-03-01 00:00:00", - "y": 14.7 - } - ], - "name": "Soufflage", - "unit": "°C", - "hide": true - }, - "Mezzanine_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 23.3 - }, - { - "x": "2012-07-01 00:00:00", - "y": 23.5 - }, - { - "x": "2012-08-01 00:00:00", - "y": 25.9 - }, - { - "x": "2012-09-01 00:00:00", - "y": 23.1 - }, - { - "x": "2012-10-01 00:00:00", - "y": 21.5 - }, - { - "x": "2012-11-01 00:00:00", - "y": 19.7 - }, - { - "x": "2012-12-01 00:00:00", - "y": 19.4 - }, - { - "x": "2013-01-01 00:00:00", - "y": 19 - }, - { - "x": "2013-02-01 00:00:00", - "y": 15.3 - }, - { - "x": "2013-03-01 00:00:00", - "y": 19.9 - }, - { - "x": "2013-04-01 00:00:00", - "y": 20.5 - }, - { - "x": "2013-05-01 00:00:00", - "y": 20.8 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22.2 - }, - { - "x": "2013-07-01 00:00:00", - "y": 25.7 - }, - { - "x": "2013-08-01 00:00:00", - "y": 23.1 - }, - { - "x": "2013-09-01 00:00:00", - "y": 23 - }, - { - "x": "2013-10-01 00:00:00", - "y": 21.5 - }, - { - "x": "2013-11-01 00:00:00", - "y": 19.5 - }, - { - "x": "2013-12-01 00:00:00", - "y": 20 - }, - { - "x": "2014-01-01 00:00:00", - "y": 20 - }, - { - "x": "2014-02-01 00:00:00", - "y": 19.6 - }, - { - "x": "2014-03-01 00:00:00", - "y": 21.1 - }, - { - "x": "2014-04-01 00:00:00", - "y": 21.6 - }, - { - "x": "2014-05-01 00:00:00", - "y": 22.3 - }, - { - "x": "2014-06-01 00:00:00", - "y": 25.9 - }, - { - "x": "2015-09-01 00:00:00", - "y": 22.7 - }, - { - "x": "2015-10-01 00:00:00", - "y": 21.3 - }, - { - "x": "2015-11-01 00:00:00", - "y": 20.9 - }, - { - "x": "2015-12-01 00:00:00", - "y": 19.9 - }, - { - "x": "2016-01-01 00:00:00", - "y": 19.6 - }, - { - "x": "2016-02-01 00:00:00", - "y": 17.6 - }, - { - "x": "2016-03-01 00:00:00", - "y": 19.9 - }, - { - "x": "2016-04-01 00:00:00", - "y": 19.5 - }, - { - "x": "2016-05-01 00:00:00", - "y": 21.6 - }, - { - "x": "2016-06-01 00:00:00", - "y": 23.5 - }, - { - "x": "2016-07-01 00:00:00", - "y": 25.4 - }, - { - "x": "2016-08-01 00:00:00", - "y": 25.1 - }, - { - "x": "2016-09-01 00:00:00", - "y": 24.2 - }, - { - "x": "2017-03-01 00:00:00", - "y": 21.8 - }, - { - "x": "2017-04-01 00:00:00", - "y": 20.6 - }, - { - "x": "2017-05-01 00:00:00", - "y": 22.8 - }, - { - "x": "2017-06-01 00:00:00", - "y": 24.9 - }, - { - "x": "2017-07-01 00:00:00", - "y": 24.9 - }, - { - "x": "2017-08-01 00:00:00", - "y": 24.2 - }, - { - "x": "2017-09-01 00:00:00", - "y": 23.2 - }, - { - "x": "2019-03-01 00:00:00", - "y": 22.7 - }, - { - "x": "2019-04-01 00:00:00", - "y": 22.6 - }, - { - "x": "2019-05-01 00:00:00", - "y": 22.2 - }, - { - "x": "2019-06-01 00:00:00", - "y": 24.4 - }, - { - "x": "2019-07-01 00:00:00", - "y": 25.6 - }, - { - "x": "2019-08-01 00:00:00", - "y": 23.9 - } - ], - "name": "Mezzanine", - "unit": "°C", - "hide": false - }, - "Extraction_temperature": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 22 - }, - { - "x": "2012-07-01 00:00:00", - "y": 22.4 - }, - { - "x": "2012-08-01 00:00:00", - "y": 24.6 - }, - { - "x": "2012-09-01 00:00:00", - "y": 21.7 - }, - { - "x": "2012-10-01 00:00:00", - "y": 19.2 - }, - { - "x": "2012-11-01 00:00:00", - "y": 17.3 - }, - { - "x": "2012-12-01 00:00:00", - "y": 18.4 - }, - { - "x": "2013-01-01 00:00:00", - "y": 20.3 - }, - { - "x": "2013-02-01 00:00:00", - "y": 16.2 - }, - { - "x": "2013-03-01 00:00:00", - "y": 20.8 - }, - { - "x": "2013-04-01 00:00:00", - "y": 21.4 - }, - { - "x": "2013-05-01 00:00:00", - "y": 21.7 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-07-01 00:00:00", - "y": 25.5 - }, - { - "x": "2013-08-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-09-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-10-01 00:00:00", - "y": 21.3 - }, - { - "x": "2013-11-01 00:00:00", - "y": 19.3 - }, - { - "x": "2013-12-01 00:00:00", - "y": 20.6 - }, - { - "x": "2014-11-01 00:00:00", - "y": 20.8 - }, - { - "x": "2014-12-01 00:00:00", - "y": 18.8 - }, - { - "x": "2015-01-01 00:00:00", - "y": -90.2 - }, - { - "x": "2017-03-01 00:00:00", - "y": 24 - }, - { - "x": "2017-04-01 00:00:00", - "y": 20.4 - }, - { - "x": "2017-05-01 00:00:00", - "y": 22.7 - }, - { - "x": "2017-06-01 00:00:00", - "y": 24.4 - }, - { - "x": "2017-07-01 00:00:00", - "y": 24.7 - }, - { - "x": "2017-08-01 00:00:00", - "y": 23.7 - }, - { - "x": "2017-09-01 00:00:00", - "y": 22.8 - }, - { - "x": "2017-10-01 00:00:00", - "y": 21.8 - }, - { - "x": "2017-11-01 00:00:00", - "y": 17.9 - } - ], - "name": "Extraction", - "unit": "°C", - "hide": true - }, - "Bureau_temperature": { - "data": [ - { - "x": "2012-08-01 00:00:00", - "y": 26 - }, - { - "x": "2012-09-01 00:00:00", - "y": 26.3 - }, - { - "x": "2012-10-01 00:00:00", - "y": 24.8 - }, - { - "x": "2012-11-01 00:00:00", - "y": 24.4 - }, - { - "x": "2012-12-01 00:00:00", - "y": 23.6 - }, - { - "x": "2013-01-01 00:00:00", - "y": 23.9 - }, - { - "x": "2013-02-01 00:00:00", - "y": 18 - }, - { - "x": "2013-03-01 00:00:00", - "y": 23.2 - }, - { - "x": "2013-04-01 00:00:00", - "y": 22.6 - }, - { - "x": "2013-05-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22.6 - }, - { - "x": "2013-07-01 00:00:00", - "y": 26.1 - }, - { - "x": "2013-08-01 00:00:00", - "y": 23.9 - }, - { - "x": "2013-09-01 00:00:00", - "y": 23.5 - }, - { - "x": "2013-10-01 00:00:00", - "y": 22.2 - }, - { - "x": "2013-11-01 00:00:00", - "y": 23.7 - }, - { - "x": "2013-12-01 00:00:00", - "y": 23.9 - }, - { - "x": "2014-01-01 00:00:00", - "y": 23.5 - }, - { - "x": "2014-02-01 00:00:00", - "y": 22.7 - }, - { - "x": "2014-03-01 00:00:00", - "y": 22.8 - }, - { - "x": "2014-04-01 00:00:00", - "y": 22.9 - }, - { - "x": "2014-05-01 00:00:00", - "y": 23.6 - }, - { - "x": "2014-06-01 00:00:00", - "y": 27 - }, - { - "x": "2014-10-01 00:00:00", - "y": 24 - }, - { - "x": "2014-11-01 00:00:00", - "y": 22.5 - }, - { - "x": "2014-12-01 00:00:00", - "y": 20.9 - }, - { - "x": "2015-01-01 00:00:00", - "y": 23.5 - }, - { - "x": "2015-02-01 00:00:00", - "y": 23.7 - }, - { - "x": "2015-03-01 00:00:00", - "y": 22.4 - }, - { - "x": "2015-04-01 00:00:00", - "y": 23.3 - }, - { - "x": "2015-05-01 00:00:00", - "y": 23.2 - }, - { - "x": "2015-06-01 00:00:00", - "y": 26 - }, - { - "x": "2015-07-01 00:00:00", - "y": 26.3 - }, - { - "x": "2015-08-01 00:00:00", - "y": 24.3 - }, - { - "x": "2015-09-01 00:00:00", - "y": 23.7 - }, - { - "x": "2015-10-01 00:00:00", - "y": 22.6 - }, - { - "x": "2015-11-01 00:00:00", - "y": 22.5 - }, - { - "x": "2015-12-01 00:00:00", - "y": 22 - }, - { - "x": "2016-01-01 00:00:00", - "y": 22.8 - }, - { - "x": "2016-02-01 00:00:00", - "y": 20.8 - }, - { - "x": "2016-03-01 00:00:00", - "y": 22.8 - }, - { - "x": "2016-04-01 00:00:00", - "y": 22.1 - }, - { - "x": "2016-05-01 00:00:00", - "y": 23.1 - }, - { - "x": "2016-06-01 00:00:00", - "y": 24.4 - }, - { - "x": "2016-07-01 00:00:00", - "y": 26.3 - }, - { - "x": "2016-08-01 00:00:00", - "y": 26 - }, - { - "x": "2016-09-01 00:00:00", - "y": 24.9 - }, - { - "x": "2017-03-01 00:00:00", - "y": 22.9 - }, - { - "x": "2017-04-01 00:00:00", - "y": 23.9 - }, - { - "x": "2017-05-01 00:00:00", - "y": 24.6 - }, - { - "x": "2017-06-01 00:00:00", - "y": 25.2 - }, - { - "x": "2017-07-01 00:00:00", - "y": 33.8 - }, - { - "x": "2017-08-01 00:00:00", - "y": 38.6 - }, - { - "x": "2017-09-01 00:00:00", - "y": 35.3 - }, - { - "x": "2017-10-01 00:00:00", - "y": 35.2 - }, - { - "x": "2017-11-01 00:00:00", - "y": 36.2 - }, - { - "x": "2017-12-01 00:00:00", - "y": 24.3 - }, - { - "x": "2018-01-01 00:00:00", - "y": 23.6 - }, - { - "x": "2018-02-01 00:00:00", - "y": 24.6 - }, - { - "x": "2018-03-01 00:00:00", - "y": 22.7 - }, - { - "x": "2018-04-01 00:00:00", - "y": 24.8 - }, - { - "x": "2018-05-01 00:00:00", - "y": 26.1 - }, - { - "x": "2018-06-01 00:00:00", - "y": 26.5 - }, - { - "x": "2018-07-01 00:00:00", - "y": 30 - }, - { - "x": "2018-08-01 00:00:00", - "y": 27.5 - }, - { - "x": "2019-03-01 00:00:00", - "y": 25.3 - }, - { - "x": "2019-04-01 00:00:00", - "y": 26.1 - }, - { - "x": "2019-05-01 00:00:00", - "y": 25.2 - }, - { - "x": "2019-06-01 00:00:00", - "y": 27.3 - }, - { - "x": "2019-07-01 00:00:00", - "y": 30.2 - }, - { - "x": "2019-08-01 00:00:00", - "y": 25.6 - }, - { - "x": "2020-03-01 00:00:00", - "y": 36 - }, - { - "x": "2020-04-01 00:00:00", - "y": 35.2 - }, - { - "x": "2020-05-01 00:00:00", - "y": 37.4 - } - ], - "name": "Bureau", - "unit": "°C", - "hide": false - }, - "Temp_Nord_temperature": { - "data": [ - { - "x": "2012-08-01 00:00:00", - "y": 22.9 - }, - { - "x": "2012-09-01 00:00:00", - "y": 15.4 - }, - { - "x": "2012-10-01 00:00:00", - "y": 12.8 - }, - { - "x": "2012-11-01 00:00:00", - "y": 8.5 - }, - { - "x": "2012-12-01 00:00:00", - "y": 18.1 - }, - { - "x": "2013-01-01 00:00:00", - "y": 22 - }, - { - "x": "2013-02-01 00:00:00", - "y": 16.8 - }, - { - "x": "2013-03-01 00:00:00", - "y": 21.2 - }, - { - "x": "2013-04-01 00:00:00", - "y": 21.3 - }, - { - "x": "2013-05-01 00:00:00", - "y": 21.9 - }, - { - "x": "2013-06-01 00:00:00", - "y": 22.7 - }, - { - "x": "2013-07-01 00:00:00", - "y": 26.2 - }, - { - "x": "2013-08-01 00:00:00", - "y": 24.5 - }, - { - "x": "2013-09-01 00:00:00", - "y": 23.6 - }, - { - "x": "2013-10-01 00:00:00", - "y": 22 - }, - { - "x": "2013-11-01 00:00:00", - "y": 22.5 - }, - { - "x": "2013-12-01 00:00:00", - "y": 22.7 - }, - { - "x": "2014-01-01 00:00:00", - "y": 22.5 - }, - { - "x": "2014-02-01 00:00:00", - "y": 20.7 - }, - { - "x": "2014-03-01 00:00:00", - "y": 21.5 - }, - { - "x": "2014-04-01 00:00:00", - "y": 22.4 - }, - { - "x": "2014-05-01 00:00:00", - "y": 23.4 - }, - { - "x": "2014-06-01 00:00:00", - "y": 26.8 - }, - { - "x": "2014-10-01 00:00:00", - "y": 23.7 - }, - { - "x": "2014-11-01 00:00:00", - "y": 22.1 - }, - { - "x": "2014-12-01 00:00:00", - "y": 19.2 - } - ], - "name": "Temp_Nord", - "unit": "°C", - "hide": true - }, - "Chambre_RDC_hygrometrie": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 63 - }, - { - "x": "2012-07-01 00:00:00", - "y": 59 - }, - { - "x": "2012-08-01 00:00:00", - "y": 56 - }, - { - "x": "2012-09-01 00:00:00", - "y": 54 - }, - { - "x": "2012-10-01 00:00:00", - "y": 59 - }, - { - "x": "2012-11-01 00:00:00", - "y": 67 - }, - { - "x": "2012-12-01 00:00:00", - "y": 62 - }, - { - "x": "2013-01-01 00:00:00", - "y": 46 - }, - { - "x": "2013-02-01 00:00:00", - "y": 42 - }, - { - "x": "2013-03-01 00:00:00", - "y": 44 - }, - { - "x": "2013-04-01 00:00:00", - "y": 47 - }, - { - "x": "2013-05-01 00:00:00", - "y": 50 - }, - { - "x": "2013-06-01 00:00:00", - "y": 56 - }, - { - "x": "2013-07-01 00:00:00", - "y": 60 - }, - { - "x": "2013-08-01 00:00:00", - "y": 59 - }, - { - "x": "2013-09-01 00:00:00", - "y": 59 - }, - { - "x": "2013-10-01 00:00:00", - "y": 62 - }, - { - "x": "2013-11-01 00:00:00", - "y": 49 - }, - { - "x": "2013-12-01 00:00:00", - "y": 45 - }, - { - "x": "2014-01-01 00:00:00", - "y": 52 - }, - { - "x": "2014-02-01 00:00:00", - "y": 48 - }, - { - "x": "2014-03-01 00:00:00", - "y": 47 - }, - { - "x": "2014-04-01 00:00:00", - "y": 48 - }, - { - "x": "2014-05-01 00:00:00", - "y": 53 - }, - { - "x": "2014-06-01 00:00:00", - "y": 63 - }, - { - "x": "2014-10-01 00:00:00", - "y": 57 - }, - { - "x": "2014-11-01 00:00:00", - "y": 56 - }, - { - "x": "2014-12-01 00:00:00", - "y": 47 - }, - { - "x": "2015-01-01 00:00:00", - "y": 47 - }, - { - "x": "2015-02-01 00:00:00", - "y": 43 - }, - { - "x": "2015-03-01 00:00:00", - "y": 47 - }, - { - "x": "2015-04-01 00:00:00", - "y": 47 - }, - { - "x": "2015-05-01 00:00:00", - "y": 46 - }, - { - "x": "2015-06-01 00:00:00", - "y": 56 - }, - { - "x": "2015-07-01 00:00:00", - "y": 54 - }, - { - "x": "2015-08-01 00:00:00", - "y": 59 - }, - { - "x": "2015-09-01 00:00:00", - "y": 54 - }, - { - "x": "2015-10-01 00:00:00", - "y": 57 - }, - { - "x": "2015-11-01 00:00:00", - "y": 59 - }, - { - "x": "2015-12-01 00:00:00", - "y": 63 - }, - { - "x": "2016-01-01 00:00:00", - "y": 64 - }, - { - "x": "2016-02-01 00:00:00", - "y": 59 - }, - { - "x": "2016-03-01 00:00:00", - "y": 55 - }, - { - "x": "2016-04-01 00:00:00", - "y": 53 - }, - { - "x": "2016-05-01 00:00:00", - "y": 52 - }, - { - "x": "2016-06-01 00:00:00", - "y": 61 - }, - { - "x": "2016-07-01 00:00:00", - "y": 58 - }, - { - "x": "2016-08-01 00:00:00", - "y": 52 - }, - { - "x": "2016-09-01 00:00:00", - "y": 54 - }, - { - "x": "2017-03-01 00:00:00", - "y": 56 - }, - { - "x": "2017-04-01 00:00:00", - "y": 51 - }, - { - "x": "2017-05-01 00:00:00", - "y": 58 - }, - { - "x": "2017-06-01 00:00:00", - "y": 60 - }, - { - "x": "2017-07-01 00:00:00", - "y": 60 - }, - { - "x": "2017-08-01 00:00:00", - "y": 59 - }, - { - "x": "2017-09-01 00:00:00", - "y": 55 - }, - { - "x": "2017-10-01 00:00:00", - "y": 54 - }, - { - "x": "2017-11-01 00:00:00", - "y": 60 - }, - { - "x": "2017-12-01 00:00:00", - "y": 49 - }, - { - "x": "2018-01-01 00:00:00", - "y": 51 - }, - { - "x": "2018-02-01 00:00:00", - "y": 43 - }, - { - "x": "2018-03-01 00:00:00", - "y": 44 - }, - { - "x": "2018-04-01 00:00:00", - "y": 49 - }, - { - "x": "2018-05-01 00:00:00", - "y": 59 - }, - { - "x": "2018-06-01 00:00:00", - "y": 61 - }, - { - "x": "2018-07-01 00:00:00", - "y": 56 - }, - { - "x": "2018-08-01 00:00:00", - "y": 51 - }, - { - "x": "2019-03-01 00:00:00", - "y": 41 - }, - { - "x": "2019-04-01 00:00:00", - "y": 43 - }, - { - "x": "2019-05-01 00:00:00", - "y": 50 - }, - { - "x": "2019-06-01 00:00:00", - "y": 57 - }, - { - "x": "2019-07-01 00:00:00", - "y": 52 - }, - { - "x": "2019-08-01 00:00:00", - "y": 48 - }, - { - "x": "2020-03-01 00:00:00", - "y": 51 - } - ], - "name": "Chambre_RDC", - "unit": "%", - "hide": false - }, - "Exterieure_hygrometrie": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 63 - }, - { - "x": "2012-07-01 00:00:00", - "y": 59 - }, - { - "x": "2012-08-01 00:00:00", - "y": 50 - }, - { - "x": "2012-09-01 00:00:00", - "y": 49 - }, - { - "x": "2012-10-01 00:00:00", - "y": 53 - }, - { - "x": "2012-11-01 00:00:00", - "y": 69 - }, - { - "x": "2012-12-01 00:00:00", - "y": 82 - }, - { - "x": "2013-01-01 00:00:00", - "y": 85 - }, - { - "x": "2013-02-01 00:00:00", - "y": 80 - }, - { - "x": "2013-03-01 00:00:00", - "y": 72 - }, - { - "x": "2013-04-01 00:00:00", - "y": 67 - }, - { - "x": "2013-05-01 00:00:00", - "y": 74 - }, - { - "x": "2013-06-01 00:00:00", - "y": 70 - }, - { - "x": "2013-07-01 00:00:00", - "y": 40 - }, - { - "x": "2013-10-01 00:00:00", - "y": 75 - }, - { - "x": "2013-11-01 00:00:00", - "y": 84 - }, - { - "x": "2013-12-01 00:00:00", - "y": 74 - }, - { - "x": "2014-01-01 00:00:00", - "y": 79 - }, - { - "x": "2014-02-01 00:00:00", - "y": 74 - }, - { - "x": "2014-03-01 00:00:00", - "y": 65 - }, - { - "x": "2014-04-01 00:00:00", - "y": 66 - }, - { - "x": "2014-05-01 00:00:00", - "y": 67 - }, - { - "x": "2014-06-01 00:00:00", - "y": 68 - }, - { - "x": "2014-10-01 00:00:00", - "y": 76 - }, - { - "x": "2014-11-01 00:00:00", - "y": 79 - }, - { - "x": "2014-12-01 00:00:00", - "y": 82 - }, - { - "x": "2015-01-01 00:00:00", - "y": 81 - }, - { - "x": "2015-02-01 00:00:00", - "y": 70 - }, - { - "x": "2015-03-01 00:00:00", - "y": 69 - }, - { - "x": "2015-04-01 00:00:00", - "y": 60 - }, - { - "x": "2015-05-01 00:00:00", - "y": 82 - }, - { - "x": "2015-06-01 00:00:00", - "y": 68 - }, - { - "x": "2015-07-01 00:00:00", - "y": 55 - }, - { - "x": "2015-08-01 00:00:00", - "y": 59 - }, - { - "x": "2015-09-01 00:00:00", - "y": 65 - }, - { - "x": "2015-10-01 00:00:00", - "y": 74 - }, - { - "x": "2015-11-01 00:00:00", - "y": 75 - }, - { - "x": "2015-12-01 00:00:00", - "y": 69 - }, - { - "x": "2016-01-01 00:00:00", - "y": 78 - }, - { - "x": "2016-02-01 00:00:00", - "y": 76 - }, - { - "x": "2016-03-01 00:00:00", - "y": 67 - }, - { - "x": "2016-04-01 00:00:00", - "y": 67 - }, - { - "x": "2016-05-01 00:00:00", - "y": 64 - }, - { - "x": "2016-06-01 00:00:00", - "y": 68 - }, - { - "x": "2016-07-01 00:00:00", - "y": 54 - }, - { - "x": "2016-08-01 00:00:00", - "y": 48 - }, - { - "x": "2017-03-01 00:00:00", - "y": 49 - }, - { - "x": "2017-04-01 00:00:00", - "y": 46 - }, - { - "x": "2017-05-01 00:00:00", - "y": 48 - }, - { - "x": "2017-06-01 00:00:00", - "y": 41 - }, - { - "x": "2017-07-01 00:00:00", - "y": 48 - }, - { - "x": "2017-08-01 00:00:00", - "y": 62 - }, - { - "x": "2017-09-01 00:00:00", - "y": 54 - }, - { - "x": "2017-10-01 00:00:00", - "y": 56 - }, - { - "x": "2017-11-01 00:00:00", - "y": 59 - }, - { - "x": "2017-12-01 00:00:00", - "y": 62 - }, - { - "x": "2018-03-01 00:00:00", - "y": 50 - }, - { - "x": "2018-04-01 00:00:00", - "y": 41 - }, - { - "x": "2018-05-01 00:00:00", - "y": 61 - }, - { - "x": "2018-06-01 00:00:00", - "y": 43 - }, - { - "x": "2018-07-01 00:00:00", - "y": 35 - }, - { - "x": "2018-08-01 00:00:00", - "y": 37 - } - ], - "name": "Exterieure", - "unit": "%", - "hide": false - }, - "Sejour_hygrometrie": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 60 - }, - { - "x": "2012-07-01 00:00:00", - "y": 57 - }, - { - "x": "2012-08-01 00:00:00", - "y": 54 - }, - { - "x": "2012-09-01 00:00:00", - "y": 52 - }, - { - "x": "2012-10-01 00:00:00", - "y": 55 - }, - { - "x": "2012-11-01 00:00:00", - "y": 63 - }, - { - "x": "2012-12-01 00:00:00", - "y": 61 - }, - { - "x": "2013-01-01 00:00:00", - "y": 45 - }, - { - "x": "2013-02-01 00:00:00", - "y": 41 - }, - { - "x": "2013-03-01 00:00:00", - "y": 43 - }, - { - "x": "2013-04-01 00:00:00", - "y": 45 - }, - { - "x": "2013-05-01 00:00:00", - "y": 52 - }, - { - "x": "2013-06-01 00:00:00", - "y": 57 - }, - { - "x": "2013-07-01 00:00:00", - "y": 60 - }, - { - "x": "2013-08-01 00:00:00", - "y": 58 - }, - { - "x": "2013-09-01 00:00:00", - "y": 56 - }, - { - "x": "2013-10-01 00:00:00", - "y": 60 - }, - { - "x": "2013-11-01 00:00:00", - "y": 48 - }, - { - "x": "2013-12-01 00:00:00", - "y": 44 - }, - { - "x": "2014-01-01 00:00:00", - "y": 51 - }, - { - "x": "2014-02-01 00:00:00", - "y": 46 - }, - { - "x": "2014-03-01 00:00:00", - "y": 44 - }, - { - "x": "2014-04-01 00:00:00", - "y": 45 - }, - { - "x": "2014-05-01 00:00:00", - "y": 49 - }, - { - "x": "2014-06-01 00:00:00", - "y": 61 - }, - { - "x": "2014-10-01 00:00:00", - "y": 54 - }, - { - "x": "2014-11-01 00:00:00", - "y": 52 - }, - { - "x": "2014-12-01 00:00:00", - "y": 46 - }, - { - "x": "2015-01-01 00:00:00", - "y": 46 - }, - { - "x": "2015-02-01 00:00:00", - "y": 41 - }, - { - "x": "2015-03-01 00:00:00", - "y": 45 - }, - { - "x": "2015-04-01 00:00:00", - "y": 44 - }, - { - "x": "2015-05-01 00:00:00", - "y": 47 - }, - { - "x": "2015-06-01 00:00:00", - "y": 54 - }, - { - "x": "2015-07-01 00:00:00", - "y": 53 - }, - { - "x": "2015-08-01 00:00:00", - "y": 55 - }, - { - "x": "2015-09-01 00:00:00", - "y": 49 - }, - { - "x": "2015-10-01 00:00:00", - "y": 54 - }, - { - "x": "2015-11-01 00:00:00", - "y": 55 - }, - { - "x": "2015-12-01 00:00:00", - "y": 59 - }, - { - "x": "2016-01-01 00:00:00", - "y": 63 - }, - { - "x": "2016-02-01 00:00:00", - "y": 60 - }, - { - "x": "2016-03-01 00:00:00", - "y": 52 - }, - { - "x": "2016-04-01 00:00:00", - "y": 50 - }, - { - "x": "2016-05-01 00:00:00", - "y": 48 - }, - { - "x": "2016-06-01 00:00:00", - "y": 57 - }, - { - "x": "2016-07-01 00:00:00", - "y": 55 - }, - { - "x": "2016-08-01 00:00:00", - "y": 49 - }, - { - "x": "2016-09-01 00:00:00", - "y": 51 - }, - { - "x": "2017-03-01 00:00:00", - "y": 51 - }, - { - "x": "2017-04-01 00:00:00", - "y": 47 - }, - { - "x": "2017-05-01 00:00:00", - "y": 54 - }, - { - "x": "2017-06-01 00:00:00", - "y": 57 - }, - { - "x": "2017-07-01 00:00:00", - "y": 57 - }, - { - "x": "2017-08-01 00:00:00", - "y": 57 - }, - { - "x": "2017-09-01 00:00:00", - "y": 52 - }, - { - "x": "2017-10-01 00:00:00", - "y": 50 - }, - { - "x": "2017-11-01 00:00:00", - "y": 56 - }, - { - "x": "2017-12-01 00:00:00", - "y": 47 - }, - { - "x": "2018-01-01 00:00:00", - "y": 50 - }, - { - "x": "2018-02-01 00:00:00", - "y": 41 - }, - { - "x": "2018-03-01 00:00:00", - "y": 41 - }, - { - "x": "2018-04-01 00:00:00", - "y": 46 - }, - { - "x": "2018-05-01 00:00:00", - "y": 56 - }, - { - "x": "2018-06-01 00:00:00", - "y": 58 - }, - { - "x": "2018-07-01 00:00:00", - "y": 54 - }, - { - "x": "2018-08-01 00:00:00", - "y": 48 - }, - { - "x": "2019-03-01 00:00:00", - "y": 36 - }, - { - "x": "2019-04-01 00:00:00", - "y": 39 - }, - { - "x": "2019-05-01 00:00:00", - "y": 46 - }, - { - "x": "2019-06-01 00:00:00", - "y": 54 - }, - { - "x": "2019-07-01 00:00:00", - "y": 49 - }, - { - "x": "2019-08-01 00:00:00", - "y": 45 - }, - { - "x": "2020-03-01 00:00:00", - "y": 45 - } - ], - "name": "Sejour", - "unit": "%", - "hide": false - }, - "Soufflage_hygrometrie": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 64 - }, - { - "x": "2012-07-01 00:00:00", - "y": 59 - }, - { - "x": "2012-08-01 00:00:00", - "y": 58 - }, - { - "x": "2012-09-01 00:00:00", - "y": 60 - }, - { - "x": "2012-10-01 00:00:00", - "y": 71 - }, - { - "x": "2012-11-01 00:00:00", - "y": 84 - }, - { - "x": "2012-12-01 00:00:00", - "y": 66 - }, - { - "x": "2013-01-01 00:00:00", - "y": 40 - }, - { - "x": "2013-02-01 00:00:00", - "y": 41 - }, - { - "x": "2013-03-01 00:00:00", - "y": 38 - }, - { - "x": "2013-04-01 00:00:00", - "y": 39 - }, - { - "x": "2013-05-01 00:00:00", - "y": 43 - }, - { - "x": "2013-06-01 00:00:00", - "y": 50 - }, - { - "x": "2013-07-01 00:00:00", - "y": 57 - }, - { - "x": "2013-08-01 00:00:00", - "y": 58 - }, - { - "x": "2013-09-01 00:00:00", - "y": 55 - }, - { - "x": "2013-10-01 00:00:00", - "y": 57 - }, - { - "x": "2013-11-01 00:00:00", - "y": 47 - }, - { - "x": "2013-12-01 00:00:00", - "y": 40 - }, - { - "x": "2014-01-01 00:00:00", - "y": 48 - }, - { - "x": "2014-02-01 00:00:00", - "y": 40 - }, - { - "x": "2014-03-01 00:00:00", - "y": 37 - }, - { - "x": "2014-04-01 00:00:00", - "y": 45 - }, - { - "x": "2014-11-01 00:00:00", - "y": 47 - }, - { - "x": "2014-12-01 00:00:00", - "y": 82 - }, - { - "x": "2015-01-01 00:00:00", - "y": 84 - }, - { - "x": "2015-02-01 00:00:00", - "y": 78 - }, - { - "x": "2015-03-01 00:00:00", - "y": 72 - }, - { - "x": "2015-04-01 00:00:00", - "y": 54 - }, - { - "x": "2015-05-01 00:00:00", - "y": 75 - }, - { - "x": "2015-06-01 00:00:00", - "y": 72 - }, - { - "x": "2015-07-01 00:00:00", - "y": 60 - }, - { - "x": "2015-08-01 00:00:00", - "y": 61 - }, - { - "x": "2015-09-01 00:00:00", - "y": 61 - }, - { - "x": "2015-10-01 00:00:00", - "y": 80 - }, - { - "x": "2015-11-01 00:00:00", - "y": 88 - }, - { - "x": "2015-12-01 00:00:00", - "y": 90 - }, - { - "x": "2016-01-01 00:00:00", - "y": 96 - }, - { - "x": "2016-02-01 00:00:00", - "y": 97 - }, - { - "x": "2017-03-01 00:00:00", - "y": 68 - }, - { - "x": "2017-04-01 00:00:00", - "y": 64 - }, - { - "x": "2017-05-01 00:00:00", - "y": 71 - }, - { - "x": "2017-06-01 00:00:00", - "y": 73 - }, - { - "x": "2017-07-01 00:00:00", - "y": 74 - }, - { - "x": "2017-08-01 00:00:00", - "y": 76 - }, - { - "x": "2017-09-01 00:00:00", - "y": 72 - }, - { - "x": "2017-10-01 00:00:00", - "y": 72 - }, - { - "x": "2017-11-01 00:00:00", - "y": 82 - }, - { - "x": "2017-12-01 00:00:00", - "y": 67 - }, - { - "x": "2018-01-01 00:00:00", - "y": 72 - }, - { - "x": "2018-02-01 00:00:00", - "y": 57 - }, - { - "x": "2018-03-01 00:00:00", - "y": 59 - } - ], - "name": "Soufflage", - "unit": "%", - "hide": true - }, - "Mezzanine_hygrometrie": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 59 - }, - { - "x": "2012-07-01 00:00:00", - "y": 56 - }, - { - "x": "2012-08-01 00:00:00", - "y": 52 - }, - { - "x": "2012-09-01 00:00:00", - "y": 52 - }, - { - "x": "2012-10-01 00:00:00", - "y": 56 - }, - { - "x": "2012-11-01 00:00:00", - "y": 64 - }, - { - "x": "2012-12-01 00:00:00", - "y": 64 - }, - { - "x": "2013-01-01 00:00:00", - "y": 49 - }, - { - "x": "2013-02-01 00:00:00", - "y": 43 - }, - { - "x": "2013-03-01 00:00:00", - "y": 45 - }, - { - "x": "2013-04-01 00:00:00", - "y": 46 - }, - { - "x": "2013-05-01 00:00:00", - "y": 53 - }, - { - "x": "2013-06-01 00:00:00", - "y": 57 - }, - { - "x": "2013-07-01 00:00:00", - "y": 58 - }, - { - "x": "2013-08-01 00:00:00", - "y": 57 - }, - { - "x": "2013-09-01 00:00:00", - "y": 57 - }, - { - "x": "2013-10-01 00:00:00", - "y": 61 - }, - { - "x": "2013-11-01 00:00:00", - "y": 51 - }, - { - "x": "2013-12-01 00:00:00", - "y": 45 - }, - { - "x": "2014-01-01 00:00:00", - "y": 54 - }, - { - "x": "2014-02-01 00:00:00", - "y": 48 - }, - { - "x": "2014-03-01 00:00:00", - "y": 45 - }, - { - "x": "2014-04-01 00:00:00", - "y": 46 - }, - { - "x": "2014-05-01 00:00:00", - "y": 50 - }, - { - "x": "2014-06-01 00:00:00", - "y": 60 - }, - { - "x": "2015-09-01 00:00:00", - "y": 52 - }, - { - "x": "2015-10-01 00:00:00", - "y": 55 - }, - { - "x": "2015-11-01 00:00:00", - "y": 57 - }, - { - "x": "2015-12-01 00:00:00", - "y": 60 - }, - { - "x": "2016-01-01 00:00:00", - "y": 66 - }, - { - "x": "2016-02-01 00:00:00", - "y": 65 - }, - { - "x": "2016-03-01 00:00:00", - "y": 55 - }, - { - "x": "2016-04-01 00:00:00", - "y": 51 - }, - { - "x": "2016-05-01 00:00:00", - "y": 50 - }, - { - "x": "2016-06-01 00:00:00", - "y": 58 - }, - { - "x": "2016-07-01 00:00:00", - "y": 55 - }, - { - "x": "2016-08-01 00:00:00", - "y": 49 - }, - { - "x": "2016-09-01 00:00:00", - "y": 52 - }, - { - "x": "2017-03-01 00:00:00", - "y": 54 - }, - { - "x": "2017-04-01 00:00:00", - "y": 50 - }, - { - "x": "2017-05-01 00:00:00", - "y": 55 - }, - { - "x": "2017-06-01 00:00:00", - "y": 55 - }, - { - "x": "2017-07-01 00:00:00", - "y": 57 - }, - { - "x": "2017-08-01 00:00:00", - "y": 56 - }, - { - "x": "2017-09-01 00:00:00", - "y": 54 - }, - { - "x": "2019-03-01 00:00:00", - "y": 39 - }, - { - "x": "2019-04-01 00:00:00", - "y": 40 - }, - { - "x": "2019-05-01 00:00:00", - "y": 48 - }, - { - "x": "2019-06-01 00:00:00", - "y": 53 - }, - { - "x": "2019-07-01 00:00:00", - "y": 48 - }, - { - "x": "2019-08-01 00:00:00", - "y": 46 - } - ], - "name": "Mezzanine", - "unit": "%", - "hide": false - }, - "Extraction_hygrometrie": { - "data": [ - { - "x": "2012-06-01 00:00:00", - "y": 64 - }, - { - "x": "2012-07-01 00:00:00", - "y": 60 - }, - { - "x": "2012-08-01 00:00:00", - "y": 56 - }, - { - "x": "2012-09-01 00:00:00", - "y": 59 - }, - { - "x": "2012-10-01 00:00:00", - "y": 65 - }, - { - "x": "2012-11-01 00:00:00", - "y": 77 - }, - { - "x": "2012-12-01 00:00:00", - "y": 62 - }, - { - "x": "2013-01-01 00:00:00", - "y": 43 - }, - { - "x": "2013-02-01 00:00:00", - "y": 40 - }, - { - "x": "2013-03-01 00:00:00", - "y": 40 - }, - { - "x": "2013-04-01 00:00:00", - "y": 42 - }, - { - "x": "2013-05-01 00:00:00", - "y": 45 - }, - { - "x": "2013-06-01 00:00:00", - "y": 52 - }, - { - "x": "2013-07-01 00:00:00", - "y": 57 - }, - { - "x": "2013-08-01 00:00:00", - "y": 57 - }, - { - "x": "2013-09-01 00:00:00", - "y": 55 - }, - { - "x": "2013-10-01 00:00:00", - "y": 58 - }, - { - "x": "2013-11-01 00:00:00", - "y": 47 - }, - { - "x": "2013-12-01 00:00:00", - "y": 39 - }, - { - "x": "2014-11-01 00:00:00", - "y": 55 - }, - { - "x": "2014-12-01 00:00:00", - "y": 47 - }, - { - "x": "2015-01-01 00:00:00", - "y": 89 - }, - { - "x": "2017-03-01 00:00:00", - "y": 50 - }, - { - "x": "2017-04-01 00:00:00", - "y": 50 - }, - { - "x": "2017-05-01 00:00:00", - "y": 56 - }, - { - "x": "2017-06-01 00:00:00", - "y": 59 - }, - { - "x": "2017-07-01 00:00:00", - "y": 58 - }, - { - "x": "2017-08-01 00:00:00", - "y": 60 - }, - { - "x": "2017-09-01 00:00:00", - "y": 55 - }, - { - "x": "2017-10-01 00:00:00", - "y": 54 - }, - { - "x": "2017-11-01 00:00:00", - "y": 57 - } - ], - "name": "Extraction", - "unit": "%", - "hide": true - } -} diff --git a/modules/private/websites/papa/maison_bbc_static/favicon.ico b/modules/private/websites/papa/maison_bbc_static/favicon.ico deleted file mode 100644 index 03990f9..0000000 Binary files a/modules/private/websites/papa/maison_bbc_static/favicon.ico and /dev/null differ diff --git a/modules/private/websites/papa/maison_bbc_static/index.html b/modules/private/websites/papa/maison_bbc_static/index.html deleted file mode 100644 index 78c318c..0000000 --- a/modules/private/websites/papa/maison_bbc_static/index.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - Pause - - - - - - - - -
-

Site web en pause !

-
- -

Le site est actuellement en pause.

-
-

Données historiques

-
- - - - -
- -
- - - - diff --git a/modules/private/websites/papa/maison_bbc_static/lamaison.png b/modules/private/websites/papa/maison_bbc_static/lamaison.png deleted file mode 100644 index dad243c..0000000 Binary files a/modules/private/websites/papa/maison_bbc_static/lamaison.png and /dev/null differ diff --git a/modules/private/websites/papa/surveillance.nix b/modules/private/websites/papa/surveillance.nix deleted file mode 100644 index a8e5149..0000000 --- a/modules/private/websites/papa/surveillance.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.papa.surveillance; - varDir = "/var/lib/ftp/papa"; - apacheUser = config.services.httpd.Prod.user; -in { - options.myServices.websites.papa.surveillance.enable = lib.mkEnableOption "enable Papa surveillance's website"; - - config = lib.mkIf cfg.enable { - security.acme.certs."ftp".extraDomains."surveillance.maison.bbc.bouya.org" = null; - - services.cron = { - systemCronJobs = let - script = pkgs.writeScript "cleanup-papa" '' - #!${pkgs.stdenv.shell} - d=$(date -d "7 days ago" +%Y%m%d) - for i in /var/lib/ftp/papa/*/20[0-9][0-9][0-9][0-9][0-9][0-9]; do - if [ "$d" -gt $(basename $i) ]; then - rm -rf "$i" - fi - done - ''; - in - [ - '' - 0 6 * * * ${apacheUser} ${script} - '' - ]; - }; - - services.websites.env.production.vhostConfs.papa_surveillance = { - certName = "papa"; - certMainHost = "surveillance.maison.bbc.bouya.org"; - hosts = [ "surveillance.maison.bbc.bouya.org" ]; - root = varDir; - extraConfig = [ - '' - Use Apaxy "${varDir}" "title .duplicity-ignore" - - Use LDAPConnect - Options Indexes - AllowOverride None - Require ldap-group cn=surveillance.maison.bbc.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu - - '' - ]; - }; - }; -} - diff --git a/modules/private/websites/patrick_fodella/altermondia.nix b/modules/private/websites/patrick_fodella/altermondia.nix deleted file mode 100644 index 2a41aa3..0000000 --- a/modules/private/websites/patrick_fodella/altermondia.nix +++ /dev/null @@ -1,73 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.patrick_fodella.altermondia; - varDir = "/var/lib/ftp/patrick_fodella/altermondia"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.patrick_fodella.altermondia.enable = lib.mkEnableOption "enable Patrick Fodella Altermondia's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "altermondia.org"; } ]; - - system.activationScripts.patrick_fodella_altermondia = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/patrick_fodella_altermondia - ''; - }; - systemd.services.phpfpm-patrick_fodella_altermondia.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-patrick_fodella_altermondia.wants = [ "mysql.service" ]; - services.phpfpm.pools.patrick_fodella_altermondia = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/patrick_fodella_altermondia:${varDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/patrick_fodella_altermondia"; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - disable_functions = "mail" - ''; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.patrick_fodella_altermondia = { - certName = "patrick_fodella"; - addToCerts = true; - hosts = ["altermondia.org" "www.altermondia.org" ]; - root = varDir; - extraConfig = [ - '' - Use Stats altermondia.org - - RewriteEngine on - RewriteCond "%{HTTP_HOST}" "!^altermondia\.org$" [NC] - RewriteRule ^(.+)$ https://altermondia.org$1 [R=302,L] - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.patrick_fodella_altermondia.socket}|fcgi://localhost" - - - - AllowOverride None - Require all denied - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride all - Require all granted - - '' - ]; - }; - }; -} - diff --git a/modules/private/websites/patrick_fodella/ecolyeu.nix b/modules/private/websites/patrick_fodella/ecolyeu.nix deleted file mode 100644 index 00dab76..0000000 --- a/modules/private/websites/patrick_fodella/ecolyeu.nix +++ /dev/null @@ -1,72 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.patrick_fodella.ecolyeu; - varDir = "/var/lib/ftp/patrick_fodella/ecolyeu_pessicart"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.patrick_fodella.ecolyeu.enable = lib.mkEnableOption "enable Patrick Fodella Ecolyeu's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "ecolyeu-pessicart-nice.fr"; } ]; - - system.activationScripts.patrick_fodella_ecolyeu = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/patrick_fodella_ecolyeu - ''; - }; - systemd.services.phpfpm-patrick_fodella_ecolyeu.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-patrick_fodella_ecolyeu.wants = [ "mysql.service" ]; - services.phpfpm.pools.patrick_fodella_ecolyeu = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/patrick_fodella_ecolyeu:${varDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/patrick_fodella_ecolyeu"; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - disable_functions = "mail" - ''; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.patrick_fodella_ecolyeu = { - certName = "patrick_fodella"; - certMainHost = "ecolyeu-pessicart-nice.fr"; - hosts = ["ecolyeu-pessicart-nice.fr" "www.ecolyeu-pessicart-nice.fr" ]; - root = varDir; - extraConfig = [ - '' - Use Stats ecolyeu-pessicart-nice.fr - - RewriteEngine on - RewriteCond "%{HTTP_HOST}" "!^www\.ecolyeu-pessicart-nice\.fr$" [NC] - RewriteRule ^(.+)$ https://www.ecolyeu-pessicart-nice.fr$1 [R=302,L] - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.patrick_fodella_ecolyeu.socket}|fcgi://localhost" - - - - AllowOverride None - Require all denied - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride all - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/piedsjaloux/app/default.nix b/modules/private/websites/piedsjaloux/app/default.nix deleted file mode 100644 index 4525a18..0000000 --- a/modules/private/websites/piedsjaloux/app/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ environment, varDir, secretsPath -, composerEnv, fetchurl, fetchgit, sources }: -let - app = composerEnv.buildPackage ( - import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } // - rec { - version = sources.websites-piedsjaloux-app.version; - pname = "piedsjaloux"; - name = "${pname}-${version}"; - src = sources.websites-piedsjaloux-app; - noDev = (environment == "prod"); - preInstall = '' - export SYMFONY_ENV="${environment}" - ''; - # /!\ miniatures and data need to be in the same physical dir due to a - # bug in leapt.im (searches for data/../miniatures) - postInstall = '' - cd $out - rm app/config/parameters.yml - ln -sf ${secretsPath} app/config/parameters.yml - rm -rf var/{logs,cache,data,miniatures,tmp} - ln -sf ${varDir}/{logs,cache,data,miniatures,tmp} var/ - ''; - passthru = { - inherit varDir environment secretsPath; - webRoot = "${app}/web"; - }; - }); -in app diff --git a/modules/private/websites/piedsjaloux/app/php-packages.nix b/modules/private/websites/piedsjaloux/app/php-packages.nix deleted file mode 100644 index 7b99936..0000000 --- a/modules/private/websites/piedsjaloux/app/php-packages.nix +++ /dev/null @@ -1,1009 +0,0 @@ -# Generated with composer2nix and adapted to return only the list of -# packages -{ composerEnv, fetchurl, fetchgit ? null }: -{ - packages = { - "behat/transliterator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c"; - src = fetchurl { - url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c; - sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0"; - }; - }; - }; - "components/bootstrap" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "components-bootstrap-5d60b2efd3159e1a9e203901849b3493c5aac61f"; - src = fetchurl { - url = https://api.github.com/repos/components/bootstrap/zipball/5d60b2efd3159e1a9e203901849b3493c5aac61f; - sha256 = "0jdyxl86dr2lf8az1vby84i7kdn1qcqkp8fy60rs18gav0aqp4fg"; - }; - }; - }; - "components/jquery" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "components-jquery-459648cda77875519c5da3ae1dd0ed5d170aa649"; - src = fetchurl { - url = https://api.github.com/repos/components/jquery/zipball/459648cda77875519c5da3ae1dd0ed5d170aa649; - sha256 = "04jv8yifhwx0cpkw3y3ng0bs2dv77pzrdd640p59rjxwba6r1lbb"; - }; - }; - }; - "components/jqueryui" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "components-jqueryui-c34f8dbf3ba57b3784b93f26119f436c0e8288e1"; - src = fetchurl { - url = https://api.github.com/repos/components/jqueryui/zipball/c34f8dbf3ba57b3784b93f26119f436c0e8288e1; - sha256 = "00nkg6z8g6l3jysyzsfmfxhxqcdsd3jfqib28j8kn2frzx508xv9"; - }; - }; - }; - "composer/ca-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "composer-ca-bundle-8afa52cd417f4ec417b4bfe86b68106538a87660"; - src = fetchurl { - url = https://api.github.com/repos/composer/ca-bundle/zipball/8afa52cd417f4ec417b4bfe86b68106538a87660; - sha256 = "18b0gq29frjf4yhl4sl3i3zbz6zr3qjgsjb8cjdhz65vpb50581p"; - }; - }; - }; - "container-interop/container-interop" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "container-interop-container-interop-79cbf1341c22ec75643d841642dd5d6acd83bdb8"; - src = fetchurl { - url = https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8; - sha256 = "1pxm461g5flcq50yabr01nw8w17n3g7klpman9ps3im4z0604m52"; - }; - }; - }; - "dmishh/settings-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "dmishh-settings-bundle-0ee48b015691694a8dcbd3ee654d33386e7bf478"; - src = fetchurl { - url = https://api.github.com/repos/dmishh/SettingsBundle/zipball/0ee48b015691694a8dcbd3ee654d33386e7bf478; - sha256 = "0m2fw5shvnkqlz0nm27ggpmkipfh377y1hjsw343zv1nn72nxfqf"; - }; - }; - }; - "doctrine/annotations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-annotations-c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5; - sha256 = "0b80xpqd3j99xgm0c41kbgy0k6knrfnd29223c93295sb12112g7"; - }; - }; - }; - "doctrine/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-cache-d768d58baee9a4862ca783840eca1b9add7a7f57"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57; - sha256 = "1kljhw4gqp12iz88h6ymsrlfir2fis7icn6dffyizfc1csyb4s2i"; - }; - }; - }; - "doctrine/collections" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-collections-a01ee38fcd999f34d9bfbcee59dbda5105449cbf"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf; - sha256 = "0d36zc21ka0pdac9xpkxsgf5zzw9gp0m9lk3r3xs5y70j0lkkkis"; - }; - }; - }; - "doctrine/common" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-common-30e33f60f64deec87df728c02b107f82cdafad9d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d; - sha256 = "0s4vv14ibyx62a9aj3wn5cs2bbxd72fajmfmi8qb5l11gx0375na"; - }; - }; - }; - "doctrine/dbal" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-dbal-22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9; - sha256 = "0kbahs699jd8pxf512dgg7arv49dc7qzi3mx8snxqm4h15n5brnj"; - }; - }; - }; - "doctrine/doctrine-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-bundle-82d2c63cd09acbde2332f55d9aa7b28aefe4983d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/82d2c63cd09acbde2332f55d9aa7b28aefe4983d; - sha256 = "0gzrigv360rp50yxpwidbkf8vlagym0w1if010yz5xcfrz37cpn3"; - }; - }; - }; - "doctrine/doctrine-cache-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-cache-bundle-5514c90d9fb595e1095e6d66ebb98ce9ef049927"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927; - sha256 = "04njrfhw4fc2ifacd9h0wd9i14l7ycv3hanbqrw5ilsai02j6asa"; - }; - }; - }; - "doctrine/doctrine-migrations-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-migrations-bundle-49fa399181db4bf4f9f725126bd1cb65c4398dce"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce; - sha256 = "1a73xjhjrjlvkh8d253kfc2rbxd2h4hwafhv5078dy7rg6x9blyn"; - }; - }; - }; - "doctrine/event-manager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-event-manager-a520bc093a0170feeb6b14e9d83f3a14452e64b3"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3; - sha256 = "165cxvw4idqj01l63nya2whpdb3fz6ld54rx198b71bzwfrydl88"; - }; - }; - }; - "doctrine/inflector" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-inflector-5527a48b7313d15261292c149e55e26eae771b0a"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a; - sha256 = "0ng6vlwjr8h6hqwa32ynykz1mhlfsff5hirjidlk086ab6njppa5"; - }; - }; - }; - "doctrine/instantiator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-instantiator-185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda; - sha256 = "1mah9a6mb30qad1zryzjain2dxw29d8h4bjkbcs3srpm3p891msy"; - }; - }; - }; - "doctrine/lexer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c; - sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74"; - }; - }; - }; - "doctrine/migrations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-migrations-215438c0eef3e5f9b7da7d09c6b90756071b43e6"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6; - sha256 = "0k6sgw65vji9rgib10mq2m634m41a67inspkrcw4qixig2lnb3ld"; - }; - }; - }; - "doctrine/orm" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-orm-434820973cadf2da2d66e7184be370084cc32ca8"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8; - sha256 = "114fyq8kaf5qzfkp8sdygqflf3z94va1cs5c3scycfpg9cmi4gls"; - }; - }; - }; - "doctrine/persistence" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-persistence-c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38; - sha256 = "0xdm5n38rjas1mlyxc15sg1as5h7y012mdb0j9lr6cvphgnaxxv7"; - }; - }; - }; - "doctrine/reflection" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-reflection-02538d3f95e88eb397a5f86274deb2c6175c2ab6"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6; - sha256 = "12n9zik4lxb9lx1jf0nbvg9vl9nv958a7z1yjx48scfxd1d1sxjy"; - }; - }; - }; - "eko/feedbundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "eko-feedbundle-d4e626616d9ccf6527212d3bdda15f9af3838e4f"; - src = fetchurl { - url = https://api.github.com/repos/eko/FeedBundle/zipball/d4e626616d9ccf6527212d3bdda15f9af3838e4f; - sha256 = "145f4mq2bpsdayaiqmgz1asmjx2is4v327h2ny2wp03knnkjvnfq"; - }; - }; - }; - "fig/link-util" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac; - sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64"; - }; - }; - }; - "gedmo/doctrine-extensions" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "gedmo-doctrine-extensions-87c78ff9fd4b90460386f753d95622f6fbbfcb27"; - src = fetchurl { - url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/87c78ff9fd4b90460386f753d95622f6fbbfcb27; - sha256 = "1i33xy9s18rncc1fllwi2qi7hrxj8g762fvgl9np7xndxa7kclyb"; - }; - }; - }; - "gregwar/captcha" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "gregwar-captcha-cf953dd79748406e0292cea8c565399681e4d345"; - src = fetchurl { - url = https://api.github.com/repos/Gregwar/Captcha/zipball/cf953dd79748406e0292cea8c565399681e4d345; - sha256 = "153m7bkhs3drxk0jfbq67a8vr1m13g7isc4ck44k5hyfzpcazb5i"; - }; - }; - }; - "gregwar/captcha-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "gregwar-captcha-bundle-c2d5468556890dd25e0b53bd345fc205562c86f7"; - src = fetchurl { - url = https://api.github.com/repos/Gregwar/CaptchaBundle/zipball/c2d5468556890dd25e0b53bd345fc205562c86f7; - sha256 = "04wcvqq457h6v7mzmrar946swd9akk27fmfig4qj8hpxzj250cgk"; - }; - }; - }; - "helios-ag/fm-bbcode-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "helios-ag-fm-bbcode-bundle-d88ff5ca6c0ab71ec094d5a7d56b0bc8bc100363"; - src = fetchurl { - url = https://api.github.com/repos/helios-ag/FMBbCodeBundle/zipball/d88ff5ca6c0ab71ec094d5a7d56b0bc8bc100363; - sha256 = "13g9ddd2p3nf1vrbkf6l00qdqz89rq6d8l20p68dmiy7mb6kpynl"; - }; - }; - }; - "immae/piedsjaloux-ckeditor-component" = { - targetDir = ""; - src = fetchgit { - name = "immae-piedsjaloux-ckeditor-component-9946db9daaa76448d0e43247472cdedd2a5ea22a"; - url = "https://git.immae.eu/perso/Immae/Projets/packagist/piedsjaloux-ckeditor-component.git"; - rev = "9946db9daaa76448d0e43247472cdedd2a5ea22a"; - sha256 = "183rgl23li3bqsynfmvv2s7jvlmqf6a5pskgrcxlaxcrr0d09n8c"; - }; - }; - "incenteev/composer-parameter-handler" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550"; - src = fetchurl { - url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550; - sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm"; - }; - }; - }; - "jdorn/sql-formatter" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc"; - src = fetchurl { - url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc; - sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi"; - }; - }; - }; - "kriswallsmith/assetic" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "kriswallsmith-assetic-e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1"; - src = fetchurl { - url = https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1; - sha256 = "1dqk4zvx8fgqf8rb81sj9bipl5431jib2b9kcvxyig5fw99irpf8"; - }; - }; - }; - "leapt/im-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "leapt-im-bundle-83442778d118f6edb537b93f9746c3a97e56c3d1"; - src = fetchurl { - url = https://api.github.com/repos/leapt/im-bundle/zipball/83442778d118f6edb537b93f9746c3a97e56c3d1; - sha256 = "1gm4ih3v1j0xjm7mrpspd3yacdwvbqgag22cyqmix0hc9hw3pc6a"; - }; - }; - }; - "luxifer/doctrine-functions" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "luxifer-doctrine-functions-e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c"; - src = fetchurl { - url = https://api.github.com/repos/luxifer/doctrine-functions/zipball/e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c; - sha256 = "1sw4826nvs5q0y2na9m26rbxfiaw0kfqwhky7x7apicgx5adqfa9"; - }; - }; - }; - "mjohnson/decoda" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "mjohnson-decoda-8cd0928b78a4bf5ade48b80c934370fc1f5f84a1"; - src = fetchurl { - url = https://api.github.com/repos/milesj/decoda/zipball/8cd0928b78a4bf5ade48b80c934370fc1f5f84a1; - sha256 = "0wcxz9yirz4zir06xvnlchqgppmyasymak06gn46jn6v6c9dsykc"; - }; - }; - }; - "monolog/monolog" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "monolog-monolog-bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266"; - src = fetchurl { - url = https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266; - sha256 = "0h3nnxjf2bdh7nmpqnpij99lqv6bw13r2bx83d8vn5zvblwg5png"; - }; - }; - }; - "ocramius/package-versions" = { - targetDir = ""; - needsModifyRights = true; - src = composerEnv.buildZipPackage { - name = "ocramius-package-versions-4489d5002c49d55576fa0ba786f42dbb009be46f"; - src = fetchurl { - url = https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f; - sha256 = "039c404g9597x45xh04bnn8kmcyknkbnr57yb9s7vf29vfrg4881"; - }; - }; - }; - "ocramius/proxy-manager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "ocramius-proxy-manager-14b137b06b0f911944132df9d51e445a35920ab1"; - src = fetchurl { - url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1; - sha256 = "10y5msgh2jdlw4w075fasv40yq01szjy15m3f0wgc89hlfmqz0sn"; - }; - }; - }; - "paragonie/random_compat" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "paragonie-random_compat-84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"; - src = fetchurl { - url = https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95; - sha256 = "03nsccdvcb79l64b7lsmx0n8ldf5z3v8niqr7bpp6wg401qp9p09"; - }; - }; - }; - "psr/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8; - sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz"; - }; - }; - }; - "psr/container" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f; - sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j"; - }; - }; - }; - "psr/link" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562; - sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13"; - }; - }; - }; - "psr/log" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-log-6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd; - sha256 = "1i351p3gd1pgjcjxv7mwwkiw79f1xiqr38irq22156h05zlcx80d"; - }; - }; - }; - "psr/simple-cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b; - sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw"; - }; - }; - }; - "robloach/component-installer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "robloach-component-installer-908a859aa7c4949ba9ad67091e67bac10b66d3d7"; - src = fetchurl { - url = https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7; - sha256 = "19y5sv4k338bihzmm8iac6q43r18vxhmbpvrdhz8jn39r51ampq9"; - }; - }; - }; - "sensio/distribution-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-distribution-bundle-59eac70f15f97ee945924948a6f5e2f6f86b7a4b"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/59eac70f15f97ee945924948a6f5e2f6f86b7a4b; - sha256 = "05mj4c0ahwg6l2wipyqfyyjjp1m2vvl7ymp61nvwv7zhvqacvljs"; - }; - }; - }; - "sensio/framework-extra-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-framework-extra-bundle-bb907234df776b68922eb4b25bfa061683597b6a"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb907234df776b68922eb4b25bfa061683597b6a; - sha256 = "011hcljjcfq5qy4a7mlf0hwqxyb58yci40ini0n5rqandcyk2nck"; - }; - }; - }; - "sensiolabs/security-checker" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensiolabs-security-checker-46be3f58adac13084497961e10eed9a7fb4d44d1"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/security-checker/zipball/46be3f58adac13084497961e10eed9a7fb4d44d1; - sha256 = "1caqf3hdfsajj9nb8fpinvs6apv90g1srwxcyxdnr6a8d6g0p6qi"; - }; - }; - }; - "swiftmailer/swiftmailer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "swiftmailer-swiftmailer-181b89f18a90f8925ef805f950d47a7190e9b950"; - src = fetchurl { - url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950; - sha256 = "0hkmawv3bhbqdavy4wxqhzajg5zqd7chsi8w27y2zdi5r35az75d"; - }; - }; - }; - "symfony/assetic-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-assetic-bundle-2e0a23a4874838e26de6f025e02fc63328921a4c"; - src = fetchurl { - url = https://api.github.com/repos/symfony/assetic-bundle/zipball/2e0a23a4874838e26de6f025e02fc63328921a4c; - sha256 = "17rxrkyzxa6x5nn7qhhhdgx4z0nlznnq5fifza4wv9znca8bbwyc"; - }; - }; - }; - "symfony/monolog-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-monolog-bundle-572e143afc03419a75ab002c80a2fd99299195ff"; - src = fetchurl { - url = https://api.github.com/repos/symfony/monolog-bundle/zipball/572e143afc03419a75ab002c80a2fd99299195ff; - sha256 = "0g8icydnwfbqcbc56pqyc8bv1vp31331w0r75r3hqh225p2j1nd7"; - }; - }; - }; - "symfony/polyfill-apcu" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-apcu-19e1b73bf255265ad0b568f81766ae2a3266d8d2"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/19e1b73bf255265ad0b568f81766ae2a3266d8d2; - sha256 = "0jg33c81kwkpxk0b18jkslz9jkbkxl5k48h6m5b33dm63p1fj05r"; - }; - }; - }; - "symfony/polyfill-ctype" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-ctype-e3d826245268269cd66f8326bd8bc066687b4a19"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19; - sha256 = "16md0qmy5jvvl7lc6n6r5hxjdr5i30vl6n9rpkm4b11rh2nqh7mh"; - }; - }; - }; - "symfony/polyfill-intl-icu" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-intl-icu-f22a90256d577c7ef7efad8df1f0201663d57644"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644; - sha256 = "0x7h8l248l1gc07xmvfixq6p80ifdaa29qympfq3jzfb79k69slq"; - }; - }; - }; - "symfony/polyfill-mbstring" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-mbstring-c79c051f5b3a46be09205c73b80b346e4153e494"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494; - sha256 = "18v2777cky55ah6xi4dh383mp4iddwzmnvx81qd86y1kgfykwhpi"; - }; - }; - }; - "symfony/polyfill-php56" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php56-ff208829fe1aa48ab9af356992bb7199fed551af"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php56/zipball/ff208829fe1aa48ab9af356992bb7199fed551af; - sha256 = "0vmpiwakc7hpbr6jwpk7cqcy41ybgwl6jkn3q8c4ryxynknn5hfk"; - }; - }; - }; - "symfony/polyfill-php70" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php70-6b88000cdd431cd2e940caa2cb569201f3f84224"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php70/zipball/6b88000cdd431cd2e940caa2cb569201f3f84224; - sha256 = "08h77r1i2q4pwdd0yk3pfhqqgk0z7gwmkzmvykx9bfv1z7a0h8ik"; - }; - }; - }; - "symfony/polyfill-util" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-util-3b58903eae668d348a7126f999b0da0f2f93611c"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-util/zipball/3b58903eae668d348a7126f999b0da0f2f93611c; - sha256 = "00bb5mgljk6d54nyvd4gmc7mbzfr4b4q7h3rxmv8rzq613wcjp3i"; - }; - }; - }; - "symfony/swiftmailer-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec"; - src = fetchurl { - url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec; - sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01"; - }; - }; - }; - "symfony/symfony" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-symfony-f6b8ddc362b1cf3fb06548693c3adbb736092412"; - src = fetchurl { - url = https://api.github.com/repos/symfony/symfony/zipball/f6b8ddc362b1cf3fb06548693c3adbb736092412; - sha256 = "0ip7k5xf34w4p1zvv2nkv4nyik3asidk3zlgzyc1v57429z0f28q"; - }; - }; - }; - "twig/extensions" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "twig-extensions-57873c8b0c1be51caa47df2cdb824490beb16202"; - src = fetchurl { - url = https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202; - sha256 = "1sjajjd6vnczvdrl9b8zhzr06l5dflzqiwg9d33d92q8gli4j7jn"; - }; - }; - }; - "twig/twig" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "twig-twig-a11dd39f5b6589e14f0ff3b36675d06047c589b1"; - src = fetchurl { - url = https://api.github.com/repos/twigphp/Twig/zipball/a11dd39f5b6589e14f0ff3b36675d06047c589b1; - sha256 = "0rnwam9379gj5m4ik0fh6c81dbr7kwj2b3x1gnmpf6awa5fm261n"; - }; - }; - }; - "zendframework/zend-code" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-code-c21db169075c6ec4b342149f446e7b7b724f95eb"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb; - sha256 = "031mfsahjkl63348020wq05273kvszx0dv2766zmzncnd6fcggw1"; - }; - }; - }; - "zendframework/zend-escaper" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-escaper-31d8aafae982f9568287cb4dce987e6aff8fd074"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-escaper/zipball/31d8aafae982f9568287cb4dce987e6aff8fd074; - sha256 = "16gwqh9zpclc3fmf89cf738mxfh36ar3wdf9i0wvby0g0nhknkd7"; - }; - }; - }; - "zendframework/zend-eventmanager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd; - sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n"; - }; - }; - }; - "zendframework/zend-feed" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-feed-6641f4cf3f4586c63f83fd70b6d19966025c8888"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-feed/zipball/6641f4cf3f4586c63f83fd70b6d19966025c8888; - sha256 = "0wl2pf4cq0snlp3gbl2ia662i48yils464qlfqf7gdmbn1ryzcpi"; - }; - }; - }; - "zendframework/zend-http" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-http-2c8aed3d25522618573194e7cc51351f8cd4a45b"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-http/zipball/2c8aed3d25522618573194e7cc51351f8cd4a45b; - sha256 = "1vy6b24ihwv1g08hjnw4pd7c5171g866jnlr3j6fg0xqv79s4dn9"; - }; - }; - }; - "zendframework/zend-loader" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-loader-78f11749ea340f6ca316bca5958eef80b38f9b6c"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-loader/zipball/78f11749ea340f6ca316bca5958eef80b38f9b6c; - sha256 = "056zp0xchc4ckijg969im5him3j4cji6hsy26fiaycwprniaqdmg"; - }; - }; - }; - "zendframework/zend-servicemanager" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-servicemanager-a1ed6140d0d3ee803fec96582593ed024950067b"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-servicemanager/zipball/a1ed6140d0d3ee803fec96582593ed024950067b; - sha256 = "0s3aplkilrd8b18xh55h9m1yvnp9b6vnlgby4gqhqv8npnxxqir9"; - }; - }; - }; - "zendframework/zend-stdlib" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-stdlib-66536006722aff9e62d1b331025089b7ec71c065"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-stdlib/zipball/66536006722aff9e62d1b331025089b7ec71c065; - sha256 = "0cl0lcgqb5aja6iijp0wrclxra57imwsmhkfpahdl2bsgs1inf2f"; - }; - }; - }; - "zendframework/zend-uri" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-uri-3b6463645c6766f78ce537c70cb4fdabee1e725f"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-uri/zipball/3b6463645c6766f78ce537c70cb4fdabee1e725f; - sha256 = "0zkb88y9qbgshm8ys5yjxhz6a7fhxl7waygwn37pqsbvz74mbbvp"; - }; - }; - }; - "zendframework/zend-validator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "zendframework-zend-validator-f0789b4c4c099afdd2ecc58cc209a26c64bd4f17"; - src = fetchurl { - url = https://api.github.com/repos/zendframework/zend-validator/zipball/f0789b4c4c099afdd2ecc58cc209a26c64bd4f17; - sha256 = "1lwxbr3jlldll4ccw5cn2ny1cbzh279mnfz7m1djqc8qnw16c8jl"; - }; - }; - }; - }; - devPackages = { - "doctrine/data-fixtures" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-data-fixtures-3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/data-fixtures/zipball/3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a; - sha256 = "0wbxhy7hq17laqgnq9x9ygysv0n1kn7s4x3v89pk7iy622pil3sm"; - }; - }; - }; - "doctrine/doctrine-fixtures-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-doctrine-fixtures-bundle-74b8cc70a4a25b774628ee59f4cdf3623a146273"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/74b8cc70a4a25b774628ee59f4cdf3623a146273; - sha256 = "1bbflq8k6izwqgp9ka2gyb5y96a80b4lnlc5wrgc5gnih7hqidlf"; - }; - }; - }; - "fzaninotto/faker" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "fzaninotto-faker-d0190b156bcca848d401fb80f31f504f37141c8d"; - src = fetchurl { - url = https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d; - sha256 = "1x7xrxw14x7b0iq7sxi9ynswk8ljga62i77ch7xip4dwgq1dypvi"; - }; - }; - }; - "league/factory-muffin" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "league-factory-muffin-316ed2bac70178567f995d877b831804c9c58d5a"; - src = fetchurl { - url = https://api.github.com/repos/thephpleague/factory-muffin/zipball/316ed2bac70178567f995d877b831804c9c58d5a; - sha256 = "1fxh0hsqifmnhgkwyd460x3w9wn74369lmak3f1m24mn2asiynxq"; - }; - }; - }; - "league/factory-muffin-faker" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "league-factory-muffin-faker-30dbd11bb6be03b47e52bd60006ae198d20ab426"; - src = fetchurl { - url = https://api.github.com/repos/thephpleague/factory-muffin-faker/zipball/30dbd11bb6be03b47e52bd60006ae198d20ab426; - sha256 = "0dsimjdnsmzdd4vwjzw1gz1bb4zlhmv66g3fc9k4nj5bqch6mny1"; - }; - }; - }; - "mikey179/vfsStream" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "mikey179-vfsStream-d5fec95f541d4d71c4823bb5e30cf9b9e5b96145"; - src = fetchurl { - url = https://github.com/bovigo/vfsStream/archive/v1.6.5.zip; - sha256 = "16vi7ci8nxq5hxnzzjmmia73gdm55qcwn006c6hgdwa3i58dnr4l"; - }; - }; - }; - "phpdocumentor/reflection-common" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpdocumentor-reflection-common-21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"; - src = fetchurl { - url = https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6; - sha256 = "1yaf1zg9lnkfnq2ndpviv0hg5bza9vjvv5l4wgcn25lx1p8a94w2"; - }; - }; - }; - "phpdocumentor/reflection-docblock" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpdocumentor-reflection-docblock-94fd0001232e47129dd3504189fa1c7225010d08"; - src = fetchurl { - url = https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08; - sha256 = "03zvxqb5n9ddvysj8mjdwf59h7sagj5x5z15nhs7mqpcky1w388x"; - }; - }; - }; - "phpdocumentor/type-resolver" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpdocumentor-type-resolver-9c977708995954784726e25d0cd1dddf4e65b0f7"; - src = fetchurl { - url = https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7; - sha256 = "0h888r2iy2290yp9i3fij8wd5b7960yi7yn1rwh26x1xxd83n2mb"; - }; - }; - }; - "phpspec/prophecy" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpspec-prophecy-4ba436b55987b4bf311cb7c6ba82aa528aac0a06"; - src = fetchurl { - url = https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06; - sha256 = "0sz9fg8r4yvpgrhsh6qaic3p89pafdj8bdf4izbcccq6mdhclxn6"; - }; - }; - }; - "phpunit/php-code-coverage" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-php-code-coverage-eabf68b476ac7d0f73793aada060f1c1a9bf8979"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979; - sha256 = "0xfkf2kaqrid0ajr8qfh3qnpiqqddl0cmmdy6hd7l9y7ziy6qz8d"; - }; - }; - }; - "phpunit/php-file-iterator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-php-file-iterator-730b01bc3e867237eaac355e06a36b85dd93a8b4"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4; - sha256 = "0kbg907g9hrx7pv8v0wnf4ifqywdgvigq6y6z00lyhgd0b8is060"; - }; - }; - }; - "phpunit/php-text-template" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-php-text-template-31f8b717e51d9a2afca6c9f046f5d69fc27c8686"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686; - sha256 = "1y03m38qqvsbvyakd72v4dram81dw3swyn5jpss153i5nmqr4p76"; - }; - }; - }; - "phpunit/php-timer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-php-timer-3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f; - sha256 = "1j04r0hqzrv6m1jk5nb92k2nnana72nscqpfk3rgv3fzrrv69ljr"; - }; - }; - }; - "phpunit/php-token-stream" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-php-token-stream-1ce90ba27c42e4e44e6d8458241466380b51fa16"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16; - sha256 = "0j1v83m268cddhyzi8qvqfzhpz12hrm3dyw6skyqvljdp7l9x6lk"; - }; - }; - }; - "phpunit/phpunit" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-phpunit-46023de9a91eec7dfb06cc56cb4e260017298517"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517; - sha256 = "0mxhgcmc575hw3n7czindgqiha8jhdi4p19h883vf15fg6xf5iv6"; - }; - }; - }; - "phpunit/phpunit-mock-objects" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpunit-phpunit-mock-objects-ac8e7a3db35738d56ee9a76e78a4e03d97628983"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983; - sha256 = "0s7nyyafdqw2hp7wsd2mxnjxpk26630vv3wii6hcdb0q8xy8r78i"; - }; - }; - }; - "sebastian/comparator" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-comparator-2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be; - sha256 = "0ymarxgnr8b3iy0w18h5z13iiv0ja17vjryryzfcwlqqhlc6w7iq"; - }; - }; - }; - "sebastian/diff" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-diff-7f066a26a962dbe58ddea9f72a4e82874a3975a4"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4; - sha256 = "1ppx21vjj79z6d584ryq451k7kvdc511awmqjkj9g4vxj1s1h3j6"; - }; - }; - }; - "sebastian/environment" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-environment-be2c607e43ce4c89ecd60e75c6a85c126e754aea"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea; - sha256 = "0gzgnk847kf18krq4ybbi2knzj7i0kdghsdlj6qynzzrlf7idij0"; - }; - }; - }; - "sebastian/exporter" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-exporter-42c4c2eec485ee3e159ec9884f95b431287edde4"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4; - sha256 = "1p5mc4lqwxn79v06jjlgqxynblywcxw2mkhbf6r4jlz0bsrqafxn"; - }; - }; - }; - "sebastian/global-state" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-global-state-bc37d50fea7d017d3d340f230811c9f1d7280af4"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4; - sha256 = "0y1x16mf9q38s7rlc7k2s6sxn2ccxmyk1q5zgh24hr4yp035f0pb"; - }; - }; - }; - "sebastian/recursion-context" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-recursion-context-b19cc3298482a335a95f3016d2f8a6950f0fbcd7"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7; - sha256 = "1i9xdv55nkg1yy5q4lmpq1jsjif69hjrwmr1zha6b5qjf6ivlvjm"; - }; - }; - }; - "sebastian/version" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sebastian-version-58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"; - src = fetchurl { - url = https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6; - sha256 = "1s71b6ss29pcsm0120myriwnzla1kpj13f3f739c7k1wfm69h4wz"; - }; - }; - }; - "sensio/generator-bundle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65"; - src = fetchurl { - url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65; - sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3"; - }; - }; - }; - "symfony/phpunit-bridge" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-phpunit-bridge-2155067dfc73e0e77dbc26f236af17e4df552de5"; - src = fetchurl { - url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/2155067dfc73e0e77dbc26f236af17e4df552de5; - sha256 = "1fhqyhvns69pkv086d1sp918bakqq9pk9d16nzck2s4pfdf097pj"; - }; - }; - }; - "webmozart/assert" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "webmozart-assert-83e253c8e0be5b0257b881e1827274667c5c17a9"; - src = fetchurl { - url = https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9; - sha256 = "04w7rrjy43k93376an7xhnxqn2ibbw5fra7rqky7j1dl1f0hkn6d"; - }; - }; - }; - }; -} diff --git a/modules/private/websites/piedsjaloux/integration.nix b/modules/private/websites/piedsjaloux/integration.nix deleted file mode 100644 index 3502964..0000000 --- a/modules/private/websites/piedsjaloux/integration.nix +++ /dev/null @@ -1,135 +0,0 @@ -{ lib, pkgs, config, ... }: -let - secrets = config.myEnv.websites.piedsjaloux.integration; - webRoot = "/var/lib/ftp/immae/piedsjaloux/web"; - cfg = config.myServices.websites.piedsjaloux.integration; - pcfg = config.services.phpApplication; - texlive = pkgs.texlive.combine { inherit (pkgs.texlive) attachfile preprint scheme-small; }; -in { - options.myServices.websites.piedsjaloux.integration.enable = lib.mkEnableOption "enable PiedsJaloux's website in integration"; - - config = lib.mkIf cfg.enable { - services.phpApplication.apps.piedsjaloux_integration = { - websiteEnv = "integration"; - httpdUser = config.services.httpd.Inte.user; - httpdGroup = config.services.httpd.Inte.group; - inherit webRoot; - varDir = "/var/lib/ftp/immae/piedsjaloux_var"; - varDirPaths = { - "tmp" = "0700"; - }; - app = "/var/lib/ftp/immae/piedsjaloux"; - serviceDeps = [ "mysql.service" ]; - preStartActions = [ - "./bin/console --env=dev cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - }; - phpEnv = { - PATH = lib.makeBinPath [ - pkgs.apg pkgs.unzip - # below ones don't need to be in the PATH but they’re used in - # secrets - pkgs.imagemagick texlive - ]; - SYMFONY_DEBUG_MODE = "\"yes\""; - }; - phpWatchFiles = [ - config.secrets.fullPaths."websites/piedsjaloux/integration" - ]; - phpPackage = pkgs.php72; - }; - - secrets.keys."websites/piedsjaloux/integration" = { - user = config.services.httpd.Inte.user; - group = config.services.httpd.Inte.group; - permissions = "0400"; - text = '' - # This file is auto-generated during the composer install - parameters: - database_host: ${secrets.mysql.host} - database_port: ${secrets.mysql.port} - database_name: ${secrets.mysql.database} - database_user: ${secrets.mysql.user} - database_password: ${secrets.mysql.password} - database_server_version: ${pkgs.mariadb.mysqlVersion} - mailer_transport: smtp - mailer_host: 127.0.0.1 - mailer_user: null - mailer_password: null - secret: ${secrets.secret} - pdflatex: "${texlive}/bin/pdflatex" - leapt_im: - binary_path: ${pkgs.imagemagick}/bin - ''; - }; - - services.websites.env.integration.vhostConfs.piedsjaloux_integration = { - certName = "integration"; - addToCerts = true; - hosts = [ "test.pj.immae.dev" ]; - root = webRoot; - extraConfig = [ - '' - - SetHandler "proxy:unix:${pcfg.phpListenPaths.piedsjaloux_integration}|fcgi://localhost" - - - - Use LDAPConnect - Require ldap-group cn=pj.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu - ErrorDocument 401 "" - - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - DirectoryIndex app_dev.php - - - Options -MultiViews - - - - RewriteEngine On - - RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ - RewriteRule ^(.*) - [E=BASE:%1] - - # Maintenance script - RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f - RewriteCond %{SCRIPT_FILENAME} !maintenance.php - RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L] - ErrorDocument 503 /maintenance.php - - # Sets the HTTP_AUTHORIZATION header removed by Apache - RewriteCond %{HTTP:Authorization} . - RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - RewriteCond %{ENV:REDIRECT_STATUS} ^$ - RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] - - # If the requested filename exists, simply serve it. - # We only want to let Apache serve files and not directories. - RewriteCond %{REQUEST_FILENAME} -f - RewriteRule ^ - [L] - - # Rewrite all other queries to the front controller. - RewriteRule ^ %{ENV:BASE}/app_dev.php [L] - - - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/piedsjaloux/production.nix b/modules/private/websites/piedsjaloux/production.nix deleted file mode 100644 index 422c7f0..0000000 --- a/modules/private/websites/piedsjaloux/production.nix +++ /dev/null @@ -1,106 +0,0 @@ -{ lib, pkgs, config, ... }: -let - secrets = config.myEnv.websites.piedsjaloux.production; - app = pkgs.callPackage ./app { - composerEnv = pkgs.composerEnv.override { php = pkgs.php72; }; - environment = secrets.environment; - varDir = "/var/lib/piedsjaloux_production"; - secretsPath = config.secrets.fullPaths."websites/piedsjaloux/production"; - }; - cfg = config.myServices.websites.piedsjaloux.production; - pcfg = config.services.phpApplication; - texlive = pkgs.texlive.combine { inherit (pkgs.texlive) attachfile preprint scheme-small; }; -in { - options.myServices.websites.piedsjaloux.production.enable = lib.mkEnableOption "enable PiedsJaloux's website in production"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "piedsjaloux.fr"; } ]; - services.phpApplication.apps.piedsjaloux_production = { - websiteEnv = "production"; - httpdUser = config.services.httpd.Prod.user; - httpdGroup = config.services.httpd.Prod.group; - inherit (app) webRoot varDir; - varDirPaths = { - "tmp" = "0700"; - }; - inherit app; - serviceDeps = [ "mysql.service" ]; - preStartActions = [ - "./bin/console --env=${app.environment} cache:clear --no-warmup" - ]; - phpOpenbasedir = [ "/tmp" ]; - phpPool = { - "php_admin_value[upload_max_filesize]" = "20M"; - "php_admin_value[post_max_size]" = "20M"; - #"php_admin_flag[log_errors]" = "on"; - "pm" = "dynamic"; - "pm.max_children" = "20"; - "pm.start_servers" = "2"; - "pm.min_spare_servers" = "1"; - "pm.max_spare_servers" = "3"; - }; - phpEnv = { - PATH = lib.makeBinPath [ - pkgs.apg pkgs.unzip - # below ones don't need to be in the PATH but they’re used in - # secrets - pkgs.imagemagick texlive - ]; - }; - phpWatchFiles = [ - app.secretsPath - ]; - phpPackage = pkgs.php72; - }; - - secrets.keys."websites/piedsjaloux/production" = { - user = config.services.httpd.Prod.user; - group = config.services.httpd.Prod.group; - permissions = "0400"; - text = '' - # This file is auto-generated during the composer install - parameters: - database_host: ${secrets.mysql.host} - database_port: ${secrets.mysql.port} - database_name: ${secrets.mysql.database} - database_user: ${secrets.mysql.user} - database_password: ${secrets.mysql.password} - database_server_version: ${pkgs.mariadb.mysqlVersion} - mailer_transport: smtp - mailer_host: 127.0.0.1 - mailer_user: null - mailer_password: null - secret: ${secrets.secret} - pdflatex: "${texlive}/bin/pdflatex" - leapt_im: - binary_path: ${pkgs.imagemagick}/bin - ''; - }; - - services.websites.env.production.vhostConfs.piedsjaloux_production = { - certName = "piedsjaloux"; - certMainHost = "piedsjaloux.fr"; - hosts = [ "piedsjaloux.fr" "www.piedsjaloux.fr" ]; - root = app.webRoot; - extraConfig = [ - '' - RewriteEngine on - RewriteCond "%{HTTP_HOST}" "!^www.piedsjaloux\.fr$" [NC] - RewriteRule ^(.+)$ https://www.piedsjaloux.fr$1 [R=302,L] - - - SetHandler "proxy:unix:${pcfg.phpListenPaths.piedsjaloux_production}|fcgi://localhost" - - - Use Stats piedsjaloux.fr - - - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/ressourcerie_banon/cloud.nix b/modules/private/websites/ressourcerie_banon/cloud.nix deleted file mode 100644 index 5179218..0000000 --- a/modules/private/websites/ressourcerie_banon/cloud.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.ressourcerie_banon.cloud; - nextcloud = config.myServices.tools.cloud.farm.package; -in { - options.myServices.websites.ressourcerie_banon.cloud.enable = lib.mkEnableOption "enable Ressourcerie Banon’s cloud"; - - config = lib.mkIf cfg.enable { - myServices.tools.cloud.farm.instances = [ "ressourcerie_banon" ]; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.ressourcerie_banon_cloud = { - certName = "ressourcerie_banon"; - addToCerts = true; - hosts = ["cloud.le-garage-autonome.org"]; - root = nextcloud; - extraConfig = [ config.myServices.tools.cloud.farm.vhosts.ressourcerie_banon ]; - }; - }; -} - diff --git a/modules/private/websites/ressourcerie_banon/cryptpad.nix b/modules/private/websites/ressourcerie_banon/cryptpad.nix deleted file mode 100644 index 7aea728..0000000 --- a/modules/private/websites/ressourcerie_banon/cryptpad.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.ressourcerie_banon.cryptpad; - envCfg = config.myEnv.tools.cryptpad.ressourcerie_banon; - port = envCfg.port; - configFile = pkgs.writeText "config.js" '' - // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js - module.exports = { - httpUnsafeOrigin: 'https://${domain}', - httpPort: ${toString port}, - adminEmail: '${envCfg.email}', - filePath: './datastore/', - archivePath: './data/archive', - pinPath: './data/pins', - taskPath: './data/tasks', - blockPath: './block', - blobPath: './blob', - blobStagingPath: './data/blobstage', - decreePath: './data/decrees', - logPath: './data/logs', - logToStdout: false, - logLevel: 'info', - logFeedback: false, - verbose: false, - inactiveTime: false, - adminKeys: ${builtins.toJSON envCfg.admins}, - }; - ''; - domain = "pad.le-garage-autonome.org"; -in { - options.myServices.websites.ressourcerie_banon.cryptpad.enable = lib.mkEnableOption "Enable Ressourcerie Banon’s cryptpad"; - - config = lib.mkIf cfg.enable { - myServices.tools.cryptpad.farm.hosts.ressourcerie_banon = { - inherit domain port; - config = configFile; - }; - services.websites.env.production.modules = [ "proxy_wstunnel" ]; - services.websites.env.production.vhostConfs.ressourcerie_banon_cryptpad = { - certName = "ressourcerie_banon"; - addToCerts = true; - hosts = [domain]; - root = config.myServices.tools.cryptpad.farm.vhostRoots.ressourcerie_banon; - extraConfig = [ - config.myServices.tools.cryptpad.farm.vhosts.ressourcerie_banon - ]; - }; - }; -} diff --git a/modules/private/websites/ressourcerie_banon/production.nix b/modules/private/websites/ressourcerie_banon/production.nix deleted file mode 100644 index fa00d92..0000000 --- a/modules/private/websites/ressourcerie_banon/production.nix +++ /dev/null @@ -1,70 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.ressourcerie_banon.production; - varDir = "/var/lib/ftp/ressourcerie_banon"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.ressourcerie_banon.production.enable = lib.mkEnableOption "enable Ressourcerie Banon's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "ressourcerie-banon.org"; } ]; - - system.activationScripts.ressourcerie_banon = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/ressourcerie_banon - ''; - }; - systemd.services.phpfpm-ressourcerie_banon.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-ressourcerie_banon.wants = [ "mysql.service" ]; - services.phpfpm.pools.ressourcerie_banon = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/ressourcerie_banon:${varDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/ressourcerie_banon"; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - disable_functions = "mail" - ''; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.ressourcerie_banon = { - certName = "ressourcerie_banon"; - certMainHost = "ressourcerie-banon.org"; - hosts = ["ressourcerie-banon.org" "www.ressourcerie-banon.org" "ressourcerie-sault.org" "www.ressourcerie-sault.org" "le-garage-autonome.org" - "www.le-garage-autonome.org"]; - root = varDir; - extraConfig = [ - '' - Use Stats ressourcerie-banon.org - - RewriteEngine on - RewriteCond "%{HTTP_HOST}" "!^ressourcerie-banon\.org$" [NC] - RewriteRule ^(.+)$ https://ressourcerie-banon.org$1 [R=302,L] - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.ressourcerie_banon.socket}|fcgi://localhost" - - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride all - Require all granted - - '' - ]; - }; - }; -} - diff --git a/modules/private/websites/richie/production.nix b/modules/private/websites/richie/production.nix deleted file mode 100644 index a548cff..0000000 --- a/modules/private/websites/richie/production.nix +++ /dev/null @@ -1,106 +0,0 @@ -{ lib, config, pkgs, ... }: -let - cfg = config.myServices.websites.richie.production; - vardir = "/var/lib/richie_production"; - richieSrc = pkgs.stdenv.mkDerivation rec { - version = pkgs.sources.websites-richie-app.version; - pname = "richie"; - name = "${pname}-${version}"; - src = pkgs.sources.websites-richie-app; - phases = "installPhase"; - installPhase = '' - cp -a $src $out - chmod -R u+w $out - ln -sf ${vardir}/files $out/ - ln -sf ${vardir}/drapeaux $out/images/ - ln -sf ${vardir}/photos $out/ - sed -i "s@localedef --list-archive@localedef --list-archive /run/current-system/sw/lib/locale/locale-archive@" $out/admin/parametres.php - ''; - }; - secretPath = config.secrets.fullPaths."websites/richie/production"; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in -{ - options.myServices.websites.richie.production.enable = lib.mkEnableOption "enable Richie's website"; - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "europe-richie.org"; } ]; - - secrets.keys."websites/richie/production" = { - user = apacheUser; - group = apacheGroup; - permissions = "0400"; - text = with config.myEnv.websites.richie; '' - Auth('${smtp_mailer.user}', '${smtp_mailer.password}'); - ?> - ''; - }; - system.activationScripts.richie_production = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/richie_production - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${vardir} - ''; - }; - services.phpfpm.pools.richie_production = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "${vardir}:/var/lib/php/sessions/richie_production:${secretPath}:${richieSrc}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/richie_production"; - }; - phpEnv = { - PATH = "/run/current-system/sw/bin:${lib.makeBinPath [ pkgs.imagemagick ]}"; - BDD_CONNECT = secretPath; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - date.timezone = 'Europe/Paris' - ''; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.richie_production = { - certName = "richie"; - addToCerts = true; - certMainHost = "europe-richie.org"; - hosts = [ "europe-richie.org" "www.europe-richie.org" ]; - root = richieSrc; - extraConfig = [ - '' - Use Stats europe-richie.org - ErrorDocument 404 /404.html - - Require all denied - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.richie_production.socket}|fcgi://localhost" - - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/syden/peertube.nix b/modules/private/websites/syden/peertube.nix deleted file mode 100644 index 64d4a5d..0000000 --- a/modules/private/websites/syden/peertube.nix +++ /dev/null @@ -1,132 +0,0 @@ -{ lib, pkgs, config, ... }: -let - scfg = config.myServices.websites.syden.peertube; - name = "peertube"; - dataDir = "/var/lib/syden_peertube"; - package = (pkgs.mylibs.flakeCompat ../../../../flakes/private/peertube).packages.x86_64-linux.peertube_syden; - env = config.myEnv.tools.syden_peertube; -in -{ - options.myServices.websites.syden.peertube.enable = lib.mkEnableOption "enable Syden's website"; - - config = lib.mkIf scfg.enable { - users.users.peertube = { - uid = config.ids.uids.peertube; - group = "peertube"; - description = "Peertube user"; - useDefaultShell = true; - extraGroups = [ "keys" ]; - }; - users.groups.peertube.gid = config.ids.gids.peertube; - - secrets.keys."websites/syden/peertube" = { - user = "peertube"; - group = "peertube"; - permissions = "0640"; - text = '' - listen: - hostname: 'localhost' - port: ${toString env.listenPort} - webserver: - https: true - hostname: 'record-links.immae.eu' - port: 443 - database: - hostname: '${env.postgresql.socket}' - port: 5432 - suffix: '_syden' - username: '${env.postgresql.user}' - password: '${env.postgresql.password}' - pool: - max: 5 - redis: - socket: '${env.redis.socket}' - auth: null - db: ${env.redis.db} - smtp: - transport: sendmail - sendmail: '/run/wrappers/bin/sendmail' - from_address: 'peertube@tools.immae.eu' - storage: - tmp: '${dataDir}/storage/tmp/' - avatars: '${dataDir}/storage/avatars/' - videos: '${dataDir}/storage/videos/' - streaming_playlists: '${dataDir}/storage/streaming-playlists/' - redundancy: '${dataDir}/storage/videos/' - logs: '${dataDir}/storage/logs/' - previews: '${dataDir}/storage/previews/' - thumbnails: '${dataDir}/storage/thumbnails/' - torrents: '${dataDir}/storage/torrents/' - captions: '${dataDir}/storage/captions/' - cache: '${dataDir}/storage/cache/' - plugins: '${dataDir}/storage/plugins/' - client_overrides: '${dataDir}/storage/client-overrides/' - ''; - }; - - services.filesWatcher.syden_peertube = { - restart = true; - paths = [ config.secrets.fullPaths."websites/syden/peertube" ]; - }; - - systemd.services.syden_peertube = { - description = "Peertube"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" "postgresql.service" ]; - wants = [ "postgresql.service" ]; - - environment.NODE_CONFIG_DIR = "${dataDir}/config"; - environment.NODE_ENV = "production"; - environment.HOME = package; - - path = [ pkgs.nodejs pkgs.bashInteractive pkgs.ffmpeg pkgs.openssl ]; - - script = '' - install -m 0750 -d ${dataDir}/config - ln -sf ${config.secrets.fullPaths."websites/syden/peertube"} ${dataDir}/config/production.yaml - ln -sf ${package}/config/default.yaml ${dataDir}/config/default.yaml - exec npm run start - ''; - - serviceConfig = { - User = "peertube"; - Group = "peertube"; - WorkingDirectory = package; - StateDirectory = "syden_peertube"; - StateDirectoryMode = 0750; - PrivateTmp = true; - ProtectHome = true; - ProtectControlGroups = true; - Restart = "always"; - Type = "simple"; - TimeoutSec = 60; - }; - - unitConfig.RequiresMountsFor = dataDir; - }; - - services.websites.env.production.vhostConfs.syden_peertube = { - certName = "syden"; - addToCerts = true; - certMainHost = "record-links.immae.eu"; - hosts = [ "record-links.immae.eu" ]; - root = null; - extraConfig = [ '' - RewriteEngine On - - RewriteCond %{REQUEST_URI} ^/socket.io [NC] - RewriteCond %{QUERY_STRING} transport=websocket [NC] - RewriteRule /(.*) ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L] - - RewriteCond %{REQUEST_URI} ^/tracker/socket [NC] - RewriteRule /(.*) ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L] - - ProxyPass / http://localhost:${toString env.listenPort}/ - ProxyPassReverse / http://localhost:${toString env.listenPort}/ - - ProxyPreserveHost On - RequestHeader set X-Real-IP %{REMOTE_ADDR}s - '' ]; - }; - }; -} diff --git a/modules/private/websites/telio_tortay/production.nix b/modules/private/websites/telio_tortay/production.nix deleted file mode 100644 index 16eca74..0000000 --- a/modules/private/websites/telio_tortay/production.nix +++ /dev/null @@ -1,81 +0,0 @@ -{ lib, pkgs, config, ... }: -let - adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; }; - cfg = config.myServices.websites.telio_tortay.production; - varDir = "/var/lib/ftp/telio_tortay"; - env = config.myEnv.websites.telio_tortay; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; -in { - options.myServices.websites.telio_tortay.production.enable = lib.mkEnableOption "enable Telio Tortay's website"; - - config = lib.mkIf cfg.enable { - services.webstats.sites = [ { name = "telio-tortay.immae.eu"; } ]; - - security.acme.certs."ftp".extraDomains."telio-tortay.immae.eu" = null; - - system.activationScripts.telio_tortay = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/ftp/telio_tortay/logs - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/telio_tortay - ''; - }; - systemd.services.phpfpm-telio_tortay.after = lib.mkAfter [ "mysql.service" ]; - systemd.services.phpfpm-telio_tortay.wants = [ "mysql.service" ]; - services.phpfpm.pools.telio_tortay = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[open_basedir]" = "/var/lib/php/sessions/telio_tortay:${varDir}:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/telio_tortay"; - }; - phpOptions = config.services.phpfpm.phpOptions + '' - disable_functions = "mail" - ''; - phpPackage = pkgs.php72; - }; - services.websites.env.production.modules = adminer.apache.modules ++ [ "proxy_fcgi" ]; - services.websites.env.production.vhostConfs.telio_tortay = { - certName = "telio_tortay"; - certMainHost = "telio-tortay.immae.eu"; - hosts = ["telio-tortay.immae.eu" "realistesmedia.fr" "www.realistesmedia.fr" ]; - root = varDir; - extraConfig = [ - (adminer.apache.vhostConf null) - '' - Use Stats telio-tortay.immae.eu - ServerAdmin ${env.server_admin} - ErrorLog "${varDir}/logs/error_log" - CustomLog "${varDir}/logs/access_log" combined - - - SetHandler "proxy:unix:${config.services.phpfpm.pools.telio_tortay.socket}|fcgi://localhost" - - - - AllowOverride None - Require all denied - - - AllowOverride None - Require all denied - - - DirectoryIndex index.php index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride all - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/tools/assets/default.nix b/modules/private/websites/tools/assets/default.nix deleted file mode 100644 index 0eb476d..0000000 --- a/modules/private/websites/tools/assets/default.nix +++ /dev/null @@ -1,39 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.websites.tools.assets; - assets_urls = lib.mapAttrs (k: v: pkgs.fetchurl v) config.myEnv.tools.assets; - assets = pkgs.runCommand "assets" {} ('' - mkdir -p $out - cp -a ${./static}/* $out/ - '' + builtins.concatStringsSep "\n" - (lib.mapAttrsToList (k: v: '' - install -D -m644 -T ${v} $out/${k} - '') assets_urls)); -in -{ - options.myServices.websites.tools.assets = { - enable = lib.mkEnableOption "Enable assets website"; - }; - config = lib.mkIf cfg.enable { - services.websites.env.tools.vhostConfs.assets = { - certName = "eldiron"; - addToCerts = true; - hosts = [ "assets.immae.eu" ]; - root = assets; - extraConfig = [ - '' - Use Apaxy "${assets}" "title" - - Options Indexes FollowSymlinks - AllowOverride None - Require all granted - Header always set Last-Modified "Tue, 01 Jan 2020 00:00:00 GMT" - Header always set Cache-Control "public, max-age=31536000, immutable" - Header always set Access-Control-Allow-Origin "*" - Header always set Access-Control-Expose-Headers "*" - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/tools/cloud/default.nix b/modules/private/websites/tools/cloud/default.nix deleted file mode 100644 index 44163de..0000000 --- a/modules/private/websites/tools/cloud/default.nix +++ /dev/null @@ -1,184 +0,0 @@ -{ lib, pkgs, config, ... }: -let - nextcloud = pkgs.webapps.nextcloud.withApps (a: [ - a.apporder a.audioplayer a.bookmarks a.calendar a.carnet a.contacts - a.cookbook a.deck a.extract a.files_markdown a.files_readmemd - a.flowupload a.gpxedit a.gpxpod a.keeweb a.maps a.metadata a.music - a.notes a.ocsms a.passman a.polls a.spreed a.tasks - ]); - env = config.myEnv.tools.nextcloud; - varDir = "/var/lib/nextcloud"; - cfg = config.myServices.websites.tools.cloud; - phpFpm = rec { - basedir = builtins.concatStringsSep ":" ([ nextcloud varDir ] ++ nextcloud.apps); - pool = { - "listen.owner" = "wwwrun"; - "listen.group" = "wwwrun"; - "pm" = "ondemand"; - "pm.max_children" = "60"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[output_buffering]" = "0"; - "php_admin_value[max_execution_time]" = "1800"; - "php_admin_value[zend_extension]" = "opcache"; - #already enabled by default? - #"php_value[opcache.enable]" = "1"; - "php_value[opcache.enable_cli]" = "1"; - "php_value[opcache.interned_strings_buffer]" = "8"; - "php_value[opcache.max_accelerated_files]" = "10000"; - "php_value[opcache.memory_consumption]" = "128"; - "php_value[opcache.save_comments]" = "1"; - "php_value[opcache.revalidate_freq]" = "1"; - "php_admin_value[memory_limit]" = "512M"; - - "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; - }; - }; -in { - options.myServices.websites.tools.cloud = { - enable = lib.mkEnableOption "enable cloud website"; - }; - - config = lib.mkIf cfg.enable { - services.websites.env.tools.modules = [ "proxy_fcgi" ]; - - services.websites.env.tools.vhostConfs.cloud = { - certName = "eldiron"; - addToCerts = true; - hosts = ["cloud.immae.eu" ]; - root = nextcloud; - extraConfig = [ - '' - SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 - - AcceptPathInfo On - DirectoryIndex index.php - Options FollowSymlinks - Require all granted - AllowOverride all - - - Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload" - - - CGIPassAuth on - SetHandler "proxy:unix:${config.services.phpfpm.pools.nextcloud.socket}|fcgi://localhost" - - - - '' - ]; - }; - - secrets.keys."webapps/tools-nextcloud" = { - user = "wwwrun"; - group = "wwwrun"; - permissions = "0600"; - # This file is not actually included, see activationScript below - text = '' - '${env.instance_id}', - 'datadirectory' => '/var/lib/nextcloud/', - 'passwordsalt' => '${env.password_salt}', - 'debug' => false, - 'dbtype' => 'pgsql', - 'version' => implode($OC_Version, '.'), - 'dbname' => '${env.postgresql.database}', - 'dbhost' => '${env.postgresql.socket}', - 'dbtableprefix' => 'oc_', - 'dbuser' => '${env.postgresql.user}', - 'dbpassword' => '${env.postgresql.password}', - 'installed' => true, - 'maxZipInputSize' => 0, - 'allowZipDownload' => true, - 'forcessl' => true, - 'theme' => ${"''"}, - 'maintenance' => false, - 'trusted_domains' => - array ( - 0 => 'cloud.immae.eu', - ), - 'secret' => '${env.secret}', - 'appstoreenabled' => false, - 'appstore.experimental.enabled' => true, - 'loglevel' => 2, - 'trashbin_retention_obligation' => 'auto', - 'htaccess.RewriteBase' => '/', - 'mail_smtpmode' => 'sendmail', - 'mail_smtphost' => '127.0.0.1', - 'mail_smtpname' => ''', - 'mail_smtppassword' => ''', - 'mail_from_address' => 'nextcloud', - 'mail_smtpauth' => false, - 'mail_domain' => 'tools.immae.eu', - 'memcache.local' => '\\OC\\Memcache\\APCu', - 'memcache.locking' => '\\OC\\Memcache\\Redis', - 'filelocking.enabled' => true, - 'redis' => - array ( - 'host' => '${env.redis.socket}', - 'port' => 0, - 'dbindex' => ${env.redis.db}, - ), - 'overwrite.cli.url' => 'https://cloud.immae.eu', - 'ldapIgnoreNamingRules' => false, - 'ldapProviderFactory' => '\\OCA\\User_LDAP\\LDAPProviderFactory', - 'has_rebuilt_cache' => true, - ); - ''; - }; - users.users.root.packages = let - occ = pkgs.writeScriptBin "nextcloud-occ" '' - #! ${pkgs.stdenv.shell} - cd ${nextcloud} - NEXTCLOUD_CONFIG_DIR="${nextcloud}/config" \ - exec \ - sudo -E -u wwwrun ${pkgs.php74}/bin/php \ - -c ${pkgs.php74}/etc/php.ini \ - occ $* - ''; - in [ occ ]; - - system.activationScripts.nextcloud = { - deps = [ "secrets" ]; - text = let - confs = lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) nextcloud.otherConfig; - in - '' - install -m 0755 -o wwwrun -g wwwrun -d ${varDir} - install -m 0750 -o wwwrun -g wwwrun -d ${varDir}/phpSessions - ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v: - "install -D -m 0644 -o wwwrun -g wwwrun -T ${v} ${varDir}/config/${n}.json" - ) confs)} - #install -D -m 0600 -o wwwrun -g wwwrun -T ${config.secrets.fullPaths."webapps/tools-nextcloud"} ${varDir}/config/config.php - ''; - }; - - services.phpfpm.pools.nextcloud = { - user = "wwwrun"; - group = "wwwrun"; - settings = phpFpm.pool; - phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache ]); - }; - - services.cron = { - enable = true; - systemCronJobs = let - script = pkgs.writeScriptBin "nextcloud-cron" '' - #! ${pkgs.stdenv.shell} - export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive - export PATH=/run/wrappers/bin:$PATH - ${pkgs.php74}/bin/php -d memory_limit=2048M -f ${nextcloud}/cron.php - ''; - in [ - '' - */15 * * * * wwwrun ${script}/bin/nextcloud-cron - '' - ]; - }; - }; -} diff --git a/modules/private/websites/tools/cloud/farm.nix b/modules/private/websites/tools/cloud/farm.nix deleted file mode 100644 index 7be774c..0000000 --- a/modules/private/websites/tools/cloud/farm.nix +++ /dev/null @@ -1,123 +0,0 @@ -{ lib, pkgs, config, ... }: -let - cfg = config.myServices.tools.cloud.farm; - apacheUser = config.services.httpd.Prod.user; - apacheGroup = config.services.httpd.Prod.group; - nextcloud = (pkgs.webapps.nextcloud.override { varDir = null; }).withApps (a: [ - a.apporder a.audioplayer a.bookmarks a.calendar a.carnet a.contacts - a.cookbook a.deck a.extract a.files_markdown a.files_readmemd - a.flowupload a.gpxedit a.gpxpod a.impersonate a.keeweb a.maps - a.metadata a.music a.notes a.ocsms a.passman a.polls a.spreed - a.tasks - ]); - toVardir = name: "/var/lib/nextcloud_farm/${name}"; - varDirs = map toVardir cfg.instances; - phpBaseDir = builtins.concatStringsSep ":" ([ nextcloud ] ++ varDirs ++ nextcloud.apps); - toVhost = name: '' - SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 - SetEnv NEXTCLOUD_CONFIG_DIR "${toVardir name}" - - AcceptPathInfo On - DirectoryIndex index.php - Options FollowSymlinks - Require all granted - AllowOverride all - - - Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload" - - - CGIPassAuth on - SetHandler "proxy:unix:${config.services.phpfpm.pools.nextcloud_farm.socket}|fcgi://localhost" - - - - ''; -in -{ - options.myServices.tools.cloud.farm = { - instances = lib.mkOption { - description = "Instances names for the nextcloud Farm"; - default = []; - type = lib.types.listOf lib.types.str; - }; - vhosts = lib.mkOption { - description = "Instance vhosts configs"; - readOnly = true; - type = lib.types.attrsOf lib.types.str; - default = lib.genAttrs cfg.instances toVhost; - }; - package = lib.mkOption { - description = "Nextcloud derivation"; - readOnly = true; - type = lib.types.package; - default = nextcloud; - }; - }; - - config = lib.mkIf (builtins.length cfg.instances > 0) { - system.activationScripts.cloud_farm_vardirs = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${builtins.concatStringsSep " " varDirs} - install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/nextcloud_farm/phpSessions - ''; - }; - systemd.services.phpfpm-nextcloud_farm.after = lib.mkAfter [ "postgresql.service" ]; - systemd.services.phpfpm-nextcloud_farm.wants = [ "postgresql.service" ]; - services.phpfpm.pools.nextcloud_farm = { - user = apacheUser; - group = apacheGroup; - settings = { - "listen.owner" = apacheUser; - "listen.group" = apacheGroup; - "pm" = "ondemand"; - "pm.max_children" = "60"; - "pm.process_idle_timeout" = "60"; - - "php_admin_value[output_buffering]" = "0"; - "php_admin_value[max_execution_time]" = "1800"; - "php_admin_value[zend_extension]" = "opcache"; - #already enabled by default? - #"php_value[opcache.enable]" = "1"; - "php_value[opcache.enable_cli]" = "1"; - "php_value[opcache.interned_strings_buffer]" = "8"; - "php_value[opcache.max_accelerated_files]" = "10000"; - "php_value[opcache.memory_consumption]" = "128"; - "php_value[opcache.save_comments]" = "1"; - "php_value[opcache.revalidate_freq]" = "1"; - "php_admin_value[memory_limit]" = "512M"; - - "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${phpBaseDir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp"; - "php_admin_value[session.save_path]" = "/var/lib/nextcloud_farm/phpSessions"; - }; - phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache ]); - }; - users.users.root.packages = let - toOcc = name: pkgs.writeScriptBin "nextcloud-occ-${name}" '' - #! ${pkgs.stdenv.shell} - cd ${nextcloud} - NEXTCLOUD_CONFIG_DIR="${toVardir name}" \ - exec \ - sudo -E -u wwwrun ${pkgs.php74}/bin/php \ - -c ${pkgs.php74}/etc/php.ini \ - occ $* - ''; - in map toOcc cfg.instances; - services.cron = { - enable = true; - systemCronJobs = let - toScript = name: pkgs.writeScriptBin "nextcloud-cron" '' - #! ${pkgs.stdenv.shell} - export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive - export PATH=/run/wrappers/bin:$PATH - export NEXTCLOUD_CONFIG_DIR="${toVardir name}" - ${pkgs.php74}/bin/php -d memory_limit=512M -f ${nextcloud}/cron.php - ''; - toLine = name: '' - */15 * * * * wwwrun ${toScript name}/bin/nextcloud-cron - ''; - in map toLine cfg.instances; - }; - }; -} diff --git a/modules/private/websites/tools/cryptpad/default.nix b/modules/private/websites/tools/cryptpad/default.nix deleted file mode 100644 index 69b9877..0000000 --- a/modules/private/websites/tools/cryptpad/default.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ config, pkgs, lib, ... }: -let - cfg = config.myServices.websites.tools.cryptpad; - envCfg = config.myEnv.tools.cryptpad.immaeEu; - domain = "cryptpad.immae.eu"; - port = envCfg.port; - configFile = pkgs.writeText "config.js" '' - // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js - module.exports = { - httpUnsafeOrigin: 'https://${domain}', - httpPort: ${toString port}, - adminEmail: '${envCfg.email}', - filePath: './datastore/', - archivePath: './data/archive', - pinPath: './data/pins', - taskPath: './data/tasks', - blockPath: './block', - blobPath: './blob', - blobStagingPath: './data/blobstage', - decreePath: './data/decrees', - logPath: './data/logs', - logToStdout: false, - logLevel: 'info', - logFeedback: false, - verbose: false, - inactiveTime: false, - maxUploadSize: 100 * 1024 * 1024, - adminKeys: ${builtins.toJSON envCfg.admins}, - }; - ''; -in -{ - options.myServices.websites.tools.cryptpad.enable = lib.mkEnableOption "Enable Cryptpad"; - config = lib.mkIf cfg.enable { - myServices.tools.cryptpad.farm.hosts.immaeEu = { - inherit domain port; - config = configFile; - }; - services.websites.env.tools.modules = [ "proxy_wstunnel" ]; - services.websites.env.tools.vhostConfs.cryptpad = { - certName = "eldiron"; - addToCerts = true; - hosts = [domain]; - root = config.myServices.tools.cryptpad.farm.vhostRoots.immaeEu; - extraConfig = [ - config.myServices.tools.cryptpad.farm.vhosts.immaeEu - ]; - }; - }; -} diff --git a/modules/private/websites/tools/dav/default.nix b/modules/private/websites/tools/dav/default.nix deleted file mode 100644 index b3aa03d..0000000 --- a/modules/private/websites/tools/dav/default.nix +++ /dev/null @@ -1,55 +0,0 @@ -{ lib, pkgs, config, ... }: -let - infcloud = rec { - root = pkgs.webapps.infcloud; - vhostConf = '' - Alias /carddavmate ${root} - Alias /caldavzap ${root} - Alias /infcloud ${root} - - AllowOverride All - Options FollowSymlinks - Require all granted - DirectoryIndex index.html - - ''; - }; - davical = pkgs.callPackage ./davical.nix { - env = config.myEnv.tools.davical; - inherit (pkgs.webapps) davical awl; - inherit config; - }; - - cfg = config.myServices.websites.tools.dav; -in { - options.myServices.websites.tools.dav = { - enable = lib.mkEnableOption "enable dav website"; - }; - - config = lib.mkIf cfg.enable { - system.activationScripts.davical = davical.activationScript; - secrets.keys = davical.keys; - services.websites.env.tools.modules = davical.apache.modules; - - services.websites.env.tools.vhostConfs.dav = { - certName = "eldiron"; - addToCerts = true; - hosts = ["dav.immae.eu" ]; - root = ./www; - extraConfig = [ - infcloud.vhostConf - (davical.apache.vhostConf config.services.phpfpm.pools.davical.socket) - ]; - }; - - services.phpfpm.pools = { - davical = { - user = config.services.httpd.Tools.user; - group = config.services.httpd.Tools.group; - settings = davical.phpFpm.pool; - phpPackage = pkgs.php72; - }; - }; - }; -} - diff --git a/modules/private/websites/tools/db/default.nix b/modules/private/websites/tools/db/default.nix deleted file mode 100644 index fc8d989..0000000 --- a/modules/private/websites/tools/db/default.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ lib, pkgs, config, ... }: -let - adminer = pkgs.callPackage ../../commons/adminer.nix { inherit config; }; - - cfg = config.myServices.websites.tools.db; -in { - options.myServices.websites.tools.db = { - enable = lib.mkEnableOption "enable database's website"; - }; - - config = lib.mkIf cfg.enable { - services.websites.env.tools.modules = adminer.apache.modules; - services.websites.env.tools.vhostConfs.db-1 = { - certName = "eldiron"; - addToCerts = true; - hosts = ["db-1.immae.eu" ]; - root = null; - extraConfig = [ (adminer.apache.vhostConf null) ]; - }; - }; -} diff --git a/modules/private/websites/tools/git/default.nix b/modules/private/websites/tools/git/default.nix deleted file mode 100644 index 8f611ee..0000000 --- a/modules/private/websites/tools/git/default.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ lib, pkgs, config, ... }: -let - mantisbt = pkgs.callPackage ./mantisbt.nix { - inherit (pkgs.webapps) mantisbt_2 mantisbt_2-plugins; - env = config.myEnv.tools.mantisbt; - inherit config; - }; - gitweb = pkgs.callPackage ./gitweb.nix { - gitoliteDir = config.myServices.gitolite.gitoliteDir; - }; - - cfg = config.myServices.websites.tools.git; -in { - options.myServices.websites.tools.git = { - enable = lib.mkEnableOption "enable git's website"; - }; - - config = lib.mkIf cfg.enable { - secrets.keys = mantisbt.keys; - services.websites.env.tools.modules = - gitweb.apache.modules ++ - mantisbt.apache.modules; - - system.activationScripts.mantisbt = mantisbt.activationScript; - services.websites.env.tools.vhostConfs.git = { - certName = "eldiron"; - addToCerts = true; - hosts = ["git.immae.eu" ]; - root = gitweb.apache.root; - extraConfig = [ - gitweb.apache.vhostConf - (mantisbt.apache.vhostConf config.services.phpfpm.pools.mantisbt.socket) - '' - RewriteEngine on - RewriteCond %{REQUEST_URI} ^/releases - RewriteRule /releases(.*) https://release.immae.eu$1 [P,L] - '' - ]; - }; - services.phpfpm.pools = { - mantisbt = { - user = config.services.httpd.Tools.user; - group = config.services.httpd.Tools.group; - settings = mantisbt.phpFpm.pool; - phpPackage = pkgs.php72; - }; - }; - }; -} diff --git a/modules/private/websites/tools/im/default.nix b/modules/private/websites/tools/im/default.nix deleted file mode 100644 index 94dc4f8..0000000 --- a/modules/private/websites/tools/im/default.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ config, lib, pkgs, ... }: -let - cfg = config.myServices.websites.tools.im; -in -{ - options.myServices.websites.tools.im = { - enable = lib.mkEnableOption "enable im website"; - }; - - config = lib.mkIf cfg.enable { - services.websites.env.tools.vhostConfs.im = { - certName = "eldiron"; - addToCerts = true; - hosts = ["im.immae.fr"]; - root = ./www; - extraConfig = [ - '' - Alias /glowing-bear ${pkgs.glowing-bear} - Alias /converse ${./www}/converse.html - ProxyPreserveHost On - - ProxyPass http://localhost:5280/bosh - ProxyPassReverse http://localhost:5280/bosh - - - ProxyPass ws://localhost:5280/ws - - ProxyPass /upload http://localhost:5280/upload - ProxyPassReverse /upload http://localhost:5280/upload - ProxyPass /admin http://localhost:5280/admin - ProxyPassReverse /admin http://localhost:5280/admin - ProxyPass /api http://localhost:5280/api - ProxyPassReverse /api http://localhost:5280/api - - AllowOverride none - Require all granted - - '' - ]; - }; - }; -} diff --git a/modules/private/websites/tools/mail/default.nix b/modules/private/websites/tools/mail/default.nix deleted file mode 100644 index 390f7ad..0000000 --- a/modules/private/websites/tools/mail/default.nix +++ /dev/null @@ -1,79 +0,0 @@ -{ lib, pkgs, config, ... }: -let - roundcubemail = pkgs.callPackage ./roundcubemail.nix { - inherit (pkgs.webapps) roundcubemail; - env = config.myEnv.tools.roundcubemail; - inherit config; - }; - rainloop = pkgs.callPackage ./rainloop.nix { - rainloop = pkgs.rainloop-community; - }; - cfg = config.myServices.websites.tools.email; - pcfg = config.services.phpfpm.pools; -in -{ - options.myServices.websites.tools.email = { - enable = lib.mkEnableOption "enable email website"; - }; - - imports = [ - ./mta-sts.nix - ]; - - config = lib.mkIf cfg.enable { - secrets.keys = roundcubemail.keys; - - services.websites.env.tools.modules = - [ "proxy_fcgi" ] - ++ rainloop.apache.modules - ++ roundcubemail.apache.modules; - - services.websites.env.tools.vhostConfs.mail = { - certName = "mail"; - addToCerts = true; - hosts = ["mail.immae.eu"]; - root = ./www; - extraConfig = [ - (rainloop.apache.vhostConf pcfg.rainloop.socket) - (roundcubemail.apache.vhostConf pcfg.roundcubemail.socket) - '' - - Require all granted - Options -Indexes - - '' - ]; - }; - systemd.services = { - phpfpm-rainloop = { - after = lib.mkAfter rainloop.phpFpm.serviceDeps; - wants = rainloop.phpFpm.serviceDeps; - }; - phpfpm-roundcubemail = { - after = lib.mkAfter roundcubemail.phpFpm.serviceDeps; - wants = roundcubemail.phpFpm.serviceDeps; - }; - }; - - services.phpfpm.pools.roundcubemail = { - user = "wwwrun"; - group = "wwwrun"; - settings = roundcubemail.phpFpm.pool; - phpOptions = config.services.phpfpm.phpOptions + '' - date.timezone = 'CET' - ''; - phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.imagick ]); - }; - services.phpfpm.pools.rainloop = { - user = "wwwrun"; - group = "wwwrun"; - settings = rainloop.phpFpm.pool; - phpPackage = pkgs.php72; - }; - system.activationScripts = { - roundcubemail = roundcubemail.activationScript; - rainloop = rainloop.activationScript; - }; - }; - -} diff --git a/modules/private/websites/tools/tools/adminer.nix b/modules/private/websites/tools/tools/adminer.nix deleted file mode 100644 index c280684..0000000 --- a/modules/private/websites/tools/tools/adminer.nix +++ /dev/null @@ -1,46 +0,0 @@ -{ webapps, php74, myPhpPackages, lib, forcePhpSocket ? null }: -rec { - activationScript = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/adminer - ''; - }; - webRoot = webapps.adminer; - phpFpm = rec { - user = apache.user; - group = apache.group; - phpPackage = php74.withExtensions ({ enabled, all }: (lib.remove all.mysqli enabled) ++ [myPhpPackages.mysqli_pam]); - settings = { - "listen.owner" = apache.user; - "listen.group" = apache.group; - "pm" = "ondemand"; - "pm.max_children" = "5"; - "pm.process_idle_timeout" = "60"; - #"php_admin_flag[log_errors]" = "on"; - # Needed to avoid clashes in browser cookies (same domain) - "php_value[session.name]" = "AdminerPHPSESSID"; - "php_admin_value[open_basedir]" = "${webRoot}:/tmp:/var/lib/php/sessions/adminer"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/adminer"; - }; - }; - apache = rec { - user = "wwwrun"; - group = "wwwrun"; - modules = [ "proxy_fcgi" ]; - root = webRoot; - vhostConf = socket: '' - Alias /adminer ${webRoot} - - DirectoryIndex index.php - - SetHandler "proxy:unix:${if forcePhpSocket != null then forcePhpSocket else socket}|fcgi://localhost" - - - Use LDAPConnect - Require ldap-group cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu - Require ldap-group cn=users,cn=postgresql,cn=pam,ou=services,dc=immae,dc=eu - - ''; - }; -} diff --git a/modules/private/websites/tools/tools/csp_reports.nix b/modules/private/websites/tools/tools/csp_reports.nix deleted file mode 100644 index 9b3f0cf..0000000 --- a/modules/private/websites/tools/tools/csp_reports.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ env }: -rec { - keys."webapps/tools-csp-reports.conf" = { - user = "wwwrun"; - group = "wwwrun"; - permissions = "0400"; - text = with env.postgresql; '' - env[CSP_REPORT_URI] = "host=${socket} dbname=${database} user=${user} password=${password}" - ''; - }; -} diff --git a/modules/private/websites/tools/tools/dokuwiki.nix b/modules/private/websites/tools/tools/dokuwiki.nix deleted file mode 100644 index aee495a..0000000 --- a/modules/private/websites/tools/tools/dokuwiki.nix +++ /dev/null @@ -1,56 +0,0 @@ -{ lib, stdenv, dokuwiki, dokuwiki-plugins }: -rec { - varDir = "/var/lib/dokuwiki"; - activationScript = { - deps = [ "wrappers" ]; - text = '' - if [ ! -d ${varDir} ]; then - install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \ - ${varDir}/animals - cp -a ${webRoot}/conf.dist ${varDir}/conf - cp -a ${webRoot}/data.dist ${varDir}/data - cp -a ${webRoot}/ - chown -R ${apache.user}:${apache.user} ${varDir}/config ${varDir}/data - chmod -R 755 ${varDir}/config ${varDir}/data - fi - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions - ''; - }; - webRoot = dokuwiki.withPlugins (p: [ p.farmer p.todo ]); - apache = rec { - user = "wwwrun"; - group = "wwwrun"; - modules = [ "proxy_fcgi" ]; - root = webRoot; - vhostConf = socket: '' - Alias /dokuwiki "${root}" - - DirectoryIndex index.php - - SetHandler "proxy:unix:${socket}|fcgi://localhost" - - - AllowOverride All - Options +FollowSymlinks - Require all granted - - ''; - }; - phpFpm = rec { - serviceDeps = [ "openldap.service" ]; - basedir = builtins.concatStringsSep ":" ( - [ webRoot varDir ] ++ webRoot.plugins); - pool = { - "listen.owner" = apache.user; - "listen.group" = apache.group; - "pm" = "ondemand"; - "pm.max_children" = "60"; - "pm.process_idle_timeout" = "60"; - - # Needed to avoid clashes in browser cookies (same domain) - "php_value[session.name]" = "DokuwikiPHPSESSID"; - "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; - }; - }; -} diff --git a/modules/private/websites/tools/tools/landing.nix b/modules/private/websites/tools/tools/landing.nix deleted file mode 100644 index 2acc323..0000000 --- a/modules/private/websites/tools/tools/landing.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ sources, stdenv, yarn2nix-moretea }: -let - yarnModules = yarn2nix-moretea.mkYarnModules rec { - name = "landing"; - pname = name; - version = "v1.0.0"; - packageJSON = "${sources.webapps-landing}/package.json"; - yarnLock = "${sources.webapps-landing}/yarn.lock"; - yarnNix = ./landing/yarn-packages.nix; - }; -in - stdenv.mkDerivation rec { - pname = "landing"; - version = "v1.0.0"; - src = sources.webapps-landing; - - buildInputs = [ yarnModules yarn2nix-moretea.yarn ]; - configurePhase = '' - ln -s ${yarnModules}/node_modules . - ''; - buildPhase = '' - yarn build - ''; - installPhase = '' - cp -a dist $out - cp ${./landing}/*.php $out/ - ln -s service-worker.js $out/worker.js - ''; - } diff --git a/modules/private/websites/tools/tools/landing/report_csp_violation.php b/modules/private/websites/tools/tools/landing/report_csp_violation.php deleted file mode 100644 index 30140b2..0000000 --- a/modules/private/websites/tools/tools/landing/report_csp_violation.php +++ /dev/null @@ -1,22 +0,0 @@ - ${cfg.dataDir}/schedule.yml - fi - ./bin/bundle exec rails db:migrate - ''; - - script = '' - exec ${cfg.workdir}/script/server - ''; - - serviceConfig = { - User = cfg.user; - PrivateTmp = true; - Restart = "always"; - Type = "simple"; - WorkingDirectory = cfg.workdir; - StateDirectory = cfg.systemdStateDirectory; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - StandardInput = "null"; - KillMode = "control-group"; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - }; -} diff --git a/modules/webapps/etherpad-lite.nix b/modules/webapps/etherpad-lite.nix deleted file mode 100644 index 2e09952..0000000 --- a/modules/webapps/etherpad-lite.nix +++ /dev/null @@ -1,162 +0,0 @@ -{ lib, pkgs, config, ... }: -let - name = "etherpad-lite"; - cfg = config.services.etherpad-lite; - - uid = config.ids.uids.etherpad-lite; - gid = config.ids.gids.etherpad-lite; -in -{ - options.services.etherpad-lite = { - enable = lib.mkEnableOption "Enable Etherpad lite’s service"; - user = lib.mkOption { - type = lib.types.str; - default = name; - description = "User account under which Etherpad lite runs"; - }; - group = lib.mkOption { - type = lib.types.str; - default = name; - description = "Group under which Etherpad lite runs"; - }; - dataDir = lib.mkOption { - type = lib.types.path; - default = "/var/lib/${name}"; - description = '' - The directory where Etherpad lite stores its data. - ''; - }; - socketsDir = lib.mkOption { - type = lib.types.path; - default = "/run/${name}"; - description = '' - The directory where Etherpad lite stores its sockets. - ''; - }; - configFile = lib.mkOption { - type = lib.types.path; - description = '' - The config file path for Etherpad lite. - ''; - }; - sessionKeyFile = lib.mkOption { - type = lib.types.path; - description = '' - The Session key file path for Etherpad lite. - ''; - }; - apiKeyFile = lib.mkOption { - type = lib.types.path; - description = '' - The API key file path for Etherpad lite. - ''; - }; - package = lib.mkOption { - type = lib.types.package; - default = pkgs.webapps.etherpad-lite; - description = '' - Etherpad lite package to use. - ''; - example = lib.literalExample '' - pkgs.webapps.etherpad-lite.withModules (p: [ p.ep_align ]); - ''; - }; - modules = lib.mkOption { - type = lib.types.listOf lib.types.package; - default = []; - description = '' - Etherpad lite modules to use. - DEPRECATED: use package directly - ''; - }; - # Output variables - workdir = lib.mkOption { - type = lib.types.package; - default = cfg.package.withModules (_: cfg.modules); - description = '' - Adjusted Etherpad lite package with plugins - ''; - readOnly = true; - }; - systemdStateDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if varDir is outside of /var/lib - default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; - lib.strings.removePrefix "/var/lib/" cfg.dataDir; - description = '' - Adjusted Etherpad lite data directory for systemd - ''; - readOnly = true; - }; - systemdRuntimeDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if socketsDir is outside of /run - default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; - lib.strings.removePrefix "/run/" cfg.socketsDir; - description = '' - Adjusted Etherpad lite sockets directory for systemd - ''; - readOnly = true; - }; - sockets = lib.mkOption { - type = lib.types.attrsOf lib.types.path; - default = { - node = "${cfg.socketsDir}/etherpad-lite.sock"; - }; - readOnly = true; - description = '' - Etherpad lite sockets - ''; - }; - }; - - config = lib.mkIf cfg.enable { - systemd.services.etherpad-lite = { - description = "Etherpad-lite"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" "postgresql.service" ]; - wants = [ "postgresql.service" ]; - - environment.NODE_ENV = "production"; - environment.HOME = cfg.workdir; - - path = [ pkgs.nodejs ]; - - script = '' - exec ${pkgs.nodejs}/bin/node ${cfg.workdir}/src/node/server.js \ - --sessionkey ${cfg.sessionKeyFile} \ - --apikey ${cfg.apiKeyFile} \ - --settings ${cfg.configFile} - ''; - - postStart = '' - while [ ! -S ${cfg.sockets.node} ]; do - sleep 0.5 - done - chmod a+w ${cfg.sockets.node} - ''; - serviceConfig = { - DynamicUser = true; - User = cfg.user; - Group = cfg.group; - WorkingDirectory = cfg.workdir; - PrivateTmp = true; - NoNewPrivileges = true; - PrivateDevices = true; - ProtectHome = true; - ProtectControlGroups = true; - ProtectKernelModules = true; - Restart = "always"; - Type = "simple"; - TimeoutSec = 60; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - StateDirectory= cfg.systemdStateDirectory; - ExecStartPre = [ - "+${pkgs.coreutils}/bin/install -d -m 0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dataDir}/ep_initialized" - "+${pkgs.coreutils}/bin/chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir} ${cfg.configFile} ${cfg.sessionKeyFile} ${cfg.apiKeyFile}" - ]; - }; - }; - - }; -} diff --git a/modules/webapps/mastodon.nix b/modules/webapps/mastodon.nix deleted file mode 100644 index df2dbb2..0000000 --- a/modules/webapps/mastodon.nix +++ /dev/null @@ -1,265 +0,0 @@ -{ lib, pkgs, config, ... }: -let - name = "mastodon"; - cfg = config.services.mastodon; - - uid = config.ids.uids.mastodon; - gid = config.ids.gids.mastodon; -in -{ - options.services.mastodon = { - enable = lib.mkEnableOption "Enable Mastodon’s service"; - user = lib.mkOption { - type = lib.types.str; - default = name; - description = "User account under which Mastodon runs"; - }; - group = lib.mkOption { - type = lib.types.str; - default = name; - description = "Group under which Mastodon runs"; - }; - dataDir = lib.mkOption { - type = lib.types.path; - default = "/var/lib/${name}"; - description = '' - The directory where Mastodon stores its data. - ''; - }; - socketsPrefix = lib.mkOption { - type = lib.types.str; - default = "live"; - description = '' - The prefix to use for Mastodon sockets. - ''; - }; - socketsDir = lib.mkOption { - type = lib.types.path; - default = "/run/${name}"; - description = '' - The directory where Mastodon puts runtime files and sockets. - ''; - }; - configFile = lib.mkOption { - type = lib.types.path; - description = '' - The configuration file path for Mastodon. - ''; - }; - package = lib.mkOption { - type = lib.types.package; - default = pkgs.webapps.mastodon; - description = '' - Mastodon package to use. - ''; - }; - # Output variables - workdir = lib.mkOption { - type = lib.types.package; - default = cfg.package.override { varDir = cfg.dataDir; }; - description = '' - Adjusted mastodon package with overriden varDir - ''; - readOnly = true; - }; - systemdStateDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if varDir is outside of /var/lib - default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; - lib.strings.removePrefix "/var/lib/" cfg.dataDir; - description = '' - Adjusted Mastodon data directory for systemd - ''; - readOnly = true; - }; - systemdRuntimeDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if socketsDir is outside of /run - default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; - lib.strings.removePrefix "/run/" cfg.socketsDir; - description = '' - Adjusted Mastodon sockets directory for systemd - ''; - readOnly = true; - }; - sockets = lib.mkOption { - type = lib.types.attrsOf lib.types.path; - default = { - node = "${cfg.socketsDir}/${cfg.socketsPrefix}_node.sock"; - rails = "${cfg.socketsDir}/${cfg.socketsPrefix}_puma.sock"; - }; - readOnly = true; - description = '' - Mastodon sockets - ''; - }; - }; - - config = lib.mkIf cfg.enable { - users.users = lib.optionalAttrs (cfg.user == name) { - "${name}" = { - inherit uid; - group = cfg.group; - description = "Mastodon user"; - home = cfg.dataDir; - useDefaultShell = true; - }; - }; - users.groups = lib.optionalAttrs (cfg.group == name) { - "${name}" = { - inherit gid; - }; - }; - - systemd.slices.mastodon = { - description = "Mastodon slice"; - }; - - systemd.services.mastodon-streaming = { - description = "Mastodon Streaming"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" "mastodon-web.service" ]; - - environment.NODE_ENV = "production"; - environment.SOCKET = cfg.sockets.node; - - path = [ pkgs.nodejs pkgs.bashInteractive ]; - - script = '' - exec npm run start - ''; - - postStart = '' - while [ ! -S $SOCKET ]; do - sleep 0.5 - done - chmod a+w $SOCKET - ''; - - postStop = '' - rm $SOCKET - ''; - - serviceConfig = { - Slice = "mastodon.slice"; - User = cfg.user; - EnvironmentFile = cfg.configFile; - PrivateTmp = true; - Restart = "always"; - TimeoutSec = 15; - Type = "simple"; - WorkingDirectory = cfg.workdir; - StateDirectory = cfg.systemdStateDirectory; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - RuntimeDirectoryPreserve = "yes"; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - - systemd.services.mastodon-web = { - description = "Mastodon Web app"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - - environment.RAILS_ENV = "production"; - environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; - environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; - environment.SOCKET = cfg.sockets.rails; - - path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file pkgs.imagemagick ]; - - preStart = '' - install -m 0755 -d ${cfg.dataDir}/tmp/cache - ./bin/bundle exec rails db:migrate - ''; - - script = '' - exec ./bin/bundle exec puma -C config/puma.rb - ''; - - postStart = '' - exec ./bin/tootctl cache clear - ''; - serviceConfig = { - Slice = "mastodon.slice"; - User = cfg.user; - EnvironmentFile = cfg.configFile; - PrivateTmp = true; - Restart = "always"; - TimeoutSec = 60; - Type = "simple"; - WorkingDirectory = cfg.workdir; - StateDirectory = cfg.systemdStateDirectory; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - RuntimeDirectoryPreserve = "yes"; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - - systemd.services.mastodon-cleanup = { - description = "Cleanup mastodon"; - startAt = "daily"; - restartIfChanged = false; - - environment.RAILS_ENV = "production"; - environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; - environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; - environment.SOCKET = cfg.sockets.rails; - - path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ]; - - script = '' - exec ./bin/tootctl media remove --days 30 - ''; - - serviceConfig = { - User = cfg.user; - EnvironmentFile = cfg.configFile; - PrivateTmp = true; - Type = "oneshot"; - WorkingDirectory = cfg.workdir; - StateDirectory = cfg.systemdStateDirectory; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - RuntimeDirectoryPreserve = "yes"; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - - systemd.services.mastodon-sidekiq = { - description = "Mastodon Sidekiq"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" "mastodon-web.service" ]; - - environment.RAILS_ENV="production"; - environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; - environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; - environment.DB_POOL="5"; - - path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.imagemagick pkgs.ffmpeg pkgs.file ]; - - script = '' - exec ./bin/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push - ''; - - serviceConfig = { - Slice = "mastodon.slice"; - User = cfg.user; - EnvironmentFile = cfg.configFile; - PrivateTmp = true; - Restart = "always"; - TimeoutSec = 15; - Type = "simple"; - WorkingDirectory = cfg.workdir; - StateDirectory = cfg.systemdStateDirectory; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - RuntimeDirectoryPreserve = "yes"; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - - }; -} diff --git a/modules/webapps/mediagoblin.nix b/modules/webapps/mediagoblin.nix deleted file mode 100644 index 3fe5e38..0000000 --- a/modules/webapps/mediagoblin.nix +++ /dev/null @@ -1,231 +0,0 @@ -{ lib, pkgs, config, ... }: -let - name = "mediagoblin"; - cfg = config.services.mediagoblin; - - uid = config.ids.uids.mediagoblin; - gid = config.ids.gids.mediagoblin; - - paste_local = pkgs.writeText "paste_local.ini" '' - [DEFAULT] - debug = false - - [pipeline:main] - pipeline = mediagoblin - - [app:mediagoblin] - use = egg:mediagoblin#app - config = ${cfg.configFile} ${cfg.package}/mediagoblin.ini - /mgoblin_static = ${cfg.package}/mediagoblin/static - - [loggers] - keys = root - - [handlers] - keys = console - - [formatters] - keys = generic - - [logger_root] - level = INFO - handlers = console - - [handler_console] - class = StreamHandler - args = (sys.stderr,) - level = NOTSET - formatter = generic - - [formatter_generic] - format = %(levelname)-7.7s [%(name)s] %(message)s - - [filter:errors] - use = egg:mediagoblin#errors - debug = false - - [server:main] - use = egg:waitress#main - unix_socket = ${cfg.sockets.paster} - unix_socket_perms = 777 - url_scheme = https - ''; -in -{ - options.services.mediagoblin = { - enable = lib.mkEnableOption "Enable Mediagoblin’s service"; - user = lib.mkOption { - type = lib.types.str; - default = name; - description = "User account under which Mediagoblin runs"; - }; - group = lib.mkOption { - type = lib.types.str; - default = name; - description = "Group under which Mediagoblin runs"; - }; - dataDir = lib.mkOption { - type = lib.types.path; - default = "/var/lib/${name}"; - description = '' - The directory where Mediagoblin stores its data. - ''; - }; - socketsDir = lib.mkOption { - type = lib.types.path; - default = "/run/${name}"; - description = '' - The directory where Mediagoblin puts runtime files and sockets. - ''; - }; - configFile = lib.mkOption { - type = lib.types.path; - description = '' - The configuration file path for Mediagoblin. - ''; - }; - package = lib.mkOption { - type = lib.types.package; - default = pkgs.webapps.mediagoblin; - example = lib.literalExample '' - pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch]) - ''; - description = '' - Mediagoblin package to use. - ''; - }; - systemdStateDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if varDir is outside of /var/lib - default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; - lib.strings.removePrefix "/var/lib/" cfg.dataDir; - description = '' - Adjusted Mediagoblin data directory for systemd - ''; - readOnly = true; - }; - systemdRuntimeDirectory = lib.mkOption { - type = lib.types.str; - # Use ReadWritePaths= instead if socketsDir is outside of /run - default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; - lib.strings.removePrefix "/run/" cfg.socketsDir; - description = '' - Adjusted Mediagoblin sockets directory for systemd - ''; - readOnly = true; - }; - sockets = lib.mkOption { - type = lib.types.attrsOf lib.types.path; - default = { - paster = "${cfg.socketsDir}/mediagoblin.sock"; - }; - readOnly = true; - description = '' - Mediagoblin sockets - ''; - }; - pids = lib.mkOption { - type = lib.types.attrsOf lib.types.path; - default = { - paster = "${cfg.socketsDir}/mediagoblin.pid"; - celery = "${cfg.socketsDir}/mediagoblin-celeryd.pid"; - }; - readOnly = true; - description = '' - Mediagoblin pid files - ''; - }; - }; - - config = lib.mkIf cfg.enable { - users.users = lib.optionalAttrs (cfg.user == name) { - "${name}" = { - inherit uid; - group = cfg.group; - description = "Mediagoblin user"; - home = cfg.dataDir; - useDefaultShell = true; - }; - }; - users.groups = lib.optionalAttrs (cfg.group == name) { - "${name}" = { - inherit gid; - }; - }; - - systemd.slices.mediagoblin = { - description = "Mediagoblin slice"; - }; - systemd.services.mediagoblin-web = { - description = "Mediagoblin service"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - wants = [ "postgresql.service" "redis.service" ]; - - environment.SCRIPT_NAME = "/mediagoblin/"; - - script = '' - exec ./bin/paster serve \ - ${paste_local} \ - --pid-file=${cfg.pids.paster} - ''; - preStop = '' - exec ./bin/paster serve \ - --pid-file=${cfg.pids.paster} \ - ${paste_local} stop - ''; - preStart = '' - if [ -d ${cfg.dataDir}/plugin_static/ ]; then - rm ${cfg.dataDir}/plugin_static/coreplugin_basic_auth - ln -sf ${cfg.package}/mediagoblin/plugins/basic_auth/static ${cfg.dataDir}/plugin_static/coreplugin_basic_auth - fi - ./bin/gmg -cf ${cfg.configFile} dbupdate - ''; - - serviceConfig = { - Slice = "mediagoblin.slice"; - User = cfg.user; - PrivateTmp = true; - Restart = "always"; - TimeoutSec = 15; - Type = "simple"; - WorkingDirectory = cfg.package; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - StateDirectory= cfg.systemdStateDirectory; - PIDFile = cfg.pids.paster; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - - systemd.services.mediagoblin-celeryd = { - description = "Mediagoblin service"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" "mediagoblin-web.service" ]; - - environment.MEDIAGOBLIN_CONFIG = cfg.configFile; - environment.CELERY_CONFIG_MODULE = "mediagoblin.init.celery.from_celery"; - - script = '' - exec ./bin/celery worker \ - --logfile=${cfg.dataDir}/celery.log \ - --loglevel=INFO - ''; - - serviceConfig = { - Slice = "mediagoblin.slice"; - User = cfg.user; - PrivateTmp = true; - Restart = "always"; - TimeoutSec = 60; - Type = "simple"; - WorkingDirectory = cfg.package; - RuntimeDirectory = cfg.systemdRuntimeDirectory; - StateDirectory= cfg.systemdStateDirectory; - PIDFile = cfg.pids.celery; - }; - - unitConfig.RequiresMountsFor = cfg.dataDir; - }; - }; -} diff --git a/modules/websites/default.nix b/modules/websites/default.nix deleted file mode 100644 index 6658c66..0000000 --- a/modules/websites/default.nix +++ /dev/null @@ -1,281 +0,0 @@ -{ lib, config, pkgs, ... }: with lib; -let - cfg = config.services.websites; -in -{ - options.services.websites = with types; { - certs = mkOption { - description = "Default websites configuration for certificates as accepted by acme"; - }; - env = mkOption { - default = {}; - description = "Each type of website to enable will target a distinct httpd server"; - type = attrsOf (submodule { - options = { - enable = mkEnableOption "Enable websites of this type"; - adminAddr = mkOption { - type = str; - description = "Admin e-mail address of the instance"; - }; - httpdName = mkOption { - type = str; - description = "Name of the httpd instance to assign this type to"; - }; - ips = mkOption { - type = listOf str; - default = []; - description = "ips to listen to"; - }; - modules = mkOption { - type = listOf str; - default = []; - description = "Additional modules to load in Apache"; - }; - extraConfig = mkOption { - type = listOf lines; - default = []; - description = "Additional configuration to append to Apache"; - }; - nosslVhost = mkOption { - description = "A default nossl vhost for captive portals"; - default = {}; - type = submodule { - options = { - enable = mkEnableOption "Add default no-ssl vhost for this instance"; - host = mkOption { - type = str; - description = "The hostname to use for this vhost"; - }; - root = mkOption { - type = path; - default = ./nosslVhost; - description = "The root folder to serve"; - }; - indexFile = mkOption { - type = str; - default = "index.html"; - description = "The index file to show."; - }; - }; - }; - }; - fallbackVhost = mkOption { - description = "The fallback vhost that will be defined as first vhost in Apache"; - type = submodule { - options = { - certName = mkOption { type = str; }; - hosts = mkOption { type = listOf str; }; - root = mkOption { type = nullOr path; }; - forceSSL = mkOption { - type = bool; - default = true; - description = '' - Automatically create a corresponding non-ssl vhost - that will only redirect to the ssl version - ''; - }; - extraConfig = mkOption { type = listOf lines; default = []; }; - }; - }; - }; - vhostNoSSLConfs = mkOption { - default = {}; - description = "List of no ssl vhosts to define for Apache"; - type = attrsOf (submodule { - options = { - hosts = mkOption { type = listOf str; }; - root = mkOption { type = nullOr path; }; - extraConfig = mkOption { type = listOf lines; default = []; }; - }; - }); - }; - vhostConfs = mkOption { - default = {}; - description = "List of vhosts to define for Apache"; - type = attrsOf (submodule { - options = { - certName = mkOption { type = str; }; - addToCerts = mkOption { - type = bool; - default = false; - description = "Use these to certificates. Is ignored (considered true) if certMainHost is not null"; - }; - certMainHost = mkOption { - type = nullOr str; - description = "Use that host as 'main host' for acme certs"; - default = null; - }; - hosts = mkOption { type = listOf str; }; - root = mkOption { type = nullOr path; }; - forceSSL = mkOption { - type = bool; - default = true; - description = '' - Automatically create a corresponding non-ssl vhost - that will only redirect to the ssl version - ''; - }; - extraConfig = mkOption { type = listOf lines; default = []; }; - }; - }); - }; - watchPaths = mkOption { - type = listOf str; - default = []; - description = '' - Paths to watch that should trigger a reload of httpd - ''; - }; - }; - }); - }; - }; - - config.services.httpd = let - nosslVhost = ips: cfg: { - listen = map (ip: { inherit ip; port = 80; }) ips; - hostName = cfg.host; - logFormat = "combinedVhost"; - documentRoot = cfg.root; - extraConfig = '' - - DirectoryIndex ${cfg.indexFile} - AllowOverride None - Require all granted - - RewriteEngine on - RewriteRule ^/(.+) / [L] - - ''; - }; - toVhost = ips: vhostConf: { - forceSSL = vhostConf.forceSSL or true; - useACMEHost = vhostConf.certName; - logFormat = "combinedVhost"; - listen = if vhostConf.forceSSL - then lists.flatten (map (ip: [{ inherit ip; port = 443; ssl = true; } { inherit ip; port = 80; }]) ips) - else map (ip: { inherit ip; port = 443; ssl = true; }) ips; - hostName = builtins.head vhostConf.hosts; - serverAliases = builtins.tail vhostConf.hosts or []; - documentRoot = vhostConf.root; - extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig; - }; - toVhostNoSSL = ips: vhostConf: { - logFormat = "combinedVhost"; - listen = map (ip: { inherit ip; port = 80; }) ips; - hostName = builtins.head vhostConf.hosts; - serverAliases = builtins.tail vhostConf.hosts or []; - documentRoot = vhostConf.root; - extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig; - }; - in attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - icfg.httpdName (mkIf icfg.enable { - enable = true; - logPerVirtualHost = true; - multiProcessingModule = "worker"; - # https://ssl-config.mozilla.org/#server=apache&version=2.4.41&config=intermediate&openssl=1.0.2t&guideline=5.4 - # test with https://www.ssllabs.com/ssltest/analyze.html?d=www.immae.eu&s=176.9.151.154&latest - sslProtocols = "all -SSLv3 -TLSv1 -TLSv1.1"; - sslCiphers = builtins.concatStringsSep ":" [ - "ECDHE-ECDSA-AES128-GCM-SHA256" "ECDHE-RSA-AES128-GCM-SHA256" - "ECDHE-ECDSA-AES256-GCM-SHA384" "ECDHE-RSA-AES256-GCM-SHA384" - "ECDHE-ECDSA-CHACHA20-POLY1305" "ECDHE-RSA-CHACHA20-POLY1305" - "DHE-RSA-AES128-GCM-SHA256" "DHE-RSA-AES256-GCM-SHA384" - ]; - inherit (icfg) adminAddr; - logFormat = "combinedVhost"; - extraModules = lists.unique icfg.modules; - extraConfig = builtins.concatStringsSep "\n" icfg.extraConfig; - - virtualHosts = with attrsets; { - ___fallbackVhost = toVhost icfg.ips icfg.fallbackVhost; - } // (optionalAttrs icfg.nosslVhost.enable { - nosslVhost = nosslVhost icfg.ips icfg.nosslVhost; - }) // (mapAttrs' (n: v: nameValuePair ("nossl_" + n) (toVhostNoSSL icfg.ips v)) icfg.vhostNoSSLConfs) - // (mapAttrs' (n: v: nameValuePair ("ssl_" + n) (toVhost icfg.ips v)) icfg.vhostConfs); - }) - ) cfg.env; - - config.services.filesWatcher = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - "httpd${icfg.httpdName}" { - paths = icfg.watchPaths; - waitTime = 5; - } - ) cfg.env; - - config.security.acme.certs = let - typesToManage = attrsets.filterAttrs (k: v: v.enable) cfg.env; - flatVhosts = lists.flatten (attrsets.mapAttrsToList (k: v: - attrValues v.vhostConfs - ) typesToManage); - groupedCerts = attrsets.filterAttrs - (_: group: builtins.any (v: v.addToCerts || !isNull v.certMainHost) group) - (lists.groupBy (v: v.certName) flatVhosts); - groupToDomain = group: - let - nonNull = builtins.filter (v: !isNull v.certMainHost) group; - domains = lists.unique (map (v: v.certMainHost) nonNull); - in - if builtins.length domains == 0 - then null - else assert (builtins.length domains == 1); (elemAt domains 0); - extraDomains = group: - let - mainDomain = groupToDomain group; - in - lists.remove mainDomain ( - lists.unique ( - lists.flatten (map (c: optionals (c.addToCerts || !isNull c.certMainHost) c.hosts) group) - ) - ); - in attrsets.mapAttrs (k: g: - if (!isNull (groupToDomain g)) - then cfg.certs // { - domain = groupToDomain g; - extraDomains = builtins.listToAttrs ( - map (d: attrsets.nameValuePair d null) (extraDomains g)); - } - else { - extraDomains = builtins.listToAttrs ( - map (d: attrsets.nameValuePair d null) (extraDomains g)); - } - ) groupedCerts; - - config.systemd.services = let - package = httpdName: config.services.httpd.${httpdName}.package.out; - cfgFile = httpdName: config.services.httpd.${httpdName}.configFile; - serviceChange = attrsets.mapAttrs' (name: icfg: - attrsets.nameValuePair - "httpd${icfg.httpdName}" { - stopIfChanged = false; - serviceConfig.ExecStart = - lib.mkForce "@${package icfg.httpdName}/bin/httpd httpd -f /etc/httpd/httpd_${icfg.httpdName}.conf"; - serviceConfig.ExecStop = - lib.mkForce "${package icfg.httpdName}/bin/httpd -f /etc/httpd/httpd_${icfg.httpdName}.conf -k graceful-stop"; - serviceConfig.ExecReload = - lib.mkForce "${package icfg.httpdName}/bin/httpd -f /etc/httpd/httpd_${icfg.httpdName}.conf -k graceful"; - } - ) cfg.env; - serviceReload = attrsets.mapAttrs' (name: icfg: - attrsets.nameValuePair - "httpd${icfg.httpdName}-config-reload" { - wants = [ "httpd${icfg.httpdName}.service" ]; - wantedBy = [ "multi-user.target" ]; - restartTriggers = [ (cfgFile icfg.httpdName) ]; - # commented, because can cause extra delays during activate for this config: - # services.nginx.virtualHosts."_".locations."/".proxyPass = "http://blabla:3000"; - # stopIfChanged = false; - serviceConfig.Type = "oneshot"; - serviceConfig.TimeoutSec = 60; - script = '' - if ${pkgs.systemd}/bin/systemctl -q is-active httpd${icfg.httpdName}.service ; then - ${package icfg.httpdName}/bin/httpd -f /etc/httpd/httpd_${icfg.httpdName}.conf -t && \ - ${pkgs.systemd}/bin/systemctl reload httpd${icfg.httpdName}.service - fi - ''; - serviceConfig.RemainAfterExit = true; - } - ) cfg.env; - in - serviceChange // serviceReload; -} diff --git a/modules/websites/httpd-service-builder.nix b/modules/websites/httpd-service-builder.nix deleted file mode 100644 index 1f7488d..0000000 --- a/modules/websites/httpd-service-builder.nix +++ /dev/null @@ -1,735 +0,0 @@ -# to help backporting this builder should stay as close as possible to -# nixos/modules/services/web-servers/apache-httpd/default.nix -{ httpdName, withUsers ? true }: -{ config, lib, pkgs, ... }: - -with lib; - -let - - cfg = config.services.httpd."${httpdName}"; - - runtimeDir = "/run/httpd_${httpdName}"; - - pkg = cfg.package.out; - - httpdConf = cfg.configFile; - - php = cfg.phpPackage.override { apacheHttpd = pkg.dev; /* otherwise it only gets .out */ }; - - phpMajorVersion = lib.versions.major (lib.getVersion php); - - mod_perl = pkgs.apacheHttpdPackages.mod_perl.override { apacheHttpd = pkg; }; - - vhosts = attrValues cfg.virtualHosts; - - mkListenInfo = hostOpts: - if hostOpts.listen != [] then hostOpts.listen - else ( - optional (hostOpts.onlySSL || hostOpts.addSSL || hostOpts.forceSSL) { ip = "*"; port = 443; ssl = true; } ++ - optional (!hostOpts.onlySSL) { ip = "*"; port = 80; ssl = false; } - ); - - listenInfo = unique (concatMap mkListenInfo vhosts); - - enableHttp2 = any (vhost: vhost.http2) vhosts; - enableSSL = any (listen: listen.ssl) listenInfo; - enableUserDir = any (vhost: vhost.enableUserDir) vhosts; - - # NOTE: generally speaking order of modules is very important - modules = - [ # required apache modules our httpd service cannot run without - "authn_core" "authz_core" - "log_config" - "mime" "autoindex" "negotiation" "dir" - "alias" "rewrite" - "unixd" "slotmem_shm" "socache_shmcb" - "mpm_${cfg.multiProcessingModule}" - ] - ++ (if cfg.multiProcessingModule == "prefork" then [ "cgi" ] else [ "cgid" ]) - ++ optional enableHttp2 "http2" - ++ optional enableSSL "ssl" - ++ optional enableUserDir "userdir" - ++ optional cfg.enableMellon { name = "auth_mellon"; path = "${pkgs.apacheHttpdPackages.mod_auth_mellon}/modules/mod_auth_mellon.so"; } - ++ optional cfg.enablePHP { name = "php${phpMajorVersion}"; path = "${php}/modules/libphp${phpMajorVersion}.so"; } - ++ optional cfg.enablePerl { name = "perl"; path = "${mod_perl}/modules/mod_perl.so"; } - ++ cfg.extraModules; - - loggingConf = (if cfg.logFormat != "none" then '' - ErrorLog ${cfg.logDir}/error.log - - LogLevel notice - - LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined - LogFormat "%h %l %u %t \"%r\" %>s %b" common - LogFormat "%{Referer}i -> %U" referer - LogFormat "%{User-agent}i" agent - - CustomLog ${cfg.logDir}/access.log ${cfg.logFormat} - '' else '' - ErrorLog /dev/null - ''); - - - browserHacks = '' - - BrowserMatch "Mozilla/2" nokeepalive - BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 - BrowserMatch "RealPlayer 4\.0" force-response-1.0 - BrowserMatch "Java/1\.0" force-response-1.0 - BrowserMatch "JDK/1\.0" force-response-1.0 - BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully - BrowserMatch "^WebDrive" redirect-carefully - BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully - BrowserMatch "^gnome-vfs" redirect-carefully - - ''; - - - sslConf = '' - - SSLSessionCache shmcb:${runtimeDir}/ssl_scache(512000) - - Mutex posixsem - - SSLRandomSeed startup builtin - SSLRandomSeed connect builtin - - SSLProtocol ${cfg.sslProtocols} - SSLCipherSuite ${cfg.sslCiphers} - SSLHonorCipherOrder on - - ''; - - - mimeConf = '' - TypesConfig ${pkg}/conf/mime.types - - AddType application/x-x509-ca-cert .crt - AddType application/x-pkcs7-crl .crl - AddType application/x-httpd-php .php .phtml - - - MIMEMagicFile ${pkg}/conf/magic - - ''; - - mkVHostConf = hostOpts: - let - adminAddr = if hostOpts.adminAddr != null then hostOpts.adminAddr else cfg.adminAddr; - listen = filter (listen: !listen.ssl) (mkListenInfo hostOpts); - listenSSL = filter (listen: listen.ssl) (mkListenInfo hostOpts); - - useACME = hostOpts.enableACME || hostOpts.useACMEHost != null; - sslCertDir = - if hostOpts.enableACME then config.security.acme.certs.${hostOpts.hostName}.directory - else if hostOpts.useACMEHost != null then config.security.acme.certs.${hostOpts.useACMEHost}.directory - else abort "This case should never happen."; - - sslServerCert = if useACME then "${sslCertDir}/full.pem" else hostOpts.sslServerCert; - sslServerKey = if useACME then "${sslCertDir}/key.pem" else hostOpts.sslServerKey; - sslServerChain = if useACME then "${sslCertDir}/fullchain.pem" else hostOpts.sslServerChain; - - acmeChallenge = optionalString useACME '' - Alias /.well-known/acme-challenge/ "${hostOpts.acmeRoot}/.well-known/acme-challenge/" - - AllowOverride None - Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec - Require method GET POST OPTIONS - Require all granted - - ''; - in - optionalString (listen != []) '' - - ServerName ${hostOpts.hostName} - ${concatMapStrings (alias: "ServerAlias ${alias}\n") hostOpts.serverAliases} - ServerAdmin ${adminAddr} - - SSLEngine off - - ${acmeChallenge} - ${if hostOpts.forceSSL then '' - - RewriteEngine on - RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge [NC] - RewriteCond %{HTTPS} off - RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} - - '' else mkVHostCommonConf hostOpts} - - '' + - optionalString (listenSSL != []) '' - - ServerName ${hostOpts.hostName} - ${concatMapStrings (alias: "ServerAlias ${alias}\n") hostOpts.serverAliases} - ServerAdmin ${adminAddr} - SSLEngine on - SSLCertificateFile ${sslServerCert} - SSLCertificateKeyFile ${sslServerKey} - ${optionalString hostOpts.http2 "Protocols h2 h2c http/1.1"} - ${acmeChallenge} - ${mkVHostCommonConf hostOpts} - - '' - ; - - mkVHostCommonConf = hostOpts: - let - documentRoot = if hostOpts.documentRoot != null - then hostOpts.documentRoot - else pkgs.runCommand "empty" { preferLocalBuild = true; } "mkdir -p $out" - ; - - mkLocations = locations: concatStringsSep "\n" (map (config: '' - - ${optionalString (config.proxyPass != null) '' - - ProxyPass ${config.proxyPass} - ProxyPassReverse ${config.proxyPass} - - ''} - ${optionalString (config.index != null) '' - - DirectoryIndex ${config.index} - - ''} - ${optionalString (config.alias != null) '' - - Alias "${config.alias}" - - ''} - ${config.extraConfig} - - '') (sortProperties (mapAttrsToList (k: v: v // { location = k; }) locations))); - in - '' - ${optionalString cfg.logPerVirtualHost '' - ErrorLog ${cfg.logDir}/error-${hostOpts.hostName}.log - CustomLog ${cfg.logDir}/access-${hostOpts.hostName}.log ${hostOpts.logFormat} - ''} - - ${optionalString (hostOpts.robotsEntries != "") '' - Alias /robots.txt ${pkgs.writeText "robots.txt" hostOpts.robotsEntries} - ''} - - DocumentRoot "${documentRoot}" - - - Options Indexes FollowSymLinks - AllowOverride None - Require all granted - - - ${optionalString hostOpts.enableUserDir '' - UserDir public_html - UserDir disabled root - - AllowOverride FileInfo AuthConfig Limit Indexes - Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec - - Require all granted - - - Require all denied - - - ''} - - ${optionalString (hostOpts.globalRedirect != null && hostOpts.globalRedirect != "") '' - RedirectPermanent / ${hostOpts.globalRedirect} - ''} - - ${ - let makeDirConf = elem: '' - Alias ${elem.urlPath} ${elem.dir}/ - - Options +Indexes - Require all granted - AllowOverride All - - ''; - in concatMapStrings makeDirConf hostOpts.servedDirs - } - - ${mkLocations hostOpts.locations} - ${hostOpts.extraConfig} - '' - ; - - - confFile = pkgs.writeText "httpd.conf" '' - - ServerRoot ${pkg} - ServerName ${config.networking.hostName} - DefaultRuntimeDir ${runtimeDir}/runtime - - PidFile ${runtimeDir}/httpd.pid - - ${optionalString (cfg.multiProcessingModule != "prefork") '' - # mod_cgid requires this. - ScriptSock ${runtimeDir}/cgisock - ''} - - - MaxClients ${toString cfg.maxClients} - MaxRequestsPerChild ${toString cfg.maxRequestsPerChild} - - - ${let - toStr = listen: "Listen ${listen.ip}:${toString listen.port} ${if listen.ssl then "https" else "http"}"; - uniqueListen = uniqList {inputList = map toStr listenInfo;}; - in concatStringsSep "\n" uniqueListen - } - - User ${cfg.user} - Group ${cfg.group} - - ${let - mkModule = module: - if isString module then { name = module; path = "${pkg}/modules/mod_${module}.so"; } - else if isAttrs module then { inherit (module) name path; } - else throw "Expecting either a string or attribute set including a name and path."; - in - concatMapStringsSep "\n" (module: "LoadModule ${module.name}_module ${module.path}") (unique (map mkModule modules)) - } - - AddHandler type-map var - - - Require all denied - - - ${mimeConf} - ${loggingConf} - ${browserHacks} - - Include ${pkg}/conf/extra/httpd-default.conf - Include ${pkg}/conf/extra/httpd-autoindex.conf - Include ${pkg}/conf/extra/httpd-multilang-errordoc.conf - Include ${pkg}/conf/extra/httpd-languages.conf - - TraceEnable off - - ${sslConf} - - # Fascist default - deny access to everything. - - Options FollowSymLinks - AllowOverride None - Require all denied - - - ${cfg.extraConfig} - - ${concatMapStringsSep "\n" mkVHostConf vhosts} - ''; - - # Generate the PHP configuration file. Should probably be factored - # out into a separate module. - phpIni = pkgs.runCommand "php.ini" - { options = cfg.phpOptions; - preferLocalBuild = true; - } - '' - cat ${php}/etc/php.ini > $out - echo "$options" >> $out - ''; - -in - - -{ - - imports = [ - (mkRemovedOptionModule [ "services" "httpd" httpdName "extraSubservices" ] "Most existing subservices have been ported to the NixOS module system. Please update your configuration accordingly.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "stateDir" ] "The httpd module now uses /run/httpd as a runtime directory.") - - # virtualHosts options - (mkRemovedOptionModule [ "services" "httpd" httpdName "documentRoot" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "enableSSL" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "enableUserDir" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "globalRedirect" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "hostName" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "listen" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "robotsEntries" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "servedDirs" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "servedFiles" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "serverAliases" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerCert" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerChain" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerKey" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - ]; - - # interface - - options = { - - services.httpd."${httpdName}" = { - - enable = mkEnableOption "the Apache HTTP Server"; - - package = mkOption { - type = types.package; - default = pkgs.apacheHttpd; - defaultText = "pkgs.apacheHttpd"; - description = '' - Overridable attribute of the Apache HTTP Server package to use. - ''; - }; - - configFile = mkOption { - type = types.path; - default = confFile; - defaultText = "confFile"; - example = literalExample ''pkgs.writeText "httpd.conf" "# my custom config file ..."''; - description = '' - Override the configuration file used by Apache. By default, - NixOS generates one automatically. - ''; - }; - - extraConfig = mkOption { - type = types.lines; - default = ""; - description = '' - Configuration lines appended to the generated Apache - configuration file. Note that this mechanism will not work - when is overridden. - ''; - }; - - extraModules = mkOption { - type = types.listOf types.unspecified; - default = []; - example = literalExample '' - [ - "proxy_connect" - { name = "jk"; path = "''${pkgs.tomcat_connectors}/modules/mod_jk.so"; } - ] - ''; - description = '' - Additional Apache modules to be used. These can be - specified as a string in the case of modules distributed - with Apache, or as an attribute set specifying the - name and path of the - module. - ''; - }; - - adminAddr = mkOption { - type = types.str; - example = "admin@example.org"; - description = "E-mail address of the server administrator."; - }; - - logFormat = mkOption { - type = types.str; - default = "common"; - example = "combined"; - description = '' - Log format for log files. Possible values are: combined, common, referer, agent. - See for more details. - ''; - }; - - logPerVirtualHost = mkOption { - type = types.bool; - default = true; - description = '' - If enabled, each virtual host gets its own - access.log and - error.log, namely suffixed by the - of the virtual host. - ''; - }; - - user = mkOption { - type = types.str; - default = "wwwrun"; - description = '' - User account under which httpd runs. - ''; - }; - - group = mkOption { - type = types.str; - default = "wwwrun"; - description = '' - Group under which httpd runs. - ''; - }; - - logDir = mkOption { - type = types.path; - default = "/var/log/httpd"; - description = '' - Directory for Apache's log files. It is created automatically. - ''; - }; - - virtualHosts = mkOption { - type = with types; attrsOf (submodule (import )); - default = { - localhost = { - documentRoot = "${pkg}/htdocs"; - }; - }; - example = literalExample '' - { - "foo.example.com" = { - forceSSL = true; - documentRoot = "/var/www/foo.example.com" - }; - "bar.example.com" = { - addSSL = true; - documentRoot = "/var/www/bar.example.com"; - }; - } - ''; - description = '' - Specification of the virtual hosts served by Apache. Each - element should be an attribute set specifying the - configuration of the virtual host. - ''; - }; - - enableMellon = mkOption { - type = types.bool; - default = false; - description = "Whether to enable the mod_auth_mellon module."; - }; - - enablePHP = mkOption { - type = types.bool; - default = false; - description = "Whether to enable the PHP module."; - }; - - phpPackage = mkOption { - type = types.package; - default = pkgs.php; - defaultText = "pkgs.php"; - description = '' - Overridable attribute of the PHP package to use. - ''; - }; - - enablePerl = mkOption { - type = types.bool; - default = false; - description = "Whether to enable the Perl module (mod_perl)."; - }; - - phpOptions = mkOption { - type = types.lines; - default = ""; - example = - '' - date.timezone = "CET" - ''; - description = '' - Options appended to the PHP configuration file php.ini. - ''; - }; - - multiProcessingModule = mkOption { - type = types.enum [ "event" "prefork" "worker" ]; - default = "prefork"; - example = "worker"; - description = - '' - Multi-processing module to be used by Apache. Available - modules are prefork (the default; - handles each request in a separate child process), - worker (hybrid approach that starts a - number of child processes each running a number of - threads) and event (a recent variant of - worker that handles persistent - connections more efficiently). - ''; - }; - - maxClients = mkOption { - type = types.int; - default = 150; - example = 8; - description = "Maximum number of httpd processes (prefork)"; - }; - - maxRequestsPerChild = mkOption { - type = types.int; - default = 0; - example = 500; - description = '' - Maximum number of httpd requests answered per httpd child (prefork), 0 means unlimited. - ''; - }; - - sslCiphers = mkOption { - type = types.str; - default = "HIGH:!aNULL:!MD5:!EXP"; - description = "Cipher Suite available for negotiation in SSL proxy handshake."; - }; - - sslProtocols = mkOption { - type = types.str; - default = "All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1"; - example = "All -SSLv2 -SSLv3"; - description = "Allowed SSL/TLS protocol versions."; - }; - }; - - }; - - # implementation - - config = mkIf cfg.enable { - - assertions = [ - { - assertion = all (hostOpts: !hostOpts.enableSSL) vhosts; - message = '' - The option `services.httpd.virtualHosts..enableSSL` no longer has any effect; please remove it. - Select one of `services.httpd.virtualHosts..addSSL`, `services.httpd.virtualHosts..forceSSL`, - or `services.httpd.virtualHosts..onlySSL`. - ''; - } - { - assertion = all (hostOpts: with hostOpts; !(addSSL && onlySSL) && !(forceSSL && onlySSL) && !(addSSL && forceSSL)) vhosts; - message = '' - Options `services.httpd.virtualHosts..addSSL`, - `services.httpd.virtualHosts..onlySSL` and `services.httpd.virtualHosts..forceSSL` - are mutually exclusive. - ''; - } - { - assertion = all (hostOpts: !(hostOpts.enableACME && hostOpts.useACMEHost != null)) vhosts; - message = '' - Options `services.httpd.virtualHosts..enableACME` and - `services.httpd.virtualHosts..useACMEHost` are mutually exclusive. - ''; - } - ]; - - warnings = - mapAttrsToList (name: hostOpts: '' - Using config.services.httpd.virtualHosts."${name}".servedFiles is deprecated and will become unsupported in a future release. Your configuration will continue to work as is but please migrate your configuration to config.services.httpd.virtualHosts."${name}".locations before the 20.09 release of NixOS. - '') (filterAttrs (name: hostOpts: hostOpts.servedFiles != []) cfg.virtualHosts); - - users.users = optionalAttrs (withUsers && cfg.user == "wwwrun") { - wwwrun = { - group = cfg.group; - description = "Apache httpd user"; - uid = config.ids.uids.wwwrun; - }; - }; - - users.groups = optionalAttrs (withUsers && cfg.group == "wwwrun") { - wwwrun.gid = config.ids.gids.wwwrun; - }; - - security.acme.certs = mapAttrs (name: hostOpts: { - user = cfg.user; - group = mkDefault cfg.group; - email = if hostOpts.adminAddr != null then hostOpts.adminAddr else cfg.adminAddr; - webroot = hostOpts.acmeRoot; - extraDomains = genAttrs hostOpts.serverAliases (alias: null); - postRun = "systemctl reload httpd.service"; - }) (filterAttrs (name: hostOpts: hostOpts.enableACME) cfg.virtualHosts); - - environment.systemPackages = [ pkg ]; - - # required for "apachectl configtest" - environment.etc."httpd/httpd_${httpdName}.conf".source = httpdConf; - - services.httpd."${httpdName}" = { phpOptions = - '' - ; Needed for PHP's mail() function. - sendmail_path = sendmail -t -i - - ; Don't advertise PHP - expose_php = off - '' + optionalString (config.time.timeZone != null) '' - - ; Apparently PHP doesn't use $TZ. - date.timezone = "${config.time.timeZone}" - ''; - - extraModules = mkBefore [ - # HTTP authentication mechanisms: basic and digest. - "auth_basic" "auth_digest" - - # Authentication: is the user who he claims to be? - "authn_file" "authn_dbm" "authn_anon" - - # Authorization: is the user allowed access? - "authz_user" "authz_groupfile" "authz_host" - - # Other modules. - "ext_filter" "include" "env" "mime_magic" - "cern_meta" "expires" "headers" "usertrack" "setenvif" - "dav" "status" "asis" "info" "dav_fs" - "vhost_alias" "imagemap" "actions" "speling" - "proxy" "proxy_http" - "cache" "cache_disk" - - # For compatibility with old configurations, the new module mod_access_compat is provided. - "access_compat" - ]; - }; - - systemd.tmpfiles.rules = - let - svc = config.systemd.services."httpd${httpdName}".serviceConfig; - in - [ - "d '${cfg.logDir}' 0700 ${svc.User} ${svc.Group}" - "Z '${cfg.logDir}' - ${svc.User} ${svc.Group}" - ]; - - systemd.services."httpd${httpdName}" = - let - vhostsACME = filter (hostOpts: hostOpts.enableACME) vhosts; - in - { description = "Apache HTTPD"; - - wantedBy = [ "multi-user.target" ]; - wants = concatLists (map (hostOpts: [ "acme-${hostOpts.hostName}.service" "acme-selfsigned-${hostOpts.hostName}.service" ]) vhostsACME); - after = [ "network.target" "fs.target" ] ++ map (hostOpts: "acme-selfsigned-${hostOpts.hostName}.service") vhostsACME; - - path = - [ pkg pkgs.coreutils pkgs.gnugrep ] - ++ optional cfg.enablePHP pkgs.system-sendmail; # Needed for PHP's mail() function. - - environment = - optionalAttrs cfg.enablePHP { PHPRC = phpIni; } - // optionalAttrs cfg.enableMellon { LD_LIBRARY_PATH = "${pkgs.xmlsec}/lib"; }; - - preStart = - '' - # Get rid of old semaphores. These tend to accumulate across - # server restarts, eventually preventing it from restarting - # successfully. - for i in $(${pkgs.utillinux}/bin/ipcs -s | grep ' ${cfg.user} ' | cut -f2 -d ' '); do - ${pkgs.utillinux}/bin/ipcrm -s $i - done - ''; - - serviceConfig = { - ExecStart = "@${pkg}/bin/httpd httpd -f ${httpdConf}"; - ExecStop = "${pkg}/bin/httpd -f ${httpdConf} -k graceful-stop"; - ExecReload = "${pkg}/bin/httpd -f ${httpdConf} -k graceful"; - User = "root"; - Group = cfg.group; - Type = "forking"; - PIDFile = "${runtimeDir}/httpd.pid"; - Restart = "always"; - RestartSec = "5s"; - RuntimeDirectory = "httpd_${httpdName} httpd_${httpdName}/runtime"; - RuntimeDirectoryMode = "0750"; - }; - }; - - }; -} diff --git a/modules/websites/httpd-service-builder.patch b/modules/websites/httpd-service-builder.patch deleted file mode 100644 index f0ad836..0000000 --- a/modules/websites/httpd-service-builder.patch +++ /dev/null @@ -1,150 +0,0 @@ ---- /nix/store/xj651aslybfsma20hpbi5nznfcffq8ky-nixexprs.tar.xz/nixos/modules/services/web-servers/apache-httpd/default.nix 1970-01-01 01:00:01.000000000 +0100 -+++ modules/websites/httpd-service-builder.nix 2020-04-04 03:08:29.068490345 +0200 -@@ -1,12 +1,15 @@ -+# to help backporting this builder should stay as close as possible to -+# nixos/modules/services/web-servers/apache-httpd/default.nix -+{ httpdName, withUsers ? true }: - { config, lib, pkgs, ... }: - - with lib; - - let - -- cfg = config.services.httpd; -+ cfg = config.services.httpd."${httpdName}"; - -- runtimeDir = "/run/httpd"; -+ runtimeDir = "/run/httpd_${httpdName}"; - - pkg = cfg.package.out; - -@@ -318,13 +321,6 @@ - Require all denied - - -- # But do allow access to files in the store so that we don't have -- # to generate clauses for every generated file that we -- # want to serve. -- -- Require all granted -- -- - ${cfg.extraConfig} - - ${concatMapStringsSep "\n" mkVHostConf vhosts} -@@ -347,30 +343,30 @@ - { - - imports = [ -- (mkRemovedOptionModule [ "services" "httpd" "extraSubservices" ] "Most existing subservices have been ported to the NixOS module system. Please update your configuration accordingly.") -- (mkRemovedOptionModule [ "services" "httpd" "stateDir" ] "The httpd module now uses /run/httpd as a runtime directory.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "extraSubservices" ] "Most existing subservices have been ported to the NixOS module system. Please update your configuration accordingly.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "stateDir" ] "The httpd module now uses /run/httpd as a runtime directory.") - - # virtualHosts options -- (mkRemovedOptionModule [ "services" "httpd" "documentRoot" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "enableSSL" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "enableUserDir" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "globalRedirect" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "hostName" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "listen" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "robotsEntries" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "servedDirs" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "servedFiles" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "serverAliases" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "sslServerCert" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "sslServerChain" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -- (mkRemovedOptionModule [ "services" "httpd" "sslServerKey" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "documentRoot" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "enableSSL" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "enableUserDir" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "globalRedirect" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "hostName" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "listen" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "robotsEntries" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "servedDirs" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "servedFiles" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "serverAliases" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerCert" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerChain" ] "Please define a virtual host using `services.httpd.virtualHosts`.") -+ (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerKey" ] "Please define a virtual host using `services.httpd.virtualHosts`.") - ]; - - # interface - - options = { - -- services.httpd = { -+ services.httpd."${httpdName}" = { - - enable = mkEnableOption "the Apache HTTP Server"; - -@@ -622,7 +618,7 @@ - Using config.services.httpd.virtualHosts."${name}".servedFiles is deprecated and will become unsupported in a future release. Your configuration will continue to work as is but please migrate your configuration to config.services.httpd.virtualHosts."${name}".locations before the 20.09 release of NixOS. - '') (filterAttrs (name: hostOpts: hostOpts.servedFiles != []) cfg.virtualHosts); - -- users.users = optionalAttrs (cfg.user == "wwwrun") { -+ users.users = optionalAttrs (withUsers && cfg.user == "wwwrun") { - wwwrun = { - group = cfg.group; - description = "Apache httpd user"; -@@ -630,7 +626,7 @@ - }; - }; - -- users.groups = optionalAttrs (cfg.group == "wwwrun") { -+ users.groups = optionalAttrs (withUsers && cfg.group == "wwwrun") { - wwwrun.gid = config.ids.gids.wwwrun; - }; - -@@ -646,9 +642,9 @@ - environment.systemPackages = [ pkg ]; - - # required for "apachectl configtest" -- environment.etc."httpd/httpd.conf".source = httpdConf; -+ environment.etc."httpd/httpd_${httpdName}.conf".source = httpdConf; - -- services.httpd.phpOptions = -+ services.httpd."${httpdName}" = { phpOptions = - '' - ; Needed for PHP's mail() function. - sendmail_path = sendmail -t -i -@@ -661,7 +657,7 @@ - date.timezone = "${config.time.timeZone}" - ''; - -- services.httpd.extraModules = mkBefore [ -+ extraModules = mkBefore [ - # HTTP authentication mechanisms: basic and digest. - "auth_basic" "auth_digest" - -@@ -682,17 +678,18 @@ - # For compatibility with old configurations, the new module mod_access_compat is provided. - "access_compat" - ]; -+ }; - - systemd.tmpfiles.rules = - let -- svc = config.systemd.services.httpd.serviceConfig; -+ svc = config.systemd.services."httpd${httpdName}".serviceConfig; - in - [ - "d '${cfg.logDir}' 0700 ${svc.User} ${svc.Group}" - "Z '${cfg.logDir}' - ${svc.User} ${svc.Group}" - ]; - -- systemd.services.httpd = -+ systemd.services."httpd${httpdName}" = - let - vhostsACME = filter (hostOpts: hostOpts.enableACME) vhosts; - in -@@ -730,7 +727,7 @@ - PIDFile = "${runtimeDir}/httpd.pid"; - Restart = "always"; - RestartSec = "5s"; -- RuntimeDirectory = "httpd httpd/runtime"; -+ RuntimeDirectory = "httpd_${httpdName} httpd_${httpdName}/runtime"; - RuntimeDirectoryMode = "0750"; - }; - }; diff --git a/modules/websites/php-application.nix b/modules/websites/php-application.nix deleted file mode 100644 index 3a43a45..0000000 --- a/modules/websites/php-application.nix +++ /dev/null @@ -1,224 +0,0 @@ -{ lib, config, pkgs, ... }: -with lib; -let - cfg = config.services.phpApplication; - cfgByEnv = lists.groupBy (x: x.websiteEnv) (builtins.attrValues cfg.apps); -in -{ - options = with types; { - services.phpApplication.apps = mkOption { - default = {}; - description = '' - php applications to define - ''; - type = attrsOf (submodule { - options = { - varDir = mkOption { - type = nullOr path; - description = '' - Path to application’s vardir. - ''; - }; - varDirPaths = mkOption { - type = attrsOf str; - default = {}; - description = '' - Map of additional folders => mode to create under varDir - ''; - }; - mode = mkOption { - type = str; - default = "0700"; - description = '' - Mode to apply to the vardir - ''; - }; - phpSession = mkOption { - type = bool; - default = true; - description = "Handle phpsession files separately in vardir"; - }; - phpListen = mkOption { - type = nullOr str; - default = null; - description = "Name of the socket to listen to. Defaults to app name if null"; - }; - phpPool = mkOption { - type = attrsOf str; - default = {}; - description = "Pool configuration to append"; - }; - phpEnv = mkOption { - type = attrsOf str; - default = {}; - description = "Pool environment to append"; - }; - phpPackage = mkOption { - type = attrsOf str; - default = pkgs.php; - description = "Php package to use"; - }; - phpOptions = mkOption { - type = lines; - default = ""; - description = "php configuration to append"; - }; - phpOpenbasedir = mkOption { - type = listOf path; - default = []; - description = '' - paths to add to php open_basedir configuration in addition to app and vardir - ''; - }; - phpWatchFiles = mkOption { - type = listOf path; - default = []; - description = '' - Path to other files to watch to trigger preStart scripts - ''; - }; - websiteEnv = mkOption { - type = str; - description = '' - website instance name to use - ''; - }; - httpdUser = mkOption { - type = str; - default = config.services.httpd.user; - description = '' - httpd user to run the prestart scripts as. - ''; - }; - httpdGroup = mkOption { - type = str; - default = config.services.httpd.group; - description = '' - httpd group to run the prestart scripts as. - ''; - }; - httpdWatchFiles = mkOption { - type = listOf path; - default = []; - description = '' - Path to other files to watch to trigger httpd reload - ''; - }; - app = mkOption { - type = path; - description = '' - Path to application root - ''; - }; - webRoot = mkOption { - type = nullOr path; - description = '' - Path to the web root path of the application. May differ from the application itself (usually a subdirectory) - ''; - }; - preStartActions = mkOption { - type = listOf str; - default = []; - description = '' - List of actions to run as apache user at preStart when - whatchFiles or app dir changed. - ''; - }; - serviceDeps = mkOption { - type = listOf str; - default = []; - description = '' - List of systemd services this application depends on - ''; - }; - }; - }); - }; - # Read-only variables - services.phpApplication.phpListenPaths = mkOption { - type = attrsOf path; - default = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - name config.services.phpfpm.pools."${name}".socket - ) cfg.apps; - readOnly = true; - description = '' - Full paths to listen for php - ''; - }; - }; - - config = { - services.websites.env = attrsets.mapAttrs' (name: cfgs: attrsets.nameValuePair - name { - modules = [ "proxy_fcgi" ]; - watchPaths = builtins.concatLists (map (c: c.httpdWatchFiles) cfgs); - } - ) cfgByEnv; - - services.phpfpm.pools = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - name { - user = icfg.httpdUser; - group = icfg.httpdUser; - settings = { - "listen.owner" = icfg.httpdUser; - "listen.group" = icfg.httpdGroup; - "php_admin_value[open_basedir]" = builtins.concatStringsSep ":" ([icfg.app icfg.varDir] ++ icfg.phpWatchFiles ++ icfg.phpOpenbasedir); - } - // optionalAttrs (icfg.phpSession) { "php_admin_value[session.save_path]" = "${icfg.varDir}/phpSessions"; } - // icfg.phpPool; - phpOptions = config.services.phpfpm.phpOptions + icfg.phpOptions; - inherit (icfg) phpEnv phpPackage; - } - ) cfg.apps; - - services.filesWatcher = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - "phpfpm-${name}" { - restart = true; - paths = icfg.phpWatchFiles; - } - ) (attrsets.filterAttrs (n: v: builtins.length v.phpWatchFiles > 0) cfg.apps); - - systemd.services = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - "phpfpm-${name}" { - after = lib.mkAfter icfg.serviceDeps; - wants = icfg.serviceDeps; - preStart = lib.mkAfter (optionalString (!isNull icfg.varDir) '' - watchFilesChanged() { - ${optionalString (builtins.length icfg.phpWatchFiles == 0) "return 1"} - [ ! -f "${icfg.varDir}"/watchedFiles ] \ - || ! sha512sum -c --status ${icfg.varDir}/watchedFiles - } - appDirChanged() { - [ ! -f "${icfg.varDir}/currentWebappDir" -o \ - "${icfg.app}" != "$(cat ${icfg.varDir}/currentWebappDir 2>/dev/null)" ] - } - updateWatchFiles() { - ${optionalString (builtins.length icfg.phpWatchFiles == 0) "return 0"} - sha512sum ${builtins.concatStringsSep " " icfg.phpWatchFiles} > ${icfg.varDir}/watchedFiles - } - - if watchFilesChanged || appDirChanged; then - pushd ${icfg.app} > /dev/null - ${builtins.concatStringsSep "\n " (map (c: "/run/wrappers/bin/sudo -u ${icfg.httpdUser} ${c}") icfg.preStartActions) } - popd > /dev/null - echo -n "${icfg.app}" > ${icfg.varDir}/currentWebappDir - updateWatchFiles - fi - ''); - } - ) cfg.apps; - - system.activationScripts = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair - name { - deps = []; - text = optionalString (!isNull icfg.varDir) '' - install -m ${icfg.mode} -o ${icfg.httpdUser} -g ${icfg.httpdGroup} -d ${icfg.varDir} - '' + optionalString (icfg.phpSession) '' - install -m 0700 -o ${icfg.httpdUser} -g ${icfg.httpdGroup} -d ${icfg.varDir}/phpSessions - '' + builtins.concatStringsSep "\n" (attrsets.mapAttrsToList (n: v: '' - install -m ${v} -o ${icfg.httpdUser} -g ${icfg.httpdGroup} -d ${icfg.varDir}/${n} - '') icfg.varDirPaths); - } - ) cfg.apps; - }; -} diff --git a/modules/zrepl.nix b/modules/zrepl.nix deleted file mode 100644 index 5bcc17b..0000000 --- a/modules/zrepl.nix +++ /dev/null @@ -1,45 +0,0 @@ -{ config, lib, pkgs, ... }: -let - cfg = config.services.zrepl; -in -{ - options = { - services.zrepl = { - enable = lib.mkEnableOption "Enable the zrepl daemon"; - - config = lib.mkOption { - type = lib.types.lines; - default = ""; - description = "Configuration"; - }; - }; - }; - - config = lib.mkIf cfg.enable { - secrets.keys = { - "zrepl/zrepl.yml" = { - permissions = "0400"; - text = cfg.config; - user = config.systemd.services.zrepl.serviceConfig.User or "root"; - group = config.systemd.services.zrepl.serviceConfig.Group or "root"; - }; - }; - services.filesWatcher.zrepl = { - restart = true; - paths = [ config.secrets.fullPaths."zrepl/zrepl.yml" ]; - }; - systemd.services.zrepl = { - description = "zrepl daemon"; - wantedBy = [ "multi-user.target" ]; - path = [ pkgs.zfs pkgs.openssh ]; - serviceConfig = { - ExecStart = - let configFile = config.secrets.fullPaths."zrepl/zrepl.yml"; - in "${pkgs.zrepl}/bin/zrepl daemon --config ${configFile}"; - Type = "simple"; - RuntimeDirectory= "zrepl"; - RuntimeDirectoryMode= "0700"; - }; - }; - }; -} diff --git a/nix/README.md b/nix/README.md deleted file mode 100644 index 7bf996c..0000000 --- a/nix/README.md +++ /dev/null @@ -1,2 +0,0 @@ -This directory is handled by niv, but it prefers to have a directory -named "nix" diff --git a/nix/sources.json b/nix/sources.json deleted file mode 100644 index 1a1cf5a..0000000 --- a/nix/sources.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "buildbot-cours-deps": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Cours", - "rev": "33f139f2e2ea0a16b8ed813c5436e5a5bb506f6d", - "type": "git" - }, - "buildbot-cours-nixpkgs": { - "branch": "nixos-unstable", - "description": "Frozen nixpkgs snapshot for texlive", - "homepage": "https://github.com/NixOS/nixpkgs", - "owner": "NixOS", - "repo": "nixpkgs-channels", - "rev": "fce7562cf46727fdaf801b232116bc9ce0512049", - "sha256": "14rvi69ji61x3z88vbn17rg5vxrnw2wbnanxb7y0qzyqrj7spapx", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs-channels/archive/fce7562cf46727fdaf801b232116bc9ce0512049.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "buildbot-denise-aventuriers-nixpkgs": { - "branch": "nixos-unstable", - "description": "Frozen nixpkgs snapshot for texlive", - "homepage": "https://github.com/NixOS/nixpkgs", - "owner": "NixOS", - "repo": "nixpkgs-channels", - "rev": "8e2b14aceb1d40c7e8b84c03a7c78955359872bb", - "sha256": "0zzjpd9smr7rxzrdf6raw9kbj42fbvafxb5bz36lcxgv290pgsm8", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs-channels/archive/8e2b14aceb1d40c7e8b84c03a7c78955359872bb.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "buildbot-history-deps": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/History", - "rev": "5f2aae4f9c92107accfc6fb6db6cb3c1f97ed9dc", - "type": "git" - }, - "buildbot-normalesup-deps": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Projets/Sites/Normalesup", - "rev": "de294da4027e80a7b8bf7ec8c393ca0b60218575", - "type": "git" - }, - "buildbot-normalesup-nixpkgs": { - "description": "Frozen nixpkgs snapshot for texlive", - "revision": "173017.85f820d6e41", - "sha256": "0fs390gvz8d3n7v4zj538gf3n1b14sikbf0ijrxgxib5i0704mdb", - "type": "tarball", - "url": "https://releases.nixos.org/nixos/19.03/nixos-19.03.173017.85f820d6e41/nixexprs.tar.xz", - "url_template": "https://releases.nixos.org/nixos//nixos-./nixexprs.tar.xz", - "version": "19.03" - }, - "buildbot-plugin-buildslist": { - "ref": "master", - "repo": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist", - "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", - "type": "git", - "version": "f1d42ba-master" - }, - "home-manager": { - "branch": "master", - "description": "Manage a user environment using Nix", - "homepage": "https://rycee.gitlab.io/home-manager/", - "owner": "rycee", - "repo": "home-manager", - "rev": "6cf6b587b575493e7718bf08b209013d7dcf4d58", - "sha256": "0666ayxazbphjn5xcrczv8m7k2q62k224fvf0kz1lx9qjn93wkvr", - "type": "tarball", - "url": "https://github.com/rycee/home-manager/archive/6cf6b587b575493e7718bf08b209013d7dcf4d58.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "niv": { - "branch": "master", - "description": "Easy dependency management for Nix projects", - "homepage": "https://github.com/nmattia/niv", - "owner": "nmattia", - "repo": "niv", - "rev": "372f96bff217a7a019de27667d04118cffa9841b", - "sha256": "1l0z6162zw60pdcdj03aq64qgf1vyzmf24i9pxca64i4sprl1b7p", - "type": "tarball", - "url": "https://github.com/nmattia/niv/archive/372f96bff217a7a019de27667d04118cffa9841b.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "nixpkgs": { - "branch": "nixos-unstable", - "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to", - "homepage": "https://github.com/NixOS/nixpkgs", - "owner": "NixOS", - "repo": "nixpkgs-channels", - "rev": "fce7562cf46727fdaf801b232116bc9ce0512049", - "sha256": "14rvi69ji61x3z88vbn17rg5vxrnw2wbnanxb7y0qzyqrj7spapx", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs-channels/archive/fce7562cf46727fdaf801b232116bc9ce0512049.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "nixpkgs-home-manager": { - "branch": "nixos-unstable", - "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to", - "homepage": "https://github.com/NixOS/nixpkgs", - "owner": "NixOS", - "repo": "nixpkgs-channels", - "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", - "sha256": "1ak7jqx94fjhc68xh1lh35kh3w3ndbadprrb762qgvcfb8351x8v", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs-channels/archive/c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "nixpkgs-nix": { - "branch": "nixos-unstable", - "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to", - "homepage": "https://github.com/NixOS/nixpkgs", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "891f607d5301d6730cb1f9dcf3618bcb1ab7f10e", - "sha256": "1cr39f0sbr0h5d83dv1q34mcpwnkwwbdk5fqlyqp2mnxghzwssng", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/891f607d5301d6730cb1f9dcf3618bcb1ab7f10e.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "nixpkgs-nixops": { - "branch": "nixos-unstable", - "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to", - "homepage": "https://github.com/NixOS/nixpkgs", - "owner": "NixOS", - "repo": "nixpkgs-channels", - "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", - "sha256": "14q3kvnmgz19pgwyq52gxx0cs90ddf24pnplmq33pdddbb6c51zn", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs-channels/archive/840c782d507d60aaa49aa9e3f6d0b0e780912742.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "webapps-landing": { - "ref": "gitolite_local/local_changes", - "repo": "https://git.immae.eu/github/bastienwirtz/homer.git", - "rev": "bb60c5b869931f305f15c5bfa9cdb3f68702f01f", - "type": "git", - "version": "e0a72b7-local" - }, - "webapps-surfer": { - "ref": "master", - "repo": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git", - "rev": "476177380452c9c7c5b1624805feedc824c5995e", - "type": "git", - "version": "4761773-master" - }, - "webapps-ttrss": { - "ref": "master", - "repo": "https://git.tt-rss.org/fox/tt-rss.git", - "rev": "986ca251f995f7754a0470d3e0c44538a545081f", - "type": "git", - "version": "986ca25-master" - }, - "websites-chloe-app": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Chloe", - "rev": "882f166999a59081ad896f26318e6a04db9f9f43", - "type": "git", - "version": "882f166-master" - }, - "websites-connexionswing-app": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Projets/Connexionswing", - "rev": "ed5874396d35766e0810a6d4e78e1a8f6b170835", - "type": "git", - "version": "ed58743-master" - }, - "websites-florian-app": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/florian_telles/stabilo", - "rev": "1793d5c7912d1b20ad1df1ac59be9d7f1220e919", - "type": "git", - "version": "1793d5c-master" - }, - "websites-isabelle-aten": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Aten", - "rev": "b99537fdad41291afb4f1bb8b2e2aa4081c71fae", - "type": "git", - "version": "b99537f-master" - }, - "websites-isabelle-iridologie": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Iridologie", - "rev": "2f2ec6b003f4de97e9f8651db540c9114ac877c2", - "type": "git", - "version": "2f2ec6b-master" - }, - "websites-ludivine-app": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Ludivine", - "rev": "eae633b7c5e92184b24141ebf267d51dbc5d2acc", - "type": "git", - "version": "0dacc32-master" - }, - "websites-piedsjaloux-app": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/Pieds_jaloux/NewSite", - "rev": "2b67b9897180af3d34f87648362337dbf3981158", - "type": "git", - "version": "2b67b98-master" - }, - "websites-richie-app": { - "ref": "master", - "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Richie", - "rev": "2a09e29dd9fc4f6abc5add82744bedf1978a35d5", - "type": "git", - "version": "2a09e29-master" - } -} diff --git a/nix/sources.nix b/nix/sources.nix deleted file mode 100644 index 45c97d1..0000000 --- a/nix/sources.nix +++ /dev/null @@ -1,135 +0,0 @@ -# This file has been generated by Niv. - -let - - # - # The fetchers. fetch_ fetches specs of type . - # - - fetch_file = pkgs: spec: - if spec.builtin or true then - builtins_fetchurl { inherit (spec) url sha256; } - else - pkgs.fetchurl { inherit (spec) url sha256; }; - - fetch_tarball = pkgs: name: spec: - let - ok = str: ! builtins.isNull (builtins.match "[a-zA-Z0-9+-._?=]" str); - # sanitize the name, though nix will still fail if name starts with period - name' = stringAsChars (x: if ! ok x then "-" else x) "${name}-src"; - in - if spec.builtin or true then - builtins_fetchTarball { name = name'; inherit (spec) url sha256; } - else - pkgs.fetchzip { name = name'; inherit (spec) url sha256; }; - - fetch_git = spec: - builtins.fetchGit { url = spec.repo; inherit (spec) rev ref; }; - - fetch_builtin-tarball = name: throw - ''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`. - $ niv modify ${name} -a type=tarball -a builtin=true''; - - fetch_builtin-url = name: throw - ''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`. - $ niv modify ${name} -a type=file -a builtin=true''; - - # - # Various helpers - # - - # The set of packages used when specs are fetched using non-builtins. - mkPkgs = sources: - let - sourcesNixpkgs = - import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) {}; - hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath; - hasThisAsNixpkgsPath = == ./.; - in - if builtins.hasAttr "nixpkgs" sources - then sourcesNixpkgs - else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then - import {} - else - abort - '' - Please specify either (through -I or NIX_PATH=nixpkgs=...) or - add a package called "nixpkgs" to your sources.json. - ''; - - # The actual fetching function. - fetch = pkgs: name: spec: - - if ! builtins.hasAttr "type" spec then - abort "ERROR: niv spec ${name} does not have a 'type' attribute" - else if spec.type == "file" then fetch_file pkgs spec - else if spec.type == "tarball" then fetch_tarball pkgs name spec - else if spec.type == "git" then fetch_git spec - else if spec.type == "builtin-tarball" then fetch_builtin-tarball name - else if spec.type == "builtin-url" then fetch_builtin-url name - else - abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}"; - - # Ports of functions for older nix versions - - # a Nix version of mapAttrs if the built-in doesn't exist - mapAttrs = builtins.mapAttrs or ( - f: set: with builtins; - listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set)) - ); - - # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295 - range = first: last: if first > last then [] else builtins.genList (n: first + n) (last - first + 1); - - # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257 - stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1)); - - # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269 - stringAsChars = f: s: concatStrings (map f (stringToCharacters s)); - concatStrings = builtins.concatStringsSep ""; - - # fetchTarball version that is compatible between all the versions of Nix - builtins_fetchTarball = { url, name, sha256 }@attrs: - let - inherit (builtins) lessThan nixVersion fetchTarball; - in - if lessThan nixVersion "1.12" then - fetchTarball { inherit name url; } - else - fetchTarball attrs; - - # fetchurl version that is compatible between all the versions of Nix - builtins_fetchurl = { url, sha256 }@attrs: - let - inherit (builtins) lessThan nixVersion fetchurl; - in - if lessThan nixVersion "1.12" then - fetchurl { inherit url; } - else - fetchurl attrs; - - # Create the final "sources" from the config - mkSources = config: - mapAttrs ( - name: spec: - if builtins.hasAttr "outPath" spec - then abort - "The values in sources.json should not have an 'outPath' attribute" - else - spec // { outPath = fetch config.pkgs name spec; } - ) config.sources; - - # The "config" used by the fetchers - mkConfig = - { sourcesFile ? ./sources.json - , sources ? builtins.fromJSON (builtins.readFile sourcesFile) - , pkgs ? mkPkgs sources - }: rec { - # The sources, i.e. the attribute set of spec name to spec - inherit sources; - - # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers - inherit pkgs; - }; -in -mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); } diff --git a/nixops/.gitignore b/nixops/.gitignore deleted file mode 100644 index 2ea467b..0000000 --- a/nixops/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/state diff --git a/nixops/.sops.yaml b/nixops/.sops.yaml deleted file mode 100644 index 04826a2..0000000 --- a/nixops/.sops.yaml +++ /dev/null @@ -1,19 +0,0 @@ -keys: - - &Immae F82806FDA1BF5B9A1B3014E7C9FCED6CA6B79454 - # obtained with: ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age - - &eldiron age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj - - &monitoring-1 age1dn4lzhgxusqrpjjnzm7w8ml39ptf326htuzmpqdqs2gg3wq7cqzqxuvx8k - - &backup-2 age1kk3nr27qu42j28mcfdag5lhq0zu2pky7gfanvne8l4z2ctevjpgskmw0sr - - &dilion age1x49n6qa0arkdpq8530s7umgm0gqkq90exv4jep97q30rfnzknpaqate06a - - &quatresaisons age1yz8u6xvh2fltvyp96ep8crce3qx4tuceyhun6pwddfe0uvcrkarscxl7e7 -creation_rules: - - path_regex: vars.yml - key_groups: - - pgp: - - *Immae - age: - - *eldiron - - *monitoring-1 - - *backup-2 - - *dilion - - *quatresaisons diff --git a/nixops/Makefile b/nixops/Makefile deleted file mode 100644 index fb9da4c..0000000 --- a/nixops/Makefile +++ /dev/null @@ -1,102 +0,0 @@ -ifndef NIXOPS_ENV_LOADED - $(error "Please load environment with direnv") -endif - -###### Current channel information -nix-info: - @version=$$(nix eval --raw nixpkgs.lib.version) && \ - mainversion=$$(echo $$version | cut -d"." -f -2) && \ - echo "https://releases.nixos.org/nixos/$$mainversion/nixos-$$version/nixexprs.tar.xz" && \ - nix-instantiate --find-file nixpkgs -.PHONY: nix-info - -###### Initial setup -setup: - ./scripts/setup -.PHONY: setup - -###### Morph regular tasks -PROFILE=/nix/var/nix/profiles/per-user/immae/morph/immaeEu -TARGET ?= -MORPH_ARGS ?= -ifdef TARGET - # multiple targets: --on="{machine1,machine2}" (works with * glob too) - override MORPH_ARGS +=--on=$(TARGET) -endif -SSH_ARGS ?= - -edit_env: - $(EDITOR) secrets/environment.nix || true - git -C secrets add environment.nix || true - git -C secrets commit -m "Edit environment.nix" environment.nix || true - -edit_vars: - sops secrets/vars.yml || true - git -C secrets add vars.yml || true - git -C secrets commit -m "Edit password for vars.yml using sops." vars.yml || true - -ssh-eldiron: - ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@eldiron $(SSH_ARGS)' - -ssh-dilion: - ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@dilion $(SSH_ARGS)' - -ssh-backup-2: - ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@backup-2 $(SSH_ARGS)' - -ssh-monitoring-1: - ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@monitoring-1 $(SSH_ARGS)' - -ssh-4c: - ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@quatresaisons $(SSH_ARGS)' - -debug: - ./scripts/with_env morph build --show-trace default.nix $(MORPH_ARGS) - -build: - ./scripts/with_env morph build default.nix $(MORPH_ARGS) - -dry-run: - ./scripts/with_env morph build --dry-run default.nix $(MORPH_ARGS) - -upload: - ./scripts/with_env morph push default.nix $(MORPH_ARGS) - -deploy: - ./scripts/with_env morph deploy default.nix switch --keep-result --upload-secrets $(MORPH_ARGS) - nix-env -p $(PROFILE) --set .gcroots/default.nix - -next-boot: - ./scripts/with_env morph deploy default.nix boot --keep-result --upload-secrets $(MORPH_ARGS) - nix-env -p $(PROFILE) --set .gcroots/default.nix - -deploy-reboot: - ./scripts/with_env morph deploy default.nix boot --reboot --upload-secrets $(MORPH_ARGS) - -.PHONY: ssh-eldiron ssh-dilion ssh-monitoring-1 ssh-backup-2 debug build upload deploy deploy-reboot - -###### Cleanup generations and garbage collection -GEN ?= "+3" - -list-generations: - nix-env -p $(PROFILE) --list-generations - $(MAKE) ssh-eldiron SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --list-generations" -.PHONY: list-generations - -delete-generations: - @echo "making sure that a complete build is done before cleaning up" - $(MAKE) build MORPH_ARGS=--keep-result - nix-env -p $(PROFILE) --delete-generations $(GEN) - $(MAKE) ssh-eldiron SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)" - $(MAKE) ssh-dilion SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)" - $(MAKE) ssh-backup-2 SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)" - $(MAKE) ssh-monitoring-1 SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)" -.PHONY: delete-generations - -cleanup: delete-generations - nix-store --gc - $(MAKE) ssh-eldiron SSH_ARGS="nix-store --gc" - $(MAKE) ssh-dilion SSH_ARGS="nix-store --gc" - $(MAKE) ssh-backup-2 SSH_ARGS="nix-store --gc" - $(MAKE) ssh-monitoring-1 SSH_ARGS="nix-store --gc" -.PHONY: cleanup diff --git a/nixops/default.nix b/nixops/default.nix deleted file mode 100644 index 1241443..0000000 --- a/nixops/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ - dilion = import ../modules/private/system/dilion.nix; - eldiron = import ../modules/private/system/eldiron.nix; - backup-2 = import ../modules/private/system/backup-2.nix; - monitoring-1 = import ../modules/private/system/monitoring-1.nix; - - quatresaisons = import ../modules/private/system/quatresaisons.nix; -} diff --git a/nixops/scripts/with_env b/nixops/scripts/with_env deleted file mode 100755 index c570ccf..0000000 --- a/nixops/scripts/with_env +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -if [ -z "$NIXOPS_ENV_LOADED" ]; then - echo "Please load the environment with direnv" - exit 1; -fi - -umask 0077 -TEMP=$(mktemp -d /tmp/XXXXXX-nixops-files) -chmod go-rwx $TEMP - -finish() { - rm -rf "$TEMP" -} - -trap finish EXIT - -sops -d secrets/vars.yml | yq -r .ssl_keys.nix_repository > $TEMP/id_ed25519 - -export SSH_IDENTITY_FILE="$TEMP/id_ed25519" - -"$@" diff --git a/nixops/secrets b/nixops/secrets deleted file mode 160000 index 8c6277e..0000000 --- a/nixops/secrets +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8c6277e3c2762e13d5f1f2ac06d2e815e02fab82 diff --git a/overlays/bonfire/default.nix b/overlays/bonfire/default.nix deleted file mode 100644 index 6dc1034..0000000 --- a/overlays/bonfire/default.nix +++ /dev/null @@ -1,36 +0,0 @@ -self: super: { - bonfire = let - click = self.python3Packages.click.overridePythonAttrs(old: rec { - version = "6.7"; - src = self.python3Packages.fetchPypi { - pname = "click"; - inherit version; - sha256 = "02qkfpykbq35id8glfgwc38yc430427yd05z1wc5cnld8zgicmgi"; - }; - postPatch = '' - substituteInPlace click/_unicodefun.py --replace "'locale'" "'${self.locale}/bin/locale'" - ''; - doCheck = false; - }); - keyring = self.python3Packages.keyring.overridePythonAttrs(old: rec { - version = "20.0.1"; - src = self.python3Packages.fetchPypi { - pname = "keyring"; - inherit version; - sha256 = "963bfa7f090269d30bdc5e25589e5fd9dad2cf2a7c6f176a7f2386910e5d0d8d"; - }; - }); - in - super.bonfire.overridePythonAttrs(old: { - version = "0.0.8"; - src = self.fetchFromGitHub { - owner = "blue-yonder"; - repo = "bonfire"; - rev = "0a0f18469d484aba6871fa7421bbb2c00ccefcb0"; - sha256 = "1y2r537ibghhmk6jngw0zwvh1vn2bihqcvji50ffh1j0qc6q3x6x"; - }; - postPatch = ""; - propagatedBuildInputs = self.lib.subtractLists [ self.python3Packages.click self.python3Packages.keyring ] old.propagatedBuildInputs ++ [ click keyring ]; - meta.broken = false; - }); -} diff --git a/overlays/bugwarrior/default.nix b/overlays/bugwarrior/default.nix deleted file mode 100644 index 2b25985..0000000 --- a/overlays/bugwarrior/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - bugwarrior = super.python3Packages.bugwarrior.overridePythonAttrs(old: rec { - patches = old.patches or [] ++ [ ./mantisbt.patch ]; - }); -} diff --git a/overlays/bugwarrior/mantisbt.patch b/overlays/bugwarrior/mantisbt.patch deleted file mode 100644 index 85e5af1..0000000 --- a/overlays/bugwarrior/mantisbt.patch +++ /dev/null @@ -1,379 +0,0 @@ -diff --git a/bugwarrior/services/mantisbt.py b/bugwarrior/services/mantisbt.py -new file mode 100644 -index 0000000..e54af0d ---- /dev/null -+++ b/bugwarrior/services/mantisbt.py -@@ -0,0 +1,361 @@ -+from builtins import filter -+import re -+import six -+ -+import requests -+from jinja2 import Template -+ -+from bugwarrior.config import asbool, aslist, die -+from bugwarrior.services import IssueService, Issue, ServiceClient -+ -+import logging -+log = logging.getLogger(__name__) -+ -+ -+class MantisbtClient(ServiceClient): -+ def __init__(self, host, token): -+ self.host = host -+ self.session = requests.Session() -+ self.session.headers['Authorization'] = token -+ -+ def _api_url(self, path, **context): -+ """ Build the full url to the API endpoint """ -+ baseurl = "https://{}/api/rest".format(self.host) -+ return baseurl + path.format(**context) -+ -+ def get_user(self): -+ return self.json_response(self.session.get(self._api_url("/users/me"))) -+ -+ def get_projects(self): -+ return self._getter(self._api_url("/projects"), subkey="projects") -+ -+ def get_issues(self): -+ url = self._api_url("/issues?page_size=50") -+ return self._getter(url, page_size=50, subkey="issues") -+ -+ def get_assigned_issues(self): -+ """ Returns all issues assigned to authenticated user. -+ """ -+ url = self._api_url("/issues?page_size=50&filter_id=assigned") -+ return self._getter(url, page_size=50, subkey="issues") -+ -+ def get_monitored_issues(self): -+ """ Returns all issues monitored by authenticated user. -+ """ -+ url = self._api_url("/issues?page_size=50&filter_id=monitored") -+ return self._getter(url, page_size=50, subkey="issues") -+ -+ def get_reported_issues(self): -+ """ Returns all issues reported by authenticated user. -+ """ -+ url = self._api_url("/issues?page_size=50&filter_id=reported") -+ return self._getter(url, page_size=50, subkey="issues") -+ -+ def _getter(self, url, page_size=None, subkey=None): -+ """ Pagination utility. Obnoxious. """ -+ -+ results = [] -+ link = dict(next=url) -+ page_number = 1 -+ -+ while 'next' in link: -+ if page_size is not None: -+ response = self.session.get(link['next'] + "&page=" + str(page_number)) -+ else: -+ response = self.session.get(link['next']) -+ -+ json_res = self.json_response(response) -+ -+ if subkey is not None: -+ json_res = json_res[subkey] -+ -+ results += json_res -+ -+ if page_size is not None and len(json_res) == page_size: -+ page_number += 1 -+ else: -+ break -+ -+ return results -+ -+class MantisbtIssue(Issue): -+ TITLE = 'mantisbttitle' -+ BODY = 'mantisbtbody' -+ CREATED_AT = 'mantisbtcreatedon' -+ UPDATED_AT = 'mantisbtupdatedat' -+ CLOSED_AT = 'mantisbtclosedon' -+ URL = 'mantisbturl' -+ PROJECT = 'mantisbtproject' -+ NUMBER = 'mantisbtnumber' -+ USER = 'mantisbtuser' -+ CATEGORY = 'mantisbtcategory' -+ STATE = 'mantisbtstate' -+ -+ UDAS = { -+ TITLE: { -+ 'type': 'string', -+ 'label': 'Mantisbt Title', -+ }, -+ BODY: { -+ 'type': 'string', -+ 'label': 'Mantisbt Body', -+ }, -+ CREATED_AT: { -+ 'type': 'date', -+ 'label': 'Mantisbt Created', -+ }, -+ UPDATED_AT: { -+ 'type': 'date', -+ 'label': 'Mantisbt Updated', -+ }, -+ CLOSED_AT: { -+ 'type': 'date', -+ 'label': 'Mantisbt Closed', -+ }, -+ PROJECT: { -+ 'type': 'string', -+ 'label': 'Mantisbt Project', -+ }, -+ URL: { -+ 'type': 'string', -+ 'label': 'Mantisbt URL', -+ }, -+ NUMBER: { -+ 'type': 'numeric', -+ 'label': 'Mantisbt Issue #', -+ }, -+ USER: { -+ 'type': 'string', -+ 'label': 'Mantisbt User', -+ }, -+ CATEGORY: { -+ 'type': 'string', -+ 'label': 'Mantisbt Category', -+ }, -+ STATE: { -+ 'type': 'string', -+ 'label': 'Mantisbt State', -+ } -+ } -+ UNIQUE_KEY = (URL, NUMBER, ) -+ -+ def _normalize_tag(self, label): -+ return re.sub(r'[^a-zA-Z0-9]', '_', label) -+ -+ def to_taskwarrior(self): -+ body = self.record.get('description') -+ if body: -+ body = body.replace('\r\n', '\n') -+ -+ created = self.parse_date(self.record.get('created_at')) -+ updated = self.parse_date(self.record.get('updated_at')) -+ closed_date = None -+ if self.record["status"]["name"] in ["closed", "resolved"]: -+ for history in self.record.get("history", []): -+ if history.get("field", {}).get("name", "") == "status"\ -+ and history.get("new_value", {}).get("name", "") in ["closed", "resolved"]: -+ closed_date = history["created_at"] -+ closed = self.parse_date(closed_date) -+ -+ return { -+ 'project': self.record['project']['name'], -+ 'priority': self.origin['default_priority'], -+ 'annotations': self.get_annotations(), -+ 'tags': self.get_tags(), -+ 'entry': created, -+ 'end': closed, -+ -+ self.TITLE: self.record.get('summary'), -+ self.BODY: body, -+ self.CREATED_AT: created, -+ self.UPDATED_AT: updated, -+ self.CLOSED_AT: closed, -+ self.URL: self.get_url(), -+ self.PROJECT: self.record['project'].get('name'), -+ self.NUMBER: self.record['id'], -+ self.USER: self.record['reporter'].get('name'), -+ self.CATEGORY: self.record['category'].get('name'), -+ self.STATE: self.record['status'].get('label'), -+ } -+ -+ def get_url(self): -+ return "https://{}view.php?id={}".format(self.extra['host'], self.record["id"]) -+ -+ def get_annotations(self): -+ annotations = [] -+ -+ context = self.record.copy() -+ annotation_template = Template(self.origin['annotation_template']) -+ -+ for annotation_dict in self.record.get('notes', []): -+ context.update({ -+ 'text': annotation_dict['text'], -+ 'date': annotation_dict['created_at'], -+ 'author': annotation_dict['reporter'].get('name', 'unknown'), -+ 'view': annotation_dict['view_state']['label'], -+ }) -+ annotations.append( -+ annotation_template.render(context) -+ ) -+ return annotations -+ -+ def get_tags(self): -+ tags = [] -+ -+ context = self.record.copy() -+ tag_template = Template(self.origin['tag_template']) -+ -+ for tag_dict in self.record.get('tags', []): -+ context.update({ -+ 'tag': self._normalize_tag(tag_dict['name']) -+ }) -+ tags.append( -+ tag_template.render(context) -+ ) -+ -+ return tags -+ -+ def get_default_description(self): -+ return self.build_default_description( -+ title=self.record['summary'], -+ url=self.get_processed_url(self.get_url()), -+ number=self.record['id'], -+ ) -+ -+ -+class MantisbtService(IssueService): -+ ISSUE_CLASS = MantisbtIssue -+ CONFIG_PREFIX = 'mantisbt' -+ -+ def __init__(self, *args, **kw): -+ super(MantisbtService, self).__init__(*args, **kw) -+ -+ self.host = self.config.get('host', 'www.mantisbt.org/bugs/') -+ -+ token = self.get_password('token') -+ -+ self.client = MantisbtClient(self.host, token) -+ self.user = None -+ -+ self.exclude_projects = self.config.get('exclude_projects', [], aslist) -+ self.include_projects = self.config.get('include_projects', [], aslist) -+ -+ self.involved_issues = self.config.get( -+ 'involved_issues', default=True, to_type=asbool -+ ) -+ self.assigned_issues = self.config.get( -+ 'assigned_issues', default=False, to_type=asbool -+ ) -+ self.monitored_issues = self.config.get( -+ 'monitored_issues', default=False, to_type=asbool -+ ) -+ self.reported_issues = self.config.get( -+ 'reported_issues', default=False, to_type=asbool -+ ) -+ self.tag_template = self.config.get( -+ 'tag_template', default='{{tag}}', to_type=six.text_type -+ ) -+ self.annotation_template = self.config.get( -+ 'annotation_template', default='{{date}} {{author}} ({{view}}): {{text}}', to_type=six.text_type -+ ) -+ -+ def get_service_metadata(self): -+ return { -+ 'tag_template': self.tag_template, -+ 'annotation_template': self.annotation_template, -+ } -+ -+ def filter_involved_issues(self, issue): -+ _, issue = issue -+ user = self.client.get_user() -+ uid = user["id"] -+ if issue["reporter"]["id"] != uid and \ -+ issue.get("handler", {}).get("id") != uid and \ -+ all([ x.get("user", {}).get("id") != uid for x in issue.get("history", [])]) and \ -+ all([ x.get("user", {}).get("id") != uid for x in issue.get("monitors", [])]): -+ return False -+ return self.filter_project_name(issue["project"]["name"]) -+ -+ def filter_issues(self, issue): -+ _, issue = issue -+ return self.filter_project_name(issue["project"]["name"]) -+ -+ def filter_project_name(self, name): -+ if self.exclude_projects: -+ if name in self.exclude_projects: -+ return False -+ -+ if self.include_projects: -+ if name in self.include_projects: -+ return True -+ else: -+ return False -+ -+ return True -+ -+ @staticmethod -+ def get_keyring_service(service_config): -+ host = service_config.get('host', 'www.mantisbt.org/bugs/') -+ username = service_config.get('username', default='nousername') -+ return "mantisbt://{username}@{host}".format(username=username, -+ host=host) -+ -+ @staticmethod -+ def to_issue_dict(issues): -+ return { i['id']: i for i in issues } -+ -+ def get_owner(self, issue): -+ return issue.get("handler", {}).get("name") -+ -+ def get_author(self, issue): -+ return issue.get("reporter", {}).get("name") -+ -+ def issues(self): -+ issues = {} -+ is_limited = self.assigned_issues or self.monitored_issues or self.reported_issues -+ -+ if self.assigned_issues: -+ issues.update( -+ filter(self.filter_issues, self.to_issue_dict(self.client.get_assigned_issues()).items()) -+ ) -+ if self.monitored_issues: -+ issues.update( -+ filter(self.filter_issues, self.to_issue_dict(self.client.get_monitored_issues()).items()) -+ ) -+ if self.reported_issues: -+ issues.update( -+ filter(self.filter_issues, self.to_issue_dict(self.client.get_reported_issues()).items()) -+ ) -+ -+ if not is_limited: -+ all_issues = self.to_issue_dict(self.client.get_issues()) -+ if self.involved_issues: -+ issues.update( -+ filter(self.filter_involved_issues, all_issues.items()) -+ ) -+ else: -+ issues.update( -+ filter(self.filter_issues, all_issues.items()) -+ ) -+ -+ log.debug(" Found %i issues.", len(issues)) -+ if not is_limited: -+ issues = list(filter(self.include, issues.values())) -+ else: -+ issues = list(issues.values()) -+ log.debug(" Pruned down to %i issues.", len(issues)) -+ -+ for issue in issues: -+ issue_obj = self.get_issue_for_record(issue) -+ extra = { -+ 'host': self.host -+ } -+ issue_obj.update_extra(extra) -+ yield issue_obj -+ -+ @classmethod -+ def validate_config(cls, service_config, target): -+ if 'token' not in service_config: -+ die("[%s] has no 'mantisbt.token'" % target) -+ -+ super(MantisbtService, cls).validate_config(service_config, target) -diff --git a/setup.py b/setup.py -index d6d957a..665e36e 100644 ---- a/setup.py -+++ b/setup.py -@@ -80,6 +80,7 @@ setup(name='bugwarrior', - activecollab2=bugwarrior.services.activecollab2:ActiveCollab2Service - activecollab=bugwarrior.services.activecollab:ActiveCollabService - jira=bugwarrior.services.jira:JiraService -+ mantisbt=bugwarrior.services.mantisbt:MantisbtService - megaplan=bugwarrior.services.megaplan:MegaplanService - phabricator=bugwarrior.services.phab:PhabricatorService - versionone=bugwarrior.services.versionone:VersionOneService diff --git a/overlays/bundix/default.nix b/overlays/bundix/default.nix deleted file mode 100644 index 6c4046c..0000000 --- a/overlays/bundix/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -self: super: { - bundix = super.bundix.overrideAttrs (old: { - preBuild = (old.preBuild or "") + '' - sed -i -e "/case obj/a\ when nil\n nil" lib/bundix/nixer.rb - ''; - }); -} diff --git a/overlays/databases/mysql/default.nix b/overlays/databases/mysql/default.nix deleted file mode 100644 index f9e5791..0000000 --- a/overlays/databases/mysql/default.nix +++ /dev/null @@ -1,24 +0,0 @@ -self: super: rec { - mariadb_pam = super.mariadb.overrideAttrs(old: { - cmakeFlags = old.cmakeFlags ++ [ "-DWITH_AUTHENTICATION_PAM=ON" ]; - buildInputs = old.buildInputs ++ [ self.pam ]; - outputs = old.outputs ++ [ "dev" ]; - postInstall = '' - mkdir -p $dev $dev/lib $dev/share - cp -a $out/include $dev - cp -a $out/lib/{libmariadbclient.a,libmysqlclient.a,libmysqlclient_r.a,libmysqlservices.a} $dev/lib - cp -a $out/lib/pkgconfig $dev/lib - cp -a $out/share/aclocal $dev/share - '' + old.postInstall; - }); - # This patched version includes C headers from the server part (see - # above). It seems to be required to build pam support in clients. - libmysqlclient_pam = super.libmysqlclient.overrideAttrs(old: { - prePatch = old.prePatch or "" + '' - sed -i -e '/define INCLUDE/s|"$| -I@CMAKE_SYSROOT@@CMAKE_INSTALL_PREFIX@/@INSTALL_INCLUDEDIR@/mysql/server -I@CMAKE_SYSROOT@@CMAKE_INSTALL_PREFIX@/@INSTALL_INCLUDEDIR@/mysql/server/private"|' mariadb_config/mariadb_config.c.in - ''; - postInstall = old.postInstall or "" + '' - cp -a ${mariadb_pam.dev}/include/* $out/include/mariadb - ''; - }); -} diff --git a/overlays/default.nix b/overlays/default.nix deleted file mode 100644 index bdc99d2..0000000 --- a/overlays/default.nix +++ /dev/null @@ -1,48 +0,0 @@ -let - flakeCompat = import ../lib/flake-compat.nix; - flakes = builtins.foldl' (a: b: a // b) {} (map (n: (flakeCompat n).overlays) [ - ../flakes/backports - ../flakes/openarc - ../flakes/opendmarc - ../flakes/peertube - ../flakes/private/peertube - ]); -in flakes // { - mylibs = self: super: { mylibs = import ../lib { pkgs = self; }; }; - mypkgs = self: super: import ../pkgs { pkgs = self; }; - - bitlbee = import ./bitlbee; - bitlbee-discord = import ./bitlbee-discord; - bonfire = import ./bonfire; - bundix = import ./bundix; - bugwarrior = import ./bugwarrior; - dwm = import ./dwm; - elinks = import ./elinks; - gitweb = import ./gitweb; - gitolite = import ./gitolite; - goaccess = import ./goaccess; - kanboard = import ./kanboard; - ledger = import ./ledger; - lesspipe = import ./lesspipe; - mysql = import ./databases/mysql; - neomutt = import ./neomutt; - nixops = import ./nixops; - pass = import ./pass; - pelican = import ./pelican; - php-packages = import ./php-packages; - postfix = import ./postfix; - postgresql = import ./databases/postgresql; - procps-ng = import ./procps-ng; - sc-im = import ./sc-im; - shaarli = import ./shaarli; - slrn = import ./slrn; - taskwarrior = import ./taskwarrior; - vcsh = import ./vcsh; - weechat = import ./weechat; - ympd = import ./ympd; - doing = import ./doing; - khal = import ./khal; - nix-direnv = import ./nix-direnv; - morph = import ./morph; -} -// import ./python-packages diff --git a/overlays/doing/default.nix b/overlays/doing/default.nix deleted file mode 100644 index 7f95fb6..0000000 --- a/overlays/doing/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -self: super: { - defaultGemConfig = super.defaultGemConfig // { - doing = attrs: { - postInstall = '' - installPath=$(cat $out/nix-support/gem-meta/install-path) - sed -i $installPath/lib/doing/wwid.rb -e "/Create a backup copy for the undo command/ {n;d}" - ''; - }; - }; -} diff --git a/overlays/dwm/default.nix b/overlays/dwm/default.nix deleted file mode 100644 index 96ed3ff..0000000 --- a/overlays/dwm/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -self: super: { - dwm = super.dwm.overrideAttrs(old: rec { - postPatch = '' - cp ${./dwm_config.h} ./config.h - ''; - }); -} diff --git a/overlays/dwm/dwm_config.h b/overlays/dwm/dwm_config.h deleted file mode 100644 index b1587e8..0000000 --- a/overlays/dwm/dwm_config.h +++ /dev/null @@ -1,98 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* appearance */ -static const unsigned int borderpx = 1; /* border pixel of windows */ -static const unsigned int snap = 32; /* snap pixel */ -static const int showbar = 1; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = { "monospace:size=10" }; -static const char dmenufont[] = "monospace:size=10"; -static const char col_gray1[] = "#222222"; -static const char col_gray2[] = "#444444"; -static const char col_gray3[] = "#bbbbbb"; -static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#005577"; -static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, -}; - -/* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating monitor */ - { "Nextcloud", NULL, NULL, 9 << 8, 0, -1 }, -}; - -/* layout(s) */ -static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ - -static const Layout layouts[] = { - /* symbol arrange function */ - { "[M]", monocle }, /* first entry is default */ - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ -}; - -/* key definitions */ -#define MODKEY Mod1Mask -#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; - -static Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY, XK_t, spawn, {.v = termcmd } }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_Return, zoom, {0} }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, -}; - -/* button definitions */ -/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ -static Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -}; - diff --git a/overlays/elinks/default.nix b/overlays/elinks/default.nix deleted file mode 100644 index 1744dc0..0000000 --- a/overlays/elinks/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -self: super: { - elinks = super.elinks.overrideAttrs (old: - self.mylibs.fetchedGithub ./elinks.json // rec { - preConfigure = ''sh autogen.sh''; - buildInputs = old.buildInputs ++ (with self; [ gettext automake autoconf ]); - configureFlags = [ - "--disable-smb" "--without-x" "--enable-cgi" - "--enable-leds" "--enable-256-colors" - "--enable-html-highlight" "--with-zlib" - ]; - patches = []; - } - ); -} diff --git a/overlays/elinks/elinks.json b/overlays/elinks/elinks.json deleted file mode 100644 index ea13b1f..0000000 --- a/overlays/elinks/elinks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "f86be65-master", - "meta": { - "name": "elinks", - "url": "https://github.com/nabetaro/elinks", - "branch": "master" - }, - "github": { - "owner": "nabetaro", - "repo": "elinks", - "rev": "f86be659718c0cd0a67f88b42f07044c23d0d028", - "sha256": "1jxb7xgawcjkb3gw4gqyw26g02709wwdbhyczfckh3l4njxhy14m", - "fetchSubmodules": true - } -} diff --git a/overlays/kanboard/default.nix b/overlays/kanboard/default.nix deleted file mode 100644 index 05f2882..0000000 --- a/overlays/kanboard/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -self: super: { - kanboard = { kanboard_config ? "/etc/kanboard/config.php" }: - super.kanboard.overrideAttrs(old: rec { - name = "kanboard-${version}"; - version = "1.2.9"; - src = self.fetchFromGitHub { - owner = "kanboard"; - repo = "kanboard"; - rev = "c4152316b14936556edf3bcc4d11f16ba31b8ae7"; - sha256 = "1hdr95cpxgdzrzhffs63gdl0g7122ma2zg8bkqwp42p5xphx0xan"; - }; - installPhase = '' - cp -a . $out - ln -s ${kanboard_config} $out/config.php - mv $out/data $out/dataold - ''; - }); -} diff --git a/overlays/khal/default.nix b/overlays/khal/default.nix deleted file mode 100644 index 597cc0e..0000000 --- a/overlays/khal/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -self: super: { - khal = super.khal.overridePythonAttrs(old: { - postPatch = '' - sed -i "s/Invalid value for \"ics\"/Invalid value for \\\'ics\\\'/" tests/cli_test.py - sed -i "s/Invalid value for \"\[ICS\]\"/Invalid value for \\\'[ICS]\\\'/" tests/cli_test.py - ''; - }); -} diff --git a/overlays/ledger/default.nix b/overlays/ledger/default.nix deleted file mode 100644 index 9f2df57..0000000 --- a/overlays/ledger/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -self: super: { - ledger = super.ledger.overrideAttrs(old: rec { - #name = "${old.pname}-${version}"; - #version = "3.2.1"; - #src = self.fetchFromGitHub { - # owner = "ledger"; - # repo = "ledger"; - # rev = "v${version}"; - # sha256 = "0x6jxwss3wwzbzlwmnwb8yzjk8f9wfawif4f1b74z2qg6hc4r7f6"; - #}; - patches = old.patches or [] ++ [ - (self.fetchpatch { - name = "xdgconfig.patch"; - url = "https://github.com/ledger/ledger/commit/c79674649dee7577d6061e3d0776922257520fd0.patch"; - sha256 = "0n82mjz9i17800r7vs45sxpss14rivsf1j8hrv7jal24iyfm01dz"; - excludes = [ "doc/NEWS.md" ]; - }) - ]; - }); -} diff --git a/overlays/lesspipe/default.nix b/overlays/lesspipe/default.nix deleted file mode 100644 index e53feae..0000000 --- a/overlays/lesspipe/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - lesspipe = super.lesspipe.overrideAttrs(old: { - configureFlags = (old.configureFlags or []) ++ [ "--yes" ]; - }); -} diff --git a/overlays/morph/default.nix b/overlays/morph/default.nix deleted file mode 100644 index 448f051..0000000 --- a/overlays/morph/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - morph = super.morph.overrideAttrs(old: { - patches = (old.patches or []) ++ [ ./verbose_nix.patch ./dry-run.patch ]; - }); -} diff --git a/overlays/neomutt/default.nix b/overlays/neomutt/default.nix deleted file mode 100644 index f03290a..0000000 --- a/overlays/neomutt/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -self: super: { - neomutt = super.neomutt.overrideAttrs(old: { - patches = old.patches or [] ++ [ - ./tx.patch - ]; - }); -} diff --git a/overlays/neomutt/tx.patch b/overlays/neomutt/tx.patch deleted file mode 100644 index c8736df..0000000 --- a/overlays/neomutt/tx.patch +++ /dev/null @@ -1,44 +0,0 @@ -commit 61ae454e1579d02736c48e3468a3237429214cdf -Author: Ismaël Bouya -Date: Tue Jun 2 13:03:04 2020 +0200 - - Add %tx to index_format - -diff --git a/hdrline.c b/hdrline.c -index 9224c6641..1594ed729 100644 ---- a/hdrline.c -+++ b/hdrline.c -@@ -575,6 +575,7 @@ static const char *index_format_str(char *buf, size_t buflen, size_t col, int co - const struct Address *from = TAILQ_FIRST(&e->env->from); - const struct Address *to = TAILQ_FIRST(&e->env->to); - const struct Address *cc = TAILQ_FIRST(&e->env->cc); -+ const struct Address *x_orig_to = TAILQ_FIRST(&e->env->x_original_to); - - buf[0] = '\0'; - switch (op) -@@ -1192,13 +1193,18 @@ static const char *index_format_str(char *buf, size_t buflen, size_t col, int co - - case 't': - tmp[0] = '\0'; -- if (!check_for_mailing_list(&e->env->to, "To ", tmp, sizeof(tmp)) && -- !check_for_mailing_list(&e->env->cc, "Cc ", tmp, sizeof(tmp))) -- { -- if (to) -- snprintf(tmp, sizeof(tmp), "To %s", mutt_get_name(to)); -- else if (cc) -- snprintf(tmp, sizeof(tmp), "Cc %s", mutt_get_name(cc)); -+ if (src[0] == 'x') { -+ snprintf(tmp, sizeof(tmp), "%s", mutt_get_name(x_orig_to)); -+ src++; -+ } else { -+ if (!check_for_mailing_list(&e->env->to, "To ", tmp, sizeof(tmp)) && -+ !check_for_mailing_list(&e->env->cc, "Cc ", tmp, sizeof(tmp))) -+ { -+ if (to) -+ snprintf(tmp, sizeof(tmp), "To %s", mutt_get_name(to)); -+ else if (cc) -+ snprintf(tmp, sizeof(tmp), "Cc %s", mutt_get_name(cc)); -+ } - } - mutt_format_s(buf, buflen, prec, tmp); - break; diff --git a/overlays/nix-direnv/default.nix b/overlays/nix-direnv/default.nix deleted file mode 100644 index c4c96e2..0000000 --- a/overlays/nix-direnv/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -self: super: { - nix-direnv = super.nix-direnv.overrideAttrs (old: { - postPatch = old.postPatch + '' - sed -i -e 's/TEMPDIR "$old_tmp"/TEMPDIR "$old_tmpdir"/' direnvrc - ''; - }); -} diff --git a/overlays/nixops/default.nix b/overlays/nixops/default.nix deleted file mode 100644 index 14aec3b..0000000 --- a/overlays/nixops/default.nix +++ /dev/null @@ -1,20 +0,0 @@ -self: super: { - nixops = super.nixops.overrideAttrs (old: { - patches = [ - ./fix_glibc.patch - (self.fetchpatch { - name = "hetzner_cloud.patch"; - url = "https://github.com/goodraven/nixops/commit/272e50d0b0262e49cdcaad42cdab57aad183d1c2.patch"; - sha256 = "12wcrb0155ald52m7fbr2m5rrxdnwdwripq91ckscgsk42mdc517"; - }) - ]; - preConfigure = (old.preConfigure or "") + '' - # https://github.com/NixOS/nixops/issues/1216 - sed -i -e "/Register the paths in the Nix database./s/#.*$/export USER=root/" nix/libvirtd-image.nix - - sed -i -e '/^import sys$/s/$/; sys.tracebacklimit = 0/' scripts/nixops - sed -i -e "/'keyFile'/s/'path'/'string'/" nixops/backends/__init__.py - sed -i -e "/security.initialRootPassword/d" nix/hetzner.nix - ''; - }); -} diff --git a/overlays/nixops/fix_glibc.patch b/overlays/nixops/fix_glibc.patch deleted file mode 100644 index 1aeb093..0000000 --- a/overlays/nixops/fix_glibc.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/nix/hetzner-bootstrap.nix b/nix/hetzner-bootstrap.nix -index 035e6f9..def42a1 100644 ---- a/nix/hetzner-bootstrap.nix -+++ b/nix/hetzner-bootstrap.nix -@@ -3,9 +3,7 @@ with import { system = "x86_64-linux"; }; - let - pkgsNative = import {}; - -- nixpart = python2Packages.nixpart0.override { -- useNixUdev = false; -- }; -+ nixpart = python2Packages.nixpart0; - - generateConfig = (import { - configuration = {}; diff --git a/overlays/nixops/hetzner_cloud.patch b/overlays/nixops/hetzner_cloud.patch deleted file mode 100644 index b75c116..0000000 --- a/overlays/nixops/hetzner_cloud.patch +++ /dev/null @@ -1,480 +0,0 @@ -From 272e50d0b0262e49cdcaad42cdab57aad183d1c2 Mon Sep 17 00:00:00 2001 -From: goodraven - -Date: Thu, 3 May 2018 22:24:58 -0700 -Subject: [PATCH] Initial commit adding support for hetzner cloud - -This is based on the digital ocean backend. It also uses nixos-infect. I extended nixos-infect to be generic -for both backends. - -Fixes #855 ---- - examples/trivial-hetzner-cloud.nix | 12 ++ - nix/eval-machine-info.nix | 1 + - nix/hetzner-cloud.nix | 56 +++++++ - nix/options.nix | 1 + - nixops/backends/hetzner_cloud.py | 230 +++++++++++++++++++++++++++++ - nixops/data/nixos-infect | 77 +++++++--- - 6 files changed, 354 insertions(+), 23 deletions(-) - create mode 100644 examples/trivial-hetzner-cloud.nix - create mode 100644 nix/hetzner-cloud.nix - create mode 100644 nixops/backends/hetzner_cloud.py - -diff --git a/examples/trivial-hetzner-cloud.nix b/examples/trivial-hetzner-cloud.nix -new file mode 100644 -index 000000000..c61add6bb ---- /dev/null -+++ b/examples/trivial-hetzner-cloud.nix -@@ -0,0 +1,12 @@ -+{ -+ resources.sshKeyPairs.ssh-key = {}; -+ -+ machine = { config, pkgs, ... }: { -+ services.openssh.enable = true; -+ -+ deployment.targetEnv = "hetznerCloud"; -+ deployment.hetznerCloud.serverType = "cx11"; -+ -+ networking.firewall.allowedTCPPorts = [ 22 ]; -+ }; -+} -diff --git a/nix/eval-machine-info.nix b/nix/eval-machine-info.nix -index 2884b4b47..6a7205786 100644 ---- a/nix/eval-machine-info.nix -+++ b/nix/eval-machine-info.nix -@@ -309,6 +309,7 @@ rec { - digitalOcean = optionalAttrs (v.config.deployment.targetEnv == "digitalOcean") v.config.deployment.digitalOcean; - gce = optionalAttrs (v.config.deployment.targetEnv == "gce") v.config.deployment.gce; - hetzner = optionalAttrs (v.config.deployment.targetEnv == "hetzner") v.config.deployment.hetzner; -+ hetznerCloud = optionalAttrs (v.config.deployment.targetEnv == "hetznerCloud") v.config.deployment.hetznerCloud; - container = optionalAttrs (v.config.deployment.targetEnv == "container") v.config.deployment.container; - route53 = v.config.deployment.route53; - virtualbox = -diff --git a/nix/hetzner-cloud.nix b/nix/hetzner-cloud.nix -new file mode 100644 -index 000000000..21d148c1a ---- /dev/null -+++ b/nix/hetzner-cloud.nix -@@ -0,0 +1,56 @@ -+{ config, pkgs, lib, utils, ... }: -+ -+with utils; -+with lib; -+with import ./lib.nix lib; -+ -+let -+ cfg = config.deployment.hetznerCloud; -+in -+{ -+ ###### interface -+ options = { -+ -+ deployment.hetznerCloud.authToken = mkOption { -+ default = ""; -+ example = "8b2f4e96af3997853bfd4cd8998958eab871d9614e35d63fab45a5ddf981c4da"; -+ type = types.str; -+ description = '' -+ The API auth token. We're checking the environment for -+ HETZNER_CLOUD_AUTH_TOKEN first and if that is -+ not set we try this auth token. -+ ''; -+ }; -+ -+ deployment.hetznerCloud.datacenter = mkOption { -+ example = "fsn1-dc8"; -+ default = null; -+ type = types.nullOr types.str; -+ description = '' -+ The datacenter. -+ ''; -+ }; -+ -+ deployment.hetznerCloud.location = mkOption { -+ example = "fsn1"; -+ default = null; -+ type = types.nullOr types.str; -+ description = '' -+ The location. -+ ''; -+ }; -+ -+ deployment.hetznerCloud.serverType = mkOption { -+ example = "cx11"; -+ type = types.str; -+ description = '' -+ Name or id of server types. -+ ''; -+ }; -+ }; -+ -+ config = mkIf (config.deployment.targetEnv == "hetznerCloud") { -+ nixpkgs.system = mkOverride 900 "x86_64-linux"; -+ services.openssh.enable = true; -+ }; -+} -diff --git a/nix/options.nix b/nix/options.nix -index 0866c3ab8..db021f74d 100644 ---- a/nix/options.nix -+++ b/nix/options.nix -@@ -22,6 +22,7 @@ in - ./keys.nix - ./gce.nix - ./hetzner.nix -+ ./hetzner-cloud.nix - ./container.nix - ./libvirtd.nix - ]; -diff --git a/nixops/backends/hetzner_cloud.py b/nixops/backends/hetzner_cloud.py -new file mode 100644 -index 000000000..a2cb176b9 ---- /dev/null -+++ b/nixops/backends/hetzner_cloud.py -@@ -0,0 +1,230 @@ -+# -*- coding: utf-8 -*- -+""" -+A backend for hetzner cloud. -+ -+This backend uses nixos-infect (which uses nixos LUSTRATE) to infect a -+hetzner cloud instance. The setup requires two reboots, one for -+the infect itself, another after we pushed the nixos image. -+""" -+import os -+import os.path -+import time -+import socket -+ -+import requests -+ -+import nixops.resources -+from nixops.backends import MachineDefinition, MachineState -+from nixops.nix_expr import Function, RawValue -+import nixops.util -+import nixops.known_hosts -+ -+infect_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'data', 'nixos-infect')) -+ -+API_HOST = 'api.hetzner.cloud' -+ -+class ApiError(Exception): -+ pass -+ -+class ApiNotFoundError(ApiError): -+ pass -+ -+class HetznerCloudDefinition(MachineDefinition): -+ @classmethod -+ def get_type(cls): -+ return "hetznerCloud" -+ -+ def __init__(self, xml, config): -+ MachineDefinition.__init__(self, xml, config) -+ self.auth_token = config["hetznerCloud"]["authToken"] -+ self.location = config["hetznerCloud"]["location"] -+ self.datacenter = config["hetznerCloud"]["datacenter"] -+ self.server_type = config["hetznerCloud"]["serverType"] -+ -+ def show_type(self): -+ return "{0} [{1}]".format(self.get_type(), self.location or self.datacenter or 'any location') -+ -+ -+class HetznerCloudState(MachineState): -+ @classmethod -+ def get_type(cls): -+ return "hetznerCloud" -+ -+ state = nixops.util.attr_property("state", MachineState.MISSING, int) # override -+ public_ipv4 = nixops.util.attr_property("publicIpv4", None) -+ public_ipv6 = nixops.util.attr_property("publicIpv6", None) -+ location = nixops.util.attr_property("hetznerCloud.location", None) -+ datacenter = nixops.util.attr_property("hetznerCloud.datacenter", None) -+ server_type = nixops.util.attr_property("hetznerCloud.serverType", None) -+ auth_token = nixops.util.attr_property("hetznerCloud.authToken", None) -+ server_id = nixops.util.attr_property("hetznerCloud.serverId", None, int) -+ -+ def __init__(self, depl, name, id): -+ MachineState.__init__(self, depl, name, id) -+ self.name = name -+ -+ def get_ssh_name(self): -+ return self.public_ipv4 -+ -+ def get_ssh_flags(self, *args, **kwargs): -+ super_flags = super(HetznerCloudState, self).get_ssh_flags(*args, **kwargs) -+ return super_flags + [ -+ '-o', 'UserKnownHostsFile=/dev/null', -+ '-o', 'StrictHostKeyChecking=no', -+ '-i', self.get_ssh_private_key_file(), -+ ] -+ -+ def get_physical_spec(self): -+ return Function("{ ... }", { -+ 'imports': [ RawValue('') ], -+ ('boot', 'loader', 'grub', 'device'): 'nodev', -+ ('fileSystems', '/'): { 'device': '/dev/sda1', 'fsType': 'ext4'}, -+ ('users', 'extraUsers', 'root', 'openssh', 'authorizedKeys', 'keys'): [self.depl.active_resources.get('ssh-key').public_key], -+ }) -+ -+ def get_ssh_private_key_file(self): -+ return self.write_ssh_private_key(self.depl.active_resources.get('ssh-key').private_key) -+ -+ def create_after(self, resources, defn): -+ # make sure the ssh key exists before we do anything else -+ return { -+ r for r in resources if -+ isinstance(r, nixops.resources.ssh_keypair.SSHKeyPairState) -+ } -+ -+ def get_auth_token(self): -+ return os.environ.get('HETZNER_CLOUD_AUTH_TOKEN', self.auth_token) -+ -+ def _api(self, path, method=None, data=None, json=True): -+ """Basic wrapper around requests that handles auth and serialization.""" -+ assert path[0] == '/' -+ url = 'https://%s%s' % (API_HOST, path) -+ token = self.get_auth_token() -+ if not token: -+ raise Exception('No hetzner cloud auth token set') -+ headers = { -+ 'Authorization': 'Bearer '+self.get_auth_token(), -+ } -+ res = requests.request( -+ method=method, -+ url=url, -+ json=data, -+ headers=headers) -+ -+ if res.status_code == 404: -+ raise ApiNotFoundError('Not Found: %r' % path) -+ elif not res.ok: -+ raise ApiError('Response for %s %s has status code %d: %s' % (method, path, res.status_code, res.content)) -+ if not json: -+ return -+ try: -+ res_data = res.json() -+ except ValueError as e: -+ raise ApiError('Response for %s %s has invalid JSON (%s): %r' % (method, path, e, res.content)) -+ return res_data -+ -+ -+ def destroy(self, wipe=False): -+ if not self.server_id: -+ self.log('server {} was never made'.format(self.name)) -+ return -+ self.log('destroying server {} with id {}'.format(self.name, self.server_id)) -+ try: -+ res = self._api('/v1/servers/%s' % (self.server_id), method='DELETE') -+ except ApiNotFoundError: -+ self.log("server not found - assuming it's been destroyed already") -+ -+ self.public_ipv4 = None -+ self.server_id = None -+ -+ return True -+ -+ def _create_ssh_key(self, public_key): -+ """Create or get an ssh key and return an id.""" -+ public_key = public_key.strip() -+ res = self._api('/v1/ssh_keys', method='GET') -+ name = 'nixops-%s-%s' % (self.depl.uuid, self.name) -+ deletes = [] -+ for key in res['ssh_keys']: -+ if key['public_key'].strip() == public_key: -+ return key['id'] -+ if key['name'] == name: -+ deletes.append(key['id']) -+ for d in deletes: -+ # This reply is empty, so don't decode json. -+ self._api('/v1/ssh_keys/%d' % d, method='DELETE', json=False) -+ res = self._api('/v1/ssh_keys', method='POST', data={ -+ 'name': name, -+ 'public_key': public_key, -+ }) -+ return res['ssh_key']['id'] -+ -+ def create(self, defn, check, allow_reboot, allow_recreate): -+ ssh_key = self.depl.active_resources.get('ssh-key') -+ if ssh_key is None: -+ raise Exception('Please specify a ssh-key resource (resources.sshKeyPairs.ssh-key = {}).') -+ -+ self.set_common_state(defn) -+ -+ if self.server_id is not None: -+ return -+ -+ ssh_key_id = self._create_ssh_key(ssh_key.public_key) -+ -+ req = { -+ 'name': self.name, -+ 'server_type': defn.server_type, -+ 'start_after_create': True, -+ 'image': 'debian-9', -+ 'ssh_keys': [ -+ ssh_key_id, -+ ], -+ } -+ -+ if defn.datacenter: -+ req['datacenter'] = defn.datacenter -+ elif defn.location: -+ req['location'] = defn.location -+ -+ self.log_start("creating server ...") -+ create_res = self._api('/v1/servers', method='POST', data=req) -+ self.server_id = create_res['server']['id'] -+ self.public_ipv4 = create_res['server']['public_net']['ipv4']['ip'] -+ self.public_ipv6 = create_res['server']['public_net']['ipv6']['ip'] -+ self.datacenter = create_res['server']['datacenter']['name'] -+ self.location = create_res['server']['datacenter']['location']['name'] -+ -+ action = create_res['action'] -+ action_path = '/v1/servers/%d/actions/%d' % (self.server_id, action['id']) -+ -+ while action['status'] == 'running': -+ time.sleep(1) -+ res = self._api(action_path, method='GET') -+ action = res['action'] -+ -+ if action['status'] != 'success': -+ raise Exception('unexpected status: %s' % action['status']) -+ -+ self.log_end("{}".format(self.public_ipv4)) -+ -+ self.wait_for_ssh() -+ self.log_start("running nixos-infect") -+ self.run_command('bash &1', stdin=open(infect_path)) -+ self.reboot_sync() -+ -+ def reboot(self, hard=False): -+ if hard: -+ self.log("sending hard reset to server...") -+ res = self._api('/v1/servers/%d/actions/reset' % self.server_id, method='POST') -+ action = res['action'] -+ action_path = '/v1/servers/%d/actions/%d' % (self.server_id, action['id']) -+ while action['status'] == 'running': -+ time.sleep(1) -+ res = self._api(action_path, method='GET') -+ action = res['action'] -+ if action['status'] != 'success': -+ raise Exception('unexpected status: %s' % action['status']) -+ self.wait_for_ssh() -+ self.state = self.STARTING -+ else: -+ MachineState.reboot(self, hard=hard) -diff --git a/nixops/data/nixos-infect b/nixops/data/nixos-infect -index 66634357b..437a2ec61 100644 ---- a/nixops/data/nixos-infect -+++ b/nixops/data/nixos-infect -@@ -68,26 +68,49 @@ makeConf() { - } - EOF - # (nixos-generate-config will add qemu-user and bind-mounts, so avoid) -+ local disk -+ if [ -e /dev/sda ]; then -+ disk=/dev/sda -+ else -+ disk=/dev/vda -+ fi - cat > /etc/nixos/hardware-configuration.nix << EOF - { ... }: - { - imports = [ ]; -- boot.loader.grub.device = "/dev/vda"; -- fileSystems."/" = { device = "/dev/vda1"; fsType = "ext4"; }; -+ boot.loader.grub.device = "${disk}"; -+ fileSystems."/" = { device = "${disk}1"; fsType = "ext4"; }; - } - EOF - - local IFS=$'\n' -- ens3_ip4s=($(ip address show dev eth0 | grep 'inet ' | sed -r 's|.*inet ([0-9.]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|')) -- ens3_ip6s=($(ip address show dev eth0 | grep 'inet6 .*global' | sed -r 's|.*inet6 ([0-9a-f:]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|')) -- ens4_ip4s=($(ip address show dev eth1 | grep 'inet ' | sed -r 's|.*inet ([0-9.]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|')) -- ens4_ip6s=($(ip address show dev eth1 | grep 'inet6 .*global' | sed -r 's|.*inet6 ([0-9a-f:]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|')) -- gateway=($(ip route show dev eth0 | grep default | sed -r 's|default via ([0-9.]+).*|\1|')) -- gateway6=($(ip -6 route show dev eth0 | grep default | sed -r 's|default via ([0-9a-f:]+).*|\1|')) -- ether0=($(ip address show dev eth0 | grep link/ether | sed -r 's|.*link/ether ([0-9a-f:]+) .*|\1|')) -- ether1=($(ip address show dev eth1 | grep link/ether | sed -r 's|.*link/ether ([0-9a-f:]+) .*|\1|')) -+ gateway=($(ip route show | grep default | sed -r 's|default via ([0-9.]+).*|\1|')) -+ gateway6=($(ip -6 route show | grep default | sed -r 's|default via ([0-9a-f:]+).*|\1|')) -+ interfaces=($(ip link | awk -F ': ' '/^[0-9]*: / {if ($2 != "lo") {print $2}}')) - nameservers=($(grep ^nameserver /etc/resolv.conf | cut -f2 -d' ')) - -+ # Predict the predictable name for each interface since that is enabled in -+ # the nixos system. -+ declare -A predictable_names -+ for interface in ${interfaces[@]}; do -+ # udevadm prints out the candidate names which will be selected if -+ # available in this order. -+ local name=$(udevadm info /sys/class/net/$interface | awk -F = ' -+ /^E: ID_NET_NAME_FROM_DATABASE=/ {arr[1]=$2} -+ /^E: ID_NET_NAME_ONBOARD=/ {arr[2]=$2} -+ /^E: ID_NET_NAME_SLOT=/ {arr[3]=$2} -+ /^E: ID_NET_NAME_PATH=/ {arr[4]=$2} -+ /^E: ID_NET_NAME_MAC=/ {arr[5]=$2} -+ END {for (i=1;i<6;i++) {if (length(arr[i]) > 0) { print arr[i]; break}}}') -+ if [ -z "$name" ]; then -+ echo Could not determine predictable name for interface $interface -+ fi -+ predictable_names[$interface]=$name -+ done -+ -+ # Take a gamble on the first interface being able to reach the gateway. -+ local default_interface=${predictable_names[${interfaces[0]}]} -+ - cat > /etc/nixos/networking.nix << EOF - { ... }: { - # This file was populated at runtime with the networking -@@ -96,25 +119,27 @@ EOF - nameservers = [$(for a in ${nameservers[@]}; do echo -n " - \"$a\""; done) - ]; -- defaultGateway = "${gateway}"; -- defaultGateway6 = "${gateway6}"; -+ defaultGateway = {address = "${gateway}"; interface = "${default_interface}";}; -+ defaultGateway6 = {address = "${gateway6}"; interface = "${default_interface}";}; - interfaces = { -- ens3 = { -- ip4 = [$(for a in ${ens3_ip4s[@]}; do echo -n " -- $a"; done) -- ]; -- ip6 = [$(for a in ${ens3_ip6s[@]}; do echo -n " -- $a"; done) -- ]; -- }; -- ens4 = { -- ip4 = [$(for a in ${ens4_ip4s[@]}; do echo -n " -+EOF -+ -+ for interface in ${interfaces[@]}; do -+ ip4s=($(ip address show dev $interface | grep 'inet ' | sed -r 's|.*inet ([0-9.]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|')) -+ ip6s=($(ip address show dev $interface | grep 'inet6 .*global' | sed -r 's|.*inet6 ([0-9a-f:]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|')) -+ cat >> /etc/nixos/networking.nix << EOF -+ ${predictable_names[$interface]} = { -+ ip4 = [$(for a in ${ip4s[@]}; do echo -n " - $a"; done) - ]; -- ip6 = [$(for a in ${ens4_ip6s[@]}; do echo -n " -+ ip6 = [$(for a in ${ip6s[@]}; do echo -n " - $a"; done) - ]; - }; -+EOF -+ done -+ -+ cat >> /etc/nixos/networking.nix << EOF - }; - }; - } -@@ -154,6 +179,12 @@ export HOME="/root" - groupadd -r nixbld -g 30000 - seq 1 10 | xargs -I{} useradd -c "Nix build user {}" -d /var/empty -g nixbld -G nixbld -M -N -r -s `which nologin` nixbld{} - -+if ! which curl >/dev/null 2>/dev/null; then -+ if which apt-get >/dev/null 2>/dev/null; then -+ apt-get update && apt-get install -y curl -+ fi -+fi -+ - curl https://nixos.org/nix/install | sh - - source ~/.nix-profile/etc/profile.d/nix.sh diff --git a/overlays/pass/default.nix b/overlays/pass/default.nix deleted file mode 100644 index ad8facd..0000000 --- a/overlays/pass/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - pass = super.pass.overrideAttrs (old: rec { - patches = old.patches ++ [ ./pass-fix-pass-init.patch ]; - }); -} diff --git a/overlays/pass/pass-fix-pass-init.patch b/overlays/pass/pass-fix-pass-init.patch deleted file mode 100644 index 10a76c1..0000000 --- a/overlays/pass/pass-fix-pass-init.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 33e8f1cd0065639a948d7b5ba3f93d43bdf7f3be Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= -Date: Sun, 11 Nov 2018 19:47:33 +0100 -Subject: [PATCH] Fix pass init for some gpg keys - -This fixes the pass init for gpg keys which have their main key as -encryption key. This may happen for instance with RSA keys and specific -configuration. ---- - src/password-store.sh | 2 +- - tests/t0300-reencryption.sh | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/password-store.sh b/src/password-store.sh -index d89d455..44d122e 100755 ---- a/src/password-store.sh -+++ b/src/password-store.sh -@@ -124,7 +124,7 @@ reencrypt_path() { - IFS=";" eval 'GPG_RECIPIENTS+=( $group )' # http://unix.stackexchange.com/a/92190 - unset "GPG_RECIPIENTS[$index]" - done -- gpg_keys="$($GPG $PASSWORD_STORE_GPG_OPTS --list-keys --with-colons "${GPG_RECIPIENTS[@]}" | sed -n 's/^sub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u)" -+ gpg_keys="$($GPG $PASSWORD_STORE_GPG_OPTS --list-keys --with-colons "${GPG_RECIPIENTS[@]}" | sed -n 's/^[ps]ub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u)" - fi - current_keys="$(LC_ALL=C $GPG $PASSWORD_STORE_GPG_OPTS -v --no-secmem-warning --no-permission-warning --decrypt --list-only --keyid-format long "$passfile" 2>&1 | sed -n 's/^gpg: public key is \([A-F0-9]\+\)$/\1/p' | LC_ALL=C sort -u)" - -diff --git a/tests/t0300-reencryption.sh b/tests/t0300-reencryption.sh -index 3c88987..57d873f 100755 ---- a/tests/t0300-reencryption.sh -+++ b/tests/t0300-reencryption.sh -@@ -7,7 +7,7 @@ cd "$(dirname "$0")" - INITIAL_PASSWORD="will this password live? a big question indeed..." - - canonicalize_gpg_keys() { -- $GPG --list-keys --with-colons "$@" | sed -n 's/sub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u -+ $GPG --list-keys --with-colons "$@" | sed -n 's/[ps]ub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u - } - gpg_keys_from_encrypted_file() { - $GPG -v --no-secmem-warning --no-permission-warning --decrypt --list-only --keyid-format long "$1" 2>&1 | grep "public key is" | cut -d ' ' -f 5 | LC_ALL=C sort -u --- -2.19.1 - diff --git a/overlays/pelican/default.nix b/overlays/pelican/default.nix deleted file mode 100644 index 4f8aece..0000000 --- a/overlays/pelican/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -self: super: { - pelican = with self.python3Packages; - pelican.overrideAttrs(old: { - propagatedBuildInputs = old.propagatedBuildInputs ++ [ pyyaml markdown ]; - doInstallCheck = false; - }); -} diff --git a/overlays/php-packages/default.nix b/overlays/php-packages/default.nix deleted file mode 100644 index 90fb613..0000000 --- a/overlays/php-packages/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -self: super: rec { - myPhpPackages.mysqli_pam = self.php74.extensions.mysqli.overrideAttrs(old: { - configureFlags = [ "--with-mysqli=${self.libmysqlclient_pam}/bin/mysql_config" "--with-mysql-sock=/run/mysqld/mysqld.sock" ]; - patches = old.patches or [] ++ [ ./mysqli_patch.patch ]; -}); -} diff --git a/overlays/procps-ng/default.nix b/overlays/procps-ng/default.nix deleted file mode 100644 index 2d43a11..0000000 --- a/overlays/procps-ng/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - procps-ng = super.procps-ng.overrideAttrs(old: { - configureFlags = old.configureFlags ++ [ "--enable-watch8bit" ]; - }); -} diff --git a/overlays/python-packages/buildbot.nix b/overlays/python-packages/buildbot.nix deleted file mode 100644 index ccf2f6a..0000000 --- a/overlays/python-packages/buildbot.nix +++ /dev/null @@ -1,8 +0,0 @@ -self: super: { - pythonOverrides = self.buildPythonOverrides (pyself: pysuper: { - buildbot-plugins = pysuper.buildbot-plugins // { - buildslist = self.python3PackagesPlus.buildbot-plugins.buildslist; - }; - buildbot-full = pysuper.buildbot-full.withPlugins [ pyself.buildbot-plugins.buildslist ]; - }) super.pythonOverrides; -} diff --git a/overlays/python-packages/default.nix b/overlays/python-packages/default.nix deleted file mode 100644 index 601eed1..0000000 --- a/overlays/python-packages/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -let - fromMyPythonPackages = name: self: super: { - pythonOverrides = self.buildPythonOverrides (pyself: pysuper: { - "${name}" = self."${pyself.python.pname}PackagesPlus"."${name}"; - }) super.pythonOverrides; - }; -in -{ - # https://github.com/NixOS/nixpkgs/issues/44426 - # needs to come before all other in alphabetical order (or make use of - # lib.mkBefore) - __pythonOverlayFix = self: super: let - pyNames = [ "python3" "python36" "python37" "python38" ]; - overriddenPython = name: [ - { inherit name; value = super.${name}.override { packageOverrides = self.pythonOverrides; }; } - { name = "${name}Packages"; value = self.recurseIntoAttrs self.${name}.pkgs; } - ]; - overriddenPythons = builtins.concatLists (map overriddenPython pyNames); - in { - pythonOverrides = pyself: pysuper: {}; - buildPythonOverrides = newOverrides: currentOverrides: super.lib.composeExtensions newOverrides currentOverrides; - } // super.lib.attrsets.listToAttrs overriddenPythons; - - - blivet3 = fromMyPythonPackages "blivet3"; - buildbot = import ./buildbot.nix; - wokkel = fromMyPythonPackages "wokkel"; - pymilter = fromMyPythonPackages "pymilter"; -} diff --git a/overlays/sc-im/default.nix b/overlays/sc-im/default.nix deleted file mode 100644 index f728655..0000000 --- a/overlays/sc-im/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -self: super: { - sc-im = super.sc-im.overrideAttrs (old: { - buildPhase = '' - cd src - sed -i Makefile -e 's@\...name.info@.local/state/$(name)info@' - cd .. - '' + old.buildPhase; - }); -} diff --git a/overlays/shaarli/default.nix b/overlays/shaarli/default.nix deleted file mode 100644 index 3b37ee8..0000000 --- a/overlays/shaarli/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -self: super: { - shaarli = varDir: super.shaarli.overrideAttrs (old: rec { - version = "0.10.2"; - src = self.fetchurl { - url = "https://github.com/shaarli/Shaarli/releases/download/v${version}/shaarli-v${version}-full.tar.gz"; - sha256 = "0h8sspj7siy3vgpi2i3gdrjcr5935fr4dfwq2zwd70sjx2sh9s78"; - }; - patchPhase = ""; - patches = (old.patches or []) ++ [ ./shaarli_ldap.patch ]; - installPhase = (old.installPhase or "") + '' - cp .htaccess $out/ - ln -sf ${varDir}/{cache,pagecache,tmp,data} $out/ - ''; - }); -} diff --git a/overlays/slrn/default.nix b/overlays/slrn/default.nix deleted file mode 100644 index 1bf5fe2..0000000 --- a/overlays/slrn/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - slrn = super.slrn.overrideAttrs (old: rec { - configureFlags = old.configureFlags ++ [ "--with-slrnpull" ]; - }); -} diff --git a/overlays/vcsh/default.nix b/overlays/vcsh/default.nix deleted file mode 100644 index eb4d48e..0000000 --- a/overlays/vcsh/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -self: super: { - vcsh = super.vcsh.overrideAttrs(old: { - patchPhase = old.patchPhase or "" + '' - sed -i -e 's@-r "$XDG_CONFIG_HOME/vcsh/config.d/$VCSH_REPO_NAME"@-f "$XDG_CONFIG_HOME/vcsh/config.d/$VCSH_REPO_NAME"@' vcsh - ''; - }); -} diff --git a/overlays/weechat/default.nix b/overlays/weechat/default.nix deleted file mode 100644 index e8cc792..0000000 --- a/overlays/weechat/default.nix +++ /dev/null @@ -1,12 +0,0 @@ -self: super: { - weechat = super.weechat.override { - configure = { availablePlugins, ... }: { - plugins = with self; with availablePlugins; [ - (python.withPackages (ps: with ps; [websocket_client emoji])) - perl - ruby - ]; - }; - }; - -} diff --git a/overlays/ympd/default.nix b/overlays/ympd/default.nix deleted file mode 100644 index dda17aa..0000000 --- a/overlays/ympd/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: { - ympd = super.ympd.overrideAttrs(old: self.mylibs.fetchedGithub ./ympd.json // { - patches = (old.patches or []) ++ [ ./ympd-password-env.patch ]; - }); -} diff --git a/overlays/ympd/ympd.json b/overlays/ympd/ympd.json deleted file mode 100644 index 51f06d5..0000000 --- a/overlays/ympd/ympd.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "612f8fc-master", - "meta": { - "name": "ympd", - "url": "https://github.com/notandy/ympd", - "branch": "master" - }, - "github": { - "owner": "notandy", - "repo": "ympd", - "rev": "612f8fc0b2c47fc89d403e4a044541c6b2b238c8", - "sha256": "01hnj10zl103mrn82vyd42fvq7w5az3jf1qz18889zv67kn73ll9", - "fetchSubmodules": true - } -} diff --git a/pkgs/cnagios/cnagios.json b/pkgs/cnagios/cnagios.json deleted file mode 100644 index 4c1c385..0000000 --- a/pkgs/cnagios/cnagios.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "3bd27fb-master", - "meta": { - "name": "cnagios", - "url": "https://github.com/dannywarren/cnagios", - "branch": "master" - }, - "github": { - "owner": "dannywarren", - "repo": "cnagios", - "rev": "3bd27fb40e68f61ffd01bea6234b919a667b6fe4", - "sha256": "0iy5pmlcz6y3if72nav22xqxniiv1v8ywi0927m6s459hkw5n2rb", - "fetchSubmodules": true - } -} diff --git a/pkgs/crypto/cardano/daedalus.json b/pkgs/crypto/cardano/daedalus.json deleted file mode 100644 index dcd14c5..0000000 --- a/pkgs/crypto/cardano/daedalus.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "0.15.1", - "meta": { - "name": "daedalus", - "url": "https://github.com/input-output-hk/daedalus", - "branch": "refs/tags/0.15.1" - }, - "github": { - "owner": "input-output-hk", - "repo": "daedalus", - "rev": "998fd3189c9a54fac496dfef7a6224714c67bc80", - "sha256": "1r3gwfv6hn7lzp4h2s6849m7x12nxadsql358ss615krvdlnb6rr", - "fetchSubmodules": true - } -} diff --git a/pkgs/crypto/iota-cli-app/iota-cli-app.json b/pkgs/crypto/iota-cli-app/iota-cli-app.json deleted file mode 100644 index 6b47dec..0000000 --- a/pkgs/crypto/iota-cli-app/iota-cli-app.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "d7e2e08-master", - "meta": { - "name": "iota-cli-app", - "url": "https://github.com/iotaledger/cli-app", - "branch": "master" - }, - "github": { - "owner": "iotaledger", - "repo": "cli-app", - "rev": "d7e2e0856ae6bd34890fefb4245c07cd467a5032", - "sha256": "1n9kczsxdgjv8282nj2grlijvxipiskx0ndn169vz6v1l1hrwc8b", - "fetchSubmodules": true - } -} diff --git a/pkgs/default.nix b/pkgs/default.nix deleted file mode 100644 index 5f5df82..0000000 --- a/pkgs/default.nix +++ /dev/null @@ -1,64 +0,0 @@ -{ pkgs }: -with pkgs; -let - mylibs = import ../lib { inherit pkgs; }; -in -rec { - sources = import ../nix/sources.nix; - myEnvironments = callPackage ../environments {}; - boinctui = callPackage ./boinctui {}; - cnagios = callPackage ./cnagios { inherit mylibs; }; - commento = callPackage ./commento {}; - flrn = callPackage ./flrn { inherit mylibs; slang = callPackage ./slang_1 {}; }; - genius = callPackage ./genius {}; - mtop = callPackage ./mtop {}; - muttprint = callPackage ./muttprint {}; - mutt-ics = callPackage ./mutt-ics { inherit mylibs; }; - nagios-cli = callPackage ./nagios-cli { inherit mylibs; }; - nagnu = callPackage ./nagnu { inherit mylibs; }; - nb = callPackage ./nb {}; - note = callPackage ./note {}; - notmuch-python2 = callPackage ./notmuch/notmuch-python { pythonPackages = python2Packages; }; - notmuch-python3 = callPackage ./notmuch/notmuch-python { pythonPackages = python3Packages; }; - notmuch-vim = callPackage ./notmuch/notmuch-vim {}; - pgloader = callPackage ./pgloader {}; - predixy = callPackage ./predixy { inherit mylibs; }; - rrsync_sudo = callPackage ./rrsync_sudo {}; - signaldctl = callPackage ./signaldctl {}; - telegram-history-dump = callPackage ./telegram-history-dump { inherit mylibs; }; - telegramircd = callPackage ./telegramircd { inherit mylibs; telethon = callPackage ./telethon_sync {}; }; - terminal-velocity = callPackage ./terminal-velocity {}; - tiv = callPackage ./tiv {}; - twins = callPackage ./twins {}; - umami = callPackage ./umami {}; - unicodeDoc = callPackage ./unicode {}; - - cardano = callPackage ./crypto/cardano { inherit mylibs; }; - cardano-cli = callPackage ./crypto/cardano-cli {}; - iota-cli-app = callPackage ./crypto/iota-cli-app { inherit mylibs; }; - sia = callPackage ./crypto/sia {}; - - proftpd = callPackage ./proftpd {}; - pure-ftpd = callPackage ./pure-ftpd {}; - - composerEnv = callPackage ./composer-env {}; - webapps = callPackage ./webapps { inherit mylibs composerEnv; }; - - monitoring-plugins = callPackage ./monitoring-plugins {}; - naemon = callPackage ./naemon { inherit mylibs monitoring-plugins; }; - naemon-livestatus = callPackage ./naemon-livestatus { inherit mylibs naemon; }; - gearmand = callPackage ./gearmand {}; - status_engine = { - module = callPackage ./status_engine/module.nix { inherit mylibs; }; - worker = callPackage ./status_engine/worker.nix { inherit mylibs composerEnv; }; - interface = callPackage ./status_engine/interface.nix { inherit composerEnv; }; - }; - - python3PackagesPlus = callPackage ./python-packages { - python = python3; - inherit mylibs; - }; - dovecot_deleted-to-trash = callPackage ./dovecot/plugins/deleted_to_trash { - inherit mylibs; - }; -} diff --git a/pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json b/pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json deleted file mode 100644 index 2987a02..0000000 --- a/pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "81b0754-master", - "meta": { - "name": "dovecot-deleted_to_trash", - "url": "https://github.com/lexbrugman/dovecot_deleted_to_trash", - "branch": "master" - }, - "github": { - "owner": "lexbrugman", - "repo": "dovecot_deleted_to_trash", - "rev": "81b07549accfc36467bf8527a53c295c7a02dbb9", - "sha256": "1b3k31g898s4fa0a9l4kvjsdyds772waaay84sjdxv09jw6mqs0f", - "fetchSubmodules": true - } -} diff --git a/pkgs/flrn/flrn.json b/pkgs/flrn/flrn.json deleted file mode 100644 index 3d7a944..0000000 --- a/pkgs/flrn/flrn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "860d642-master", - "meta": { - "name": "flrn", - "url": "https://github.com/Cigaes/flrn", - "branch": "master" - }, - "github": { - "owner": "Cigaes", - "repo": "flrn", - "rev": "860d642bd6389a209c8b697bd044f78d23406509", - "sha256": "0sqlxxpy1xg7cb2hbxcr0al46nyr6jjnns4b5i8w04z5sypa9r5c", - "fetchSubmodules": true - } -} diff --git a/pkgs/mutt-ics/default.nix b/pkgs/mutt-ics/default.nix deleted file mode 100644 index a8a529b..0000000 --- a/pkgs/mutt-ics/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ python3Packages, mylibs }: -with python3Packages; -buildPythonApplication (mylibs.fetchedGithub ./mutt-ics.json // { - propagatedBuildInputs = [ icalendar ]; -}) diff --git a/pkgs/mutt-ics/mutt-ics.json b/pkgs/mutt-ics/mutt-ics.json deleted file mode 100644 index ae8ed37..0000000 --- a/pkgs/mutt-ics/mutt-ics.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "d291187-master", - "meta": { - "name": "mutt-ics", - "url": "https://github.com/dmedvinsky/mutt-ics", - "branch": "master" - }, - "github": { - "owner": "dmedvinsky", - "repo": "mutt-ics", - "rev": "d29118788f291f67d34fefa6eda9f95846a2fe34", - "sha256": "0kqzngsvzjq5gpf60jhfmb2xzjznvk172khf4dlcb72n3ak4rb92", - "fetchSubmodules": true - } -} diff --git a/pkgs/naemon-livestatus/naemon-livestatus.json b/pkgs/naemon-livestatus/naemon-livestatus.json deleted file mode 100644 index c648d2b..0000000 --- a/pkgs/naemon-livestatus/naemon-livestatus.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "33dbcfe-master", - "meta": { - "name": "naemon-livestatus", - "url": "https://github.com/naemon/naemon-livestatus", - "branch": "master" - }, - "github": { - "owner": "naemon", - "repo": "naemon-livestatus", - "rev": "33dbcfe18e42158f25c27cff95a1e07b73be53b0", - "sha256": "16jk0c6pwr7ck0g6s12hj6czbhgdr7c7f74zzsp5279af86y8fd6", - "fetchSubmodules": true - } -} diff --git a/pkgs/naemon/naemon.json b/pkgs/naemon/naemon.json deleted file mode 100644 index 2dc9809..0000000 --- a/pkgs/naemon/naemon.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "d7ac1c8-master", - "meta": { - "name": "naemon", - "url": "https://github.com/naemon/naemon-core", - "branch": "master" - }, - "github": { - "owner": "naemon", - "repo": "naemon-core", - "rev": "d7ac1c824e01dbb1c4a6bd0550b324e7cf165d54", - "sha256": "003grwciplnqfn9jh2km2pm6xxp8fxvmwihg3vmch8f0vfwcmv1m", - "fetchSubmodules": true - } -} diff --git a/pkgs/nagios-cli/default.nix b/pkgs/nagios-cli/default.nix deleted file mode 100644 index 7d7e7cc..0000000 --- a/pkgs/nagios-cli/default.nix +++ /dev/null @@ -1,2 +0,0 @@ -{ python2Packages, mylibs }: -python2Packages.buildPythonApplication (mylibs.fetchedGithub ./nagios-cli.json) diff --git a/pkgs/nagios-cli/nagios-cli.json b/pkgs/nagios-cli/nagios-cli.json deleted file mode 100644 index fc91227..0000000 --- a/pkgs/nagios-cli/nagios-cli.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "edc51ea-master", - "meta": { - "name": "nagios-cli", - "url": "https://github.com/tehmaze/nagios-cli", - "branch": "master" - }, - "github": { - "owner": "tehmaze", - "repo": "nagios-cli", - "rev": "edc51eaccf1086bb4469ce45c5e5155f2d71a2f9", - "sha256": "1qw5fv4niz079zqwmfr3kzjv8cc31rbhi9whdbv9c32qdi3h7vsp", - "fetchSubmodules": true - } -} diff --git a/pkgs/nagnu/default.nix b/pkgs/nagnu/default.nix deleted file mode 100644 index 2b9c0ec..0000000 --- a/pkgs/nagnu/default.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ stdenv, mylibs, ncurses, curl }: -stdenv.mkDerivation (mylibs.fetchedGithub ./nagnu.json // rec { - buildInputs = [ ncurses curl ]; - installPhase = '' - mkdir -p $out/bin - cp nagnu $out/bin - mkdir -p $out/share/doc/nagnu - cp nagnu.conf.sample $out/share/doc/nagnu - mkdir -p $out/share/man/man8 - cp docs/nagnu.8 $out/share/man/man8 - ''; -}) diff --git a/pkgs/nagnu/nagnu.json b/pkgs/nagnu/nagnu.json deleted file mode 100644 index 60a8b07..0000000 --- a/pkgs/nagnu/nagnu.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "c7e65fc-master", - "meta": { - "name": "nagnu", - "url": "https://github.com/frlen/nagnu", - "branch": "master" - }, - "github": { - "owner": "frlen", - "repo": "nagnu", - "rev": "c7e65fc02f46a3756a4cc47953ea2f3e57a84728", - "sha256": "1i2jm8ibvqcc734daamnzc3hx8q0nsry1x12q0kr5yvcsdjjgyy3", - "fetchSubmodules": true - } -} diff --git a/pkgs/pgloader/default.nix b/pkgs/pgloader/default.nix deleted file mode 100644 index 6093ada..0000000 --- a/pkgs/pgloader/default.nix +++ /dev/null @@ -1,40 +0,0 @@ -# https://github.com/NixOS/nixpkgs/pull/61702 -{ stdenv, fetchurl, makeWrapper, sbcl, sqlite, freetds, libzip, curl, git, cacert, openssl }: -stdenv.mkDerivation rec { - pname = "pgloader"; - version = "3.6.1"; - name = "${pname}-${version}"; - - src = fetchurl { - url = "https://github.com/dimitri/pgloader/releases/download/v3.6.1/pgloader-bundle-3.6.1.tgz"; - sha256 = "1sm8xmq30d1biin5br0y3vrv4fydbrzfqglz1hnvrkdyxrg7d6f9"; - }; - - nativeBuildInputs = [ git makeWrapper ]; - buildInputs = [ sbcl cacert sqlite freetds libzip curl openssl ]; - - LD_LIBRARY_PATH = stdenv.lib.makeLibraryPath [ sqlite libzip curl git openssl freetds ]; - - buildPhase = '' - export PATH=$PATH:$out/bin - export HOME=$TMPDIR - - make pgloader - ''; - - dontStrip = true; - enableParallelBuilding = false; - - installPhase = '' - install -Dm755 bin/pgloader "$out/bin/pgloader" - wrapProgram $out/bin/pgloader --prefix LD_LIBRARY_PATH : "${LD_LIBRARY_PATH}" - ''; - - meta = with stdenv.lib; { - homepage = https://pgloader.io/; - description = "pgloader loads data into PostgreSQL and allows you to implement Continuous Migration from your current database to PostgreSQL"; - maintainers = with maintainers; [ mguentner ]; - license = licenses.postgresql; - platforms = platforms.all; - }; -} diff --git a/pkgs/predixy/default.nix b/pkgs/predixy/default.nix deleted file mode 100644 index 7e7a9ba..0000000 --- a/pkgs/predixy/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ stdenv, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./predixy.json // { - installPhase = '' - mkdir -p $out/bin - cp src/predixy $out/bin - mkdir -p $out/share - cp -r doc $out/share - cp -r conf $out/share/doc - ''; -}) diff --git a/pkgs/predixy/predixy.json b/pkgs/predixy/predixy.json deleted file mode 100644 index 9f9759c..0000000 --- a/pkgs/predixy/predixy.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "dacf3fb-master", - "meta": { - "name": "predixy", - "url": "https://github.com/joyieldInc/predixy", - "branch": "master" - }, - "github": { - "owner": "joyieldInc", - "repo": "predixy", - "rev": "dacf3fb30c2602dc044040df04e194d44b49c1be", - "sha256": "0sbvy0jg551lwkfq8qh0a49cl9mhfnkhi3cnk25l8pz4jcdrr9k9", - "fetchSubmodules": true - } -} diff --git a/pkgs/python-packages/blivet/default.nix b/pkgs/python-packages/blivet/default.nix deleted file mode 100644 index 108d548..0000000 --- a/pkgs/python-packages/blivet/default.nix +++ /dev/null @@ -1,118 +0,0 @@ -{ lib, writeText, poetry2nix, python, pythonPackages, - gobject-introspection, libblockdev, libbytesize, fetchFromGitHub, - pkg-config, parted, systemd, - with_dmraid ? false, - with_fs_btrfs ? false, - with_fs_fat ? false, - with_fs_f2fs ? false, - with_fs_hfs_plus ? false, - with_fs_jfs ? false, - with_fs_nfs ? false, - with_fs_nfsv4 ? false, - with_fs_ntfs ? false, - with_fs_reiserfs ? false, - with_fs_xfs ? false, - with_luks ? false, - with_lvm ? false, - with_mdadm ? false, - with_multipath ? false, - with_optical ? false, - with_iscsi ? false, - dmraid, multipath_tools, lvm2, eject, kmod, utillinux, lsof, - openiscsi, coreutils, dosfstools, e2fsprogs, jfsutils, btrfs-progs, - xfsprogs, f2fs-tools, hfsprogs, nfs-utils, ntfs3g, ntfsprogs, - reiserfsprogs, devicemapper, cryptsetup, mdadm -}@args: -let - # FIXME: blivet/tasks/fsmount.py links to /sbin - additionalPackages = - lib.optionals with_dmraid [ dmraid ] - ++ lib.optionals with_fs_btrfs [ btrfs-progs ] - ++ lib.optionals with_fs_fat [ dosfstools ] - ++ lib.optionals with_fs_f2fs [ f2fs-tools ] - ++ lib.optionals with_fs_hfs_plus [ hfsprogs ] - ++ lib.optionals with_fs_jfs [ jfsutils ] - ++ lib.optionals with_fs_nfs [ nfs-utils ] - ++ lib.optionals with_fs_ntfs [ ntfs3g ntfsprogs ] - ++ lib.optionals with_fs_reiserfs [ reiserfsprogs ] - ++ lib.optionals with_fs_xfs [ xfsprogs.bin ] - ++ lib.optionals with_luks [ devicemapper cryptsetup ] - ++ lib.optionals with_lvm [ lvm2 ] - ++ lib.optionals with_mdadm [ mdadm ] - ++ lib.optionals with_multipath [ multipath_tools ] - ++ lib.optionals with_optical [ eject ] - ++ lib.optionals with_iscsi [ openiscsi ]; -in -# nix-shell -E "with import {}; pkgs.mkShell { buildInputs = [ python3 python3Packages.blivet3 ]; }" -# nix-shell -E "with import {}; pkgs.mkShell { buildInputs = [ (python3.withPackages(p: [ p.blivet3 ])) ]; }" -poetry2nix.mkPoetryApplication { - inherit python; - propagatedBuildInputs = [ - gobject-introspection - (pythonPackages.toPythonModule libblockdev) - (pythonPackages.toPythonModule libbytesize) - ]; - src = fetchFromGitHub { - owner = "storaged-project"; - repo = "blivet"; - rev = "blivet-3.3.0"; - sha256 = "0ynxm37cxxr2sf2hj18hrdxs1qfw6dgdagkvv5f6g4fmp51m7c3c"; - }; - overrides = poetry2nix.overrides.withDefaults (self: super: { - pyparted = super.pyparted.overridePythonAttrs (old: { - buildInputs = old.buildInputs ++ [ parted ]; - nativeBuildInputs = old.nativeBuildInputs ++ [ pkg-config ]; - }); - selinux = super.selinux.overridePythonAttrs (old: { - buildInputs = old.buildInputs ++ [ self.setuptools-scm-git-archive ]; - nativeBuildInputs = old.nativeBuildInputs ++ [ pkg-config ]; - }); - }); - patches = [ ./fix_path.patch ]; - postPatch = let - runtimePaths = lib.makeBinPath ([ - systemd utillinux kmod e2fsprogs mdadm lsof coreutils - ] ++ additionalPackages); - libraryPath = builtins.concatStringsSep " " (map (v: "-rpath ${v}/lib -L ${v}/lib") [ systemd.lib ]); - giLibraryPath = lib.makeSearchPath "lib/girepository-1.0" [libblockdev gobject-introspection]; - addGiPath = writeText "add-gi-path" '' - import os - newGiPath = "${giLibraryPath}" - if newGiPath not in os.environ.get("GI_TYPELIB_PATH", ""): - os.environ["GI_TYPELIB_PATH"] = os.environ.get("GI_TYPELIB_PATH", "") + ":" + newGiPath - ''; - addPath = writeText "add-path" '' - import os - newPath = "${runtimePaths}" - newLibraryPath = "${libraryPath}" - if newPath not in os.environ.get("PATH", ""): - os.environ["PATH"] = os.environ.get("PATH", "") + ":" + newPath - os.environ["NIX_LDFLAGS"] = os.environ.get("NIX_LDFLAGS", "") + " " + newLibraryPath - ''; - in - '' - prepend() { - mv "$1" "$1.bak" - cat ${addPath} "$1.bak" > $1 - rm -f "$1.bak" - } - prepend "blivet/__init__.py" - prepend "blivet/iscsi.py" - prepend "blivet/tasks/availability.py" - prepend "blivet/util.py" - prepend "blivet/udev.py" - prependGi() { - mv "$1" "$1.bak" - cat ${addGiPath} "$1.bak" > $1 - rm -f "$1.bak" - } - grep -rl require_version blivet/ | while read i; do prependGi "$i"; done - sed -i -e "s@/lib/modules@/run/booted-system/kernel-modules/lib/modules/@" blivet/tasks/fsmount.py - ''; - postInstall = let - in '' - rm -rf $out/lib/python*/site-packages/{etc,usr} - ''; - pyproject = ./pyproject.toml; - poetrylock = ./poetry.lock; -} diff --git a/pkgs/python-packages/blivet/fix_path.patch b/pkgs/python-packages/blivet/fix_path.patch deleted file mode 100644 index 29c4052..0000000 --- a/pkgs/python-packages/blivet/fix_path.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/blivet/tasks/fsmount.py b/blivet/tasks/fsmount.py -index 15f79a3e..bb3fe873 100644 ---- a/blivet/tasks/fsmount.py -+++ b/blivet/tasks/fsmount.py -@@ -19,6 +19,7 @@ - # - # Red Hat Author(s): Anne Mulhern - -+from distutils.spawn import find_executable - import os - - from ..errors import FSError -@@ -58,7 +59,7 @@ class FSMount(task.BasicApplication, fstask.FSTask): - @property - def _can_mount(self): - return (self.mount_type in fslib.kernel_filesystems) or \ -- (os.access("/sbin/mount.%s" % (self.mount_type,), os.X_OK)) or \ -+ (find_executable("mount.%s" % (self.mount_type,)) is not None) or \ - self._has_driver - - @property diff --git a/pkgs/python-packages/blivet/poetry.lock b/pkgs/python-packages/blivet/poetry.lock deleted file mode 100644 index c45011a..0000000 --- a/pkgs/python-packages/blivet/poetry.lock +++ /dev/null @@ -1,96 +0,0 @@ -[[package]] -name = "distro" -version = "1.5.0" -description = "Distro - an OS platform information API" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pycairo" -version = "1.19.1" -description = "Python interface for cairo" -category = "main" -optional = false -python-versions = ">=3.5, <4" - -[[package]] -name = "pygobject" -version = "3.36.1" -description = "Python bindings for GObject Introspection" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.dependencies] -pycairo = ">=1.11.1" - -[[package]] -name = "pyparted" -version = "3.11.6" -description = "Python bindings for GNU parted" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyudev" -version = "0.22.0" -description = "A libudev binding" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -six = "*" - -[[package]] -name = "selinux" -version = "0.2.1" -description = "shim selinux module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" - -[package.dependencies] -distro = ">=1.3.0" -setuptools = ">=39.0" - -[[package]] -name = "six" -version = "1.15.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[metadata] -lock-version = "1.0" -python-versions = "^3.8" -content-hash = "636edb46b1deb0f6d5db636b0bc6639205335c9915480b156a417067137548f8" - -[metadata.files] -distro = [ - {file = "distro-1.5.0-py2.py3-none-any.whl", hash = "sha256:df74eed763e18d10d0da624258524ae80486432cd17392d9c3d96f5e83cd2799"}, - {file = "distro-1.5.0.tar.gz", hash = "sha256:0e58756ae38fbd8fc3020d54badb8eae17c5b9dcbed388b17bb55b8a5928df92"}, -] -pycairo = [ - {file = "pycairo-1.19.1.tar.gz", hash = "sha256:2c143183280feb67f5beb4e543fd49990c28e7df427301ede04fc550d3562e84"}, -] -pygobject = [ - {file = "PyGObject-3.36.1.tar.gz", hash = "sha256:012a589aec687bfa809a1ff9f5cd775dc7f6fcec1a6bc7fe88e1002a68f8ba34"}, -] -pyparted = [ - {file = "pyparted-3.11.6.tar.gz", hash = "sha256:727ccdf308c194069aa9797f7a6a973bc95b2e407cdf5d58d6c8bc4c9dec92dc"}, -] -pyudev = [ - {file = "pyudev-0.22.0.tar.gz", hash = "sha256:69bb1beb7ac52855b6d1b9fe909eefb0017f38d917cba9939602c6880035b276"}, -] -selinux = [ - {file = "selinux-0.2.1-py2.py3-none-any.whl", hash = "sha256:820adcf1b4451c9cc7759848797703263ba0eb6a4cad76d73548a9e0d57b7926"}, - {file = "selinux-0.2.1.tar.gz", hash = "sha256:d435f514e834e3fdc0941f6a29d086b80b2ea51b28112aee6254bd104ee42a74"}, -] -six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, -] diff --git a/pkgs/python-packages/blivet/pyproject.toml b/pkgs/python-packages/blivet/pyproject.toml deleted file mode 100644 index cf86aa1..0000000 --- a/pkgs/python-packages/blivet/pyproject.toml +++ /dev/null @@ -1,20 +0,0 @@ -[tool.poetry] -name = "blivet" -version = "3.3.0" -description = "A python module for system storage configuration" -authors = ["David Lehman "] -license = "GPL-2.0-or-later" - -[tool.poetry.dependencies] -python = "^3.8" -six = "^1.15.0" -pyudev = "^0.22.0" -pyparted = "^3.11.6" -selinux = "^0.2.1" -pygobject = "^3.36.1" - -[tool.poetry.dev-dependencies] - -[build-system] -requires = ["poetry>=0.12"] -build-backend = "poetry.masonry.api" diff --git a/pkgs/python-packages/buildbot/plugins/default.nix b/pkgs/python-packages/buildbot/plugins/default.nix deleted file mode 100644 index 22a8507..0000000 --- a/pkgs/python-packages/buildbot/plugins/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ callPackage, python }: -{ - buildslist = callPackage ./buildslist { - pythonPackages = python.pkgs; - }; -} diff --git a/pkgs/python-packages/default.nix b/pkgs/python-packages/default.nix deleted file mode 100644 index 441c5bc..0000000 --- a/pkgs/python-packages/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ mylibs, callPackage, python }: -{ - blivet3 = callPackage ./blivet { inherit python; pythonPackages = python.pkgs; }; - buildbot-plugins = callPackage ./buildbot/plugins { inherit python; }; - wokkel = callPackage ./wokkel.nix { pythonPackages = python.pkgs; }; - pymilter = callPackage ./pymilter.nix { pythonPackages = python.pkgs; }; -} diff --git a/pkgs/python-packages/pymilter.nix b/pkgs/python-packages/pymilter.nix deleted file mode 100644 index 736794e..0000000 --- a/pkgs/python-packages/pymilter.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ pythonPackages, libmilter }: with pythonPackages; -buildPythonPackage rec { - pname = "pymilter"; - version = "1.0.4"; - src = fetchPypi { - inherit pname version; - sha256 = "1bpcvq7d72q0zi7c8h5knhasywwz9gxc23n9fxmw874n5k8hsn7k"; - }; - doCheck = false; - buildInputs = [ libmilter ]; -} diff --git a/pkgs/python-packages/wokkel.nix b/pkgs/python-packages/wokkel.nix deleted file mode 100644 index 3237f2b..0000000 --- a/pkgs/python-packages/wokkel.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ pythonPackages }: with pythonPackages; -buildPythonPackage rec { - pname = "wokkel"; - version = "18.0.0"; - src = fetchPypi { - inherit pname version; - sha256 = "1spq44gg8gsviqx1dvlmjpgfc0wk0jpyx4ap01y2pad1ai9cw016"; - }; - propagatedBuildInputs = [ twisted.extras.tls twisted incremental dateutil ]; - doCheck = false; -} diff --git a/pkgs/status_engine/module.json b/pkgs/status_engine/module.json deleted file mode 100644 index 5ed06d2..0000000 --- a/pkgs/status_engine/module.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "d461e95-master", - "meta": { - "name": "statusengine-module", - "url": "https://github.com/statusengine/module", - "branch": "master" - }, - "github": { - "owner": "statusengine", - "repo": "module", - "rev": "d461e95a11fffaac604d11ac42d237b5e13071bc", - "sha256": "1awmq9rck9xy82pambnd2wh66ndif8x8jpk4qbbghs9f2sd48x1n", - "fetchSubmodules": true - } -} diff --git a/pkgs/status_engine/module.nix b/pkgs/status_engine/module.nix deleted file mode 100644 index 43d2b09..0000000 --- a/pkgs/status_engine/module.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ stdenv, mylibs, gearmand, json_c, libuuid, libevent, pkgconfig, glib }: -stdenv.mkDerivation (mylibs.fetchedGithub ./module.json // { - patches = [ ./host_perfdata.patch ]; - buildInputs = [ gearmand json_c libuuid libevent pkgconfig glib ]; - makeFlags = "all"; - installPhase = '' - mkdir -p $out/lib/status-engine - cp -a src/bin/* $out/lib/status-engine - ''; -}) diff --git a/pkgs/status_engine/worker.json b/pkgs/status_engine/worker.json deleted file mode 100644 index 301bab5..0000000 --- a/pkgs/status_engine/worker.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "02267d4-master", - "meta": { - "name": "worker", - "url": "https://github.com/statusengine/worker", - "branch": "master" - }, - "github": { - "owner": "statusengine", - "repo": "worker", - "rev": "02267d495ae69137d6765dc6b0f453f80216f1cf", - "sha256": "06ci4mkmifdf1z15yc8rxl44ppi45vjz4s136yaccq9d8vk9iyd4", - "fetchSubmodules": true - } -} diff --git a/pkgs/status_engine/worker.nix b/pkgs/status_engine/worker.nix deleted file mode 100644 index 1232303..0000000 --- a/pkgs/status_engine/worker.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ stdenv, mylibs, composerEnv, fetchurl, gearmand, callPackage, php73, config_file ? "/var/lib/status_engine/ui.yml" }: -let - gearman = php73.buildPecl rec { - version = "2.0.6"; - pname = "gearman"; - src = fetchurl { - url = "https://github.com/wcgallego/pecl-gearman/archive/${pname}-${version}.tar.gz"; - sha256 = "0bliga4j41xkvdfh6bqi6k8x6mfxbi5sl9gix97axs7w0ncyfprz"; - }; - configureFlags = [ "--with-gearman=${gearmand}" ]; - nativeBuildInputs = [ gearmand ]; - }; -in -(composerEnv.override { - php = php73.withExtensions({ enabled, all }: enabled ++ (with all; [gearman redis mbstring bcmath json iconv])); -}).buildPackage (mylibs.fetchedGithub ./worker.json // - import ./worker_php_packages.nix { inherit composerEnv fetchurl; } // rec { - postInstall = '' - ln -s ${config_file} $out/etc/config.yml - ''; - preInstall = '' - cp ${./worker_composer.lock} $out/composer.lock - ''; -}) diff --git a/pkgs/status_engine/worker_composer.lock b/pkgs/status_engine/worker_composer.lock deleted file mode 100644 index 63f2646..0000000 --- a/pkgs/status_engine/worker_composer.lock +++ /dev/null @@ -1,1457 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "0b9940904a72531dd233d2c1b0ea28a0", - "packages": [ - { - "name": "crate/crate-dbal", - "version": "0.3.1", - "source": { - "type": "git", - "url": "https://github.com/crate/crate-dbal.git", - "reference": "3329f19d39f648bdd7613e5c8dc7e230f45814d9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/crate/crate-dbal/zipball/3329f19d39f648bdd7613e5c8dc7e230f45814d9", - "reference": "3329f19d39f648bdd7613e5c8dc7e230f45814d9", - "shasum": "" - }, - "require": { - "crate/crate-pdo": "~0.6.0", - "doctrine/dbal": "~2.5.5", - "php": "~5.5|~7.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "Crate\\DBAL": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "description": "A Doctrine Database Abstraction Layer for the Crate.io DBMS", - "homepage": "https://github.com/crate/crate-dbal", - "keywords": [ - "crate", - "database", - "dbal", - "doctrine" - ], - "time": "2017-04-07T13:26:54+00:00" - }, - { - "name": "crate/crate-pdo", - "version": "0.6.3", - "source": { - "type": "git", - "url": "https://github.com/crate/crate-pdo.git", - "reference": "31a88d1004235327a4651a10a5b98a7803b3cde3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/crate/crate-pdo/zipball/31a88d1004235327a4651a10a5b98a7803b3cde3", - "reference": "31a88d1004235327a4651a10a5b98a7803b3cde3", - "shasum": "" - }, - "require": { - "ext-pdo": "*", - "guzzlehttp/guzzle": "~6.0", - "php": "~5.5|~7.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "Crate\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "description": "A PDO adapter for interacting with the Crate.io DBMS", - "homepage": "https://github.com/crate/crate-pdo", - "keywords": [ - "crate", - "database", - "pdo" - ], - "time": "2017-07-17T12:50:03+00:00" - }, - { - "name": "doctrine/annotations", - "version": "1.10.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "5db60a4969eba0e0c197a19c077780aadbc43c5d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/5db60a4969eba0e0c197a19c077780aadbc43c5d", - "reference": "5db60a4969eba0e0c197a19c077780aadbc43c5d", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/cache": "1.*", - "phpunit/phpunit": "^7.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "time": "2020-05-25T17:24:27+00:00" - }, - { - "name": "doctrine/cache", - "version": "1.10.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "35a4a70cd94e09e2259dfae7488afc6b474ecbd3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/35a4a70cd94e09e2259dfae7488afc6b474ecbd3", - "reference": "35a4a70cd94e09e2259dfae7488afc6b474ecbd3", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", - "type": "tidelift" - } - ], - "time": "2020-05-27T16:24:54+00:00" - }, - { - "name": "doctrine/collections", - "version": "1.6.5", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "fc0206348e17e530d09463fef07ba8968406cd6d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/fc0206348e17e530d09463fef07ba8968406cd6d", - "reference": "fc0206348e17e530d09463fef07ba8968406cd6d", - "shasum": "" - }, - "require": { - "php": "^7.1.3 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan-shim": "^0.9.2", - "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.8.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", - "homepage": "https://www.doctrine-project.org/projects/collections.html", - "keywords": [ - "array", - "collections", - "iterators", - "php" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", - "type": "tidelift" - } - ], - "time": "2020-05-25T19:24:35+00:00" - }, - { - "name": "doctrine/common", - "version": "v2.7.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9", - "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9", - "shasum": "" - }, - "require": { - "doctrine/annotations": "1.*", - "doctrine/cache": "1.*", - "doctrine/collections": "1.*", - "doctrine/inflector": "1.*", - "doctrine/lexer": "1.*", - "php": "~5.6|~7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.4.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Common Library for Doctrine projects", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "collections", - "eventmanager", - "persistence", - "spl" - ], - "time": "2017-07-22T08:35:12+00:00" - }, - { - "name": "doctrine/dbal", - "version": "v2.5.13", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "729340d8d1eec8f01bff708e12e449a3415af873" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873", - "reference": "729340d8d1eec8f01bff708e12e449a3415af873", - "shasum": "" - }, - "require": { - "doctrine/common": ">=2.4,<2.8-dev", - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "4.*", - "symfony/console": "2.*||^3.0" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\DBAL\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Database Abstraction Layer", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "persistence", - "queryobject" - ], - "time": "2017-07-22T20:44:48+00:00" - }, - { - "name": "doctrine/inflector", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector", - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", - "type": "tidelift" - } - ], - "time": "2020-05-29T07:19:59+00:00" - }, - { - "name": "doctrine/lexer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2020-05-25T17:44:05+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.5.4", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "a4a1b6930528a8f7ee03518e6442ec7a44155d9d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a4a1b6930528a8f7ee03518e6442ec7a44155d9d", - "reference": "a4a1b6930528a8f7ee03518e6442ec7a44155d9d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "1.17.0" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" - }, - "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.5-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2020-05-25T19:35:05+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "v1.3.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "time": "2016-12-20T10:07:11+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" - }, - "suggest": { - "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Schultze", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "time": "2019-07-01T23:21:34+00:00" - }, - { - "name": "php-amqplib/php-amqplib", - "version": "v2.11.3", - "source": { - "type": "git", - "url": "https://github.com/php-amqplib/php-amqplib.git", - "reference": "6353c5d2d3021a301914bc6566e695c99cfeb742" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/6353c5d2d3021a301914bc6566e695c99cfeb742", - "reference": "6353c5d2d3021a301914bc6566e695c99cfeb742", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "ext-sockets": "*", - "php": ">=5.6.3", - "phpseclib/phpseclib": "^2.0.0" - }, - "conflict": { - "php": "7.4.0 - 7.4.1" - }, - "replace": { - "videlalvaro/php-amqplib": "self.version" - }, - "require-dev": { - "ext-curl": "*", - "nategood/httpful": "^0.2.20", - "phpunit/phpunit": "^5.7|^6.5|^7.0", - "squizlabs/php_codesniffer": "^2.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.11-dev" - } - }, - "autoload": { - "psr-4": { - "PhpAmqpLib\\": "PhpAmqpLib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-or-later" - ], - "authors": [ - { - "name": "Alvaro Videla", - "role": "Original Maintainer" - }, - { - "name": "Raúl Araya", - "email": "nubeiro@gmail.com", - "role": "Maintainer" - }, - { - "name": "Luke Bakken", - "email": "luke@bakken.io", - "role": "Maintainer" - }, - { - "name": "Ramūnas Dronga", - "email": "github@ramuno.lt", - "role": "Maintainer" - } - ], - "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", - "homepage": "https://github.com/php-amqplib/php-amqplib/", - "keywords": [ - "message", - "queue", - "rabbitmq" - ], - "time": "2020-05-13T13:56:11+00:00" - }, - { - "name": "phpseclib/phpseclib", - "version": "2.0.27", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc", - "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phing/phing": "~2.7", - "phpunit/phpunit": "^4.8.35|^5.7|^6.0", - "sami/sami": "~2.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "suggest": { - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "type": "library", - "autoload": { - "files": [ - "phpseclib/bootstrap.php" - ], - "psr-4": { - "phpseclib\\": "phpseclib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "funding": [ - { - "url": "https://github.com/terrafrost", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpseclib", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", - "type": "tidelift" - } - ], - "time": "2020-04-04T23:17:33+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "symfony/console", - "version": "v2.8.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "d232bfc100dfd32b18ccbcab4bcc8f28697b7e41" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d232bfc100dfd32b18ccbcab4bcc8f28697b7e41", - "reference": "d232bfc100dfd32b18ccbcab4bcc8f28697b7e41", - "shasum": "" - }, - "require": { - "php": ">=5.3.9", - "symfony/polyfill-mbstring": "~1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.1|~3.0.0", - "symfony/process": "~2.1|~3.0.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2015-11-30T12:35:10+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a", - "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fa79b11539418b02fc5e1897267673ba2c19419c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c", - "reference": "fa79b11539418b02fc5e1897267673ba2c19419c", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "f048e612a3905f34931127360bdd2def19a5e582" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582", - "reference": "f048e612a3905f34931127360bdd2def19a5e582", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/yaml", - "version": "v2.8.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "f79824187de95064a2f5038904c4d7f0227fedb5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/f79824187de95064a2f5038904c4d7f0227fedb5", - "reference": "f79824187de95064a2f5038904c4d7f0227fedb5", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2015-11-30T12:35:10+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=5.5.9", - "ext-redis": "*", - "ext-gearman": "*", - "ext-mbstring": "*", - "ext-bcmath": "*", - "ext-json": "*", - "ext-iconv": "*" - }, - "platform-dev": [], - "plugin-api-version": "1.1.0" -} diff --git a/pkgs/status_engine/worker_php_packages.nix b/pkgs/status_engine/worker_php_packages.nix deleted file mode 100644 index 1d956ad..0000000 --- a/pkgs/status_engine/worker_php_packages.nix +++ /dev/null @@ -1,217 +0,0 @@ -# Generated with composer2nix and adapted to return only the list of -# packages -{ composerEnv, fetchurl }: -{ - packages = { - "crate/crate-dbal" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "crate-crate-dbal-3329f19d39f648bdd7613e5c8dc7e230f45814d9"; - src = fetchurl { - url = https://api.github.com/repos/crate/crate-dbal/zipball/3329f19d39f648bdd7613e5c8dc7e230f45814d9; - sha256 = "013z63zcvrnmxphdm6qqy0if1397lmbb0g3yrpjbka98pg8zm99g"; - }; - }; - }; - "crate/crate-pdo" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "crate-crate-pdo-31a88d1004235327a4651a10a5b98a7803b3cde3"; - src = fetchurl { - url = https://api.github.com/repos/crate/crate-pdo/zipball/31a88d1004235327a4651a10a5b98a7803b3cde3; - sha256 = "194f6daj9ghlwyplp86nazh1av6jadqznwqijqgr1g3dfmgb3y16"; - }; - }; - }; - "doctrine/annotations" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-annotations-5db60a4969eba0e0c197a19c077780aadbc43c5d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/annotations/zipball/5db60a4969eba0e0c197a19c077780aadbc43c5d; - sha256 = "1a8psmvs90x4nflfvjvp6j9yjmq6z9jgsb3plrp5c7iy7snkq1v2"; - }; - }; - }; - "doctrine/cache" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-cache-35a4a70cd94e09e2259dfae7488afc6b474ecbd3"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/cache/zipball/35a4a70cd94e09e2259dfae7488afc6b474ecbd3; - sha256 = "1fk0c8vhjgl7j4b2vd4k7sshdrqysqwcp9mlxbapf8x7nmpa6i9b"; - }; - }; - }; - "doctrine/collections" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-collections-fc0206348e17e530d09463fef07ba8968406cd6d"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/collections/zipball/fc0206348e17e530d09463fef07ba8968406cd6d; - sha256 = "1aqnjna5cc5hyy6wypmayvl5lgz2qbym6innmr3qaq9nff6r9qlf"; - }; - }; - }; - "doctrine/common" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-common-4acb8f89626baafede6ee5475bc5844096eba8a9"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9; - sha256 = "0qjqframvg81z3lwqaj5haanqj9v3dfbj170pxmwlgmrfsbr16zh"; - }; - }; - }; - "doctrine/dbal" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873; - sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3"; - }; - }; - }; - "doctrine/inflector" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-inflector-4650c8b30c753a76bf44fb2ed00117d6f367490c"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c; - sha256 = "13jnzwpzz63i6zipmhb22lv35l5gq6wmji0532c94331wcq5bvv9"; - }; - }; - }; - "doctrine/lexer" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "doctrine-lexer-e864bbf5904cb8f5bb334f99209b48018522f042"; - src = fetchurl { - url = https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042; - sha256 = "11lg9fcy0crb8inklajhx3kyffdbx7xzdj8kwl21xsgq9nm9iwvv"; - }; - }; - }; - "guzzlehttp/guzzle" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "guzzlehttp-guzzle-a4a1b6930528a8f7ee03518e6442ec7a44155d9d"; - src = fetchurl { - url = https://api.github.com/repos/guzzle/guzzle/zipball/a4a1b6930528a8f7ee03518e6442ec7a44155d9d; - sha256 = "0midln6ji6b990vkc0syn631nf6r94lv5600dcc26lcivz8c4gk3"; - }; - }; - }; - "guzzlehttp/promises" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "guzzlehttp-promises-a59da6cf61d80060647ff4d3eb2c03a2bc694646"; - src = fetchurl { - url = https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646; - sha256 = "1kpl91fzalcgkcs16lpakvzcnbkry3id4ynx6xhq477p4fipdciz"; - }; - }; - }; - "guzzlehttp/psr7" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "guzzlehttp-psr7-239400de7a173fe9901b9ac7c06497751f00727a"; - src = fetchurl { - url = https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a; - sha256 = "0mfq93x7ayix6l3v5jkk40a9hnmrxaqr9vk1r26q39d1s6292ma7"; - }; - }; - }; - "php-amqplib/php-amqplib" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "php-amqplib-php-amqplib-6353c5d2d3021a301914bc6566e695c99cfeb742"; - src = fetchurl { - url = https://api.github.com/repos/php-amqplib/php-amqplib/zipball/6353c5d2d3021a301914bc6566e695c99cfeb742; - sha256 = "1nadc5afkn1fiws2w1wh0n032pr5b4dzfg1dcqyf2jnh0nsgq0xp"; - }; - }; - }; - "phpseclib/phpseclib" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "phpseclib-phpseclib-34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc"; - src = fetchurl { - url = https://api.github.com/repos/phpseclib/phpseclib/zipball/34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc; - sha256 = "1jlc8plx0v0rq3zqhc19a01r7xx7a2p6gl7mkzf2hn0kss50plz5"; - }; - }; - }; - "psr/http-message" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "psr-http-message-f6561bf28d520154e4b0ec72be95418abe6d9363"; - src = fetchurl { - url = https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363; - sha256 = "195dd67hva9bmr52iadr4kyp2gw2f5l51lplfiay2pv6l9y4cf45"; - }; - }; - }; - "ralouphie/getallheaders" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "ralouphie-getallheaders-120b605dfeb996808c31b6477290a714d356e822"; - src = fetchurl { - url = https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822; - sha256 = "1bv7ndkkankrqlr2b4kw7qp3fl0dxi6bp26bnim6dnlhavd6a0gg"; - }; - }; - }; - "symfony/console" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-console-d232bfc100dfd32b18ccbcab4bcc8f28697b7e41"; - src = fetchurl { - url = https://api.github.com/repos/symfony/console/zipball/d232bfc100dfd32b18ccbcab4bcc8f28697b7e41; - sha256 = "16kgs7x60y3vj0bbmljj80hq1x8fb6w1g0fd1j2hc1cbphgj8x67"; - }; - }; - }; - "symfony/polyfill-intl-idn" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-intl-idn-3bff59ea7047e925be6b7f2059d60af31bb46d6a"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a; - sha256 = "0c26v3xpchyiqckp663n7i3hgswbzy56r0jdwjizrsgqq731h6fp"; - }; - }; - }; - "symfony/polyfill-mbstring" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-mbstring-fa79b11539418b02fc5e1897267673ba2c19419c"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c; - sha256 = "17m46mkkcv7fsxf71si0cq8xdf6b1k272mc5bfwgl00h8s9bk0rs"; - }; - }; - }; - "symfony/polyfill-php72" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-polyfill-php72-f048e612a3905f34931127360bdd2def19a5e582"; - src = fetchurl { - url = https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582; - sha256 = "1lkjxh17nfaglh7v2m3zw2fy6b2w8nmxr7jb1gqqpvg74yqqz83f"; - }; - }; - }; - "symfony/yaml" = { - targetDir = ""; - src = composerEnv.buildZipPackage { - name = "symfony-yaml-f79824187de95064a2f5038904c4d7f0227fedb5"; - src = fetchurl { - url = https://api.github.com/repos/symfony/yaml/zipball/f79824187de95064a2f5038904c4d7f0227fedb5; - sha256 = "1pwx4bckfjz0afz62q02vl0i4wmg3c6f963jrhlx247b1z6isram"; - }; - }; - }; - }; -} diff --git a/pkgs/telegram-history-dump/default.nix b/pkgs/telegram-history-dump/default.nix deleted file mode 100644 index 050b351..0000000 --- a/pkgs/telegram-history-dump/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ stdenv, ruby, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./telegram-history-dump.json // { - installPhase = '' - mkdir -p $out/lib $out/bin - cp -a $src $out/lib/telegram-history-dump - ln -s $out/lib/telegram-history-dump/telegram-history-dump.rb $out/bin/telegram-history-dump - ''; - buildInputs = [ ruby ]; -}) diff --git a/pkgs/telegram-history-dump/telegram-history-dump.json b/pkgs/telegram-history-dump/telegram-history-dump.json deleted file mode 100644 index 487df73..0000000 --- a/pkgs/telegram-history-dump/telegram-history-dump.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "468ea91-master", - "meta": { - "name": "telegram-history-dump", - "url": "https://github.com/tvdstaaij/telegram-history-dump", - "branch": "master" - }, - "github": { - "owner": "tvdstaaij", - "repo": "telegram-history-dump", - "rev": "468ea91e543529b54bc2c5ea28b1ea17f362fd3e", - "sha256": "1wmwiqacfa56bmwx50njnb15cg0fy6rbdrmrjd4xfbh8bs6yp0gh", - "fetchSubmodules": true - } -} diff --git a/pkgs/telegramircd/telegramircd.json b/pkgs/telegramircd/telegramircd.json deleted file mode 100644 index 3d219f8..0000000 --- a/pkgs/telegramircd/telegramircd.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "40a0c7c-master", - "meta": { - "name": "telegramircd", - "url": "https://github.com/MaskRay/telegramircd", - "branch": "master" - }, - "github": { - "owner": "MaskRay", - "repo": "telegramircd", - "rev": "40a0c7cf60492bde3f44d43f06f62e3792480139", - "sha256": "123fjhgxq2fzn0ar8274jv7jjbxnlpidrj5333kbch7rpcipks0y", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/adminer/default.nix b/pkgs/webapps/adminer/default.nix deleted file mode 100644 index 203b565..0000000 --- a/pkgs/webapps/adminer/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ stdenv, fetchurl }: -stdenv.mkDerivation rec { - version = "4.7.1"; - name = "adminer-${version}"; - src = fetchurl { - url = "https://github.com/vrana/adminer/releases/download/v${version}/${name}.php"; - sha256 = "00gnck9vd44wc6ihf7hh4ma6jvdsw69xgjlkbrdf6irnni6rnvhn"; - }; - phases = "installPhase"; - installPhase = '' - mkdir -p $out - cp $src $out/index.php - ''; -} diff --git a/pkgs/webapps/default.nix b/pkgs/webapps/default.nix deleted file mode 100644 index cbee0b3..0000000 --- a/pkgs/webapps/default.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ callPackage, mylibs, composerEnv }: -rec { - adminer = callPackage ./adminer {}; - apache-theme = callPackage ./apache-theme {}; - awl = callPackage ./awl {}; - davical = callPackage ./davical {}; - diaspora = callPackage ./diaspora { inherit mylibs; }; - dokuwiki = callPackage ./dokuwiki { inherit mylibs; }; - etherpad-lite = callPackage ./etherpad-lite {}; - grocy = callPackage ./grocy { inherit mylibs composerEnv; }; - infcloud = callPackage ./infcloud {}; - mantisbt_2 = callPackage ./mantisbt_2 {}; - mastodon = callPackage ./mastodon { inherit mylibs; }; - mediagoblin = callPackage ./mediagoblin { inherit mylibs; }; - nextcloud = callPackage ./nextcloud {}; - peertube = (mylibs.flakeCompat ../../flakes/peertube).default; - phpbb = callPackage ./phpbb {}; - phpldapadmin = callPackage ./phpldapadmin {}; - rompr = callPackage ./rompr { inherit mylibs; }; - roundcubemail = callPackage ./roundcubemail {}; - spip = callPackage ./spip {}; - surfer = callPackage ./surfer { inherit mylibs; }; - taskwarrior-web = callPackage ./taskwarrior-web { inherit mylibs; }; - ttrss = callPackage ./ttrss {}; - wallabag = callPackage ./wallabag { inherit composerEnv; }; - yourls = callPackage ./yourls { inherit mylibs; }; -} diff --git a/pkgs/webapps/diaspora/default.nix b/pkgs/webapps/diaspora/default.nix deleted file mode 100644 index b435347..0000000 --- a/pkgs/webapps/diaspora/default.nix +++ /dev/null @@ -1,69 +0,0 @@ -{ ldap ? false, varDir ? "/var/lib/diaspora", podmin_email ? null, config_dir ? "/etc/diaspora", - mylibs, stdenv, bundlerEnv, writeText, - cacert, defaultGemConfig, perl, ruby_2_4, nodejs, which, git }: -let - diaspora_src = stdenv.mkDerivation (mylibs.fetchedGithub ./diaspora.json // rec { - buildPhase = '' - ${if ldap then "patch -p1 < ${./ldap.patch}" else ""} - # FIXME: bundlerEnv below doesn't take postgresql group for some - # reason - echo 'gem "pg", "1.1.3"' >> Gemfile - ''; - installPhase = '' - cp -a . $out - ''; - }); - gems = bundlerEnv { - name = "diaspora-env"; - gemfile = "${diaspora_src}/Gemfile"; - lockfile = "${diaspora_src}/Gemfile.lock"; - gemset = if ldap then ./gemset_ldap.nix else ./gemset.nix; - groups = [ "postgresql" "default" "production" ]; - gemConfig = defaultGemConfig // { - kostya-sigar = attrs: { - buildInputs = [ perl ]; - }; - }; - }; - build_config = writeText "diaspora.yml" '' - configuration: - environment: - certificate_authorities: '${cacert}/etc/ssl/certs/ca-bundle.crt' - ${if podmin_email != null then '' - # dummy comment for indentation - admins: - podmin_email: '${podmin_email}' - '' else ""} - production: - environment: - ''; - dummy_token = writeText "secret_token.rb" '' - Diaspora::Application.config.secret_key_base = 'dummy' - ''; -in -stdenv.mkDerivation { - name = "diaspora"; - inherit diaspora_src; - builder = writeText "build_diaspora" '' - source $stdenv/setup - cp -a $diaspora_src $out - cd $out - chmod -R u+rwX . - tar -czf public/source.tar.gz ./{app,db,lib,script,Gemfile,Gemfile.lock,Rakefile,config.ru} - ln -s database.yml.example config/database.yml - ln -s ${build_config} config/diaspora.yml - ln -s ${dummy_token} config/initializers/secret_token.rb - ln -sf ${varDir}/schedule.yml config/schedule.yml - ln -sf ${varDir}/oidc_key.pem config/oidc_key.pem - ln -sf ${varDir}/uploads public/uploads - RAILS_ENV=production ${gems}/bin/rake assets:precompile - ln -sf ${config_dir}/database.yml config/database.yml - ln -sf ${config_dir}/diaspora.yml config/diaspora.yml - ln -sf ${config_dir}/secret_token.rb config/initializers/secret_token.rb - rm -rf tmp log - ln -sf ${varDir}/tmp tmp - ln -sf ${varDir}/log log - ''; - propagatedBuildInputs = [ gems nodejs which git ]; - passthru = { inherit gems varDir; }; -} diff --git a/pkgs/webapps/diaspora/diaspora.json b/pkgs/webapps/diaspora/diaspora.json deleted file mode 100644 index e6795aa..0000000 --- a/pkgs/webapps/diaspora/diaspora.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "v0.7.10.0", - "meta": { - "name": "diaspora", - "url": "https://github.com/diaspora/diaspora", - "branch": "refs/tags/v0.7.10.0" - }, - "github": { - "owner": "diaspora", - "repo": "diaspora", - "rev": "f0085cf5bb1c45bdfba866f628153d299e56eca8", - "sha256": "02mnb40rdkk6jlnvpy61fad59gbpgnlwz1k35w4wfqdwzq0znaqp", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/dokuwiki/dokuwiki.json b/pkgs/webapps/dokuwiki/dokuwiki.json deleted file mode 100644 index fc03252..0000000 --- a/pkgs/webapps/dokuwiki/dokuwiki.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "release_stable_2018-04-22b", - "meta": { - "name": "dokuwiki", - "url": "https://github.com/splitbrain/dokuwiki", - "branch": "refs/tags/release_stable_2018-04-22b" - }, - "github": { - "owner": "splitbrain", - "repo": "dokuwiki", - "rev": "871dae1320b40211626c7ec665f5e6d5290aca95", - "sha256": "1syvd5dvv3v75swf8ig7dxqs0g5xikb0f6vlcy7g4c4ghldkw7nz", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/etherpad-lite/etherpad-lite.json b/pkgs/webapps/etherpad-lite/etherpad-lite.json deleted file mode 100644 index 0d68df1..0000000 --- a/pkgs/webapps/etherpad-lite/etherpad-lite.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "1.8.3", - "meta": { - "name": "etherpad-lite", - "url": "https://github.com/ether/etherpad-lite", - "branch": "refs/tags/1.8.3" - }, - "github": { - "owner": "ether", - "repo": "etherpad-lite", - "rev": "62101147a0c3495dc80daa87ab53a3366321a205", - "sha256": "1d726qldw3bil4x7j39aqk7m71kyjvxklai5238rrd5v82z28c1y", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/grocy/grocy.json b/pkgs/webapps/grocy/grocy.json deleted file mode 100644 index cd75c18..0000000 --- a/pkgs/webapps/grocy/grocy.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "d7738aa-master", - "meta": { - "name": "grocy", - "url": "https://github.com/grocy/grocy/", - "branch": "master" - }, - "github": { - "owner": "grocy", - "repo": "grocy", - "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", - "sha256": "13zxzq71hvs3dzywrdwqflnkx6dpdc40l9klm4slv0fmmyclbbdf", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/mastodon/mastodon.json b/pkgs/webapps/mastodon/mastodon.json deleted file mode 100644 index a0a6cfd..0000000 --- a/pkgs/webapps/mastodon/mastodon.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "v2.9.4", - "meta": { - "name": "mastodon", - "url": "https://github.com/tootsuite/mastodon", - "branch": "refs/tags/v2.9.4" - }, - "github": { - "owner": "tootsuite", - "repo": "mastodon", - "rev": "9bace2dd88d127d396794375c8fcb2132619a799", - "sha256": "1x9pai1q73lsq1i685w7z4v3w478iyij65mar13k4hq9zdz9d2b0", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/mediagoblin/tempita.json b/pkgs/webapps/mediagoblin/tempita.json deleted file mode 100644 index 5371e17..0000000 --- a/pkgs/webapps/mediagoblin/tempita.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "47414a7-master", - "meta": { - "name": "tempita", - "url": "https://github.com/gjhiggins/tempita", - "branch": "master" - }, - "github": { - "owner": "gjhiggins", - "repo": "tempita", - "rev": "47414a7c6e46a9a9afe78f0bce2ea299fa84d10d", - "sha256": "0f33jjjs5rvp7ar2j6ggyfykcrsrn04jaqcq71qfvycf6b7nw3rn", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/nextcloud/apps/apporder.nix b/pkgs/webapps/nextcloud/apps/apporder.nix deleted file mode 100644 index 29fd6e2..0000000 --- a/pkgs/webapps/nextcloud/apps/apporder.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 18; -buildApp rec { - appName = "apporder"; - version = "0.9.0"; - url = "https://github.com/juliushaertl/apporder/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "1add4i892n4bpmpxwrsr7x99fjyj5rk6maw04iwhviqqqr28fsw6"; -} diff --git a/pkgs/webapps/nextcloud/apps/audioplayer.nix b/pkgs/webapps/nextcloud/apps/audioplayer.nix deleted file mode 100644 index a49776f..0000000 --- a/pkgs/webapps/nextcloud/apps/audioplayer.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 17 && nextcloudVersion <= 19; -buildApp rec { - appName = "audioplayer"; - version = "2.10.0"; - url = "https://github.com/Rello/${appName}/releases/download/${version}/${appName}-${version}.tar.gz"; - sha256 = "122wc05b0m8s5ksdhsiws98aqph894i7cffjkhfhq66c40a728s3"; -} diff --git a/pkgs/webapps/nextcloud/apps/bookmarks.nix b/pkgs/webapps/nextcloud/apps/bookmarks.nix deleted file mode 100644 index 1065c34..0000000 --- a/pkgs/webapps/nextcloud/apps/bookmarks.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 17 && nextcloudVersion <= 19; -buildApp rec { - appName = "bookmarks"; - version = "3.0.10"; - url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz"; - sha256 = "0y12iqcc6yp25cisg7mg40ddx72531zdvsp2gcl37qi8vqf162ji"; -} diff --git a/pkgs/webapps/nextcloud/apps/calendar.nix b/pkgs/webapps/nextcloud/apps/calendar.nix deleted file mode 100644 index bc3ccea..0000000 --- a/pkgs/webapps/nextcloud/apps/calendar.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 17 && nextcloudVersion <= 19; -buildApp rec { - appName = "calendar"; - version = "2.0.3"; - url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "17pjsa657p9n1kslqkfcxd6n4ssh2yd4f5l5ww79mixfs34idbl9"; -} diff --git a/pkgs/webapps/nextcloud/apps/carnet.nix b/pkgs/webapps/nextcloud/apps/carnet.nix deleted file mode 100644 index 879ab17..0000000 --- a/pkgs/webapps/nextcloud/apps/carnet.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 13 && nextcloudVersion <= 18; -buildApp rec { - appName = "carnet"; - version = "0.20.0"; - url = "https://github.com/PhieF/CarnetNextcloud/releases/download/v${version}/${appName}-nc-v${version}.tar.gz"; - sha256 = "1hbvs88vj830xalyq8fv8xlnf7livsj1xmnjl4xgla803ch4aym8"; -} diff --git a/pkgs/webapps/nextcloud/apps/circles.nix b/pkgs/webapps/nextcloud/apps/circles.nix deleted file mode 100644 index 64a4f2f..0000000 --- a/pkgs/webapps/nextcloud/apps/circles.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 18 && nextcloudVersion <= 18; -buildApp rec { - appName = "circles"; - version = "0.18.9"; - url = "https://github.com/nextcloud/circles/releases/download/v${version}/${appName}-${version}.tar.gz"; - sha256 = "1a58zrjg4cc0igq14s5zfc5zva83mahmfr0mxvhvnasw7rwkpyzr"; -} diff --git a/pkgs/webapps/nextcloud/apps/contacts.nix b/pkgs/webapps/nextcloud/apps/contacts.nix deleted file mode 100644 index d80f0b5..0000000 --- a/pkgs/webapps/nextcloud/apps/contacts.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 17 && nextcloudVersion <= 19; -buildApp rec { - appName = "contacts"; - version = "3.3.0"; - url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "187avlksg4k7ci3jz4djfq8zfyq5jpvhbw2dzlp76wlppm1al4m0"; -} diff --git a/pkgs/webapps/nextcloud/apps/cookbook.nix b/pkgs/webapps/nextcloud/apps/cookbook.nix deleted file mode 100644 index 63cac0d..0000000 --- a/pkgs/webapps/nextcloud/apps/cookbook.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 14 && nextcloudVersion <= 19; -buildApp rec { - appName = "cookbook"; - version = "0.6.5"; - url = "https://github.com/mrzapp/nextcloud-cookbook/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "068dxdxy9ix37970mn348blkdrrnkzad26zgyx4f5s19wm439p5j"; - installPhase = '' - sed -i -e "s/application..ld..json/application[^\"|\\\\']*ld[^\"|\\\\']*json/" lib/Service/RecipeService.php - mkdir -p $out - cp -R . $out/ - ''; -} - diff --git a/pkgs/webapps/nextcloud/apps/deck.nix b/pkgs/webapps/nextcloud/apps/deck.nix deleted file mode 100644 index ec693c6..0000000 --- a/pkgs/webapps/nextcloud/apps/deck.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion == 18; -buildApp rec { - appName = "deck"; - version = "1.0.0"; - url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "13r9vd5bf75slrzhvi6bybazhh1vcx0n4a8a7hf97bxr7pq2f91j"; -} diff --git a/pkgs/webapps/nextcloud/apps/extract.nix b/pkgs/webapps/nextcloud/apps/extract.nix deleted file mode 100644 index daa9d2d..0000000 --- a/pkgs/webapps/nextcloud/apps/extract.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 13 && nextcloudVersion <= 19; -buildApp rec { - appName = "extract"; - version = "1.2.4"; - url = "https://github.com/PaulLereverend/NextcloudExtract/releases/download/${version}/${appName}.tar.gz"; - sha256 = "0f1csv0warga12a1hkgdcnhnfiwfv5z2ab3mri4frn2qlh12wyby"; -} diff --git a/pkgs/webapps/nextcloud/apps/files_markdown.nix b/pkgs/webapps/nextcloud/apps/files_markdown.nix deleted file mode 100644 index 5810ec9..0000000 --- a/pkgs/webapps/nextcloud/apps/files_markdown.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 18; -buildApp rec { - appName = "files_markdown"; - version = "2.2.0"; - url = "https://github.com/icewind1991/${appName}/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "05f793pznkkdgmr3wfqfbhwcg8s8kcvpfxnhzyj0pbw19srls2aw"; -} diff --git a/pkgs/webapps/nextcloud/apps/files_readmemd.nix b/pkgs/webapps/nextcloud/apps/files_readmemd.nix deleted file mode 100644 index c9728c0..0000000 --- a/pkgs/webapps/nextcloud/apps/files_readmemd.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 18; -buildApp rec { - appName = "files_readmemd"; - version = "1.1.4"; - url = "https://gitlab.univ-nantes.fr/uncloud/files_readmemd/-/wikis/uploads/e1d280e855f37e5f0a421c757868113c/${appName}.tar.gz"; - sha256 = "1sfaghbyzfv3hg5vhj1nprb85zsl6lcr2x88ks6l9ndv49nfbvm9"; -} diff --git a/pkgs/webapps/nextcloud/apps/flowupload.nix b/pkgs/webapps/nextcloud/apps/flowupload.nix deleted file mode 100644 index 516ee32..0000000 --- a/pkgs/webapps/nextcloud/apps/flowupload.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 15 && nextcloudVersion <= 18; -buildApp rec { - appName = "flowupload"; - version = "0.1.8"; - url = "https://github.com/e-alfred/${appName}/releases/download/${version}/${appName}-${version}.tar.gz"; - sha256 = "0llg5cr4fgqg512znp9bga77y7vdsi2pgsyl4m3a54c557zyjah3"; -} diff --git a/pkgs/webapps/nextcloud/apps/gpxedit.nix b/pkgs/webapps/nextcloud/apps/gpxedit.nix deleted file mode 100644 index cd3e878..0000000 --- a/pkgs/webapps/nextcloud/apps/gpxedit.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 14 && nextcloudVersion <= 19; -buildApp rec { - appName = "gpxedit"; - version = "0.0.13"; - url = "https://gitlab.com/eneiluj/gpxedit-oc/wikis/uploads/a7c638d1b038514d07bb5c787b6e7961/${appName}-${version}.tar.gz"; - sha256 = "1b15iqaq8fj3khpx3lh0fyqkhmj6x44fc59pg3cp3jrh3bpg0534"; - otherConfig = { - mimetypealiases = { - "application/gpx+xml" = "gpx"; - }; - mimetypemapping = { - "gpx" = ["application/gpx+xml"]; - }; - }; -} diff --git a/pkgs/webapps/nextcloud/apps/gpxpod.nix b/pkgs/webapps/nextcloud/apps/gpxpod.nix deleted file mode 100644 index 0750144..0000000 --- a/pkgs/webapps/nextcloud/apps/gpxpod.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 14 && nextcloudVersion <= 19; -buildApp rec { - appName = "gpxpod"; - version = "4.2.1"; - url = "https://gitlab.com/eneiluj/gpxpod-oc/wikis/uploads/0361f9dc50633f0f39d929442935435c/${appName}-${version}.tar.gz"; - sha256 = "0ycpychq6g8axdprvd0ahgdy2pwfdbfyf1pxk4cprr4ab986aq1x"; - otherConfig = { - mimetypealiases = { - "application/gpx+xml" = "gpx"; - }; - mimetypemapping = { - "gpx" = ["application/gpx+xml"]; - }; - }; -} diff --git a/pkgs/webapps/nextcloud/apps/impersonate.nix b/pkgs/webapps/nextcloud/apps/impersonate.nix deleted file mode 100644 index 66cc893..0000000 --- a/pkgs/webapps/nextcloud/apps/impersonate.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 18 && nextcloudVersion < 19; -buildApp rec { - appName = "impersonate"; - version = "1.5.2"; - url = "https://github.com/nextcloud/impersonate/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "03fm9d2p6ap9gyiw5anmlwsdmiyklrkpdgchfx2zfgxn38pjrz6d"; -} - diff --git a/pkgs/webapps/nextcloud/apps/keeweb.nix b/pkgs/webapps/nextcloud/apps/keeweb.nix deleted file mode 100644 index 4ea1399..0000000 --- a/pkgs/webapps/nextcloud/apps/keeweb.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 11 && nextcloudVersion <= 18; -buildApp rec { - appName = "keeweb"; - version = "0.6.2"; - url = "https://github.com/jhass/nextcloud-keeweb/releases/download/v${version}/${appName}-${version}.tar.gz"; - sha256 = "067801qz0fcfvmb14ja1ringzk53j1wp7ys2fl7lnlhf45r81vxx"; - installPhase = '' - mkdir -p $out - cp -R . $out/ - ''; - otherConfig = { - mimetypemapping = { - "kdbx" = ["application/x-kdbx"]; - }; - }; -} diff --git a/pkgs/webapps/nextcloud/apps/maps.nix b/pkgs/webapps/nextcloud/apps/maps.nix deleted file mode 100644 index 898df6c..0000000 --- a/pkgs/webapps/nextcloud/apps/maps.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 19; -buildApp rec { - appName = "maps"; - version = "0.1.6"; - url = "https://github.com/nextcloud/maps/releases/download/v${version}/${appName}-${version}.tar.gz"; - sha256 = "1yh5h96c91lgz58zcm7zdpblvsc6c6nflx8pldfds102x292mprk"; -} diff --git a/pkgs/webapps/nextcloud/apps/metadata.nix b/pkgs/webapps/nextcloud/apps/metadata.nix deleted file mode 100644 index 2d62f53..0000000 --- a/pkgs/webapps/nextcloud/apps/metadata.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 13 && nextcloudVersion <= 19; -buildApp rec { - appName = "metadata"; - version = "0.11.1"; - url = "https://github.com/gino0631/nextcloud-metadata/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "11napkv5s29xk1gmbfvy610ab1kc06qxqzw606ix5x0d1x4m3h0c"; -} diff --git a/pkgs/webapps/nextcloud/apps/music.nix b/pkgs/webapps/nextcloud/apps/music.nix deleted file mode 100644 index e430dd9..0000000 --- a/pkgs/webapps/nextcloud/apps/music.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 9 && nextcloudVersion <= 19; -buildApp rec { - appName = "music"; - version = "0.14.1"; - url = "https://github.com/owncloud/music/releases/download/v${version}/${appName}.zip"; - zip = true; - sha256 = "06svn24qix0nbikwi0kxnli402vq99851bn5ljcsm10r74bnlw83"; -} diff --git a/pkgs/webapps/nextcloud/apps/notes.nix b/pkgs/webapps/nextcloud/apps/notes.nix deleted file mode 100644 index 7a06bbc..0000000 --- a/pkgs/webapps/nextcloud/apps/notes.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 19; -buildApp rec { - appName = "notes"; - version = "3.3.0"; - url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}.tar.gz"; - sha256 = "03k0ijma7sccwqq9ch3bvgbg9kxr2wk0bmkxzxrc9in1d40d3k7f"; -} diff --git a/pkgs/webapps/nextcloud/apps/ocsms.nix b/pkgs/webapps/nextcloud/apps/ocsms.nix deleted file mode 100644 index aee1ff2..0000000 --- a/pkgs/webapps/nextcloud/apps/ocsms.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 18; -buildApp rec { - appName = "ocsms"; - version = "2.1.7"; - url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}-${version}.tar.gz"; - sha256 = "1pfdzq16nbh4wfmkmif0dxacxg0fy4n4cp2d1hbq9k2z9awcx1vh"; - installPhase = '' - mkdir -p $out - cp -R . $out/ - ''; -} diff --git a/pkgs/webapps/nextcloud/apps/passman.nix b/pkgs/webapps/nextcloud/apps/passman.nix deleted file mode 100644 index 2de4882..0000000 --- a/pkgs/webapps/nextcloud/apps/passman.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 17 && nextcloudVersion <= 18; -buildApp rec { - # FIXME: it creates a /settings/user/additional setting url which - # doesn’t work - appName = "passman"; - version = "2.3.5"; - url = "https://releases.passman.cc/${appName}_${version}.tar.gz"; - sha256 = "05gc288n43c7dhmq1jqfn8cfw7sycwdfhn36j8rh8nbx1irldbjn"; -} diff --git a/pkgs/webapps/nextcloud/apps/polls.nix b/pkgs/webapps/nextcloud/apps/polls.nix deleted file mode 100644 index 69e1102..0000000 --- a/pkgs/webapps/nextcloud/apps/polls.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 19; -buildApp rec { - appName = "polls"; - version = "1.4.3"; - url = "https://github.com/nextcloud/polls/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "07l5x5xblk6w8f6mqz3a5hjpry8qc3zgqi49z6bp5ipnzj0s6wm4"; -} diff --git a/pkgs/webapps/nextcloud/apps/social.nix b/pkgs/webapps/nextcloud/apps/social.nix deleted file mode 100644 index 75b790a..0000000 --- a/pkgs/webapps/nextcloud/apps/social.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 17 && nextcloudVersion <= 19; -buildApp rec { - appName = "social"; - version = "0.3.1"; - url = "https://github.com/nextcloud/social/releases/download/v${version}/${appName}-${version}.tar.gz"; - sha256 = "03hh6vr34p33dphrjqmc7s8mvsk5n7dl817j8qkf75203y8szhdy"; -} - diff --git a/pkgs/webapps/nextcloud/apps/spreed.nix b/pkgs/webapps/nextcloud/apps/spreed.nix deleted file mode 100644 index b52c8c5..0000000 --- a/pkgs/webapps/nextcloud/apps/spreed.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion == 18; -buildApp rec { - appName = "spreed"; - version = "8.0.8"; - url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz"; - sha256 = "19szk61ixzzrabs63l2fihx7k4f6a8k4kdzpa0xxzv5w9ssqjhbj"; -} diff --git a/pkgs/webapps/nextcloud/apps/tasks.nix b/pkgs/webapps/nextcloud/apps/tasks.nix deleted file mode 100644 index a2de465..0000000 --- a/pkgs/webapps/nextcloud/apps/tasks.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ buildApp, nextcloudVersion }: -assert nextcloudVersion >= 16 && nextcloudVersion <= 19; -buildApp rec { - appName = "tasks"; - version = "0.12.2"; - url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz"; - sha256 = "092fg7dpx69jp5z0ka14ay6bnfdcnjq8zk2gc3rwpzc3llpdnqph"; -} diff --git a/pkgs/webapps/nextcloud/default.nix b/pkgs/webapps/nextcloud/default.nix deleted file mode 100644 index 5017fd2..0000000 --- a/pkgs/webapps/nextcloud/default.nix +++ /dev/null @@ -1,69 +0,0 @@ -{ varDir ? "/var/lib/nextcloud", nextcloudVersion ? 18, otherConfig ? {}, lib, stdenv, callPackage, fetchzip, fetchurl }: -let - appNames = [ - "apporder" "audioplayer" "bookmarks" "calendar" "carnet" "circles" - "contacts" "cookbook" "deck" "extract" "files_markdown" - "files_readmemd" "flowupload" "gpxedit" "gpxpod" "impersonate" - "keeweb" "maps" "metadata" "music" "notes" "ocsms" "passman" "polls" - "spreed" "social" "tasks" - ]; - allApps = lib.attrsets.genAttrs appNames - (name: callPackage (./apps + "/${name}.nix") { inherit buildApp nextcloudVersion; }); - buildApp = { appName, version, url, sha256, zip ? false, otherConfig ? {}, installPhase ? "mkdir -p $out && cp -R . $out/" }: - stdenv.mkDerivation rec { - name = "nextcloud-app-${appName}-${version}"; - inherit version; - phases = "unpackPhase installPhase"; - inherit installPhase; - src = (if zip then fetchzip else fetchurl) { inherit url sha256; }; - passthru = { - inherit appName otherConfig; - }; - }; - toPassthru = pkg: apps: otherConfig: { - inherit apps otherConfig allApps buildApp varDir; - withApps = withApps pkg; - }; - withApps = pkg: toApps: - let - apps = toApps allApps; - toInstallApp = n: '' - ln -sf ${n} $out/apps/${n.appName} - ''; - zipped = lib.attrsets.zipAttrs ([pkg.otherConfig or {}] ++ map (v: v.otherConfig) apps); - appConfigs = with lib.attrsets; with lib.lists; { - mimetypealiases = foldr (h: prev: prev // h) {} (zipped.mimetypealiases or []); - mimetypemapping = mapAttrs (_: v: unique (flatten v)) (zipAttrs (zipped.mimetypemapping or [])); - }; - newNextcloud = pkg.overrideAttrs(old: { - installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallApp apps); - passthru = toPassthru newNextcloud (pkg.apps ++ apps) appConfigs; - }); - in newNextcloud; - package = stdenv.mkDerivation rec { - name = "nextcloud-${version}"; - version = "${builtins.toString nextcloudVersion}.0.4"; - - src = fetchurl { - url = "https://download.nextcloud.com/server/releases/${name}.tar.bz2"; - sha256 = "0aa3f4xbkzacfw0h9aic0ywk5mqlwka83qaszizj8lmk68kf3n7s"; - }; - - installPhase = '' - mkdir -p $out/ - cp -R . $out/ - rm -r $out/config - '' + lib.optionalString (varDir != null) '' - ln -sf ${varDir}/config $out/config - ''; - - passthru = toPassthru package [] otherConfig; - meta = { - description = "Sharing solution for files, calendars, contacts and more"; - homepage = https://nextcloud.com; - maintainers = with lib.maintainers; [ schneefux bachp globin fpletz ]; - license = lib.licenses.agpl3Plus; - platforms = with lib.platforms; unix; - }; - }; -in package diff --git a/pkgs/webapps/rompr/default.nix b/pkgs/webapps/rompr/default.nix deleted file mode 100644 index 2accf00..0000000 --- a/pkgs/webapps/rompr/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ varDir ? "/var/lib/rompr", stdenv, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./rompr.json // { - installPhase = '' - cp -a . $out - ln -sf ${varDir}/prefs $out/prefs - ln -sf ${varDir}/albumart $out/albumart - ''; -}) diff --git a/pkgs/webapps/rompr/rompr.json b/pkgs/webapps/rompr/rompr.json deleted file mode 100644 index 778d915..0000000 --- a/pkgs/webapps/rompr/rompr.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "1.24", - "meta": { - "name": "rompr", - "url": "https://github.com/fatg3erman/RompR", - "branch": "refs/tags/1.24" - }, - "github": { - "owner": "fatg3erman", - "repo": "RompR", - "rev": "0d8f597027ac71b320963fe3f33f461a136312ad", - "sha256": "13p3c4whhmvz1vvh9fva5gdx4xji288k108hjdi8b1yn506lzix2", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/taskwarrior-web/taskwarrior-web.json b/pkgs/webapps/taskwarrior-web/taskwarrior-web.json deleted file mode 100644 index 70f396d..0000000 --- a/pkgs/webapps/taskwarrior-web/taskwarrior-web.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "a79cfe2-master", - "meta": { - "name": "taskwarrior-web", - "url": "https://github.com/theunraveler/taskwarrior-web", - "branch": "master" - }, - "github": { - "owner": "theunraveler", - "repo": "taskwarrior-web", - "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", - "sha256": "028rb4wry2an19707bvy4n305f3s0hipg214224p1m0mb61c3cq4", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json b/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json deleted file mode 100644 index e57fcce..0000000 --- a/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "0ea2092-master", - "meta": { - "name": "ttrss-af_feedmod", - "url": "https://github.com/mbirth/ttrss_plugin-af_feedmod", - "branch": "master" - }, - "github": { - "owner": "mbirth", - "repo": "ttrss_plugin-af_feedmod", - "rev": "0ea2092dd34067ecd898802cfca3570023d1ecfe", - "sha256": "02ibf47zcrsc2rr45wsix8gxyyf371davj8n8i0gj1zdq95klvnv", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix b/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix deleted file mode 100644 index 8512be3..0000000 --- a/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ patched ? false, stdenv, mylibs, lib }: -stdenv.mkDerivation (mylibs.fetchedGithub ./af_feedmod.json // { - patches = lib.optionals patched [ ./type_replace.patch ]; - installPhase = '' - mkdir $out - cp init.php $out - ''; - passthru.pluginName = "af_feedmod"; -}) diff --git a/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json b/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json deleted file mode 100644 index c8aaab5..0000000 --- a/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "4d751b0-master", - "meta": { - "name": "ttrss-auth-ldap", - "url": "https://github.com/hydrian/TTRSS-Auth-LDAP", - "branch": "master" - }, - "github": { - "owner": "hydrian", - "repo": "TTRSS-Auth-LDAP", - "rev": "4d751b095c29a8dbe2dc7bb07777742956136e94", - "sha256": "0b9fl86acrzpcv41r7pj3bl8b3n72hpkdywzx9zjyfqv5pskxyim", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix b/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix deleted file mode 100644 index 424a9f7..0000000 --- a/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ stdenv, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./auth-ldap.json // { - installPhase = '' - mkdir $out - cp plugins/auth_ldap/init.php $out - ''; - passthru.pluginName = "auth_ldap"; -}) diff --git a/pkgs/webapps/ttrss/plugins/feediron/default.nix b/pkgs/webapps/ttrss/plugins/feediron/default.nix deleted file mode 100644 index 80bfda4..0000000 --- a/pkgs/webapps/ttrss/plugins/feediron/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ patched ? false, stdenv, mylibs, lib }: -stdenv.mkDerivation (mylibs.fetchedGithub ./feediron.json // { - patches = lib.optionals patched [ ./json_reformat.patch ]; - installPhase = '' - mkdir $out - cp -a . $out - ''; - passthru.pluginName = "feediron"; -}) diff --git a/pkgs/webapps/ttrss/plugins/feediron/feediron.json b/pkgs/webapps/ttrss/plugins/feediron/feediron.json deleted file mode 100644 index 5dbec92..0000000 --- a/pkgs/webapps/ttrss/plugins/feediron/feediron.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "407168c-master", - "meta": { - "name": "ttrss-feediron", - "url": "https://github.com/m42e/ttrss_plugin-feediron", - "branch": "master" - }, - "github": { - "owner": "m42e", - "repo": "ttrss_plugin-feediron", - "rev": "407168c628880b5ced572cc549db6d50e866d3c8", - "sha256": "17b95ifpcph6m03hjd1mhi8gi1hw9yd3fnffmw66fqr5c9l3zd9r", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix b/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix deleted file mode 100644 index 3540f73..0000000 --- a/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ stdenv, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./ff_instagram.json // { - installPhase = '' - mkdir $out - cp -a . $out - ''; - passthru.pluginName = "ff_instagram"; -}) diff --git a/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json b/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json deleted file mode 100644 index 1f241b9..0000000 --- a/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "0366ffb-master", - "meta": { - "name": "ttrss-ff_instagram", - "url": "https://github.com/wltb/ff_instagram", - "branch": "master" - }, - "github": { - "owner": "wltb", - "repo": "ff_instagram", - "rev": "0366ffb18c4d490c8fbfba2f5f3367a5af23cfe8", - "sha256": "0vvzl6wi6jmrqknsfddvckjgsgfizz1d923d1nyrpzjfn6bda1vk", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix b/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix deleted file mode 100644 index 2cf3e05..0000000 --- a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ stdenv, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./tumblr_gdpr_ua.json // { - installPhase = '' - mkdir $out - cp -a . $out - ''; - passthru.pluginName = "tumblr_gdpr_ua"; -}) diff --git a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json b/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json deleted file mode 100644 index eafbcfe..0000000 --- a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "287c584-master", - "meta": { - "name": "ttrss-tumblr_gdpr_ua", - "url": "https://github.com/hkockerbeck/ttrss-tumblr-gdpr-ua", - "branch": "master" - }, - "github": { - "owner": "hkockerbeck", - "repo": "ttrss-tumblr-gdpr-ua", - "rev": "287c584e68845d524f920156bff0b2eaa6f65117", - "sha256": "1fviawgcclqky4k4xv1sqzvpb8i74w9f0pclm09m78s8l85wh9py", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/yourls/plugins/ldap/default.nix b/pkgs/webapps/yourls/plugins/ldap/default.nix deleted file mode 100644 index 01dc6fb..0000000 --- a/pkgs/webapps/yourls/plugins/ldap/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ stdenv, mylibs }: -stdenv.mkDerivation (mylibs.fetchedGithub ./ldap.json // rec { - installPhase = '' - mkdir -p $out - cp plugin.php $out - ''; - passthru.pluginName = "ldap"; -}) diff --git a/pkgs/webapps/yourls/plugins/ldap/ldap.json b/pkgs/webapps/yourls/plugins/ldap/ldap.json deleted file mode 100644 index 9411e4a..0000000 --- a/pkgs/webapps/yourls/plugins/ldap/ldap.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "2a3cb03-master", - "meta": { - "name": "yourls-ldap-plugin", - "url": "https://github.com/k3a/yourls-ldap-plugin", - "branch": "master" - }, - "github": { - "owner": "k3a", - "repo": "yourls-ldap-plugin", - "rev": "2a3cb0334b8a6b81b284a7196e614bbd2b2b1615", - "sha256": "0cchbnli77d295lzf7kjmn4dcxj2bmdqa9qc3f8l8qgmp4n5n0gh", - "fetchSubmodules": true - } -} diff --git a/pkgs/webapps/yourls/yourls.json b/pkgs/webapps/yourls/yourls.json deleted file mode 100644 index 0a79b18..0000000 --- a/pkgs/webapps/yourls/yourls.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "tag": "1.7.3", - "meta": { - "name": "yourls", - "url": "https://github.com/YOURLS/YOURLS", - "branch": "refs/tags/1.7.3" - }, - "github": { - "owner": "YOURLS", - "repo": "YOURLS", - "rev": "077018822d3594229daa8343310d0b40804b9ddc", - "sha256": "1av6h619rwqn0yn0kjn2s2h3gmrhmxaaa9hd5ns4ralxgg731imd", - "fetchSubmodules": true - } -} diff --git a/scripts/fetch_version b/scripts/fetch_version deleted file mode 100755 index 5c4715a..0000000 --- a/scripts/fetch_version +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env bash - -usage() { - echo "$0 file.json" - echo "$0 [-n|--name name] [-b|--branch branch_or_rev] [-f|--file out_file] [-h|--help] (-u|--url) url" - exit -} - -branch="master" -while [[ $# -gt 0 ]]; do - a="$1" - shift - case "$a" in - *.json) - file=$a - content=$(cat $a) - name="$(echo "$content" | jq -r ".meta.name")" - url="$(echo "$content" | jq -r ".meta.url")" - branch="$(echo "$content" | jq -r ".meta.branch")" - ;; - -n|--name) - name=$1 - shift - ;; - -u|--url) - url=$1 - shift - ;; - -b|--branch) - branch=$1 - shift - ;; - -f|--file) - file=$1 - shift - ;; - -h|--help) - usage - ;; - esac -done -if [ -z "$url" ]; then - usage -fi -if [ -z "$name" ]; then - name=$(echo "$url" | cut -d"/" -f5) -fi -if [ -z "$file" ]; then - file=$name.json -fi - -# function fetch_ledger () { -# pushd $HOME/projets/ledger >/dev/null 2>/dev/null -# git fetch origin -# tag="$(git describe origin/next | sed -e "s/^v//")" -# rev="$(git show-ref -s refs/remotes/origin/next)" -# sha="$(nix-prefetch-url --unpack file://<(git archive --format=tar.gz HEAD) 2>/dev/null)" -# popd >/dev/null 2>/dev/null -# } - -# awk_describe='BEGIN { -# FS = "[ /^]+" -# while ("git ls-remote " ARGV[1] "| sort -Vk2" | getline) { -# if (!sha) -# sha = substr($0, 1, 7) -# tag = $3 -# } -# while ("curl -s " ARGV[1] "/releases/tag/" tag | getline) -# if ($3 ~ "commits") -# com = $2 -# printf com ? "%s-%s-g%s\n" : "%s\n", tag, com, sha -# }' - -function get_ref () { - case "$1" in - refs/*) - echo "$1" - ;; - *) - echo "refs/heads/$1" - ;; - esac -} - -function get_name () { - branch="$1" - rev="$2" - minirev=${rev:0:7} - - case "$branch" in - refs/tags/*) - b="${branch#refs/tags/}" - echo "${b//\//-}" - ;; - refs/heads/*) - b=${branch#refs/heads/} - echo "$minirev-${b//\//-}" - ;; - refs/*) - b=${branch#refs/} - echo "$minirev-${b//\//-}" - ;; - *) - echo "$minirev-${branch//\//-}" - ;; - esac -} - -function fetch_github () { - rev="$(git ls-remote --refs $url $(get_ref $branch) | head -n1 | cut -f1)" - sha="$(nix-prefetch-url --unpack $url/archive/$rev.tar.gz)" - # Différent du git-describe et github-spécifique - #tag=$(echo "$awk_describe" | awk -f - $url | sed -e "s/^v//") - tag=$(get_name $branch $rev) -} - -function fetch_other () { - rev="$(git ls-remote --refs $url $(get_ref $branch) | head -n1 | cut -f1)" - sha="$(nix-prefetch-git --url $url --rev $(get_ref $branch) | jq -r '.sha256')" - tag=$(get_name $branch $rev) -} - -case "$url" in - https://*github.com/*) - fetch_github 2>/dev/null - owner=$(echo "$url" | cut -d"/" -f4) - repo=$(echo "$url" | cut -d"/" -f5) - - F='{ - "tag": $tag, - "meta": { - "name": $name, - "url": $url, - "branch": $branch - }, - "github": { - "owner": $owner, - "repo": $repo, - "rev": $rev, - "sha256": $sha, - "fetchSubmodules": true - } - }' - ;; - *) - fetch_other 2>/dev/null - F='{ - "tag": $tag, - "meta": { - "name": $name, - "url": $url, - "branch": $branch - }, - "git": { - "url": $url, - "rev": $rev, - "sha256": $sha, - "fetchSubmodules": true - } - }' - ;; -esac - -jq -n \ - --arg name "$name" \ - --arg owner "$owner" \ - --arg repo "$repo" \ - --arg tag "$tag" \ - --arg rev "$rev" \ - --arg url "$url" \ - --arg branch "$branch" \ - --arg sha "$sha" \ - "$F" > $file diff --git a/scripts/make-nur b/scripts/make-nur index 127f8bd..2b7278f 100755 --- a/scripts/make-nur +++ b/scripts/make-nur @@ -19,7 +19,7 @@ git rebase --onto=$nur_root $first_commit master # The list below musn't get shrinked, it is used by filter-branch on # every commit clean_folder=' - rm -rf config lib/private modules/private pkgs/private nixops + rm -rf config lib/private modules/private pkgs/private deploy for broken in pkgs/crypto/cardano/default.nix; do if [ -f $broken ]; then rm -f $broken diff --git a/scripts/refresh_flakes b/scripts/refresh_flakes new file mode 100755 index 0000000..2bbcad6 --- /dev/null +++ b/scripts/refresh_flakes @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +set -e + +declare -A refreshed + +while [ -n "$1" ]; do + case "$1" in + --no-new-inputs) + no_new_inputs="y" + shift;; + *) + flake_or_dir="$1" + shift;; + esac +done + +refresh_deps() { + local flake + local inputs=() + local depname + local deppath + flake="$(realpath $1)" + if [ "${refreshed[$flake]}" = 1 ]; then + return + fi + pushd "$flake" 2>/dev/null >/dev/null + if [ -z "$no_new_inputs" ]; then + nix --no-warn-dirty flake lock + fi + if [ ! -e "$flake/flake.lock" ]; then + popd 2>/dev/null >/dev/null + refreshed[$flake]=1 + return + fi + + deps=$(jq -r '. as $root | .nodes[.root].inputs|values|to_entries|map({ key: .key, value: $root.nodes[.value].original.path })[]|select(.value != null)|.key + " " + .value' < flake.lock) + if [ -n "$deps" ]; then + while read depname deppath; do + refresh_deps "$deppath" + inputs+=(--update-input "$depname") + done <<<"$deps" + fi + nix --no-warn-dirty flake lock "${inputs[@]}" + popd 2>/dev/null >/dev/null + refreshed[$flake]=1 +} + +git_dir=$(git rev-parse --show-toplevel) + +# If argument is given (flake.nix or directory containing), refresh that argument +# Otherwise, if we are in a subdirectory containing a flake.nix, refresh that +# Otherwise, refresh all +if [ -n "$flake_or_dir" ]; then + if [ -d "$flake_or_dir" -a -e "$1/flake.nix" ]; then + refresh_deps "$flake_or_dir" + elif [ -f "$flake_or_dir" -a -e "$(dirname $flake_or_dir)/flake.nix" ]; then + refresh_deps "$(dirname $flake_or_dir)" + else + echo "No flake.nix file in specified location" + exit 1 + fi +else + if [ "$(pwd)" != "$git_dir" -a -e "$(pwd)/flake.nix" ]; then + refresh_deps "$(pwd)" + else + find $git_dir -name "flake.lock" | while read flake; do + refresh_deps "$(dirname $flake)" + done + fi +fi diff --git a/nixops/scripts/setup b/scripts/setup similarity index 100% rename from nixops/scripts/setup rename to scripts/setup diff --git a/scripts/update_flake b/scripts/update_flake new file mode 100755 index 0000000..3a9cd17 --- /dev/null +++ b/scripts/update_flake @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +searched_file="$1" + +get_inputs() { + flake=$1 + name=$2 + cat "$flake" | jq -r --arg name "$name" '.nodes|to_entries[]|select(.value.original.path != null and (.value.original.path|test("(../)+" + $name)))|.key' +} + +find flakes -name "flake.lock" | while read flake; do + for input in $(get_inputs "$flake" "$searched_file"); do + echo "updating $input in $(dirname "$flake")" + pushd "$(dirname "$flake")" >/dev/null 2>/dev/null + nix flake update --update-input "$input" + popd >/dev/null 2>/dev/null + done +done diff --git a/scripts/with_env b/scripts/with_env new file mode 100755 index 0000000..783d86c --- /dev/null +++ b/scripts/with_env @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +if [ -z "$SOPS_VARS_FILE" ]; then + echo "Variable SOPS_VARS_FILE is needed with a path to the sops variables" + exit 1; +fi + +umask 0077 +TEMP=$(mktemp -d /tmp/XXXXXX-nixops-files) +chmod go-rwx $TEMP + +finish() { + rm -rf "$TEMP" +} + +trap finish EXIT + +sops -d $SOPS_VARS_FILE | yq -r .ssl_keys.nix_repository > $TEMP/id_ed25519 + +cat > $TEMP/ssh_config < { overlays = builtins.attrValues (import ./overlays); }, - pkgs-nix ? import { overlays = builtins.attrValues (import ./overlays); } -}: -let - patchedNix = pkgs-nix.nixUnstable.overrideAttrs(old: { - patches = old.patches ++ [ - # Fix the ETag bug. PR merged. Remove when updating to >= 20210125 - # https://github.com/NixOS/nixpkgs/pull/109309#issuecomment-768331750 - (pkgs-nix.fetchpatch { - url = "https://patch-diff.githubusercontent.com/raw/NixOS/nix/pull/4470.diff"; - sha256 = "sha256-d4RNOKMxa4NMbFgYcqWRv2ByHt8F/XUWV+6P9qHz7S4="; - }) - ]; - }); -in -pkgs.mkShell { - buildInputs = [ patchedNix pkgs.sops pkgs.morph pkgs.niv pkgs.curl pkgs.shellcheck pkgs.jq pkgs.gnumake pkgs.yq ]; -} diff --git a/modules/private/system/backup-2.nix b/systems/backup-2/base.nix similarity index 70% rename from modules/private/system/backup-2.nix rename to systems/backup-2/base.nix index c01a666..97a364c 100644 --- a/modules/private/system/backup-2.nix +++ b/systems/backup-2/base.nix @@ -1,10 +1,5 @@ -{ config, pkgs, resources, name, ... }: +{ config, pkgs, resources, name, lib, nixpkgs, secrets, ... }: { - deployment = { - targetUser = "root"; - targetHost = config.hostEnv.ips.main.ip4; - substituteOnDestination = true; - }; # ssh-keyscan backup-2 | nix-shell -p ssh-to-age --run ssh-to-age secrets.ageKeys = [ "age1kk3nr27qu42j28mcfdag5lhq0zu2pky7gfanvne8l4z2ctevjpgskmw0sr" ]; secrets.keys = { @@ -22,9 +17,22 @@ }; }; boot.kernelPackages = pkgs.linuxPackages_latest; - myEnv = import ../../../nixops/secrets/environment.nix; - imports = [ ] ++ builtins.attrValues (import ../..); + nixpkgs.config.permittedInsecurePackages = [ + "python-2.7.18.6" # for nagios-cli + ]; + + imports = + [ + secrets.nixosModules.users-config-backup-2 + (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix") + ./databases/mariadb_replication.nix + ./databases/openldap_replication.nix + ./databases/postgresql_replication.nix + ./databases/redis_replication.nix + ./mail/relay.nix + ./monitoring.nix + ]; fileSystems = { "/backup2" = { @@ -36,9 +44,9 @@ networking = { firewall.enable = true; - interfaces."ens3".ipv4.addresses = pkgs.lib.attrsets.mapAttrsToList - (n: ips: { address = ips.ip4; prefixLength = 32; }) - (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips); + interfaces."ens3".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList + (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or [])) + (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips)); interfaces."ens3".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or [])) config.hostEnv.ips); @@ -47,9 +55,7 @@ boot.loader.grub.device = "nodev"; - myServices.certificates.enable = true; security.acme.certs."${name}" = { - user = config.services.nginx.user; group = config.services.nginx.group; }; services.nginx = { @@ -65,6 +71,27 @@ enable = true; }; + myServices.chatonsProperties.hostings.rsync-backup = { + file.datetime = "2022-08-27T16:00:00"; + hosting = { + name = "Rsync backups"; + description = "Remote initiated rsync backups"; + website = "backup-2.v.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "rsync"; + website = "https://rsync.samba.org/"; + license.url = "https://rsync.samba.org/GPL.html"; + license.name = "GNU General Public License version 3"; + version = pkgs.rsync.version; + source.url = "https://github.com/WayneD/rsync"; + }; + }; + services.rsyncBackup = { mountpoint = "/backup2"; profiles = config.myEnv.rsync_backup.profiles; @@ -95,8 +122,8 @@ eldiron = { serverId = 2; # mysql resolves "backup-2" host and checks the ip, but uses /etc/hosts which only contains ip4 - host = config.myEnv.servers.eldiron.ips.main.ip4; - port = "3306"; + host = lib.head config.myEnv.servers.eldiron.ips.main.ip4; + port = config.myEnv.databases.mysql.port; user = "backup-2"; password = config.hostEnv.ldap.password; dumpUser = "root"; @@ -133,5 +160,5 @@ # database servers. You should change this only after NixOS release # notes say you should. # https://nixos.org/nixos/manual/release-notes.html - system.stateVersion = "20.03"; # Did you read the comment? + system.stateVersion = "23.05"; # Did you read the comment? } diff --git a/modules/private/databases/mariadb_replication.nix b/systems/backup-2/databases/mariadb_replication.nix similarity index 89% rename from modules/private/databases/mariadb_replication.nix rename to systems/backup-2/databases/mariadb_replication.nix index 68e6f7f..8d2b457 100644 --- a/modules/private/databases/mariadb_replication.nix +++ b/systems/backup-2/databases/mariadb_replication.nix @@ -38,7 +38,7 @@ in ''; }; port = lib.mkOption { - type = lib.types.str; + type = lib.types.int; description = '' Port to connect to ''; @@ -73,6 +73,26 @@ in }; config = lib.mkIf cfg.enable { + myServices.chatonsProperties.hostings.mysql-replication = { + file.datetime = "2022-08-27T15:00:00"; + hosting = { + name = "Mysql replication"; + description = "Replication of mysql database"; + website = "db-1.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "MariaDB"; + website = "https://mariadb.org/"; + license.url = "https://github.com/MariaDB/server/blob/10.11/COPYING"; + license.name = "GNU General Public License v2.0"; + version = pkgs.mariadb.version; + source.url = "https://github.com/MariaDB/server"; + }; + }; users.users.mysql = { description = "MySQL server user"; group = "mysql"; @@ -87,7 +107,7 @@ in group = "mysql"; permissions = "0400"; text = '' - CHANGE MASTER TO master_host="${hcfg.host}", master_port=${hcfg.port}, master_user="${hcfg.user}", master_password="${hcfg.password}", master_ssl=1, master_use_gtid=slave_pos; + CHANGE MASTER TO master_host="${hcfg.host}", master_port=${builtins.toString hcfg.port}, master_user="${hcfg.user}", master_password="${hcfg.password}", master_ssl=1, master_use_gtid=slave_pos; START SLAVE; ''; }) @@ -192,7 +212,7 @@ in ${hcfg.package}/bin/mysqldump \ --defaults-file=${config.secrets.fullPaths."mysql_replication/${name}/mysqldump_remote"} \ -h ${hcfg.host} \ - -P ${hcfg.port} \ + -P ${builtins.toString hcfg.port} \ --ssl \ --gtid \ --flush-privileges \ diff --git a/modules/private/databases/openldap_replication.nix b/systems/backup-2/databases/openldap_replication.nix similarity index 96% rename from modules/private/databases/openldap_replication.nix rename to systems/backup-2/databases/openldap_replication.nix index b456323..b962224 100644 --- a/modules/private/databases/openldap_replication.nix +++ b/systems/backup-2/databases/openldap_replication.nix @@ -1,19 +1,18 @@ -{ pkgs, config, lib, ... }: +{ pkgs, config, lib, openldap, ... }: let cfg = config.myServices.databasesReplication.openldap; - eldiron_schemas = pkgs.callPackage ./openldap/eldiron_schemas.nix {}; ldapConfig = hcfg: name: pkgs.writeText "slapd.conf" '' include ${pkgs.openldap}/etc/schema/core.schema include ${pkgs.openldap}/etc/schema/cosine.schema include ${pkgs.openldap}/etc/schema/inetorgperson.schema include ${pkgs.openldap}/etc/schema/nis.schema - ${eldiron_schemas} + include ${openldap.immae-schema} pidfile /run/slapd_${name}/slapd.pid argsfile /run/slapd_${name}/slapd.args - moduleload back_hdb - backend hdb - database hdb + moduleload back_mdb + backend mdb + database mdb suffix "${hcfg.base}" rootdn "cn=root,${hcfg.base}" diff --git a/modules/private/databases/postgresql_replication.nix b/systems/backup-2/databases/postgresql_replication.nix similarity index 88% rename from modules/private/databases/postgresql_replication.nix rename to systems/backup-2/databases/postgresql_replication.nix index 135bbed..5351a4f 100644 --- a/modules/private/databases/postgresql_replication.nix +++ b/systems/backup-2/databases/postgresql_replication.nix @@ -50,6 +50,26 @@ in }; config = lib.mkIf cfg.enable { + myServices.chatonsProperties.hostings.postgresql-replication = { + file.datetime = "2022-08-27T15:00:00"; + hosting = { + name = "PostgreSQL replication"; + description = "Replication of PostgreSQL database"; + website = "db-1.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "PostgreSQL"; + website = "https://www.postgresql.org/"; + license.url = "https://www.postgresql.org/about/licence/"; + license.name = "The PostgreSQL Licence"; + version = pkgs.postgresql.version; + source.url = "https://git.postgresql.org/gitweb/?p=postgresql.git;a=summary"; + }; + }; users.users.postgres = { name = "postgres"; uid = config.ids.uids.postgres; @@ -90,6 +110,7 @@ in unix_socket_directories = '${dataDir}' data_directory = '${dataDir}' wal_level = logical + max_connections = 300 ''; }) ]) cfg.hosts)); diff --git a/modules/private/databases/redis_replication.nix b/systems/backup-2/databases/redis_replication.nix similarity index 98% rename from modules/private/databases/redis_replication.nix rename to systems/backup-2/databases/redis_replication.nix index 9e48939..53fa904 100644 --- a/modules/private/databases/redis_replication.nix +++ b/systems/backup-2/databases/redis_replication.nix @@ -63,7 +63,7 @@ in config.redis = { encrypt = true; source = "127.0.0.1:16379"; - target = "${config.myEnv.servers.eldiron.ips.main.ip4}:16379"; + target = "${lib.head config.myEnv.servers.eldiron.ips.main.ip4}:16379"; keyfile = config.secrets.fullPaths."redis/spiped_eldiron_keyfile"; }; }; diff --git a/modules/private/databases/utils.nix b/systems/backup-2/databases/utils.nix similarity index 96% rename from modules/private/databases/utils.nix rename to systems/backup-2/databases/utils.nix index 47988fc..1b3190f 100644 --- a/modules/private/databases/utils.nix +++ b/systems/backup-2/databases/utils.nix @@ -16,7 +16,7 @@ rev = "061f0564757289d3bea553b16f8fd5c4a0319c5e"; }; log2rotate = pkgs.writeScript "log2rotate" '' - #!${pkgs.python3}/bin/python + #!${pkgs.python38}/bin/python ${builtins.readFile "${log2rotateSrc}/log2rotate.py"} ''; diff --git a/systems/backup-2/flake.lock b/systems/backup-2/flake.lock new file mode 100644 index 0000000..46003ba --- /dev/null +++ b/systems/backup-2/flake.lock @@ -0,0 +1,1159 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_6", + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "chatons": { + "inputs": { + "environment": "environment" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_3", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_6": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "mail-relay": { + "inputs": { + "environment": "environment_3", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "milters": { + "inputs": { + "environment": "environment_4", + "files-watcher": "files-watcher", + "openarc": "openarc", + "opendmarc": "opendmarc", + "secrets": "secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_5", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_11", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "my-lib", + "disko" + ], + "flake-parts": [ + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_5", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "openarc": { + "inputs": { + "flake-utils": "flake-utils", + "myuids": "myuids", + "nixpkgs": "nixpkgs", + "openarc": "openarc_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_2": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_3": { + "inputs": { + "files-watcher": "files-watcher_2", + "openarc": "openarc_4", + "secrets": "secrets_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "openarc_4": { + "inputs": { + "flake-utils": "flake-utils_4", + "myuids": "myuids_4", + "nixpkgs": "nixpkgs_8", + "openarc": "openarc_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_5": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "opendmarc": { + "inputs": { + "flake-utils": "flake-utils_2", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_2": { + "inputs": { + "environment": "environment_6", + "files-watcher": "files-watcher_3", + "opendmarc": "opendmarc_3", + "secrets": "secrets_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "opendmarc_3": { + "inputs": { + "flake-utils": "flake-utils_5", + "myuids": "myuids_5", + "nixpkgs": "nixpkgs_9" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "root": { + "inputs": { + "chatons": "chatons", + "environment": "environment_2", + "loginctl-linger": "loginctl-linger", + "mail-relay": "mail-relay", + "milters": "milters", + "monitoring": "monitoring", + "my-lib": "my-lib", + "myuids": "myuids_3", + "nixpkgs": "nixpkgs_7", + "openarc": "openarc_3", + "opendmarc": "opendmarc_2", + "openldap": "openldap", + "rsync_backup": "rsync_backup", + "secrets": "secrets_6", + "system": "system" + } + }, + "rsync_backup": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=", + "path": "../../flakes/rsync_backup", + "type": "path" + }, + "original": { + "path": "../../flakes/rsync_backup", + "type": "path" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_7", + "mypackages": "mypackages", + "myuids": "myuids_6", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/systems/backup-2/flake.nix b/systems/backup-2/flake.nix new file mode 100644 index 0000000..e6807d6 --- /dev/null +++ b/systems/backup-2/flake.nix @@ -0,0 +1,51 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + my-lib.url = "path:../../flakes/lib"; + + openldap.url = "path:../../flakes/private/openldap"; + monitoring.url = "path:../../flakes/private/monitoring"; + mail-relay.url = "path:../../flakes/private/mail-relay"; + milters.url = "path:../../flakes/private/milters"; + openarc.url = "path:../../flakes/private/openarc"; + opendmarc.url = "path:../../flakes/private/opendmarc"; + chatons.url = "path:../../flakes/private/chatons"; + environment.url = "path:../../flakes/private/environment"; + system.url = "path:../../flakes/private/system"; + + myuids.url = "path:../../flakes/myuids"; + secrets.url = "path:../../flakes/secrets"; + rsync_backup.url = "path:../../flakes/rsync_backup"; + loginctl-linger.url = "path:../../flakes/loginctl-linger"; + }; + outputs = inputs@{ self, my-lib, nixpkgs, ...}: + my-lib.lib.mkColmenaFlake { + name = "backup-2"; + inherit self nixpkgs; + system = "x86_64-linux"; + targetHost = "95.217.19.143"; + targetUser = "root"; + nixosModules = { + base = ./base.nix; + system = inputs.system.nixosModule; + mail-relay = inputs.mail-relay.nixosModule; + milters = inputs.milters.nixosModule; + openarc = inputs.openarc.nixosModule; + opendmarc = inputs.opendmarc.nixosModule; + chatons = inputs.chatons.nixosModule; + monitoring = inputs.monitoring.nixosModule; + environment = inputs.environment.nixosModule; + + myuids = inputs.myuids.nixosModule; + secrets = inputs.secrets.nixosModule; + rsync_backup = inputs.rsync_backup.nixosModule; + loginctl-linger = inputs.loginctl-linger.nixosModule; + }; + moduleArgs = { + nixpkgs = inputs.nixpkgs; + openldap = inputs.openldap; + monitoring = inputs.monitoring; + }; + }; +} diff --git a/modules/private/mail/relay.nix b/systems/backup-2/mail/relay.nix similarity index 68% rename from modules/private/mail/relay.nix rename to systems/backup-2/mail/relay.nix index 668d365..1b7e25e 100644 --- a/modules/private/mail/relay.nix +++ b/systems/backup-2/mail/relay.nix @@ -1,17 +1,22 @@ -{ lib, pkgs, config, nodes, name, ... }: +{ lib, pkgs, config, name, nodes, ... }: +let + getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) (lib.filterAttrs (n: v: v.receive) p.emailPolicies); + bydomain = builtins.mapAttrs (n: getDomains) nodes.eldiron.config.myServices.dns.zones; + receiving_domains = lib.flatten (builtins.attrValues bydomain); +in { + options.myServices.mailBackup.enable = lib.mkEnableOption "enable MX backup services"; config = lib.mkIf config.myServices.mailBackup.enable { - security.acme.certs."mail" = config.myServices.certificates.certConfig // { + myServices.mail.milters.enable = true; + security.acme.certs."mail" = { postRun = '' systemctl restart postfix.service ''; domain = config.hostEnv.fqdn; - extraDomains = let - zonesWithMx = builtins.filter (zone: - lib.attrsets.hasAttr "withEmail" zone && lib.lists.length zone.withEmail > 0 - ) config.myEnv.dns.masterZones; - mxs = map (zone: "${config.myEnv.servers."${name}".mx.subdomain}.${zone.name}") zonesWithMx; - in builtins.listToAttrs (map (mx: lib.attrsets.nameValuePair mx null) mxs); + extraDomainNames = let + zonesWithMx = builtins.attrNames (lib.filterAttrs (n: v: v.hasEmail) nodes.eldiron.config.myServices.dns.zones); + mxs = map (n: "${config.myEnv.servers."${name}".mx.subdomain}.${n}") zonesWithMx; + in mxs; }; secrets.keys = { "postfix/mysql_alias_maps" = { @@ -112,45 +117,22 @@ }; services.postfix = { mapFiles = let - recipient_maps = let - name = n: i: "relay_${n}_${toString i}"; - pair = n: i: m: lib.attrsets.nameValuePair (name n i) ( - if m.type == "hash" - then pkgs.writeText (name n i) m.content - else null - ); - pairs = n: v: lib.imap1 (i: m: pair n i m) v.recipient_maps; - in lib.attrsets.filterAttrs (k: v: v != null) ( - lib.attrsets.listToAttrs (lib.flatten ( - lib.attrsets.mapAttrsToList pairs config.myEnv.mail.postfix.backup_domains - )) - ); - relay_restrictions = lib.attrsets.filterAttrs (k: v: v != null) ( - lib.attrsets.mapAttrs' (n: v: - lib.attrsets.nameValuePair "recipient_access_${n}" ( - if lib.attrsets.hasAttr "relay_restrictions" v - then pkgs.writeText "recipient_access_${n}" v.relay_restrictions - else null - ) - ) config.myEnv.mail.postfix.backup_domains - ); virtual_map = { virtual = let cfg = config.myEnv.monitoring.email_check.eldiron; address = "${cfg.mail_address}@${cfg.mail_domain}"; + aliases = config.myEnv.mail.postfix.common_aliases; in pkgs.writeText "postfix-virtual" ( builtins.concatStringsSep "\n" ( - ["${address} 1"] ++ - lib.attrsets.mapAttrsToList ( - n: v: lib.optionalString v.external '' - script_${n}@mail.immae.eu 1 - '' - ) config.myEnv.mail.scripts + [ "${address} 1" + ] ++ + map (a: "${a} 1") config.myEnv.mail.postfix.other_aliases ++ + lib.lists.flatten (map (domain: map (alias: "${alias}@${domain} 1") aliases) receiving_domains) ) ); }; in - recipient_maps // relay_restrictions // virtual_map; + virtual_map; config = { ### postfix module overrides readme_directory = "${pkgs.postfix}/share/postfix/doc"; @@ -163,25 +145,8 @@ alias_database = "\$alias_maps"; ### Relay domains - relay_domains = let - backups = lib.flatten (lib.attrsets.mapAttrsToList (n: v: v.domains or []) config.myEnv.mail.postfix.backup_domains); - virtual_domains = config.myEnv.mail.postfix.additional_mailbox_domains - ++ lib.remove null (lib.flatten (map - (zone: map - (e: if e.receive - then "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}" - else null - ) - (zone.withEmail or []) - ) - config.myEnv.dns.masterZones - )); - in - backups ++ virtual_domains; + relay_domains = receiving_domains; relay_recipient_maps = let - backup_recipients = lib.flatten (lib.attrsets.mapAttrsToList (n: v: - lib.imap1 (i: m: "${m.type}:/etc/postfix/relay_${n}_${toString i}") v.recipient_maps - ) config.myEnv.mail.postfix.backup_domains); virtual_alias_maps = [ "hash:/etc/postfix/virtual" "mysql:${config.secrets.fullPaths."postfix/mysql_alias_maps"}" @@ -192,14 +157,10 @@ "pgsql:${config.secrets.fullPaths."postfix/sympa_mailbox_maps"}" ]; in - backup_recipients ++ virtual_alias_maps ++ virtual_mailbox_maps; + virtual_alias_maps ++ virtual_mailbox_maps; smtpd_relay_restrictions = [ "defer_unauth_destination" - ] ++ lib.flatten (lib.attrsets.mapAttrsToList (n: v: - if lib.attrsets.hasAttr "relay_restrictions" v - then [ "check_recipient_access hash:/etc/postfix/recipient_access_${n}" ] - else [] - ) config.myEnv.mail.postfix.backup_domains); + ]; ### Additional smtpd configuration smtpd_tls_received_header = "yes"; @@ -210,7 +171,7 @@ smtp_tls_loglevel = "1"; ### Force ip bind for smtp - smtp_bind_address = config.myEnv.servers."${name}".ips.main.ip4; + smtp_bind_address = builtins.head config.myEnv.servers."${name}".ips.main.ip4; smtp_bind_address6 = builtins.head config.myEnv.servers."${name}".ips.main.ip6; smtpd_milters = [ diff --git a/systems/backup-2/monitoring.nix b/systems/backup-2/monitoring.nix new file mode 100644 index 0000000..6d769e3 --- /dev/null +++ b/systems/backup-2/monitoring.nix @@ -0,0 +1,117 @@ +{ config, pkgs, lib, name, openldap, monitoring, ... }: +let + hostFQDN = config.hostEnv.fqdn; + emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check; +in +{ + config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "file_date" "mysql" "openldap" "redis" "emails" "notify-secondary"]; + config.myServices.monitoring.objects = lib.mkMerge [ + (monitoring.lib.objectsCommon { + inherit hostFQDN; + hostName = name; + master = false; + processWarn = "60"; processAlert = "70"; + loadWarn = "4.0"; loadAlert = "6.0"; + load15Warn = "1.0"; load15Alert = "1.0"; + interface = builtins.head (builtins.attrNames config.networking.interfaces); + }) + + { + service = [ + (emailCheck "backup-2" hostFQDN // { + __passive_servicegroups = "webstatus-email"; + }) + { + service_description = "Size on /backup2 partition"; + use = "local-service"; + check_command = ["check_local_disk" "10%" "5%" "/backup2"]; + __passive_servicegroups = "webstatus-resources"; + } + { + service_description = "Last backup in /backup2/phare is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/phare" "14" "backup"]; + __passive_servicegroups = "webstatus-backup"; + } + { + service_description = "Last backup in /backup2/dilion is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/dilion" "14" "backup"]; + __passive_servicegroups = "webstatus-backup"; + } + { + service_description = "Last backup in /backup2/ulminfo is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/ulminfo" "14" "backup"]; + __passive_servicegroups = "webstatus-backup"; + } + { + service_description = "Last postgresql dump in /backup2/eldiron/postgresql_backup is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/eldiron/postgresql_backup" "7" "postgres"]; + __passive_servicegroups = "webstatus-databases,webstatus-backup"; + } + { + service_description = "Redis replication for eldiron is up to date"; + use = "local-service"; + check_command = ["check_redis_replication" "/run/redis_eldiron/redis.sock"]; + __passive_servicegroups = "webstatus-databases"; + } + { + service_description = "Last redis dump in /backup2/eldiron/redis_backup is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/eldiron/redis_backup" "7" "redis"]; + __passive_servicegroups = "webstatus-databases,webstatus-backup"; + } + { + service_description = "Mysql replication for eldiron is up to date"; + use = "local-service"; + check_command = ["check_mysql_replication" "/run/mysqld_eldiron/mysqld.sock" config.secrets.fullPaths."mysql_replication/eldiron/client"]; + __passive_servicegroups = "webstatus-databases"; + } + { + service_description = "Last mysql dump in /backup2/eldiron/mysql_backup is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/eldiron/mysql_backup" "7" "mysql"]; + __passive_servicegroups = "webstatus-databases,webstatus-backup"; + } + { + service_description = "Openldap replication for eldiron is up to date"; + use = "local-service"; + check_command = let + name = "eldiron"; + hcfg = config.myServices.databasesReplication.openldap.hosts.eldiron; + base = config.myServices.databasesReplication.openldap.base; + ldapConfig = pkgs.writeText "slapd.conf" '' + include ${pkgs.openldap}/etc/schema/core.schema + include ${pkgs.openldap}/etc/schema/cosine.schema + include ${pkgs.openldap}/etc/schema/inetorgperson.schema + include ${pkgs.openldap}/etc/schema/nis.schema + include ${openldap.immae-schema} + moduleload back_mdb + backend mdb + database mdb + + suffix "${hcfg.base}" + directory ${base}/${name}/openldap + ''; + in [ + "check_openldap_replication" + hcfg.url + hcfg.dn + config.secrets.fullPaths."openldap_replication/eldiron/replication_password" + hcfg.base + "${ldapConfig}" + ]; + __passive_servicegroups = "webstatus-databases"; + } + { + service_description = "Last openldap dump in /backup2/eldiron/openldap_backup is not too old"; + use = "local-service"; + check_command = ["check_last_file_date" "/backup2/eldiron/openldap_backup" "7" "openldap"]; + __passive_servicegroups = "webstatus-databases,webstatus-backup"; + } + ]; + } + ]; +} diff --git a/modules/private/system/dilion.nix b/systems/dilion/base.nix similarity index 50% rename from modules/private/system/dilion.nix rename to systems/dilion/base.nix index fa92cd9..ac4bdaf 100644 --- a/modules/private/system/dilion.nix +++ b/systems/dilion/base.nix @@ -1,24 +1,17 @@ -{ config, pkgs, name, lib, ... }: +{ config, pkgs, name, lib, pkgs-no-overlay, secrets, ... }: { - deployment = { - targetUser = "root"; - targetHost = config.hostEnv.ips.main.ip4; - substituteOnDestination = true; - }; # ssh-keyscan dilion | nix-shell -p ssh-to-age --run ssh-to-age secrets.ageKeys = [ "age1x49n6qa0arkdpq8530s7umgm0gqkq90exv4jep97q30rfnzknpaqate06a" ]; - nixpkgs.system = lib.mkOverride 900 "x86_64-linux"; boot = { loader = { grub = { - version = 2; devices = [ "/dev/sda" "/dev/sdb" "/dev/sdc" "/dev/sdd" ]; }; timeout = 1; }; blacklistedKernelModules = [ "nvidiafb" ]; supportedFilesystems = [ "zfs" ]; - kernelPackages = pkgs.linuxPackages_latest; + kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages; kernelModules = [ "kvm-intel" ]; initrd.availableKernelModules = [ "ahci" "sd_mod" ]; initrd.secrets = { @@ -28,12 +21,9 @@ # available in nixos-20.09 #zfs.requestEncryptionCredentials = [ "zpool/root" ]; }; - nix.maxJobs = 8; powerManagement.cpuFreqGovernor = "powersave"; hardware.enableRedistributableFirmware = true; - myEnv = import ../../../nixops/secrets/environment.nix; - swapDevices = [ { label = "swap"; } ]; fileSystems = { "/" = { fsType = "zfs"; device = "zpool/root"; }; @@ -51,14 +41,18 @@ ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="10:bf:48:7f:e6:3b", NAME="eth0" ''; + nixpkgs.config.permittedInsecurePackages = [ + "python-2.7.18.6" # for nagios-cli + ]; + networking = { hostId = "27c3048d"; # generated with head -c4 /dev/urandom | od -A none -t x4 firewall.enable = false; interfaces."eth0".ipv4.addresses = - [ { address = config.hostEnv.ips.main.ip4; prefixLength = 27; } ] - ++ pkgs.lib.attrsets.mapAttrsToList - (n: ips: { address = ips.ip4; prefixLength = 32; }) - (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips); + [ { address = lib.head config.hostEnv.ips.main.ip4; prefixLength = 27; } ] + ++ pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList + (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or [])) + (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips)); interfaces."eth0".ipv6.addresses = [ { address = "2a01:4f8:141:53e7::"; prefixLength = 64; } ] ++ pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList @@ -76,8 +70,54 @@ ]; }; - myServices.ssh.modules = [ config.myServices.ssh.predefinedModules.regular ]; - imports = builtins.attrValues (import ../..) ++ [ ./dilion/vms.nix ]; + myServices.ssh.modules.regular.snippet = builtins.readFile ./ssh_ldap_regular.sh; + + imports = [ + secrets.nixosModules.users-config-dilion + ./monitoring.nix + ./vms.nix + ]; + + myServices.vms.libvirt-guests = { + buildbot = { + pool = "zfspool"; + network = "immae"; + cpus = 1; + memory = 3; + diskSize = 10; + destroyVolumeOnExit = true; + }; + }; + myServices.vms.libvirt-images = { + nixos = ./vms/base_configuration.nix; + buildbot = ./vms/buildbot_configuration.nix; + }; + myServices.vms.libvirt-networks.immae = { + bridgeNumber = 1; + ipRange = "192.168.100"; + }; + myServices.vms.libvirt-pools = { + niximages = { + type = "dir"; + target = "/etc/libvirtd/base-images"; + }; + buildbot-disks = rec { + type = "dir"; + target = "/var/lib/libvirt/images/buildbot-disks"; + preStart = '' + mkdir -p ${target} + ''; + }; + zfspool = { + # pool-define-as --name zfspool --source-name zpool/libvirt --type zfs + type = "zfs"; + xml = '' + + zpool/libvirt + + ''; + }; + }; system.nssModules = [ pkgs.libvirt ]; system.nssDatabases.hosts = lib.mkForce [ "files" "libvirt_guest" "mymachines" "dns" "myhostname" ]; @@ -88,20 +128,22 @@ shell = pkgs.bashInteractive; isSystemUser = true; group = "libvirtd"; - packages = [ pkgs.netcat-openbsd ]; + packages = [ pkgs.libressl.nc ]; openssh.authorizedKeys.keys = [ config.myEnv.buildbot.ssh_key.public config.myEnv.sshd.rootKeys.ismael_flony ]; }; + users.groups.backup = {}; users.users.backup = { hashedPassword = "!"; isSystemUser = true; extraGroups = [ "keys" ]; + group = "backup"; shell = pkgs.bashInteractive; openssh.authorizedKeys.keys = let - zreplConfig = config.secrets.fullPaths."zrepl/zrepl.yml"; + zreplConfig = "/etc/zrepl/zrepl.yml"; in ["command=\"${pkgs.zrepl}/bin/zrepl stdinserver --config ${zreplConfig} eldiron\",restrict ${config.myEnv.zrepl_backup.ssh_key.public}"]; }; @@ -115,29 +157,26 @@ } ]; - system.activationScripts.libvirtd_exports = '' - install -m 0755 -o root -g root -d /var/lib/caldance - ''; virtualisation.docker.enable = true; virtualisation.docker.storageDriver = "zfs"; virtualisation.libvirtd.enable = true; - users.extraUsers.immae.extraGroups = [ "libvirtd" "docker" ]; + virtualisation.libvirtd.qemu.package = pkgs-no-overlay.qemu; + systemd.services.libvirtd.path = lib.mkAfter [ config.boot.zfs.package ]; + users.groups.immae = {}; + users.extraUsers.immae.extraGroups = [ "immae" "libvirtd" "docker" ]; systemd.services.libvirtd.postStart = '' install -m 0770 -g libvirtd -d /var/lib/libvirt/images ''; - systemd.services.socat-caldance = { - description = "Forward ssh port to caldance"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - - serviceConfig = { - ExecStart = "${pkgs.socat}/bin/socat TCP-LISTEN:8022,fork TCP:caldance:22"; - }; - }; time.timeZone = "Europe/Paris"; nix = { - useSandbox = "relaxed"; + settings = { + sandbox = "relaxed"; + max-jobs = 8; + substituters = [ "https://hydra.iohk.io" "https://cache.nixos.org" ]; + trusted-public-keys = [ "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=" ]; + trusted-users = [ "root" "@wheel"] ; + }; extraOptions = '' keep-outputs = true keep-derivations = true @@ -155,88 +194,116 @@ }) ]; - # This is equivalent to setting environment.sessionVariables.NIX_PATH - nix.nixPath = [ - "home-manager=${pkgs.sources.home-manager.url}" - "nixpkgs=${pkgs.sources.nixpkgs-home-manager.url}" - ]; - nix.binaryCaches = [ "https://hydra.iohk.io" "https://cache.nixos.org" ]; - nix.binaryCachePublicKeys = [ "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=" ]; - myServices.monitoring.enable = true; - myServices.certificates.enable = true; - security.acme.certs."${name}-immae" = config.myServices.certificates.certConfig // { - user = "immae"; + security.acme.certs."${name}-immae" = { + group = "immae"; domain = "dilion.immae.eu"; }; security.acme.certs."${name}" = { - user = config.services.nginx.user; group = config.services.nginx.group; - extraDomains = { - "dilion.immae.dev" = null; - "caldance.cs.immae.dev" = null; - }; + extraDomainNames = [ + "dilion.immae.dev" + ]; }; + systemd.services.nginx.serviceConfig.ProtectHome = "read-only"; services.nginx = { enable = true; recommendedOptimisation = true; recommendedGzipSettings = true; recommendedProxySettings = true; - upstreams = { - caldance.servers."caldance:3031" = {}; - }; virtualHosts = { "dilion.immae.dev" = { - acmeRoot = config.myServices.certificates.webroot; + acmeRoot = config.security.acme.defaults.webroot; useACMEHost = name; forceSSL = true; - root = "/home/immae/www"; - }; - "caldance.cs.immae.dev" = { - acmeRoot = config.myServices.certificates.webroot; - useACMEHost = name; - forceSSL = true; - locations."/".extraConfig = '' - uwsgi_pass caldance; - ''; - locations."/static/".alias = "/var/lib/caldance/caldance/app/www/static/"; - locations."/media/".alias = "/var/lib/caldance/caldance/media/"; - extraConfig = '' - auth_basic "Authentification requise"; - auth_basic_user_file ${pkgs.writeText "htpasswd" config.myEnv.websites.caldance.integration.password}; - ''; + locations."/".root = "/home/immae/www"; }; }; }; - systemd.services.zrepl.serviceConfig.RuntimeDirectory = lib.mkForce "zrepl zrepl/stdinserver"; + secrets.keys = { + "zrepl/${name}.key" = { + permissions = "0400"; + text = config.myEnv.zrepl_backup.certs."${name}".key; + user = "backup"; + group = "root"; + }; + } // builtins.listToAttrs (map (x: lib.attrsets.nameValuePair "zrepl/certificates/${x}.crt" { + permissions = "0400"; + text = config.myEnv.zrepl_backup.certs."${x}".certificate; + user = "backup"; + group = "root"; + }) (builtins.attrNames config.myEnv.zrepl_backup.certs)); + + environment.etc."mdadm.conf" = { + enable = true; + mode = "0644"; + user = "root"; + text = "MAILADDR ${config.myEnv.monitoring.email}"; + }; + + systemd.services.zrepl.serviceConfig.User = "backup"; + systemd.services.zrepl.path = [ pkgs.openssh ]; + # pour eldiron: # zfs allow backup create,mount,receive,destroy,rename,snapshot,hold,bookmark,release zpool/backup + # pour flony: + # zfs allow backup hold,release,bookmark,snapshot,send zpool services.zrepl = { enable = true; - config = '' - global: - control: - sockpath: /run/zrepl/control - serve: - stdinserver: - sockdir: /run/zrepl/stdinserver - jobs: - - type: sink + settings = { + global.control.sockpath = "/run/zrepl/control"; + global.serve.stdinserver.sockdir = "/run/zrepl/stdinserver"; + jobs = [ + { + type = "sink"; # must not change - name: "backup-from-eldiron" - root_fs: "zpool/backup" - serve: - type: stdinserver - client_identities: - - eldiron - ''; + name = "backup-from-eldiron"; + root_fs = "zpool/backup"; + serve.type = "tls"; + serve.listen = ":19000"; + serve.ca = config.secrets.fullPaths."zrepl/certificates/eldiron.crt"; + serve.cert = config.secrets.fullPaths."zrepl/certificates/dilion.crt"; + serve.key = config.secrets.fullPaths."zrepl/dilion.key"; + serve.client_cns = [ "eldiron" ]; + } + { + type = "source"; + # must not change + name = "backup-to-wd-zpool"; + # not encrypted! + serve.type = "tls"; + serve.listen = ":19001"; + serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt"; + serve.cert = config.secrets.fullPaths."zrepl/certificates/dilion.crt"; + serve.key = config.secrets.fullPaths."zrepl/dilion.key"; + serve.client_cns = [ "flony" ]; + filesystems."zpool/libvirt<" = true; + filesystems."zpool/root<" = true; + snapshotting.type = "manual"; + } + { + type = "source"; + # must not change + name = "backup-to-wd-zpool-docker"; + # not encrypted! + serve.type = "tls"; + serve.listen = ":19002"; + serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt"; + serve.cert = config.secrets.fullPaths."zrepl/certificates/dilion.crt"; + serve.key = config.secrets.fullPaths."zrepl/dilion.key"; + serve.client_cns = [ "flony" ]; + filesystems."zpool/docker<" = true; + snapshotting.type = "manual"; + } + ]; + }; }; # This value determines the NixOS release with which your system is # to be compatible, in order to avoid breaking some software such as # database servers. You should change this only after NixOS release # notes say you should. # https://nixos.org/nixos/manual/release-notes.html - system.stateVersion = "20.03"; # Did you read the comment? + system.stateVersion = "23.05"; # Did you read the comment? } diff --git a/systems/dilion/flake.lock b/systems/dilion/flake.lock new file mode 100644 index 0000000..6da2d47 --- /dev/null +++ b/systems/dilion/flake.lock @@ -0,0 +1,695 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_2", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_7", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "my-lib", + "disko" + ], + "flake-parts": [ + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "root": { + "inputs": { + "environment": "environment", + "files-watcher": "files-watcher", + "loginctl-linger": "loginctl-linger", + "monitoring": "monitoring", + "my-lib": "my-lib", + "myuids": "myuids", + "nixpkgs": "nixpkgs_5", + "secrets": "secrets_2", + "ssh": "ssh", + "system": "system" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "ssh": { + "inputs": { + "environment": "environment_3", + "secrets": "secrets_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_4", + "mypackages": "mypackages", + "myuids": "myuids_2", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/systems/dilion/flake.nix b/systems/dilion/flake.nix new file mode 100644 index 0000000..9747086 --- /dev/null +++ b/systems/dilion/flake.nix @@ -0,0 +1,43 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + my-lib.url = "path:../../flakes/lib"; + + monitoring.url = "path:../../flakes/private/monitoring"; + ssh.url = "path:../../flakes/private/ssh"; + environment.url = "path:../../flakes/private/environment"; + system.url = "path:../../flakes/private/system"; + + myuids.url = "path:../../flakes/myuids"; + secrets.url = "path:../../flakes/secrets"; + files-watcher.url = "path:../../flakes/files-watcher"; + loginctl-linger.url = "path:../../flakes/loginctl-linger"; + }; + outputs = inputs@{ self, my-lib, nixpkgs, ...}: + my-lib.lib.mkColmenaFlake { + name = "dilion"; + inherit self nixpkgs; + system = "x86_64-linux"; + targetHost = "176.9.10.233"; + targetUser = "root"; + nixosModules = { + base = ./base.nix; + system = inputs.system.nixosModule; + monitoring = inputs.monitoring.nixosModule; + environment = inputs.environment.nixosModule; + ssh = inputs.ssh.nixosModule; + + myuids = inputs.myuids.nixosModule; + secrets = inputs.secrets.nixosModule; + files-watcher = inputs.files-watcher.nixosModule; + loginctl-linger = inputs.loginctl-linger.nixosModule; + }; + moduleArgs = { + nixpkgs = inputs.nixpkgs; + monitoring = inputs.monitoring; + environment = inputs.environment; + pkgs-no-overlay = inputs.nixpkgs.legacyPackages.x86_64-linux; + }; + }; +} diff --git a/systems/dilion/monitoring.nix b/systems/dilion/monitoring.nix new file mode 100644 index 0000000..af7f224 --- /dev/null +++ b/systems/dilion/monitoring.nix @@ -0,0 +1,43 @@ +{ lib, pkgs, config, name, monitoring, ... }: +let + hostFQDN = config.hostEnv.fqdn; + zfs_snapshot = name: { + service_description = "ZFS snapshot ${name} happened not too long ago"; + use = "local-service"; + check_command = ["check_zfs_snapshot" name]; + __passive_servicegroups = "webstatus-resources"; + }; +in +{ + config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "mdadm" "zfs" "notify-secondary"]; + config.myServices.monitoring.objects = lib.mkMerge [ + (monitoring.lib.objectsCommon { + inherit hostFQDN; + hostName = name; + master = false; + processWarn = "250"; processAlert = "400"; + loadWarn = "1.0"; loadAlert = "1.2"; + interface = builtins.head (builtins.attrNames config.networking.interfaces); + }) + + { + service = [ + { + service_description = "No mdadm array is degraded"; + use = "local-service"; + check_command = ["check_mdadm"]; + __passive_servicegroups = "webstatus-resources"; + } + { + service_description = "No ZFS pool is degraded"; + use = "local-service"; + check_command = ["check_zfs"]; + __passive_servicegroups = "webstatus-resources"; + } + (zfs_snapshot "zpool/backup/eldiron/zpool/root") + (zfs_snapshot "zpool/backup/eldiron/zpool/root/etc") + (zfs_snapshot "zpool/backup/eldiron/zpool/root/var") + ]; + } + ]; +} diff --git a/modules/private/ssh/ldap_regular.sh b/systems/dilion/ssh_ldap_regular.sh similarity index 100% rename from modules/private/ssh/ldap_regular.sh rename to systems/dilion/ssh_ldap_regular.sh diff --git a/systems/dilion/vms.nix b/systems/dilion/vms.nix new file mode 100644 index 0000000..189e5ff --- /dev/null +++ b/systems/dilion/vms.nix @@ -0,0 +1,200 @@ +# inspired from https://nixos.wiki/wiki/Virtualization_in_NixOS +{ config, pkgs, lib, pkgs-no-overlay, ... }@args: +let + toImage = f: "${import ./vms/base_image.nix f (args // { myEnv = config.myEnv; })}/nixos.qcow2"; +in +{ + options = { + myServices.vms.libvirt-guests = lib.mkOption { + type = lib.types.attrsOf (lib.types.submodule { + options = { + network = lib.mkOption { type = lib.types.str; description = "network to attach the guest to"; }; + pool = lib.mkOption { type = lib.types.str; description = "pool to attach the guest to"; }; + cpus = lib.mkOption { type = lib.types.int; default = 1; description = "number of cpus to assign"; }; + memory = lib.mkOption { type = lib.types.int; description = "memory in GiB to assign"; }; + diskSize = lib.mkOption { type = lib.types.int; description = "disk size in GiB"; }; + destroyVolumeOnExit = lib.mkOption { type = lib.types.bool; description = "Whether to destroy the volume on exit"; default = false; }; + extraDevicesXML = lib.mkOption { type = lib.types.lines; description = "Extra device configuration"; default = ""; }; + preStart = lib.mkOption { type = lib.types.lines; default = ""; description = "Script to run as prestart"; }; + }; + }); + default = {}; + description = "Libvirt guests to start"; + }; + myServices.vms.libvirt-networks = lib.mkOption { + type = lib.types.attrsOf (lib.types.submodule { + options = { + bridgeNumber = lib.mkOption { type = lib.types.int; description = "bridge interface to create virbr"; }; + ipRange = lib.mkOption { type = lib.types.str; example = "192.168.100"; description = "ip4 prefix to use"; }; + }; + }); + description = "Libvirt networks to configure"; + default = {}; + }; + myServices.vms.libvirt-pools = lib.mkOption { + type = lib.types.attrsOf (lib.types.submodule { + options = { + type = lib.mkOption { type = lib.types.enum [ "dir" "zfs" ]; description = "Pool type"; }; + target = lib.mkOption { type = lib.types.nullOr lib.types.path; default = null; description = "where to find images"; }; + preStart = lib.mkOption { type = lib.types.lines; default = ""; description = "Script to run as prestart"; }; + xml = lib.mkOption { type = lib.types.lines; default = ""; description = "Additional configuration"; }; + }; + }); + }; + myServices.vms.libvirt-images = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = {}; + description = "Attrs of images to create in /etc/libvirtd/base-images"; + }; + }; + config = lib.mkMerge [ + # Define images + { + environment.etc = lib.mapAttrs' + (n: v: lib.nameValuePair "libvirtd/base-images/${n}.qcow2" { source = toImage v; }) + config.myServices.vms.libvirt-images; + } + + # Define networks + { + systemd.services = lib.mapAttrs' (name: network: lib.nameValuePair "libvirtd-network-${name}" { + after = [ "libvirtd.service" ]; + requires = [ "libvirtd.service" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = "yes"; + }; + path = [ config.boot.zfs.package ]; + script = let + xml = pkgs.writeText "libvirt-network-${name}.xml" '' + + ${name} + UUID + + + + + + + + + + ''; + in '' + uuid="$(${pkgs.libvirt}/bin/virsh net-uuid '${name}' || true)" + ${pkgs.libvirt}/bin/virsh net-define <(sed "s/UUID/$uuid/" '${xml}') + ${pkgs.libvirt}/bin/virsh net-start '${name}' + ''; + preStop = '' + ${pkgs.libvirt}/bin/virsh net-destroy '${name}' + ''; + }) config.myServices.vms.libvirt-networks; + } + + # Define pools + { + systemd.services = lib.mapAttrs' (name: pool: lib.nameValuePair "libvirtd-pool-${name}" { + after = [ "libvirtd.service" ]; + requires = [ "libvirtd.service" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = "yes"; + }; + path = [ config.boot.zfs.package ]; + script = let + xml = pkgs.writeText "libvirt-pool-${name}.xml" '' + + ${name} + UUID + ${pool.xml} + ${if pool.target != null then '' + + ${pool.target} + + '' else ""} + + ''; + in pool.preStart + '' + uuid="$(${pkgs.libvirt}/bin/virsh pool-uuid '${name}' || true)" + ${pkgs.libvirt}/bin/virsh pool-define <(sed "s/UUID/$uuid/" '${xml}') + ${pkgs.libvirt}/bin/virsh pool-start '${name}' || true + ''; + }) config.myServices.vms.libvirt-pools; + } + + # Define guests + { + systemd.services = lib.mapAttrs' (name: guest: lib.nameValuePair "libvirtd-guest-${name}" { + after = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ]; + requires = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = "yes"; + }; + path = [ config.boot.zfs.package ]; + script = + let + xml = pkgs.writeText "libvirt-guest-${name}.xml" + '' + + ${name} + UUID + ${builtins.toString guest.memory} + ${builtins.toString guest.cpus} + + hvm + + + /run/current-system/sw/bin/qemu-system-x86_64 + + + + + ${guest.extraDevicesXML} + + + + + + + + + + + ''; + in + guest.preStart + '' + if ! ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then + ${pkgs.libvirt}/bin/virsh vol-create-as --pool ${guest.pool} --name 'guest-${name}' --capacity '${builtins.toString guest.diskSize}GiB' + volume_path=$(${pkgs.libvirt}/bin/virsh vol-path --pool ${guest.pool} --vol 'guest-${name}') + ${pkgs-no-overlay.qemu}/bin/qemu-img convert /etc/libvirtd/base-images/nixos.qcow2 $volume_path + fi + uuid="$(${pkgs.libvirt}/bin/virsh domuuid '${name}' || true)" + ${pkgs.libvirt}/bin/virsh define <(sed "s/UUID/$uuid/" '${xml}') + ${pkgs.libvirt}/bin/virsh start '${name}' + ''; + preStop = '' + ${pkgs.libvirt}/bin/virsh shutdown '${name}' + let "timeout = $(date +%s) + 10" + while [ "$(${pkgs.libvirt}/bin/virsh list --name | grep --count '^${name}$')" -gt 0 ]; do + if [ "$(date +%s)" -ge "$timeout" ]; then + # Meh, we warned it... + ${pkgs.libvirt}/bin/virsh destroy '${name}' + else + # The machine is still running, let's give it some time to shut down + sleep 0.5 + fi + done + '' + lib.optionalString guest.destroyVolumeOnExit '' + if ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then + ${pkgs.libvirt}/bin/virsh vol-wipe --pool ${guest.pool} --vol 'guest-${name}' || true + ${pkgs.libvirt}/bin/virsh vol-delete --pool ${guest.pool} --vol 'guest-${name}' + fi + ''; + }) config.myServices.vms.libvirt-guests; + } + ]; +} diff --git a/modules/private/system/dilion/vms/base_configuration.nix b/systems/dilion/vms/base_configuration.nix similarity index 52% rename from modules/private/system/dilion/vms/base_configuration.nix rename to systems/dilion/vms/base_configuration.nix index e2caba2..7b67886 100644 --- a/modules/private/system/dilion/vms/base_configuration.nix +++ b/systems/dilion/vms/base_configuration.nix @@ -1,12 +1,18 @@ -{ lib, config, ... }@args: +{ lib, config, environment, ... }@args: { - options.myEnv = (import ../../../environment.nix (args // { name = "dummy"; })).options.myEnv; + options.myEnv = (environment.nixosModule (args // { name = "dummy"; })).options.myEnv; config = { + # This value determines the NixOS release with which your system is + # to be compatible, in order to avoid breaking some software such as + # database servers. You should change this only after NixOS release + # notes say you should. + # https://nixos.org/nixos/manual/release-notes.html + system.stateVersion = lib.mkDefault "23.05"; # Did you read the comment? + fileSystems."/".device = "/dev/disk/by-label/nixos"; boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" "virtio_balloon" "virtio_blk" "virtio_pci" "virtio_ring" ]; boot.loader = { grub = { - version = 2; device = "/dev/vda"; }; timeout = 0; diff --git a/modules/private/system/dilion/vms/base_image.nix b/systems/dilion/vms/base_image.nix similarity index 82% rename from modules/private/system/dilion/vms/base_image.nix rename to systems/dilion/vms/base_image.nix index 8de8560..46b90eb 100644 --- a/modules/private/system/dilion/vms/base_image.nix +++ b/systems/dilion/vms/base_image.nix @@ -1,10 +1,14 @@ -configuration_file: { pkgs ? import {}, system ? builtins.currentSystem, myEnv, ... }: +configuration_file: { pkgs, myEnv, nixpkgs, environment, pkgs-no-overlay, ... }: let - config = (import { - inherit system; + config = (import (nixpkgs + "/nixos/lib/eval-config.nix") { + inherit (pkgs) system; modules = [ { + _module.args.environment = environment; myEnv = myEnv; - imports = [ configuration_file ]; + imports = [ + (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix") + configuration_file + ]; # We want our template image to be as small as possible, but the deployed image should be able to be # of any size. Hence we resize on the first boot. @@ -22,7 +26,7 @@ let }; } ]; }).config; -in pkgs.vmTools.runInLinuxVM ( +in pkgs-no-overlay.vmTools.runInLinuxVM ( pkgs.runCommand "nixos-base-image" { memSize = 768; @@ -30,13 +34,13 @@ in pkgs.vmTools.runInLinuxVM ( '' mkdir $out diskImage=image.qcow2 - ${pkgs.vmTools.qemu}/bin/qemu-img create -f qcow2 $diskImage 2G + ${pkgs-no-overlay.vmTools.qemu}/bin/qemu-img create -f qcow2 $diskImage 2G mv closure xchg/ ''; postVM = '' echo compressing VM image... - ${pkgs.vmTools.qemu}/bin/qemu-img convert -c $diskImage -O qcow2 $out/nixos.qcow2 + ${pkgs-no-overlay.vmTools.qemu}/bin/qemu-img convert -c $diskImage -O qcow2 $out/nixos.qcow2 ''; buildInputs = [ pkgs.utillinux pkgs.perl pkgs.parted pkgs.e2fsprogs ]; exportReferencesGraph = diff --git a/modules/private/system/dilion/vms/buildbot_configuration.nix b/systems/dilion/vms/buildbot_configuration.nix similarity index 87% rename from modules/private/system/dilion/vms/buildbot_configuration.nix rename to systems/dilion/vms/buildbot_configuration.nix index 05b02d4..622f8ba 100644 --- a/modules/private/system/dilion/vms/buildbot_configuration.nix +++ b/systems/dilion/vms/buildbot_configuration.nix @@ -1,9 +1,15 @@ { pkgs, config, lib, ... }: { imports = [ - ./base_configuration.nix ]; + # This value determines the NixOS release with which your system is + # to be compatible, in order to avoid breaking some software such as + # database servers. You should change this only after NixOS release + # notes say you should. + # https://nixos.org/nixos/manual/release-notes.html + system.stateVersion = "23.05"; # Did you read the comment? + systemd.services.buildbot-worker.serviceConfig.ExecStartPre = let cfg = config.services.buildbot-worker; script = pkgs.writeScript "decode-dmi" '' diff --git a/systems/eldiron/base.nix b/systems/eldiron/base.nix new file mode 100644 index 0000000..cda518e --- /dev/null +++ b/systems/eldiron/base.nix @@ -0,0 +1,371 @@ +{ config, pkgs, lib, php, name, secrets, ... }: +{ + # ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age + secrets.ageKeys = [ "age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj" ]; + boot = { + kernelModules = [ "kvm-intel" ]; + blacklistedKernelModules = [ "nvidiafb" ]; + loader.timeout = 1; + loader.grub.devices = [ "/dev/sda" "/dev/sdc" ]; + kernel.sysctl = { + # https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001.md + "net.ipv4.tcp_sack" = 0; + }; + supportedFilesystems = [ "zfs" ]; + kernelParams = ["zfs.zfs_arc_max=6442450944"]; + kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages; + initrd.availableKernelModules = [ "ahci" "sd_mod" ]; + initrd.secrets = { + "/boot/pass.key" = "/boot/pass.key"; + }; + }; + services.udev.extraRules = '' + ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:56:a0:88", NAME="eth0" + ''; + nix.settings.max-jobs = 8; + nixpkgs.config.permittedInsecurePackages = [ + "python-2.7.18.6" # for nagios-cli + "nodejs-16.20.2" # for landing page building + ]; + + nixpkgs.overlays = [ + php.overlays.php + ]; + powerManagement.cpuFreqGovernor = "powersave"; + + security.acme.certs."${name}".postRun = builtins.concatStringsSep "\n" [ + (lib.optionalString config.services.websites.env.production.enable "/run/current-system/sw/bin/machinectl shell httpd-production /usr/bin/env systemctl reload httpd.service") + (lib.optionalString config.services.websites.env.integration.enable "/run/current-system/sw/bin/machinectl shell httpd-integration /usr/bin/env systemctl reload httpd.service") + ]; + + fileSystems = { + # pools: + # zpool: ashift=12 + # zfast: ashift=12 + # zfs: + # zpool/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy + # zpool/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key + # zpool/root/var: atime=on + # zfast/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy + # zfast/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key + # zfast/root/etc: ø + # zfast/root/nix: ø + # zfast/root/tmp: async=disabled + # zfast/root/var: atime=on + # zfast/root/var/lib: ø + # zfast/root/var/lib/mysql: logbias=throughput ; atime=off ; primarycache=metadata + # zfast/root/var/lib/postgresql: recordsize=8K ; atime=off ; logbias=throughput + # zfast/root/var/lib/postgresql/11.0: ø + # zfast/root/var/lib/postgresql/11.0/pg_wal: ø + "/" = { fsType = "zfs"; device = "zpool/root"; }; + "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/e6bb18fb-ff56-4b5f-ae9f-e60d40dc0622"; }; + "/etc" = { fsType = "zfs"; device = "zpool/root/etc"; }; + "/nix" = { fsType = "zfs"; device = "zfast/root/nix"; }; + "/tmp" = { fsType = "zfs"; device = "zfast/root/tmp"; }; + "/var" = { fsType = "zfs"; device = "zpool/root/var"; }; + "/var/lib/mysql" = { fsType = "zfs"; device = "zfast/root/var/lib/mysql"; }; + "/var/lib/postgresql" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql"; }; + "/var/lib/postgresql/11.0" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0"; }; + "/var/lib/postgresql/11.0/pg_wal" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0/pg_wal"; }; + }; + swapDevices = [ { label = "swap1"; } { label = "swap2"; } ]; + hardware.enableRedistributableFirmware = true; + + services.zfs = { + autoScrub = { + enable = false; + }; + }; + networking = { + hostId = "8262ca33"; # generated with head -c4 /dev/urandom | od -A none -t x4 + firewall.enable = true; + firewall.allowedTCPPorts = [ config.myEnv.ports.zrepl_flony ]; + # FIXME: on next reboot, remove the /27 and the localCommands + interfaces."eth0".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList + (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or [])) + (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips)) + ++ [ { address = lib.head config.hostEnv.ips.main.ip4; prefixLength = 27; } ]; + interfaces."eth0".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList + (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or [])) + config.hostEnv.ips); + defaultGateway = "176.9.151.65"; + localCommands = '' + # FIXME: Those commands were added by nixops and may not be + # actually needed + ip -6 addr add '2a01:4f8:160:3445::/64' dev 'eth0' || true + ip -4 route change '176.9.151.64/27' via '176.9.151.65' dev 'eth0' || true + ip -6 route add default via 'fe80::1' dev eth0 || true + ''; + nameservers = [ + "213.133.98.98" + "213.133.99.99" + "213.133.100.100" + "2a01:4f8:0:a0a1::add:1010" + "2a01:4f8:0:a102::add:9999" + "2a01:4f8:0:a111::add:9898" + ]; + }; + + imports = [ + secrets.nixosModules.users-config-eldiron + ./databases + ./databases/mariadb.nix + ./databases/openldap + ./databases/postgresql.nix + ./databases/redis.nix + + + ./monitoring.nix + ./ejabberd + ./buildbot + ./coturn.nix + ./dns.nix + ./duply_backup.nix + ./gemini + ./gitolite + ./mail + ./websites + ./webstats + ./irc.nix + ./pub + ./tasks + ./ftp.nix + ./mpd.nix + ./vpn + ]; + + myServices.buildbot.enable = true; + myServices.databases.enable = true; + myServices.gitolite.enable = true; + myServices.monitoring.enable = true; + myServices.irc.enable = true; + myServices.pub.enable = true; + myServices.tasks.enable = true; + myServices.mpd.enable = true; + myServices.dns.enable = true; + myServices.websites.enable = true; + myServices.gemini.enable = true; + myServices.mail.enable = true; + myServices.ejabberd.enable = true; + myServices.vpn.enable = true; + myServices.ftp.enable = true; + + myServices.chatonsProperties.hostings.infogerance = { + file.datetime = "2022-08-27T18:50:00"; + hosting = { + name = "Infogérance"; + description = "Administration de serveurs"; + website = "https://www.immae.eu/"; + logo = "https://assets.immae.eu/logo.jpg"; + type = "HOSTEDSERVER"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; + + services.netdata.enable = true; + services.netdata.config.global."memory mode" = "none"; + services.netdata.config.health."enabled" = "no"; + services.netdata.config.web.mode = "none"; + users.users."${config.services.netdata.user}".extraGroups = [ "keys" ]; + services.netdata.configDir."stream.conf" = config.secrets.fullPaths."netdata-stream.conf"; + secrets.keys = { + "ldap/pam_pgsql" = { + user = "root"; + group = "root"; + permissions = "0400"; + text = '' + database = immae + user = immae_auth_read + password = {{ .postgresql.immae_auth_read }} + table = ldap_users + user_column = login + pw_type = function + auth_query = SELECT (mechanism = 'SSHA' AND password = encode(digest( %p || salt, 'sha1'), 'hex')) FROM ldap_users WHERE login = %u OR login || '@' || realm = %u + #pwd_query = WITH newsalt as (select gen_random_bytes(4)) UPDATE ldap_users SET password = encode(digest( %p || (SELECT * FROM newsalt), 'sha1'), 'hex'), salt = (SELECT * FROM newsalt), mechanism = 'SSHA' WHERE login = %u OR login || '@' || realm = %u + ''; + }; + + "netdata-stream.conf" = { + user = config.services.netdata.user; + group = config.services.netdata.group; + permissions = "0400"; + text = '' + [stream] + enabled = yes + destination = ${config.myEnv.monitoring.netdata_aggregator} + api key = ${config.myEnv.monitoring.netdata_keys.eldiron} + ''; + }; + "zrepl_backup/identity" = { + user = "root"; + group = "root"; + permissions = "0400"; + text = config.myEnv.zrepl_backup.ssh_key.private; + }; + "zrepl/${name}.key" = { + permissions = "0400"; + text = config.myEnv.zrepl_backup.certs."${name}".key; + user = "root"; + group = "root"; + }; + } // builtins.listToAttrs (map (x: lib.attrsets.nameValuePair "zrepl/certificates/${x}.crt" { + permissions = "0400"; + text = config.myEnv.zrepl_backup.certs."${x}".certificate; + user = "root"; + group = "root"; + }) (builtins.attrNames config.myEnv.zrepl_backup.certs)); + + programs.ssh.knownHosts.dilion = { + extraHostNames = ["dilion.immae.eu"]; + publicKey = config.myEnv.servers.dilion.hostKey; + }; + + services.cron = { + enable = true; + mailto = "cron@immae.eu"; + systemCronJobs = [ + '' + 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "immae.eu.*Recipient address rejected" + # Need a way to blacklist properly + # 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "NOQUEUE:" + 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtp -g "status=bounced" + '' + ]; + }; + + environment.systemPackages = [ pkgs.bindfs ]; + + environment.etc."mdadm.conf" = { + enable = true; + mode = "0644"; + user = "root"; + text = "MAILADDR ${config.myEnv.monitoring.email}"; + }; + + systemd.services.zrepl.path = [ pkgs.openssh ]; + services.zrepl = { + enable = true; + settings = { + jobs = [ + { + type = "push"; + # must not change + name = "backup-to-dilion"; + filesystems."zpool/root" = true; + filesystems."zpool/root/etc" = true; + filesystems."zpool/root/var<" = true; + connect = { + address = "dilion.immae.eu:19000"; + type = "tls"; + server_cn = "dilion"; + ca = config.secrets.fullPaths."zrepl/certificates/dilion.crt"; + cert = config.secrets.fullPaths."zrepl/certificates/eldiron.crt"; + key = config.secrets.fullPaths."zrepl/eldiron.key"; + }; + snapshotting = { + type = "periodic"; + prefix = "zrepl_"; + interval = "1h"; + # hooks = [ + # { + # type = "mysql-lock-tables"; + # dsn = "${config.myEnv.zrepl_backup.mysql.user}:${config.myEnv.zrepl_backup.mysql.password}@tcp(localhost)/"; + # filesystems."zpool/root/var" = true; + # } + # { + # type = "command"; + # path = pkgs.writeScript "redis-dump" '' + # #!${pkgs.stdenv.shell} + # ${pkgs.redis}/bin/redis-cli bgsave + # ''; + # err_is_fatal = false; + # filesystems."zpool/root/var" = true; + # } + # ]; + }; + send.encrypted = true; + pruning.keep_sender = [ + { type = "regex"; regex = "^manual_.*"; } + { type = "grid"; grid = "24x1h | 7x1d | 4x7d | 6x30d"; regex = "^zrepl_.*"; } + ]; + pruning.keep_receiver = [ + { type = "regex"; regex = "^manual_.*"; } + { type = "grid"; grid = "6x4h | 7x1d | 4x7d | 6x30d"; regex = "^zrepl_.*"; } + ]; + } + { + type = "source"; + # must not change + name = "backup-to-wd-zpool"; + serve.type = "tls"; + serve.listen = ":${builtins.toString config.myEnv.ports.zrepl_flony}"; + serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt"; + serve.cert = config.secrets.fullPaths."zrepl/certificates/eldiron.crt"; + serve.key = config.secrets.fullPaths."zrepl/eldiron.key"; + serve.client_cns = [ "flony" ]; + filesystems."zpool/root" = true; + filesystems."zpool/root/etc" = true; + filesystems."zpool/root/var<" = true; + filesystems."zfast/root/var<" = true; + send.encrypted = true; + snapshotting.type = "manual"; + } + ]; + }; + }; + + environment.etc."fail2ban/filter.d/postgresql.conf".text = '' + [Definition] + failregex = \S+ FATAL: password authentication failed for user .+$ + \S+ FATAL: PAM authentication failed for user.+$ + \S+ FATAL: no pg_hba.conf entry for host.+$ + ''; + environment.etc."fail2ban/filter.d/mysqld-auth.local".text = '' + [Definition] + _daemon = mysql[-\w]* + ''; + services.fail2ban.jails.dovecot = '' + enabled = true + ''; + services.fail2ban.jails.postfix-sasl = '' + enabled = true + ''; + services.fail2ban.jails.proftpd = '' + enabled = true + ''; + services.fail2ban.jails.postgresql = '' + enabled = true + port = 5432 + logpath = %(syslog_daemon)s + backend = %(default_backend)s + journalmatch = _SYSTEMD_UNIT=postgresql.service + _COMM=postgres + ''; + services.fail2ban.jails.mysqld-auth = '' + enabled = true + journalmatch = _SYSTEMD_UNIT=mysql.service + _COMM=mysqld + ''; + # This value determines the NixOS release with which your system is + # to be compatible, in order to avoid breaking some software such as + # database servers. You should change this only after NixOS release + # notes say you should. + # https://nixos.org/nixos/manual/release-notes.html + system.stateVersion = "23.05"; # Did you read the comment? + + security.pam.services.ldap.text = '' + # Authentication from ldap for pgsql + auth required ${pkgs.pam_pgsql}/lib/security/pam_pgsql.so config_file=/var/secrets/ldap/pam_pgsql + account required ${pkgs.pam_pgsql}/lib/security/pam_pgsql.so config_file=/var/secrets/ldap/pam_pgsql + ''; + services.saslauthd = { + enable = true; + mechanism = "pam"; + }; + environment.etc."sasl2/slapd.conf".text = '' + mech_list: plain + pwcheck_method: saslauthd + saslauthd_path: /run/saslauthd/mux + ''; +} diff --git a/modules/private/buildbot/default.nix b/systems/eldiron/buildbot/default.nix similarity index 70% rename from modules/private/buildbot/default.nix rename to systems/eldiron/buildbot/default.nix index ec28b63..e86b081 100644 --- a/modules/private/buildbot/default.nix +++ b/systems/eldiron/buildbot/default.nix @@ -1,16 +1,7 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, buildbot, ... }: let varDir = "/var/lib/buildbot"; - buildbot_common = pkgs.python3Packages.buildPythonPackage rec { - name = "buildbot_common"; - src = ./common; - format = "other"; - installPhase = '' - mkdir -p $out/${pkgs.python3.pythonForBuild.sitePackages} - cp -a $src $out/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_common - ''; - }; - buildbot = pkgs.python3Packages.buildbot-full; + bb-python = buildbot.pythonModule; in { options = { @@ -24,6 +15,80 @@ in }; config = lib.mkIf config.myServices.buildbot.enable { + myEnv.buildbot.projects.test = { + name = "test"; + workerPort = config.myEnv.ports.buildbot_test; + packages = [ pkgs.git pkgs.gzip pkgs.openssh ]; + pythonPathHome = false; + secrets = { + apprise_webhooks = builtins.concatStringsSep "\n" [ + "{{ .apprise_webhooks.matrix_immae_eu_alert }}" + ]; + notify_xmpp_password = "{{ .xmpp.notify_bot }}"; + }; + activationScript = '' + install -m 0755 -o buildbot -g buildbot -d /var/lib/ftp/release.immae.eu/test + ''; + webhookTokens = [ + "{{ .buildbot.webhookTokens.Immae }}" + "{{ .buildbot.webhookTokens.Immae }}" + ]; + }; + + myServices.chatonsProperties.hostings.buildbot = { + file.datetime = "2022-08-21T10:37:00"; + hosting = { + name = "Buildbot"; + description = "Python-based continuous integration testing framework"; + type = "INSTANCE"; + website = "https://git.immae.eu"; + logo = "https://www.buildbot.net/img/icon.png"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + guide.user = "https://www.immae.eu/docs/forge-logicielle.html"; + }; + software = { + name = "Buildbot"; + website = "https://www.buildbot.net/"; + license.url = "https://github.com/buildbot/buildbot/blob/master/LICENSE"; + license.name = "GNU General Public License v2.0"; + version = pkgs.buildbot.version; + source.url = "https://github.com/buildbot/buildbot"; + }; + }; + nixpkgs.overlays = [ + (self: super: { + follow-systemd-unit = self.writeScriptBin "follow-systemd-unit" '' + #!${self.stdenv.shell} + + set -euo pipefail + + service=$1 + before_invocation_id=$2 + + get_id() { + systemctl show -p InvocationID --value "$service" + } + + while [ "$(get_id)" = "$before_invocation_id" ]; do sleep 1; done + + invocation_id="$(get_id)" + cursor="$(mktemp)" + trap "rm -f $cursor" EXIT + + get_logs() { + journalctl --quiet --cursor-file=$cursor INVOCATION_ID=$invocation_id + _SYSTEMD_INVOCATION_ID=$invocation_id + } + + while [ -n "$(systemctl show -p Job --value "$service")" ]; do + get_logs + done + get_logs + ''; + }) + ]; ids.uids.buildbot = config.myEnv.buildbot.user.uid; ids.gids.buildbot = config.myEnv.buildbot.user.gid; @@ -34,7 +99,9 @@ in group = "buildbot"; description = "Buildbot user"; home = varDir; - extraGroups = [ "keys" ]; + extraGroups = [ "keys" "systemd-journal" ]; + useDefaultShell = true; + openssh.authorizedKeys.keys = [ config.myEnv.buildbot.ssh_key.public ]; }; services.websites.env.tools.watchPaths = lib.attrsets.mapAttrsToList @@ -96,12 +163,12 @@ in permissions = "0600"; user = "buildbot"; group = "buildbot"; + keyDependencies = [ (buildbot.buildbot_config project).src ] ++ project.secretsDeps; text = let project_env = with lib.attrsets; mapAttrs' (k: v: nameValuePair "BUILDBOT_${k}" v) project.environment // - mapAttrs' (k: v: nameValuePair "BUILDBOT_PATH_${k}" (v pkgs)) (attrByPath ["builderPaths"] {} project) // { - BUILDBOT_PROJECT_DIR = ./projects + "/${project.name}"; + BUILDBOT_PROJECT_DIR = (buildbot.buildbot_config project).src; BUILDBOT_WORKER_PORT = builtins.toString project.workerPort; BUILDBOT_HOST = config.hostEnv.fqdn; BUILDBOT_VIRT_URL = "qemu+ssh://libvirt@dilion.immae.eu/system"; @@ -131,6 +198,16 @@ in group = "buildbot"; text = config.myEnv.buildbot.ssh_key.private; }; + "buildbot/ssh_known_hosts" = { + permissions = "0644"; + user = "buildbot"; + group = "buildbot"; + text = '' + git.immae.eu ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF + eldiron ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF + phare.normalesup.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN2GomItXICXpCtCFRMT2xuerqx2nLMO/3mNUuWyzFr1 + ''; + }; }; services.filesWatcher = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" { @@ -152,9 +229,9 @@ in description = "Buildbot Continuous Integration Server ${project.name}."; after = [ "network-online.target" ]; wantedBy = [ "multi-user.target" ]; - path = project.packages pkgs ++ (project.pythonPackages buildbot.pythonModule pkgs); + path = project.packages; preStart = let - master-cfg = "${buildbot_common}/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_common/master.cfg"; + master-cfg = "${buildbot.buildbot_common}/${bb-python.pythonForBuild.sitePackages}/buildbot_common/master.cfg"; tac_file = pkgs.writeText "buildbot.tac" '' import os @@ -197,6 +274,7 @@ in ln -sf ${tac_file} ${varDir}/${project.name}/buildbot.tac # different buildbots may be trying that simultaneously, add the || true to avoid complaining in case of race install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ssh_key"} ${varDir}/buildbot_key || true + install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ssh_known_hosts"} ${varDir}/buildbot_hosts || true buildbot_secrets=${varDir}/${project.name}/secrets install -m 0700 -o buildbot -g buildbot -d $buildbot_secrets install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ldap"} $buildbot_secrets/ldap @@ -207,23 +285,11 @@ in ${buildbot}/bin/buildbot upgrade-master ${varDir}/${project.name} ''; environment = let - buildbot_config = pkgs.python3Packages.buildPythonPackage (rec { - name = "buildbot_config-${project.name}"; - src = ./projects + "/${project.name}"; - format = "other"; - installPhase = '' - mkdir -p $out/${pkgs.python3.pythonForBuild.sitePackages} - cp -a $src $out/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_config - ''; - }); HOME = "${varDir}/${project.name}"; - PYTHONPATH = "${buildbot.pythonModule.withPackages (self: project.pythonPackages self pkgs ++ [ - pkgs.python3Packages.libvirt - pkgs.python3Packages.wokkel - pkgs.python3Packages.treq pkgs.python3Packages.ldap3 buildbot - pkgs.python3Packages.buildbot-worker - buildbot_common buildbot_config - ])}/${buildbot.pythonModule.sitePackages}${if project.pythonPathHome then ":${varDir}/${project.name}/.local/${pkgs.python3.pythonForBuild.sitePackages}" else ""}"; + PYTHONPATH = "${bb-python.withPackages (self: + buildbot.common_packages self ++ + [ (buildbot.buildbot_config project) ] + )}/${bb-python.sitePackages}${if project.pythonPathHome then ":${varDir}/${project.name}/.local/${bb-python.sitePackages}" else ""}"; in { inherit PYTHONPATH HOME; }; serviceConfig = { diff --git a/systems/eldiron/coturn.nix b/systems/eldiron/coturn.nix new file mode 100644 index 0000000..d8b02c5 --- /dev/null +++ b/systems/eldiron/coturn.nix @@ -0,0 +1,73 @@ +{ config, name, lib, pkgs, ... }: +{ + config = lib.mkIf (name == "eldiron") { + myServices.chatonsProperties.services.coturn = { + file.datetime = "2022-08-27T19:00:00"; + service = { + name = "Coturn"; + description = "coturn TURN server"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "FULL"; + install.type = "PACKAGE"; + }; + software = { + name = "coturn"; + website = "https://github.com/coturn/coturn"; + license.url = "https://github.com/coturn/coturn/blob/master/LICENSE"; + license.name = "3-Clause BSD License"; + version = pkgs.coturn.version; + source.url = "https://github.com/coturn/coturn"; + }; + }; + networking.firewall.allowedTCPPorts = [ + config.services.coturn.alt-listening-port + config.services.coturn.alt-tls-listening-port + config.services.coturn.listening-port + config.services.coturn.tls-listening-port + ]; + networking.firewall.allowedTCPPortRanges = [ + { from = config.services.coturn.min-port; to = config.services.coturn.max-port; } + ]; + networking.firewall.allowedUDPPortRanges = [ + { from = config.services.coturn.min-port; to = config.services.coturn.max-port; } + ]; + networking.firewall.allowedUDPPorts = [ + config.services.coturn.alt-listening-port + config.services.coturn.alt-tls-listening-port + config.services.coturn.listening-port + config.services.coturn.tls-listening-port + ]; + #users.users.turnserver.extraGroups = [ "keys" ]; + services.coturn = { + enable = true; + no-cli = true; + no-tls = true; + no-dtls = true; + use-auth-secret = true; + lt-cred-mech = true; + realm = "eldiron.immae.eu"; + extraConfig = '' + fingerprint + total-quota=0 + bps-capacity=0 + stale-nonce + no-multicast-peers + ''; + static-auth-secret = config.myEnv.coturn.auth_access_key; + #cert = "/var/lib/acme/eldiron/fullchain.pem"; + #pkey = "/var/lib/acme/eldiron/key.pem"; + listening-ips = [ + "127.0.0.1" + "::1" + ] ++ config.myEnv.servers.eldiron.ips.main.ip4 + ++ config.myEnv.servers.eldiron.ips.main.ip6; + relay-ips = [ + "127.0.0.1" + "::1" + ] ++ config.myEnv.servers.eldiron.ips.main.ip4 + ++ config.myEnv.servers.eldiron.ips.main.ip6; + }; + }; +} diff --git a/modules/private/databases/default.nix b/systems/eldiron/databases/default.nix similarity index 82% rename from modules/private/databases/default.nix rename to systems/eldiron/databases/default.nix index 1241658..d8d3048 100644 --- a/modules/private/databases/default.nix +++ b/systems/eldiron/databases/default.nix @@ -1,16 +1,15 @@ -{ lib, config, nodes, ... }: +{ lib, config, secrets, ... }: let cfg = config.myServices.databases; in { options.myServices = { databases.enable = lib.mkEnableOption "my databases service"; - databasesCerts = lib.mkOption { - description = "Default databases configurations for certificates as accepted by acme"; - }; }; + config.myServices.dns.zones."immae.eu".subdomains.db-1 = lib.mkIf cfg.enable (with config.myServices.dns.helpers; ips servers.eldiron.ips.main); config.myServices.databases = lib.mkIf cfg.enable { + mariadb = { enable = true; ldapConfig = { @@ -25,7 +24,7 @@ in }; openldap = { - accessFile = ../../../nixops/secrets/ldap.conf; + accessFile = secrets.ldap-conf; baseDn = config.myEnv.ldap.base; rootDn = config.myEnv.ldap.root_dn; rootPw = config.myEnv.ldap.root_pw; @@ -45,7 +44,7 @@ in }; replicationHosts = { backup-2 = { - ip4 = [config.myEnv.servers.backup-2.ips.main.ip4]; + ip4 = config.myEnv.servers.backup-2.ips.main.ip4; ip6 = config.myEnv.servers.backup-2.ips.main.ip6; }; }; diff --git a/modules/private/databases/mariadb.nix b/systems/eldiron/databases/mariadb.nix similarity index 92% rename from modules/private/databases/mariadb.nix rename to systems/eldiron/databases/mariadb.nix index 101eb3f..b4a6917 100644 --- a/modules/private/databases/mariadb.nix +++ b/systems/eldiron/databases/mariadb.nix @@ -74,7 +74,7 @@ in { }; config = lib.mkIf cfg.enable { - networking.firewall.allowedTCPPorts = [ 3306 ]; + networking.firewall.allowedTCPPorts = [ config.myEnv.databases.mysql.port ]; # for adminer, ssl is implemented with mysqli only, which is # currently disabled because it’s not compatible with pam. @@ -96,6 +96,7 @@ in { dataDir = cfg.dataDir; settings = { mysqld = { + port = config.myEnv.databases.mysql.port; ssl_ca = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"; ssl_key = "${config.security.acme.certs.mysql.directory}/key.pem"; ssl_cert = "${config.security.acme.certs.mysql.directory}/fullchain.pem"; @@ -107,13 +108,18 @@ in { # this introduces a small delay before storing on disk, but # makes it order of magnitudes quicker innodb_flush_log_at_trx_commit = "0"; + + # This is necessary since the default ("dialog") is not + # supported by php's mysqlnd plugin (in mysqli). But with that + # change only regular login+password schemes can work (no + # "fancy" authentication methods like fprintd or keys) + pam_use_cleartext_plugin = true; }; }; }; users.users.mysql.extraGroups = [ "keys" ]; - security.acme.certs."mysql" = config.myServices.databasesCerts // { - user = "mysql"; + security.acme.certs."mysql" = { group = "mysql"; domain = "db-1.immae.eu"; postRun = '' diff --git a/systems/eldiron/databases/openldap/default.nix b/systems/eldiron/databases/openldap/default.nix new file mode 100644 index 0000000..7cd15da --- /dev/null +++ b/systems/eldiron/databases/openldap/default.nix @@ -0,0 +1,304 @@ +{ lib, pkgs, config, openldap, ... }: +let + cfg = config.myServices.databases.openldap; +in +{ + options.myServices.databases = { + openldap = { + enable = lib.mkOption { + default = false; + example = true; + description = "Whether to enable ldap"; + type = lib.types.bool; + }; + baseDn = lib.mkOption { + type = lib.types.str; + description = '' + Base DN for LDAP + ''; + }; + rootDn = lib.mkOption { + type = lib.types.str; + description = '' + Root DN + ''; + }; + rootPw = lib.mkOption { + type = lib.types.str; + description = '' + Root (Hashed) password + ''; + }; + accessFile = lib.mkOption { + type = lib.types.path; + description = '' + The file path that defines the access + ''; + }; + dataDir = lib.mkOption { + type = lib.types.path; + default = "/var/lib/openldap/mdb"; + description = '' + The directory where Openldap stores its data. + ''; + }; + socketsDir = lib.mkOption { + type = lib.types.path; + default = "/run/openldap"; + description = '' + The directory where Openldap puts sockets and pid files. + ''; + }; + # Output variables + pids = lib.mkOption { + type = lib.types.attrsOf lib.types.path; + default = { + pid = "${cfg.socketsDir}/slapd.pid"; + args = "${cfg.socketsDir}/slapd.args"; + }; + readOnly = true; + description = '' + Slapd pid files + ''; + }; + }; + }; + + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.ldap = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + nixpkgs.overlays = [ + (self: super: { + openldap_libressl_cyrus = (self.openldap.override { + openssl = self.libressl; + cyrus_sasl = self.cyrus_sasl.overrideAttrs (old: { + configureFlags = old.configureFlags ++ [ "--with-configdir=/etc/sasl2" ]; + }); + }).overrideAttrs (old: { + configureFlags = old.configureFlags ++ [ "--with-cyrus-sasl" "--enable-spasswd" ]; + }); + }) + ]; + + secrets.keys = { + "ldap/password" = { + permissions = "0400"; + user = "openldap"; + group = "openldap"; + text = "${cfg.rootPw}"; + }; + "ldap/access" = { + permissions = "0400"; + user = "openldap"; + group = "openldap"; + text = builtins.readFile cfg.accessFile; + }; + "ldap" = { + permissions = "0500"; + user = "openldap"; + group = "openldap"; + isDir = true; + }; + }; + users.users.openldap.extraGroups = [ "keys" ]; + networking.firewall.allowedTCPPorts = [ 636 389 ]; + + security.acme.certs."ldap" = { + group = "openldap"; + domain = "ldap.immae.eu"; + postRun = '' + systemctl restart openldap.service + ''; + }; + + services.filesWatcher.openldap = { + restart = true; + paths = [ config.secrets.fullPaths."ldap" ]; + }; + + services.openldap = { + enable = true; + urlList = [ "ldap://" "ldaps://" ]; + package = pkgs.openldap_libressl_cyrus; + settings = { + attrs = { + olcPidFile = cfg.pids.pid; + olcArgsFile = cfg.pids.args; + olcLogLevel = "none"; + olcTLSCertificateFile = "${config.security.acme.certs.ldap.directory}/cert.pem"; + olcTLSCertificateKeyFile = "${config.security.acme.certs.ldap.directory}/key.pem"; + olcTLSCACertificateFile = "${config.security.acme.certs.ldap.directory}/fullchain.pem"; + olcTLSCACertificatePath = "${pkgs.cacert.unbundled}/etc/ssl/certs/"; + # This makes openldap crash + # olcTLSCipherSuite = "DEFAULT"; + #olcSaslHost = "kerberos.immae.eu"; + # Map sasl "dn" to ldap dn + #olcAuthzRegexp = ''{0}"uid=([^,]*)(,cn=IMMAE.EU)?,cn=(gssapi|gss-spnego),cn=auth" "uid=$1,ou=users,dc=immae,dc=eu"''; + }; + children = { + "cn=module{0}" = { + attrs = { + cn = "module{0}"; + objectClass = [ "olcModuleList" ]; + olcModuleLoad = [ "{0}back_mdb" "{1}memberof" "{2}syncprov" ]; + }; + }; + "cn=schema".includes = map (schema: + "${config.services.openldap.package}/etc/schema/${schema}.ldif" + ) [ "core" "cosine" "inetorgperson" "nis" ] ++ [ + "${openldap.immae-ldif}" + ]; + "olcDatabase={0}config" = { + attrs = { + objectClass = "olcDatabaseConfig"; + olcDatabase = "{0}config"; + olcAccess = ["{0}to * by * none"]; + }; + }; + "olcDatabase={1}mdb" = { + attrs = { + objectClass = [ "olcDatabaseConfig" "olcMdbConfig" ]; + olcDatabase = "{1}mdb"; + olcDbIndex = [ + "objectClass eq" + "uid pres,eq" + "mail pres,eq,sub" + "cn pres,eq,sub" + "sn pres,eq,sub" + "dc eq" + "member eq" + "memberOf eq" + ]; + olcAccess = let + join = builtins.replaceStrings ["\n"] [" "]; + in [ + # First matching "to" + "by" wins + #### Replication needs full access + (join ''{0}to * + by dn.base="uid=ldap_replication,cn=ldap,ou=services,dc=immae,dc=eu" read + by * break + '') + #### Prevent modification of SASL passwords + (join ''{1}to attrs=userPassword val.regex="^.SASL..+" + by self read + by anonymous auth + by * none + '') + #### Oneself needs access to users password + (join ''{2}to attrs=userPassword,shadowLastChange + by self write + by anonymous auth + by * none + '') + #### Should be write, but disabled during migration to psql + (join ''{3}to attrs=immaeSshKey + by self read + by * break + '') + + #### Anyone can auth, and I can see myself + (join ''{4}to * + by self read + by anonymous auth + by * break + '') + + #### Specific access for phpldapadmin + (join ''{5}to filter="(uid=*)" attrs=entry,uid + by dn.base="cn=phpldapadmin,ou=services,dc=immae,dc=eu" read + by * break + '') + + #### Hosts + # The attributes are available to every host + (join ''{6}to dn.one="ou=hosts,dc=immae,dc=eu" + by dn.subtree="ou=hosts,dc=immae,dc=eu" read + by dn.base="dc=immae,dc=eu" search + by * break + '') + #### /Hosts + + #### Local services + # this/-* & user : all your ancestors have access to you + # this/memberOf/-* & user : all those whom you belong to (in a group), + # and their ancestors, have access to you + # user/immaeAccessWriteDn*/member & this : you have write access to the + # members of your immaeAccessDn + # attributes + # user/immaeAccessDn*/member & this : you have access to the members + # of your immaeAccessDn attributes + # user/immaeAccessReadSubtree* & this/-* : you have access to the + # childrens of your immaeAccessReadSubtree + # attributes + # this/memberOf/-* & user/immaeAccessReadSubtree*: you have access to + # the members of the childrens of your + # immaeAccessReadSubtree attributes + # http://www.openldap.org/faq/data/cache/1133.html + (join ''{7}to dn.subtree="dc=immae,dc=eu" + by dn.subtree="ou=external_services,dc=immae,dc=eu" break + by set.exact="this/-* & user" read + by set.exact="this/memberOf/-* & user" read + by set.exact="user/immaeAccessWriteDn*/member & this" write + by set.exact="user/immaeAccessDn*/member & this" read + by set.exact="user/immaeAccessReadSubtree* & this/-*" read + by set.exact="this/memberOf/-* & user/immaeAccessReadSubtree*" read + by users search + by * break + '') + #### /Local services + + #### External services + # http://www.openldap.org/faq/data/cache/429.html + # FIXME: Find a way to whitelist? + (join ''{8}to attrs=immaeSshKey + by dn.subtree="ou=external_services,dc=immae,dc=eu" none + '') + (join ''{9}to dn.subtree="dc=immae,dc=eu" + by set.exact="this/-* & user" read + by set.exact="this/memberOf/-* & user" read + by set.exact="user/immaeAccessDn*/member & this/-*" read + by users search + by * none + '') + #### /External services + ]; + olcDbDirectory = cfg.dataDir; + olcRootDN = cfg.rootDn; + olcRootPW.path = config.secrets.fullPaths."ldap/password"; + olcSuffix = cfg.baseDn; + }; + children = { + "olcOverlay={0}memberof" = { + attrs = { + objectClass = [ "olcOverlayConfig" "olcMemberOf" ]; + olcOverlay = "{0}memberof"; + }; + }; + "olcOverlay={1}syncprov" = { + attrs = { + objectClass = [ "olcOverlayConfig" "olcSyncProvConfig" ]; + olcOverlay = "{1}syncprov"; + olcSpCheckpoint = "100 10"; + }; + }; + }; + }; + }; + }; + }; + myServices.monitoring.fromMasterActivatedPlugins = [ "tcp" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "ldap SSL is up to date"; + host_name = config.hostEnv.fqdn; + use = "external-service"; + check_command = ["check_tcp_ssl" "636"]; + + servicegroups = "webstatus-ssl"; + _webstatus_name = "LDAP"; + _webstatus_url = "ldap.immae.eu"; + } + ]; + }; +} diff --git a/modules/private/databases/postgresql.nix b/systems/eldiron/databases/postgresql.nix similarity index 81% rename from modules/private/databases/postgresql.nix rename to systems/eldiron/databases/postgresql.nix index a6c4cc9..721059a 100644 --- a/modules/private/databases/postgresql.nix +++ b/systems/eldiron/databases/postgresql.nix @@ -97,8 +97,7 @@ in { config = lib.mkIf cfg.enable { networking.firewall.allowedTCPPorts = [ 5432 ]; - security.acme.certs."postgresql" = config.myServices.databasesCerts // { - user = "postgres"; + security.acme.certs."postgresql" = { group = "postgres"; domain = "db-1.immae.eu"; postRun = '' @@ -108,10 +107,17 @@ in { systemd.services.postgresql.serviceConfig = { SupplementaryGroups = "keys"; + ExecStartPre = [ ("+" + (pkgs.writeShellScript "postgresql-fix-cert" '' + # postgresql complains: + # private key file "${config.security.acme.certs.postgresql.directory}/key.pem" must be owned by the database user or root + cp -f "${config.security.acme.certs.postgresql.directory}/key.pem" "${config.services.postgresql.dataDir}/key.pem" + chown postgres:postgres "${config.services.postgresql.dataDir}/key.pem" + chmod go-r "${config.services.postgresql.dataDir}/key.pem" + '')) ]; }; systemd.services.postgresql.postStart = lib.mkAfter '' # This line is already defined in 19.09 - PSQL="${pkgs.sudo}/bin/sudo -u postgres psql --port=5432" + PSQL="psql --port=5432" ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (role: _: '' $PSQL -tAc "SELECT 1 FROM pg_roles WHERE rolname='${role}'" \ @@ -134,32 +140,34 @@ in { enable = true; package = cfg.package; enableTCPIP = true; - extraConfig = '' - max_connections = 100 - wal_level = logical - shared_buffers = 512MB - work_mem = 10MB - max_wal_size = 1GB - min_wal_size = 80MB - log_timezone = 'Europe/Paris' - datestyle = 'iso, mdy' - timezone = 'Europe/Paris' - lc_messages = 'en_US.UTF-8' - lc_monetary = 'en_US.UTF-8' - lc_numeric = 'en_US.UTF-8' - lc_time = 'en_US.UTF-8' - default_text_search_config = 'pg_catalog.english' + checkConfig = false; + logLinePrefix = "%h %q%u@%d "; # Default: '%m [%p] ', already stored independently by journald. %h needed for fail2ban + settings = { + max_connections = 300; + wal_level = "logical"; + shared_buffers = "512MB"; + work_mem = "10MB"; + max_wal_size = "1GB"; + min_wal_size = "80MB"; + log_timezone = "Europe/Paris"; + datestyle = "iso, mdy"; + timezone = "Europe/Paris"; + lc_messages = "en_US.UTF-8"; + lc_monetary = "en_US.UTF-8"; + lc_numeric = "en_US.UTF-8"; + lc_time = "en_US.UTF-8"; + default_text_search_config = "pg_catalog.english"; # this introduces a small delay before storing on disk, but # makes it order of magnitudes quicker - synchronous_commit = off - ssl = on - ssl_cert_file = '${config.security.acme.certs.postgresql.directory}/fullchain.pem' - ssl_key_file = '${config.security.acme.certs.postgresql.directory}/key.pem' - ''; + synchronous_commit = "off"; + ssl = "on"; + ssl_cert_file = "${config.security.acme.certs.postgresql.directory}/fullchain.pem"; + ssl_key_file = "${config.services.postgresql.dataDir}/key.pem"; + }; authentication = let hosts = builtins.concatStringsSep "\n" ( lib.lists.flatten (lib.mapAttrsToList (k: vs: map (v: - map (ip6: "hostssl ${v.database} ${v.username} ${ip6}/128 ${v.method}") v.ip6 + map (ip6: "hostssl ${v.database} ${v.username} ${ip6} ${v.method}") v.ip6 ++ map (ip4: "hostssl ${v.database} ${v.username} ${ip4}/32 ${v.method}") v.ip4 ) vs) cfg.authorizedHosts )); diff --git a/modules/private/databases/redis.nix b/systems/eldiron/databases/redis.nix similarity index 56% rename from modules/private/databases/redis.nix rename to systems/eldiron/databases/redis.nix index 685fa46..1f57aa9 100644 --- a/modules/private/databases/redis.nix +++ b/systems/eldiron/databases/redis.nix @@ -32,16 +32,21 @@ in { config = lib.mkIf cfg.enable { users.users.redis.uid = config.ids.uids.redis; users.groups.redis.gid = config.ids.gids.redis; - services.redis = rec { + services.redis.servers."" = { enable = true; bind = "127.0.0.1"; unixSocket = cfg.sockets.redis; - extraConfig = '' - unixsocketperm 777 - maxclients 1024 - ''; + unixSocketPerm = 777; + maxclients = 1024; }; systemd.services.redis.serviceConfig.Slice = "redis.slice"; + systemd.services.redis.serviceConfig.RuntimeDirectoryMode = lib.mkForce "0755"; + services.redis.servers."php-sessions" = { + enable = true; + maxclients = 1024; + unixSocketPerm = 777; + user = "wwwrun"; + }; services.spiped = { enable = true; @@ -68,38 +73,38 @@ in { script = "exec ${pkgs.spiped}/bin/spiped -F `cat /etc/spiped/redis.spec`"; }; - services.filesWatcher.predixy = { - restart = true; - paths = [ config.secrets.fullPaths."redis/predixy.conf" ]; - }; + #services.filesWatcher.predixy = { + # restart = true; + # paths = [ config.secrets.fullPaths."redis/predixy.conf" ]; + #}; - networking.firewall.allowedTCPPorts = [ 7617 16379 ]; + networking.firewall.allowedTCPPorts = [ 16379 ]; secrets.keys = { - "redis/predixy.conf" = { - user = "redis"; - group = "redis"; - permissions = "0400"; - text = '' - Name Predixy - Bind 127.0.0.1:7617 - ClientTimeout 300 - WorkerThreads 1 + #"redis/predixy.conf" = { + # user = "redis"; + # group = "redis"; + # permissions = "0400"; + # text = '' + # Name Predixy + # Bind 127.0.0.1:7617 + # ClientTimeout 300 + # WorkerThreads 1 - Authority { - Auth "${config.myEnv.databases.redis.predixy.read}" { - Mode read - } - } + # Authority { + # Auth "${config.myEnv.databases.redis.predixy.read}" { + # Mode read + # } + # } - StandaloneServerPool { - Databases 16 - RefreshMethod fixed - Group shard001 { - + ${config.myEnv.databases.redis.socket} - } - } - ''; - }; + # StandaloneServerPool { + # Databases 16 + # RefreshMethod fixed + # Group shard001 { + # + ${config.myEnv.databases.redis.socket} + # } + # } + # ''; + #}; "redis/spiped_keyfile" = { user = "spiped"; group = "spiped"; @@ -112,22 +117,22 @@ in { description = "Redis slice"; }; - systemd.services.predixy = { - description = "Redis proxy"; - wantedBy = [ "multi-user.target" ]; - after = [ "redis.service" ]; + #systemd.services.predixy = { + # description = "Redis proxy"; + # wantedBy = [ "multi-user.target" ]; + # after = [ "redis.service" ]; - serviceConfig = { - Slice = "redis.slice"; - User = "redis"; - Group = "redis"; - SupplementaryGroups = "keys"; - Type = "simple"; + # serviceConfig = { + # Slice = "redis.slice"; + # User = "redis"; + # Group = "redis"; + # SupplementaryGroups = "keys"; + # Type = "simple"; - ExecStart = "${pkgs.predixy}/bin/predixy ${config.secrets.fullPaths."redis/predixy.conf"}"; - }; + # ExecStart = "${pkgs.predixy}/bin/predixy ${config.secrets.fullPaths."redis/predixy.conf"}"; + # }; - }; + #}; }; } diff --git a/systems/eldiron/dns.nix b/systems/eldiron/dns.nix new file mode 100644 index 0000000..486fcc1 --- /dev/null +++ b/systems/eldiron/dns.nix @@ -0,0 +1,290 @@ +{ lib, pkgs, config, dns-nix, ... }: +{ + options.myServices.dns = { + enable = lib.mkEnableOption "enable DNS resolver"; + helpers = lib.mkOption { + readOnly = true; + description = '' + Some useful constants or functions for zones definition + ''; + default = rec { + servers = config.myEnv.servers; + ips = i: { A = i.ip4; AAAA = i.ip6; }; + letsencrypt = [ { tag = "issue"; value = "letsencrypt.org"; issuerCritical = false; } ]; + toKV = a: builtins.concatStringsSep ";" (builtins.attrValues (builtins.mapAttrs (n: v: "${n}=${v}") a)); + mailMX = { + hasEmail = true; + subdomains = let + mxes = lib.filterAttrs (n: v: v ? mx && v.mx.enable) servers; + in + lib.mapAttrs' (n: v: lib.nameValuePair v.mx.subdomain (ips v.ips.main)) mxes; + }; + zoneHeader = { + TTL = 3*60*60; + SOA = { + # yyyymmdd?? (increment ?? at each change) + serial = 2022121902; # Don't change this value, it is replaced automatically! + refresh = 10800; + retry = 3600; + expire = 604800; + minimum = 10800; # negative cache ttl + adminEmail = "hostmaster@immae.eu"; #email-address s/@/./ + nameServer = "ns1.immae.eu."; + }; + }; + mailSend = { + # DKIM + subdomains._domainkey.subdomains.eldiron.TXT = [ + (toKV config.myEnv.mail.dkim.eldiron.public) + ]; + # old key, may still be used by verifiers + subdomains._domainkey.subdomains.immae_eu.TXT = [ + (toKV config.myEnv.mail.dkim.immae_eu.public) + ]; + }; + mailCommon = name: { + MX = let + mxes = lib.filterAttrs (n: v: v ? mx && v.mx.enable) servers; + in + lib.mapAttrsToList (n: v: { preference = v.mx.priority; exchange = "${v.mx.subdomain}.${name}."; }) mxes; + + # https://tools.ietf.org/html/rfc6186 + SRV = [ + { service = "submission"; proto = "tcp"; priority = 0; weight = 1; port = 587; target = "smtp.immae.eu."; } + { service = "submissions"; proto = "tcp"; priority = 0; weight = 1; port = 465; target = "smtp.immae.eu."; } + + { service = "imap"; proto = "tcp"; priority = 0; weight = 1; port = 143; target = "imap.immae.eu."; } + { service = "imaps"; proto = "tcp"; priority = 0; weight = 1; port = 993; target = "imap.immae.eu."; } + { service = "sieve"; proto = "tcp"; priority = 0; weight = 1; port = 4190; target = "imap.immae.eu."; } + + { service = "pop3"; proto = "tcp"; priority = 10; weight = 1; port = 110; target = "pop3.immae.eu."; } + { service = "pop3s"; proto = "tcp"; priority = 10; weight = 1; port = 995; target = "pop3.immae.eu."; } + ]; + + subdomains = { + # MTA-STS + # https://blog.delouw.ch/2018/12/16/using-mta-sts-to-enhance-email-transport-security-and-privacy/ + # https://support.google.com/a/answer/9261504 + _mta-sts.TXT = [ (toKV { v = "STSv1"; id = "20200109150200Z"; }) ]; # Don't change this value, it is updated automatically! + _tls.subdomains._smtp.TXT = [ (toKV { v = "TLSRPTv1"; "rua" = "mailto:postmaster+mta-sts@immae.eu"; }) ]; + mta-sts = ips servers.eldiron.ips.main; + + # DMARC + _dmarc.TXT = [ (toKV { v = "DMARC1"; p = "none"; adkim = "r"; aspf = "r"; fo = "1"; rua = "mailto:postmaster+rua@immae.eu"; ruf = "mailto:postmaster+ruf@immae.eu"; }) ]; + }; + + # SPF + TXT = [ (toKV { v = "spf1 mx ~all"; }) ]; + }; + }; + }; + zones = lib.mkOption { + type = lib.types.attrsOf (dns-nix.lib.types.zone.substSubModules ( + dns-nix.lib.types.zone.getSubModules ++ [ + ({ name, ... }: { + options = { + hasEmail = lib.mkEnableOption "This domain has e-mails configuration"; + emailPolicies = lib.mkOption { + default = {}; + type = lib.types.attrsOf (lib.types.submodule { + options = { + receive = lib.mkEnableOption "Configure this domain to receive e-mail"; + }; + }); + apply = builtins.mapAttrs (n: v: v // { + domain = name; + fqdn = if n == "" then name else "${n}.${name}"; + }); + }; + extraConfig = lib.mkOption { + type = lib.types.lines; + description = "Extra zone configuration for bind"; + example = '' + notify yes; + ''; + default = ""; + }; + slaves = lib.mkOption { + type = lib.types.listOf lib.types.str; + description = "NS slave groups of this zone"; + default = []; + }; + ns = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = []; + }; + }; + }) + ])); + apply = let + toNS = n: builtins.map (d: "${d}.") (builtins.concatMap (s: builtins.attrNames config.myEnv.dns.ns."${s}") n); + in + builtins.mapAttrs (n: v: v // { NS = v.NS or [] ++ toNS (v.ns); }); + default = {}; + description = '' + attrset of zones to configure + ''; + }; + }; + config = let + cfg = config.services.bind; + in lib.mkIf config.myServices.dns.enable { + myServices.chatonsProperties.hostings.dns-secondaire = { + file.datetime = "2022-08-22T02:00:00"; + hosting = { + name = "DNS secondaire"; + description = "DNS secondaire"; + website = "ns1.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "bind9"; + website = pkgs.bind.meta.homepage; + license.url = pkgs.bind.meta.license.url; + license.name = pkgs.bind.meta.license.fullName; + version = pkgs.bind.version; + source.url = "https://www.isc.org/download/"; + }; + }; + myServices.dns.zones = with config.myServices.dns.helpers; { + "imsite.eu" = lib.mkMerge [ + zoneHeader + (ips servers.eldiron.ips.main) + { + ns = [ "immae" ]; + CAA = letsencrypt; + } + ]; + "immae.dev" = lib.mkMerge [ + { + extraConfig = '' + notify yes; + ''; + slaves = [ "raito" ]; + } + zoneHeader + (ips servers.eldiron.ips.integration) + { + ns = [ "immae" "raito" ]; + CAA = letsencrypt; + } + ]; + "immae.eu" = lib.mkMerge [ + { + extraConfig = '' + notify yes; + ''; + slaves = [ "raito" ]; + } + zoneHeader + (ips servers.eldiron.ips.production) + { + ns = [ "immae" "raito" ]; + CAA = letsencrypt; + + # ns1 has glue records in gandi.net + subdomains.ns1 = ips servers.eldiron.ips.main; + # raito / kurisu.dual.lahfa.xyz ; replace with eldiron in case of problem + subdomains.ns2.A = builtins.map (address: { inherit address; ttl = 600; }) servers.eldiron.ips.main.ip4; + subdomains.ns2.AAAA = builtins.map (address: { inherit address; ttl = 600; }) servers.eldiron.ips.main.ip6; + } + { + # Machines local users + emailPolicies.localhost.receive = false; + subdomains.localhost = lib.mkMerge [ (mailCommon "immae.eu") mailSend ]; + emailPolicies.eldiron.receive = true; + subdomains.eldiron = lib.mkMerge [ (mailCommon "immae.eu") mailSend ]; + } + { + # For each server "server" and each server ip group "ipgroup", + # define ipgroup.server.immae.eu + # "main" is set as server.immae.eu instead + # if main has an "alias", it is duplicated with this alias. + # If the server is a vm, use the v.immae.eu namespace (only main is created) + subdomains = let + vms = lib.filterAttrs (n: v: v.isVm) servers; + bms = lib.filterAttrs (n: v: !v.isVm) servers; + toIps = type: builtins.mapAttrs (n: v: ips v.ips."${type}"); + in + lib.mkMerge [ + (toIps "main" bms) + + { v.subdomains = toIps "main" vms; } + + (lib.mapAttrs (_: v: { + subdomains = lib.mapAttrs' + (n': v': lib.nameValuePair "${if v'.alias == null then n' else v'.alias}" (ips v')) + (lib.filterAttrs (n': v': n' != "main" || v'.alias != null) v.ips); + }) bms) + ]; + } + { + # Outils + subdomains = { + status = ips servers.monitoring-1.ips.main; + }; + } + ]; + }; + networking.firewall.allowedUDPPorts = [ 53 ]; + networking.firewall.allowedTCPPorts = [ 53 ]; + users.users.named.extraGroups = [ "keys" ]; + services.bind = { + enable = true; + cacheNetworks = ["any"]; + extraOptions = '' + allow-recursion { 127.0.0.1; }; + allow-transfer { none; }; + + notify-source ${lib.head config.myEnv.servers.eldiron.ips.main.ip4}; + notify-source-v6 ${lib.head config.myEnv.servers.eldiron.ips.main.ip6}; + version none; + hostname none; + server-id none; + ''; + zones = + builtins.mapAttrs (name: v: { + master = true; + extraConfig = v.extraConfig; + masters = []; + slaves = + lib.flatten (map (n: builtins.attrValues config.myEnv.dns.ns.${n}) v.slaves); + file = pkgs.runCommand "${name}.zone" { + text = v; + passAsFile = [ "text" ]; + # Automatically change the increment when relevant change + # happened (both serial and mta-sts) + } '' + mv "$textPath" $out + increment=$(( 100*($(date -u +%-H) * 60 + $(date -u +%-M))/1440 )) + sed -i -e "s/2022121902/$(date -u +%Y%m%d)$increment/g" $out + sed -i -e "s/20200109150200Z/$(date -u +%Y%m%d%H%M%SZ)/g" $out + ''; + }) config.myServices.dns.zones; + }; + myServices.monitoring.fromMasterActivatedPlugins = [ "dns" ]; + myServices.monitoring.fromMasterObjects.service = lib.mkMerge (lib.mapAttrsToList (name: z: + lib.optional (builtins.elem "immae" z.ns) { + service_description = "eldiron dns is active and authoritative for ${name}"; + host_name = config.hostEnv.fqdn; + use = "dns-service"; + check_command = ["check_dns" name "-A"]; + + servicegroups = "webstatus-dns"; + _webstatus_name = name; + } ++ + lib.optional (builtins.elem "raito" z.ns) { + service_description = "raito dns is active and authoritative for ${name}"; + host_name = config.hostEnv.fqdn; + use = "dns-service"; + check_command = ["check_external_dns" "kurisu.dual.lahfa.xyz" name "-A"]; + + servicegroups = "webstatus-dns"; + _webstatus_name = "${name} (Secondary DNS Raito)"; + } + ) config.myServices.dns.zones); + }; +} diff --git a/modules/duply_backup/default.nix b/systems/eldiron/duply_backup.nix similarity index 83% rename from modules/duply_backup/default.nix rename to systems/eldiron/duply_backup.nix index 846b1d4..590d125 100644 --- a/modules/duply_backup/default.nix +++ b/systems/eldiron/duply_backup.nix @@ -120,5 +120,32 @@ in sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh"; }) ]; + + myServices.monitoring.fromMasterActivatedPlugins = [ "eriomem" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "eriomem backup is up and not full"; + host_name = config.hostEnv.fqdn; + use = "external-service"; + check_command = "check_backup_eriomem"; + + check_interval = 120; + notification_interval = "1440"; + + servicegroups = "webstatus-backup"; + } + + { + service_description = "ovh backup is up and not full"; + host_name = config.hostEnv.fqdn; + use = "external-service"; + check_command = "check_ok"; + + check_interval = 120; + notification_interval = "1440"; + + servicegroups = "webstatus-backup"; + } + ]; }; } diff --git a/modules/private/ejabberd/default.nix b/systems/eldiron/ejabberd/default.nix similarity index 54% rename from modules/private/ejabberd/default.nix rename to systems/eldiron/ejabberd/default.nix index 4d86a64..5268516 100644 --- a/modules/private/ejabberd/default.nix +++ b/systems/eldiron/ejabberd/default.nix @@ -1,4 +1,4 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, mypackages-lib, ... }: let cfg = config.myServices.ejabberd; in @@ -14,22 +14,44 @@ in }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.fr" = with config.myServices.dns.helpers; + lib.mkMerge [ + { + extraConfig = '' + notify yes; + ''; + slaves = [ "raito" ]; + emailPolicies."".receive = true; + } + zoneHeader + mailMX + (mailCommon "immae.fr") + (ips servers.eldiron.ips.main) + { + ns = [ "immae" "raito" ]; + CAA = letsencrypt; + subdomains.www = ips servers.eldiron.ips.production; + subdomains.im = ips servers.eldiron.ips.main; + subdomains.conference = ips servers.eldiron.ips.main; + subdomains.pubsub = ips servers.eldiron.ips.main; + subdomains.proxy = ips servers.eldiron.ips.main; + subdomains.upload = ips servers.eldiron.ips.main; + subdomains._xmppconnect.TXT = [ + "_xmpp-client-xbosh=https://im.immae.fr/bosh" + "_xmpp-client-websocket=wss://im.immae.fr/ws" + ]; + } + ]; + security.acme.certs = { - "ejabberd" = config.myServices.certificates.certConfig // { - user = "ejabberd"; + "ejabberd" = { group = "ejabberd"; domain = "eldiron.immae.eu"; keyType = "rsa4096"; postRun = '' systemctl restart ejabberd.service ''; - extraDomains = { - "immae.fr" = null; - "conference.immae.fr" = null; - "proxy.immae.fr" = null; - "pubsub.immae.fr" = null; - "upload.immae.fr" = null; - }; + extraDomainNames = [ "immae.fr" "conference.immae.fr" "proxy.immae.fr" "pubsub.immae.fr" "upload.immae.fr" ]; }; }; networking.firewall.allowedTCPPorts = [ 5222 5269 ]; @@ -88,5 +110,32 @@ in substituteAll ${./ejabberd.yml} $out ''; }; + secrets.keys."postfix/scripts/ejabberd-env" = { + user = "postfixscripts"; + group = "root"; + permissions = "0400"; + text = builtins.toJSON { + jid = "notify_bot@immae.fr"; + password = "{{ .xmpp.notify_bot }}"; + }; + }; + services.postfix.extraAliases = let + nixpkgs = builtins.fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/840c782d507d60aaa49aa9e3f6d0b0e780912742.tar.gz"; + sha256 = "14q3kvnmgz19pgwyq52gxx0cs90ddf24pnplmq33pdddbb6c51zn"; + }; + pkgs' = import nixpkgs { inherit (pkgs) system; overlays = []; }; + warn_xmpp_email = scriptEnv: pkgs'.runCommand "warn_xmpp_email" { + inherit scriptEnv; + pythonEnv = pkgs'.python3.withPackages (ps: [ + ps.unidecode ps.slixmpp + ]); + } '' + substituteAll ${./warn_xmpp_email.py} $out + chmod a+x $out + ''; + in '' + ejabberd: "|${mypackages-lib.postfixScript pkgs "ejabberd" (warn_xmpp_email config.secrets.fullPaths."postfix/scripts/ejabberd-env")}" + ''; }; } diff --git a/modules/private/ejabberd/ejabberd.yml b/systems/eldiron/ejabberd/ejabberd.yml similarity index 100% rename from modules/private/ejabberd/ejabberd.yml rename to systems/eldiron/ejabberd/ejabberd.yml diff --git a/systems/eldiron/ejabberd/warn_xmpp_email.py b/systems/eldiron/ejabberd/warn_xmpp_email.py new file mode 100755 index 0000000..d482b43 --- /dev/null +++ b/systems/eldiron/ejabberd/warn_xmpp_email.py @@ -0,0 +1,112 @@ +#!@pythonEnv@/bin/python3 + +import sys +import json +import slixmpp +import asyncio +import logging +import io + +CONFIG = json.load(open("@scriptEnv@", "r")) + +def sanitize(string): + import re + from unidecode import unidecode + return re.compile(r"[^-.A-Za-z0-9_]").sub("_", unidecode(string)) + +def parse_email(): + import email + from email.header import decode_header + + mail = email.message_from_file(sys.stdin) + try: + d = decode_header(mail["subject"])[0] + if d[1] is not None: + subject = d[0].decode(d[1]) + else: + subject = d[0] + except Exception as e: + subject = mail["subject"] + sender = mail["from"] + recipient = mail["X-Original-To"] + + body = "" + html = None + files = {} + for part in mail.walk(): + if part.get_content_type() == "text/plain": + body += "\n-------------------\n" + try: + body += part.get_payload(decode=True).decode(encoding=part.get_content_charset() or "utf-8") + except Exception as e: + body += part.get_payload(decode=False) + elif part.get_content_type() == "text/html": + html = part.get_payload(decode=True) + elif part.get_content_type() != "text/html" and\ + part.get_content_maintype() != "multipart": + + filename = part.get_filename() or "{}.dat".format(part["Content-ID"]) + files[sanitize(filename)] = (part.get_content_type(), part.get_payload(decode=True)) + + return [body, html, subject, sender, recipient, files] + +[body, html, subject, sender, recipient, files] = parse_email() + +class Bot(slixmpp.ClientXMPP): + def __init__(self, jid, password, body, html, subject, sender, recipient, files): + super().__init__(jid, password) + + self.got_error = False + self.body = body + self.html = html + self.subject = subject + self.sender = sender + self.recipient = recipient + self.files = files + self.register_plugin('xep_0363') + self.add_event_handler("session_start", self.session_start) + self.add_event_handler("message", self.message) + + @asyncio.coroutine + def session_start(self, event): + files = [] + if self.html is not None: + url = yield from self['xep_0363'].upload_file( + "mail.html", + content_type="text/html", + input_file=io.BytesIO(self.html)) + files.append(("HTML version", url)) + for f in self.files: + url = yield from self['xep_0363'].upload_file( + f, + content_type=self.files[f][0], + input_file=io.BytesIO(self.files[f][1]) + ) + files.append((f, url)) + + text = """ +New e-mail message from {sender} +Subject: {subject} +{body} +""".format(sender=self.sender, subject=self.subject, body=self.body) + if len(files) > 0: + text += "\n\nAttachments:" + for f in files: + text += "\n{}: {}".format(f[0], f[1]) + self.send_message(mto=self.recipient, mbody=text, msubject=self.subject, mtype='message') + yield from asyncio.sleep(5) + self.disconnect() + + @asyncio.coroutine + def message(self, msg): + if msg["type"] == "error": + self.got_error = True + +logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s %(message)s') +xmpp = Bot(CONFIG["jid"], CONFIG["password"], body, html, subject, sender, recipient, files) +xmpp.connect() +xmpp.process(forever=False) +if xmpp.got_error: + sys.exit(1) +else: + sys.exit(0) diff --git a/systems/eldiron/flake.lock b/systems/eldiron/flake.lock new file mode 100644 index 0000000..99a5c92 --- /dev/null +++ b/systems/eldiron/flake.lock @@ -0,0 +1,2758 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_12", + "nixpkgs": "nixpkgs_15" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "buildslist": { + "flake": false, + "locked": { + "lastModified": 1585697026, + "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=", + "ref": "master", + "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0", + "revCount": 4, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + }, + "original": { + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "copanier": { + "flake": false, + "locked": { + "lastModified": 1633895178, + "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=", + "owner": "spiral-project", + "repo": "copanier", + "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837", + "type": "github" + }, + "original": { + "owner": "spiral-project", + "repo": "copanier", + "type": "github" + } + }, + "diaspora": { + "flake": false, + "locked": { + "lastModified": 1551139311, + "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=", + "owner": "diaspora", + "repo": "diaspora", + "rev": "663da1ef2573863eb870e0edbd50050f261f3d30", + "type": "github" + }, + "original": { + "owner": "diaspora", + "ref": "v0.7.10.0", + "repo": "diaspora", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "dns-nix": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1635273082, + "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=", + "owner": "kirelagin", + "repo": "dns.nix", + "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a", + "type": "github" + }, + "original": { + "owner": "kirelagin", + "repo": "dns.nix", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "etherpad-lite": { + "flake": false, + "locked": { + "lastModified": 1587951095, + "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=", + "owner": "ether", + "repo": "etherpad-lite", + "rev": "62101147a0c3495dc80daa87ab53a3366321a205", + "type": "github" + }, + "original": { + "owner": "ether", + "ref": "1.8.3", + "repo": "etherpad-lite", + "type": "github" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../files-watcher", + "type": "path" + }, + "original": { + "path": "../../files-watcher", + "type": "path" + } + }, + "files-watcher_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_4" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_4": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_5" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_5": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_6" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_6": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_7" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1614513358, + "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_10": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_11": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_12": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_13": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_14": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_15": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_16": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_17": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_18": { + "locked": { + "lastModified": 1649676176, + "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_19": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_20": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_21": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_22": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_23": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_6": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_7": { + "locked": { + "lastModified": 1609246779, + "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_8": { + "locked": { + "lastModified": 1631561581, + "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_9": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "grocy": { + "flake": false, + "locked": { + "lastModified": 1585166193, + "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=", + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + }, + "original": { + "owner": "grocy", + "repo": "grocy", + "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a", + "type": "github" + } + }, + "mastodon": { + "flake": false, + "locked": { + "lastModified": 1582790581, + "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=", + "owner": "tootsuite", + "repo": "mastodon", + "rev": "9bace2dd88d127d396794375c8fcb2132619a799", + "type": "github" + }, + "original": { + "owner": "tootsuite", + "ref": "v2.9.4", + "repo": "mastodon", + "type": "github" + } + }, + "mediagoblin": { + "flake": false, + "locked": { + "lastModified": 1531090939, + "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=", + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "revCount": 4805, + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + }, + "original": { + "ref": "stable", + "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850", + "submodules": true, + "type": "git", + "url": "https://git.savannah.gnu.org/git/mediagoblin.git" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_16", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "mypackages_2": { + "inputs": { + "flake-parts": "flake-parts_3", + "nixpkgs": "nixpkgs_19", + "webapps-ttrss": "webapps-ttrss_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_3": { + "inputs": { + "flake-parts": "flake-parts_4", + "nixpkgs": "nixpkgs_21", + "webapps-ttrss": "webapps-ttrss_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "mypackages_4": { + "inputs": { + "flake-parts": "flake-parts_6", + "nixpkgs": "nixpkgs_29", + "webapps-ttrss": "webapps-ttrss_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../mypackages", + "type": "path" + }, + "original": { + "path": "../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_10": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_11": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_12": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_13": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_14": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_6": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_7": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "myuids_8": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_9": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "my-lib", + "disko" + ], + "flake-parts": [ + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_4": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_5": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_6": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_7": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1631570365, + "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "df7113c0727881519248d4c7d080324e0ee3327b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_12": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_13": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_14": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_15": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_16": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_17": { + "locked": { + "lastModified": 1633901457, + "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f358794824b4595d77fec93732485d329ed7b0e0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_18": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_19": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_20": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_21": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_22": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_23": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_24": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_25": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_26": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_27": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_28": { + "locked": { + "lastModified": 1611097871, + "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_29": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_30": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_31": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1597943282, + "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "openarc": { + "inputs": { + "flake-utils": "flake-utils_4", + "myuids": "myuids", + "nixpkgs": "nixpkgs_7", + "openarc": "openarc_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_2": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_3": { + "inputs": { + "flake-utils": "flake-utils_6", + "myuids": "myuids_3", + "nixpkgs": "nixpkgs_9", + "openarc": "openarc_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../openarc", + "type": "path" + }, + "original": { + "path": "../../openarc", + "type": "path" + } + }, + "openarc_4": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "openarc_5": { + "flake": false, + "locked": { + "lastModified": 1537545083, + "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=", + "owner": "trusteddomainproject", + "repo": "OpenARC", + "rev": "355ee2a1ca85acccce494478991983b54f794f4e", + "type": "github" + }, + "original": { + "owner": "trusteddomainproject", + "repo": "OpenARC", + "type": "github" + } + }, + "opendmarc": { + "inputs": { + "flake-utils": "flake-utils_5", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_8" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "opendmarc_2": { + "inputs": { + "flake-utils": "flake-utils_7", + "myuids": "myuids_4", + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../opendmarc", + "type": "path" + }, + "original": { + "path": "../../opendmarc", + "type": "path" + } + }, + "paste": { + "inputs": { + "flake-utils": "flake-utils_8", + "nixpkgs": "nixpkgs_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=", + "path": "../../paste", + "type": "path" + }, + "original": { + "path": "../../paste", + "type": "path" + } + }, + "peertube": { + "flake": false, + "locked": { + "lastModified": 1611184594, + "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", + "ref": "gitolite_local/open_instance", + "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", + "revCount": 6316, + "type": "git", + "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_2": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_3": { + "flake": false, + "locked": { + "lastModified": 1610436329, + "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", + "owner": "Chocobozzz", + "repo": "PeerTube", + "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", + "type": "github" + }, + "original": { + "owner": "Chocobozzz", + "ref": "v3.0.1", + "repo": "PeerTube", + "type": "github" + } + }, + "peertube_open_instance": { + "inputs": { + "flake-utils": "flake-utils_9", + "myuids": "myuids_5", + "nixpkgs": "nixpkgs_12", + "peertube": "peertube" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "peertube_origin": { + "inputs": { + "flake-utils": "flake-utils_10", + "myuids": "myuids_6", + "nixpkgs": "nixpkgs_13", + "peertube": "peertube_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "./../../peertube", + "type": "path" + }, + "original": { + "path": "./../../peertube", + "type": "path" + } + }, + "private-buildbot": { + "inputs": { + "buildslist": "buildslist", + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=", + "path": "../../flakes/private/buildbot", + "type": "path" + }, + "original": { + "path": "../../flakes/private/buildbot", + "type": "path" + } + }, + "private-chatons": { + "inputs": { + "environment": "environment" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-milters": { + "inputs": { + "environment": "environment_2", + "files-watcher": "files-watcher", + "openarc": "openarc", + "opendmarc": "opendmarc", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=", + "path": "../../flakes/private/milters", + "type": "path" + }, + "original": { + "path": "../../flakes/private/milters", + "type": "path" + } + }, + "private-monitoring": { + "inputs": { + "environment": "environment_3", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib_2", + "secrets": "secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "private-openarc": { + "inputs": { + "files-watcher": "files-watcher_2", + "openarc": "openarc_3", + "secrets": "secrets_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=", + "path": "../../flakes/private/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openarc", + "type": "path" + } + }, + "private-opendmarc": { + "inputs": { + "environment": "environment_4", + "files-watcher": "files-watcher_3", + "opendmarc": "opendmarc_2", + "secrets": "secrets_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=", + "path": "../../flakes/private/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/private/opendmarc", + "type": "path" + } + }, + "private-openldap": { + "locked": { + "lastModified": 1, + "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=", + "path": "../../flakes/private/openldap", + "type": "path" + }, + "original": { + "path": "../../flakes/private/openldap", + "type": "path" + } + }, + "private-paste": { + "inputs": { + "paste": "paste" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=", + "path": "../../flakes/private/paste", + "type": "path" + }, + "original": { + "path": "../../flakes/private/paste", + "type": "path" + } + }, + "private-peertube": { + "inputs": { + "peertube_open_instance": "peertube_open_instance", + "peertube_origin": "peertube_origin" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=", + "path": "../../flakes/private/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/private/peertube", + "type": "path" + } + }, + "private-php": { + "inputs": { + "flake-utils": "flake-utils_11", + "nixpkgs": "nixpkgs_14", + "nixpkgs-4": "nixpkgs-4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "private-ssh": { + "inputs": { + "environment": "environment_5", + "secrets": "secrets_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=", + "path": "../../flakes/private/ssh", + "type": "path" + }, + "original": { + "path": "../../flakes/private/ssh", + "type": "path" + } + }, + "private-system": { + "inputs": { + "backports": "backports", + "environment": "environment_6", + "mypackages": "mypackages", + "myuids": "myuids_7", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "public-copanier": { + "inputs": { + "copanier": "copanier", + "flake-utils": "flake-utils_13", + "nixpkgs": "nixpkgs_17" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=", + "path": "../../flakes/copanier", + "type": "path" + }, + "original": { + "path": "../../flakes/copanier", + "type": "path" + } + }, + "public-diaspora": { + "inputs": { + "diaspora": "diaspora", + "flake-utils": "flake-utils_14", + "myuids": "myuids_8", + "nixpkgs": "nixpkgs_18" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=", + "path": "../../flakes/diaspora", + "type": "path" + }, + "original": { + "path": "../../flakes/diaspora", + "type": "path" + } + }, + "public-etherpad-lite": { + "inputs": { + "etherpad-lite": "etherpad-lite", + "flake-utils": "flake-utils_15", + "mypackages": "mypackages_2", + "nixpkgs": "nixpkgs_20" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=", + "path": "../../flakes/etherpad-lite", + "type": "path" + }, + "original": { + "path": "../../flakes/etherpad-lite", + "type": "path" + } + }, + "public-fiche": { + "locked": { + "lastModified": 1, + "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=", + "path": "../../flakes/fiche", + "type": "path" + }, + "original": { + "path": "../../flakes/fiche", + "type": "path" + } + }, + "public-files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "public-grocy": { + "inputs": { + "flake-utils": "flake-utils_16", + "grocy": "grocy", + "mypackages": "mypackages_3", + "nixpkgs": "nixpkgs_22" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=", + "path": "../../flakes/grocy", + "type": "path" + }, + "original": { + "path": "../../flakes/grocy", + "type": "path" + } + }, + "public-loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "public-mastodon": { + "inputs": { + "flake-utils": "flake-utils_17", + "mastodon": "mastodon", + "myuids": "myuids_9", + "nixpkgs": "nixpkgs_23" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=", + "path": "../../flakes/mastodon", + "type": "path" + }, + "original": { + "path": "../../flakes/mastodon", + "type": "path" + } + }, + "public-mediagoblin": { + "inputs": { + "flake-utils": "flake-utils_18", + "mediagoblin": "mediagoblin", + "myuids": "myuids_10", + "nixpkgs": "nixpkgs_24" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=", + "path": "../../flakes/mediagoblin", + "type": "path" + }, + "original": { + "path": "../../flakes/mediagoblin", + "type": "path" + } + }, + "public-multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_4", + "myuids": "myuids_11" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "public-mypackages": { + "inputs": { + "flake-parts": "flake-parts_5", + "nixpkgs": "nixpkgs_25", + "webapps-ttrss": "webapps-ttrss_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../flakes/mypackages", + "type": "path" + }, + "original": { + "path": "../../flakes/mypackages", + "type": "path" + } + }, + "public-myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "public-openarc": { + "inputs": { + "flake-utils": "flake-utils_19", + "myuids": "myuids_12", + "nixpkgs": "nixpkgs_26", + "openarc": "openarc_5" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=", + "path": "../../flakes/openarc", + "type": "path" + }, + "original": { + "path": "../../flakes/openarc", + "type": "path" + } + }, + "public-opendmarc": { + "inputs": { + "flake-utils": "flake-utils_20", + "myuids": "myuids_13", + "nixpkgs": "nixpkgs_27" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=", + "path": "../../flakes/opendmarc", + "type": "path" + }, + "original": { + "path": "../../flakes/opendmarc", + "type": "path" + } + }, + "public-peertube": { + "inputs": { + "flake-utils": "flake-utils_21", + "myuids": "myuids_14", + "nixpkgs": "nixpkgs_28", + "peertube": "peertube_3" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=", + "path": "../../flakes/peertube", + "type": "path" + }, + "original": { + "path": "../../flakes/peertube", + "type": "path" + } + }, + "public-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "public-surfer": { + "inputs": { + "flake-utils": "flake-utils_22", + "mypackages": "mypackages_4", + "nixpkgs": "nixpkgs_30", + "surfer": "surfer" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=", + "path": "../../flakes/surfer", + "type": "path" + }, + "original": { + "path": "../../flakes/surfer", + "type": "path" + } + }, + "public-taskwarrior-web": { + "inputs": { + "flake-utils": "flake-utils_23", + "nixpkgs": "nixpkgs_31", + "taskwarrior-web": "taskwarrior-web" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=", + "path": "../../flakes/taskwarrior-web", + "type": "path" + }, + "original": { + "path": "../../flakes/taskwarrior-web", + "type": "path" + } + }, + "root": { + "inputs": { + "dns-nix": "dns-nix", + "my-lib": "my-lib", + "nixpkgs": "nixpkgs_5", + "private-buildbot": "private-buildbot", + "private-chatons": "private-chatons", + "private-environment": "private-environment", + "private-milters": "private-milters", + "private-monitoring": "private-monitoring", + "private-openarc": "private-openarc", + "private-opendmarc": "private-opendmarc", + "private-openldap": "private-openldap", + "private-paste": "private-paste", + "private-peertube": "private-peertube", + "private-php": "private-php", + "private-ssh": "private-ssh", + "private-system": "private-system", + "public-copanier": "public-copanier", + "public-diaspora": "public-diaspora", + "public-etherpad-lite": "public-etherpad-lite", + "public-fiche": "public-fiche", + "public-files-watcher": "public-files-watcher", + "public-grocy": "public-grocy", + "public-loginctl-linger": "public-loginctl-linger", + "public-mastodon": "public-mastodon", + "public-mediagoblin": "public-mediagoblin", + "public-multi-apache-container": "public-multi-apache-container", + "public-mypackages": "public-mypackages", + "public-myuids": "public-myuids", + "public-openarc": "public-openarc", + "public-opendmarc": "public-opendmarc", + "public-peertube": "public-peertube", + "public-secrets": "public-secrets", + "public-surfer": "public-surfer", + "public-taskwarrior-web": "public-taskwarrior-web" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "surfer": { + "flake": false, + "locked": { + "lastModified": 1588637864, + "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=", + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "revCount": 318, + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + }, + "original": { + "rev": "476177380452c9c7c5b1624805feedc824c5995e", + "type": "git", + "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git" + } + }, + "taskwarrior-web": { + "flake": false, + "locked": { + "lastModified": 1546434241, + "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=", + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + }, + "original": { + "owner": "theunraveler", + "repo": "taskwarrior-web", + "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_2": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_3": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_4": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + }, + "webapps-ttrss_5": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/systems/eldiron/flake.nix b/systems/eldiron/flake.nix new file mode 100644 index 0000000..790b638 --- /dev/null +++ b/systems/eldiron/flake.nix @@ -0,0 +1,90 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + dns-nix.url = "github:kirelagin/dns.nix"; + dns-nix.inputs.nixpkgs.follows = "nixpkgs"; + + my-lib.url = "path:../../flakes/lib"; + + public-etherpad-lite.url = "path:../../flakes/etherpad-lite"; + public-grocy.url = "path:../../flakes/grocy"; + public-openarc.url = "path:../../flakes/openarc"; + public-opendmarc.url = "path:../../flakes/opendmarc"; + public-peertube.url = "path:../../flakes/peertube"; + public-diaspora.url = "path:../../flakes/diaspora"; + public-mastodon.url = "path:../../flakes/mastodon"; + public-mediagoblin.url = "path:../../flakes/mediagoblin"; + public-surfer.url = "path:../../flakes/surfer"; + public-myuids.url = "path:../../flakes/myuids"; + public-copanier.url = "path:../../flakes/copanier"; + public-secrets.url = "path:../../flakes/secrets"; + public-files-watcher.url = "path:../../flakes/files-watcher"; + public-fiche.url = "path:../../flakes/fiche"; + public-mypackages.url = "path:../../flakes/mypackages"; + public-loginctl-linger.url = "path:../../flakes/loginctl-linger"; + public-multi-apache-container.url = "path:../../flakes/multi-apache-container"; + public-taskwarrior-web.url = "path:../../flakes/taskwarrior-web"; + + private-peertube.url = "path:../../flakes/private/peertube"; + private-buildbot.url = "path:../../flakes/private/buildbot"; + private-php.url = "path:../../flakes/private/php"; + private-environment.url = "path:../../flakes/private/environment"; + private-openarc.url = "path:../../flakes/private/openarc"; + private-openldap.url = "path:../../flakes/private/openldap"; + private-opendmarc.url = "path:../../flakes/private/opendmarc"; + private-milters.url = "path:../../flakes/private/milters"; + private-monitoring.url = "path:../../flakes/private/monitoring"; + private-paste.url = "path:../../flakes/private/paste"; + private-ssh.url = "path:../../flakes/private/ssh"; + private-chatons.url = "path:../../flakes/private/chatons"; + private-system.url = "path:../../flakes/private/system"; + }; + outputs = inputs@{ self, my-lib, nixpkgs, dns-nix, ...}: + my-lib.lib.mkColmenaFlake { + name = "eldiron"; + inherit self nixpkgs; + system = "x86_64-linux"; + targetHost = "176.9.151.89"; + targetUser = "root"; + nixosModules = with inputs; { + base = ./base.nix; + myuids = public-myuids.nixosModule; + secrets = public-secrets.nixosModule; + loginctl-linger = public-loginctl-linger.nixosModule; + files-watcher = public-files-watcher.nixosModule; + multi-apache-container = public-multi-apache-container.nixosModule; + etherpad-lite = public-etherpad-lite.nixosModule; + mastodon = public-mastodon.nixosModule; + mediagoblin = public-mediagoblin.nixosModule; + peertube = public-peertube.nixosModule; + diaspora = public-diaspora.nixosModule; + fiche = public-fiche.nixosModule; + + environment = private-environment.nixosModule; + openarc = private-openarc.nixosModule; + opendmarc = private-opendmarc.nixosModule; + ssh = private-ssh.nixosModule; + chatons = private-chatons.nixosModule; + system = private-system.nixosModule; + monitoring = private-monitoring.nixosModule; + paste = private-paste.nixosModule; + milters = private-milters.nixosModule; + }; + moduleArgs = with inputs; { + dns-nix = dns-nix; + nixpkgsRaw = nixpkgs.legacyPackages.x86_64-linux; + mypackages-lib = public-mypackages.lib.x86_64-linux; + etherpad-lite = public-etherpad-lite.defaultPackage.x86_64-linux; + taskwarrior-web = public-taskwarrior-web.defaultPackage.x86_64-linux; + copanier = public-copanier.defaultPackage.x86_64-linux; + grocy = public-grocy.defaultPackage.x86_64-linux; + surfer = public-surfer.defaultPackage.x86_64-linux; + mediagoblin = public-mediagoblin.defaultPackage.x86_64-linux; + buildbot = private-buildbot.packages.x86_64-linux.buildbot-full; + openldap = private-openldap; + monitoring = private-monitoring; + peertube = private-peertube.packages.x86_64-linux; + php = private-php; + }; + }; +} diff --git a/modules/private/ftp.nix b/systems/eldiron/ftp.nix similarity index 68% rename from modules/private/ftp.nix rename to systems/eldiron/ftp.nix index cae25c1..6aa1afc 100644 --- a/modules/private/ftp.nix +++ b/systems/eldiron/ftp.nix @@ -30,14 +30,88 @@ in }; config = lib.mkIf config.myServices.ftp.enable { - security.acme.certs."ftp" = config.myServices.certificates.certConfig // { + myServices.dns.zones."immae.eu".subdomains.ftp = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.espace-de-stockage = { + file.datetime = "2022-08-22T01:00:00"; + service = { + name = "Espace de stockage"; + description = "Compte FTP/SFTP"; + logo = if pure-ftpd-enabled + then "https://www.pureftpd.org/project/pure-ftpd/images/favicon.png" + else if proftpd-enabled + then "http://proftpd.org/proftpd.png" + else ""; + website = "ftp.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = if pure-ftpd-enabled then { + name = "Pure-ftpd"; + website = "https://www.pureftpd.org/project/pure-ftpd/"; + license.url = "https://github.com/jedisct1/pure-ftpd/blob/master/COPYING"; + license.name = "MIT Licence"; + version = package.version; + source.url = "https://github.com/jedisct1/pure-ftpd/"; + modules = "openssh"; + } else if proftpd-enabled then { + name = "ProFTPD"; + website = "http://proftpd.org/"; + license.url = "https://github.com/proftpd/proftpd/blob/master/COPYING"; + license.name = "GNU General Public License v2.0"; + version = pkgs.proftpd.version; + source.url = "https://github.com/proftpd/proftpd/"; + modules = "openssh"; + } else {}; + }; + #myServices.chatonsProperties.services.ftp = { + # file.datetime = "2022-08-22T01:00:00"; + # service = { + # name = "Comptes FTP"; + # description = "Compte FTP/SFTP"; + # logo = if pure-ftpd-enabled + # then "https://www.pureftpd.org/project/pure-ftpd/images/favicon.png" + # else if proftpd-enabled + # then "http://proftpd.org/proftpd.png" + # else ""; + # website = "ftp.immae.eu"; + # status.level = "OK"; + # status.description = "OK"; + # registration."" = ["MEMBER" "CLIENT"]; + # registration.load = "OPEN"; + # install.type = "PACKAGE"; + # }; + # software = if pure-ftpd-enabled then { + # name = "Pure-ftpd"; + # website = "https://www.pureftpd.org/project/pure-ftpd/"; + # license.url = "https://github.com/jedisct1/pure-ftpd/blob/master/COPYING"; + # license.name = "MIT Licence"; + # version = package.version; + # source.url = "https://github.com/jedisct1/pure-ftpd/"; + # } else if proftpd-enabled then { + # name = "ProFTPD"; + # website = "http://proftpd.org/"; + # license.url = "https://github.com/proftpd/proftpd/blob/master/COPYING"; + # license.name = "GNU General Public License v2.0"; + # version = pkgs.proftpd.version; + # source.url = "https://github.com/proftpd/proftpd/"; + # } else {}; + #}; + security.acme.certs."ftp" = { domain = "eldiron.immae.eu"; + # FIXME: make it global + extraLegoRunFlags = ["--preferred-chain" "ISRG Root X1"]; + extraLegoRenewFlags = ["--preferred-chain" "ISRG Root X1"]; postRun = (lib.optionalString pure-ftpd-enabled '' systemctl restart pure-ftpd.service '') + (lib.optionalString proftpd-enabled '' systemctl restart proftpd.service ''); - extraDomains = { "ftp.immae.eu" = null; }; + extraDomainNames = [ "ftp.immae.eu" ]; }; networking = { @@ -227,6 +301,7 @@ in SFTPAuthMethods password publickey SFTPOptions IgnoreSFTPSetOwners + AllowChrootSymlinks off ''; in lib.mkIf proftpd-enabled { @@ -243,6 +318,22 @@ in services.cron.systemCronJobs = lib.mkIf proftpd-enabled [ "*/2 * * * * nobody ${./ftp_sync.sh}" ]; + + myServices.monitoring.fromMasterActivatedPlugins = [ "ftp" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "ftp has access to database for authentication"; + host_name = config.hostEnv.fqdn; + use = "external-service"; + check_command = "check_ftp_database"; + + servicegroups = "webstatus-remote-services"; + _webstatus_name = "FTP"; + _webstatus_url = "ftp.immae.eu"; + } + + ]; + }; } diff --git a/modules/private/ftp_sync.sh b/systems/eldiron/ftp_sync.sh similarity index 91% rename from modules/private/ftp_sync.sh rename to systems/eldiron/ftp_sync.sh index 8b0d9c5..aff7178 100755 --- a/modules/private/ftp_sync.sh +++ b/systems/eldiron/ftp_sync.sh @@ -4,7 +4,7 @@ LDAPSEARCH=ldapsearch LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu" LDAP_PASS=$(cat /etc/ssh/ldap_password) -LDAP_HOST="ldap.immae.eu" +LDAP_HOST="ldap://ldap.immae.eu" LDAP_BASE="dc=immae,dc=eu" LDAP_FILTER="(memberOf=cn=users,cn=ftp,ou=services,dc=immae,dc=eu)" @@ -43,5 +43,5 @@ $key" $(echo "$key" | cut -d" " -f2-)" fi fi -done < <(ldapsearch -h "$LDAP_HOST" -ZZ -LLL -D "$LDAP_BIND" -w "$LDAP_PASS" -b "$LDAP_BASE" -x -o ldif-wrap=no "$LDAP_FILTER" uid immaeSshKey) +done < <(ldapsearch -H "$LDAP_HOST" -ZZ -LLL -D "$LDAP_BIND" -w "$LDAP_PASS" -b "$LDAP_BASE" -x -o ldif-wrap=no "$LDAP_FILTER" uid immaeSshKey) handle_keys "$uids" "$keys" diff --git a/systems/eldiron/gemini/default.nix b/systems/eldiron/gemini/default.nix new file mode 100644 index 0000000..600afbc --- /dev/null +++ b/systems/eldiron/gemini/default.nix @@ -0,0 +1,50 @@ +{ lib, config, pkgs, ... }: +let + configFile = pkgs.writeText "config.yaml" '' + listen: ":1965" + hosts: + immae.eu: + cert: /var/lib/acme/immae/full.pem + key: /var/lib/acme/immae/key.pem + paths: + - path: / + root: ${./public} + ''; +in +{ + options.myServices.gemini.enable = lib.mkEnableOption "enable Gemini capsule"; + config = lib.mkIf config.myServices.gemini.enable { + security.acme.certs.immae.postRun = '' + systemctl restart gemini.service + ''; + myServices.chatonsProperties.hostings.gemini = { + file.datetime = "2022-08-27T18:00:00"; + hosting = { + name = "Hébergement Gemini"; + description = "Hébergement de capsules Gemini"; + type = "INSTANCE"; + website = "gemini://immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "twins"; + website = "https://code.rocketnine.space/tslocum/twins"; + license.url = "https://code.rocketnine.space/tslocum/twins/src/branch/master/LICENSE"; + license.name = "MIT License"; + version = pkgs.twins.version; + source.url = "https://code.rocketnine.space/tslocum/twins"; + }; + }; + networking.firewall.allowedTCPPorts = [ 1965 ]; + systemd.services.gemini = { + description = "Gemini capsule server"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + serviceConfig.ExecStart = "${pkgs.twins}/bin/twins -config ${configFile}"; + serviceConfig.Type = "simple"; + }; + }; +} diff --git a/modules/private/gemini/public/index.gmi b/systems/eldiron/gemini/public/index.gmi similarity index 100% rename from modules/private/gemini/public/index.gmi rename to systems/eldiron/gemini/public/index.gmi diff --git a/systems/eldiron/gitolite/default.nix b/systems/eldiron/gitolite/default.nix new file mode 100644 index 0000000..1885234 --- /dev/null +++ b/systems/eldiron/gitolite/default.nix @@ -0,0 +1,127 @@ +{ lib, pkgs, config, ... }: +let + cfg = config.myServices.gitolite; +in { + options.myServices.gitolite = { + enable = lib.mkEnableOption "my gitolite service"; + gitoliteDir = lib.mkOption { + type = lib.types.str; + default = "/var/lib/gitolite"; + }; + }; + + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.git = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.gitolite = { + file.datetime = "2022-08-21T10:01:00"; + service = { + name = "Gitolite"; + description = "Gitolite allows you to setup git hosting on a central server, with fine-grained access control and many more powerful features."; + website = "https://git.immae.eu"; + logo = "https://git.immae.eu/cgit-css/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + guide.user = "https://www.immae.eu/docs/forge-logicielle.html"; + }; + software = { + name = "Gitolite"; + website = "https://gitolite.com/gitolite/"; + license.url = "https://github.com/sitaramc/gitolite/blob/master/COPYING"; + license.name = "GNU General Public License v2.0"; + version = pkgs.gitolite.version; + source.url = "https://github.com/sitaramc/gitolite"; + }; + }; + myServices.ssh.modules.gitolite = { + snippet = builtins.readFile ./ldap_gitolite.sh; + dependencies = [ pkgs.gitolite ]; + vars.ldap_group = "cn=users,cn=gitolite,ou=services,dc=immae,dc=eu"; + vars.shell_path = "${pkgs.gitolite}/bin/gitolite-shell"; + vars.services = let + toLine = login: key: ''command="${pkgs.gitolite}/bin/gitolite-shell ${login}",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ${key}''; + in builtins.concatStringsSep "\n" [ + (toLine "naemon" config.myEnv.monitoring.ssh_public_key) + (toLine "buildbot" config.myEnv.buildbot.ssh_key.public) + ]; + }; + networking.firewall.allowedTCPPorts = [ 9418 ]; + + secrets.keys."gitolite/ldap_password" = { + user = "gitolite"; + group = "gitolite"; + permissions = "0400"; + text = config.myEnv.tools.gitolite.ldap.password; + }; + + services.gitDaemon = { + enable = true; + user = "gitolite"; + group = "gitolite"; + basePath = "${cfg.gitoliteDir}/repositories"; + }; + + system.activationScripts.gitolite = let + deps = [ pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.coreutils ]; + gitolite_ldap_groups = pkgs.runCommand "gitolite_ldap_groups.sh" { + buildInputs = [ pkgs.makeWrapper ]; + } '' + makeWrapper "${./gitolite_ldap_groups.sh}" "$out" \ + --prefix PATH : ${lib.makeBinPath deps} \ + --set LDAP_PASS_PATH ${config.secrets.fullPaths."gitolite/ldap_password"} + ''; + in { + deps = [ "users" ]; + text = '' + if [ -d ${cfg.gitoliteDir} ]; then + ln -sf ${gitolite_ldap_groups} ${cfg.gitoliteDir}/gitolite_ldap_groups.sh + chmod g+rx ${cfg.gitoliteDir} + fi + if [ -f ${cfg.gitoliteDir}/projects.list ]; then + chmod g+r ${cfg.gitoliteDir}/projects.list + fi + ''; + }; + + users.users.wwwrun.extraGroups = [ "gitolite" ]; + users.users.gitolite.extraGroups = [ "keys" ]; + + users.users.gitolite.packages = let + python-packages = python-packages: with python-packages; [ + simplejson + apprise + sleekxmpp + urllib3 + pyyaml + ]; + in + [ + # For some reason it absolutely wants to include "doc" output + ((pkgs.python39.withPackages python-packages) // { doc = ""; }) + pkgs.nettools + pkgs.findutils + ]; + # Installation: https://git.immae.eu/mantisbt/view.php?id=93 + services.gitolite = { + enable = true; + adminPubkey = config.myEnv.sshd.rootKeys.immae_dilion; + }; + myServices.monitoring.fromMasterActivatedPlugins = [ "git" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "gitolite is working"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = "check_git"; + + servicegroups = "webstatus-remote-services"; + _webstatus_name = "Git"; + _webstatus_url = "git.immae.eu"; + } + ]; + }; +} diff --git a/modules/private/gitolite/gitolite_ldap_groups.sh b/systems/eldiron/gitolite/gitolite_ldap_groups.sh similarity index 84% rename from modules/private/gitolite/gitolite_ldap_groups.sh rename to systems/eldiron/gitolite/gitolite_ldap_groups.sh index 3d7117e..ffa2dab 100755 --- a/modules/private/gitolite/gitolite_ldap_groups.sh +++ b/systems/eldiron/gitolite/gitolite_ldap_groups.sh @@ -1,13 +1,13 @@ #!/usr/bin/env bash uid_param="$1" -ldap_host="ldap.immae.eu" +ldap_host="ldap://ldap.immae.eu" ldap_binddn="cn=gitolite,ou=services,dc=immae,dc=eu" ldap_bindpw="$(cat $LDAP_PASS_PATH)" ldap_searchbase="dc=immae,dc=eu" ldap_scope="subtree" -ldap_options="-h ${ldap_host} -ZZ -x -D ${ldap_binddn} -w ${ldap_bindpw} -b ${ldap_searchbase} -s ${ldap_scope}" +ldap_options="-H ${ldap_host} -ZZ -x -D ${ldap_binddn} -w ${ldap_bindpw} -b ${ldap_searchbase} -s ${ldap_scope}" ldap_filter="(&(memberOf=cn=groups,cn=gitolite,ou=services,dc=immae,dc=eu)(|(member=uid=${uid_param},ou=users,dc=immae,dc=eu)(member=uid=${uid_param},ou=group_users,dc=immae,dc=eu)))" ldap_result=$(ldapsearch ${ldap_options} -LLL "${ldap_filter}" cn | grep 'cn:' | cut -d' ' -f2) diff --git a/systems/eldiron/gitolite/ldap_gitolite.sh b/systems/eldiron/gitolite/ldap_gitolite.sh new file mode 100644 index 0000000..75a39bf --- /dev/null +++ b/systems/eldiron/gitolite/ldap_gitolite.sh @@ -0,0 +1,28 @@ +### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh +LDAP_GITOLITE_MEMBER="@gitolite_ldap_group@" +GITOLITE_SHELL="@gitolite_shell_path@" + +if [[ $user == gitolite ]]; then + allowed_logins=$(LDAP_BASE=$USER_LDAP_BASE \ + ldap_search '(memberOf='$LDAP_GITOLITE_MEMBER')' '' \ + | grep ^dn \ + | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \ + | paste -sd,) + + psql_search "SELECT login, key FROM ldap_users_ssh_keys WHERE realm = 'immae' AND 'git' = ANY(usage) AND login IN ($allowed_logins);" | while IFS='|' read user key; do + if [[ $user == "immae" ]] || [[ $user == "denise" ]]; then + # Capitalize first letter (backward compatibility) + user=$(sed -r 's/^([a-z])/\U\1/' <<< "$user") + fi + if [ ! -z "$key" ]; then + if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then + echo -n 'command="'$GITOLITE_SHELL' '$user'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ' + echo $key + fi + fi + done +cat <&1) - ret=$? - - if [ "$ret" != "0" ]; then - echo "$mail" \ - | ${pkgs.procmail}/bin/formail -i "X-Return-Code: $ret" \ - | /run/wrappers/bin/sendmail -i scripts_error+${name}@mail.immae.eu - - messageId=$(echo "$mail" | ${pkgs.procmail}/bin/formail -x "Message-Id:") - repeat=$(echo "$mail" | ${pkgs.procmail}/bin/formail -X "From:" -X "Received:") - - ${pkgs.coreutils}/bin/cat <')" ''; - scripts = lib.attrsets.mapAttrs (n: v: - toScript n (pkgs.callPackage (builtins.fetchGit { url = v.src.url; ref = "master"; rev = v.src.rev; }) { scriptEnv = config.secrets.fullPaths."postfix/scripts/${n}-env"; }) - ) config.myEnv.mail.scripts // { - testmail = pkgs.writeScript "testmail" '' - #! ${pkgs.stdenv.shell} - ${pkgs.coreutils}/bin/touch \ - "/var/lib/naemon/checks/email/$(${pkgs.procmail}/bin/formail -x To: | ${pkgs.coreutils}/bin/tr -d ' <>')" - ''; - }; - in builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v: ''${n}: "|${v}"'') scripts); + in + ''testmail: "|${testmail}"''; mapFiles = let - recipient_maps = let - name = n: i: "relay_${n}_${toString i}"; - pair = n: i: m: lib.attrsets.nameValuePair (name n i) ( - if m.type == "hash" - then pkgs.writeText (name n i) m.content - else null - ); - pairs = n: v: lib.imap1 (i: m: pair n i m) v.recipient_maps; - in lib.attrsets.filterAttrs (k: v: v != null) ( - lib.attrsets.listToAttrs (lib.flatten ( - lib.attrsets.mapAttrsToList pairs config.myEnv.mail.postfix.backup_domains - )) - ); - relay_restrictions = lib.attrsets.filterAttrs (k: v: v != null) ( - lib.attrsets.mapAttrs' (n: v: - lib.attrsets.nameValuePair "recipient_access_${n}" ( - if lib.attrsets.hasAttr "relay_restrictions" v - then pkgs.writeText "recipient_access_${n}" v.relay_restrictions - else null - ) - ) config.myEnv.mail.postfix.backup_domains - ); virtual_map = { virtual = let cfg = config.myEnv.monitoring.email_check.eldiron; address = "${cfg.mail_address}@${cfg.mail_domain}"; + aliases = config.myEnv.mail.postfix.common_aliases; + admins = builtins.concatStringsSep "," config.myEnv.mail.postfix.admins; in pkgs.writeText "postfix-virtual" ( builtins.concatStringsSep "\n" ( - ["${address} testmail@localhost"] ++ - lib.attrsets.mapAttrsToList ( - n: v: lib.optionalString v.external '' - script_${n}@mail.immae.eu ${n}@localhost, scripts@mail.immae.eu - '' - ) config.myEnv.mail.scripts - ) - ); + [ "${address} testmail@localhost" + ] ++ + map (a: "${a} ${admins}") config.myEnv.mail.postfix.other_aliases + ++ lib.lists.flatten ( + map (domain: + map (alias: "${alias}@${domain} ${admins}") aliases + ) receiving_domains + ) + )); }; sasl_access = { host_sender_login = with lib.attrsets; let addresses = zipAttrs (lib.flatten (mapAttrsToList (n: v: (map (e: { "${e}" = "${n}@immae.eu"; }) v.emails)) config.myEnv.servers)); + aliases = config.myEnv.mail.postfix.common_aliases; joined = builtins.concatStringsSep ","; + admins = joined config.myEnv.mail.postfix.admins; in pkgs.writeText "host-sender-login" - (builtins.concatStringsSep "\n" (mapAttrsToList (n: v: "${n} ${joined v}") addresses)); + (builtins.concatStringsSep "\n" ( + mapAttrsToList (n: v: "${n} ${joined v}") addresses + ++ lib.lists.flatten ( + map (domain: + map (alias: "${alias}@${domain} ${admins}") aliases + ) receiving_domains + ) + ++ map (a: "${a} ${admins}") config.myEnv.mail.postfix.other_aliases + )); }; in - recipient_maps // relay_restrictions // virtual_map // sasl_access; + virtual_map // sasl_access; config = { ### postfix module overrides readme_directory = "${pkgs.postfix}/share/postfix/doc"; @@ -286,17 +293,7 @@ "mysql:${config.secrets.fullPaths."postfix/mysql_alias_maps"}" "ldap:${config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"}" ]; - virtual_mailbox_domains = config.myEnv.mail.postfix.additional_mailbox_domains - ++ lib.remove null (lib.flatten (map - (zone: map - (e: if e.receive - then "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}" - else null - ) - (zone.withEmail or []) - ) - config.myEnv.dns.masterZones - )); + virtual_mailbox_domains = receiving_domains; virtual_mailbox_maps = [ "ldap:${config.secrets.fullPaths."postfix/ldap_mailboxes"}" ]; @@ -304,17 +301,9 @@ virtual_transport = "dovecot"; ### Relay domains - relay_domains = lib.flatten (lib.attrsets.mapAttrsToList (n: v: v.domains or []) config.myEnv.mail.postfix.backup_domains); - relay_recipient_maps = lib.flatten (lib.attrsets.mapAttrsToList (n: v: - lib.imap1 (i: m: "${m.type}:/etc/postfix/relay_${n}_${toString i}") v.recipient_maps - ) config.myEnv.mail.postfix.backup_domains); smtpd_relay_restrictions = [ "defer_unauth_destination" - ] ++ lib.flatten (lib.attrsets.mapAttrsToList (n: v: - if lib.attrsets.hasAttr "relay_restrictions" v - then [ "check_recipient_access hash:/etc/postfix/recipient_access_${n}" ] - else [] - ) config.myEnv.mail.postfix.backup_domains); + ]; ### Additional smtpd configuration smtpd_tls_received_header = "yes"; @@ -325,18 +314,23 @@ smtp_tls_loglevel = "1"; ### Force ip bind for smtp - smtp_bind_address = config.hostEnv.ips.main.ip4; + smtp_bind_address = builtins.head config.hostEnv.ips.main.ip4; smtp_bind_address6 = builtins.head config.hostEnv.ips.main.ip6; # Use some relays when authorized senders are not myself - smtp_sasl_mechanism_filter = "plain,login"; # GSSAPI Not correctly supported by postfix + smtp_sasl_mechanism_filter = [ + "plain" + "login" + ]; # GSSAPI Not correctly supported by postfix smtp_sasl_auth_enable = "yes"; - smtp_sasl_password_maps = - "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_creds"}"; + smtp_sasl_password_maps = [ + "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_creds"}" + ]; smtp_sasl_security_options = "noanonymous"; smtp_sender_dependent_authentication = "yes"; - sender_dependent_relayhost_maps = - "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_hosts"}"; + sender_dependent_relayhost_maps = [ + "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_hosts"}" + ]; ### opendkim, opendmarc, openarc milters non_smtpd_milters = [ @@ -350,7 +344,10 @@ smtp_use_tls = true; smtpd_use_tls = true; - smtpd_tls_chain_files = builtins.concatStringsSep "," [ "/var/lib/acme/mail/full.pem" "/var/lib/acme/mail-rsa/full.pem" ]; + smtpd_tls_chain_files = [ + "/var/lib/acme/mail/full.pem" + "/var/lib/acme/mail-rsa/full.pem" + ]; maximal_queue_lifetime = "6w"; bounce_queue_lifetime = "6w"; @@ -358,7 +355,8 @@ enable = true; enableSmtp = true; enableSubmission = true; - submissionOptions = { + submissionOptions = config.services.postfix.submissionOptions'; + submissionOptions' = { # Don’t use "long form", only commas (cf # http://www.postfix.org/master.5.html long form is not handled # well by the submission function) @@ -369,19 +367,31 @@ smtpd_sasl_type = "dovecot"; smtpd_sasl_path = "private/auth"; smtpd_reject_unlisted_recipient = "no"; - smtpd_client_restrictions = "permit_sasl_authenticated,reject"; - smtpd_relay_restrictions = "permit_sasl_authenticated,reject"; + smtpd_client_restrictions = [ + "permit_sasl_authenticated" + "reject" + ]; + smtpd_relay_restrictions = [ + "permit_sasl_authenticated" + "reject" + ]; # Refuse to send e-mails with a From that is not handled - smtpd_sender_restrictions = - "reject_sender_login_mismatch,reject_unlisted_sender,permit_sasl_authenticated,reject"; - smtpd_sender_login_maps = builtins.concatStringsSep "," [ + smtpd_sender_restrictions = [ + "reject_sender_login_mismatch" + "reject_unlisted_sender" + "permit_sasl_authenticated,reject" + ]; + smtpd_sender_login_maps = [ "hash:/etc/postfix/host_sender_login" "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_maps"}" "mysql:${config.secrets.fullPaths."postfix/mysql_sender_login_maps"}" ]; - smtpd_recipient_restrictions = "permit_sasl_authenticated,reject"; + smtpd_recipient_restrictions = [ + "permit_sasl_authenticated" + "reject" + ]; milter_macro_daemon_name = "ORIGINATING"; - smtpd_milters = builtins.concatStringsSep "," [ + smtpd_milters = [ # FIXME: put it back when opensmtpd is upgraded and able to # rewrite the from header #"unix:/run/milter_verify_from/verify_from.sock" @@ -415,13 +425,20 @@ # here. rspamc_dovecot = pkgs.writeScriptBin "rspamc_dovecot" '' #! ${pkgs.stdenv.shell} + set -o pipefail sender="$1" original_recipient="$2" user="$3" ${pkgs.coreutils}/bin/cat - | \ - (${pkgs.rspamd}/bin/rspamc -h ${config.myServices.mail.rspamd.sockets.worker-controller} -c bayes -d "$user" --mime || true) | \ + ${pkgs.rspamd}/bin/rspamc -h ${config.myServices.mail.rspamd.sockets.worker-controller} -c bayes -d "$user" --mime | \ ${pkgs.dovecot}/libexec/dovecot/dovecot-lda -f "$sender" -a "$original_recipient" -d "$user" + if echo ''${PIPESTATUS[@]} | ${pkgs.gnugrep}/bin/grep -qE '^[0 ]+$'; then + exit 0 + else + # src/global/sys_exits.h to retry + exit 75 + fi ''; in [ "flags=ODRhu" "user=vhost:vhost" @@ -434,17 +451,13 @@ postRun = '' systemctl restart postfix.service ''; - extraDomains = { - "smtp.immae.eu" = null; - }; + extraDomainNames = [ "smtp.immae.eu" ]; }; security.acme.certs."mail-rsa" = { postRun = '' systemctl restart postfix.service ''; - extraDomains = { - "smtp.immae.eu" = null; - }; + extraDomainNames = [ "smtp.immae.eu" ]; }; system.activationScripts.testmail = { deps = [ "users" ]; @@ -467,5 +480,18 @@ ''; }; systemd.services.postfix.serviceConfig.Slice = "mail.slice"; + + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "postfix SSL is up to date"; + host_name = config.hostEnv.fqdn; + use = "external-service"; + check_command = "check_smtp"; + + servicegroups = "webstatus-ssl"; + _webstatus_name = "SMTP"; + _webstatus_url = "smtp.immae.eu"; + } + ]; }; } diff --git a/modules/private/mail/rspamd.nix b/systems/eldiron/mail/rspamd.nix similarity index 97% rename from modules/private/mail/rspamd.nix rename to systems/eldiron/mail/rspamd.nix index 05f1300..a300cc5 100644 --- a/modules/private/mail/rspamd.nix +++ b/systems/eldiron/mail/rspamd.nix @@ -26,6 +26,7 @@ [ "*/20 * * * * vhost ${cron_script}/scan_reported_mails" ]; systemd.services.rspamd.serviceConfig.Slice = "mail.slice"; + systemd.services.rspamd.serviceConfig.SupplementaryGroups = [ "vhost" ]; services.rspamd = { enable = true; debug = false; diff --git a/modules/private/mail/scan_reported_mails b/systems/eldiron/mail/scan_reported_mails similarity index 100% rename from modules/private/mail/scan_reported_mails rename to systems/eldiron/mail/scan_reported_mails diff --git a/modules/private/mail/sieve_bin/imapsieve_copy b/systems/eldiron/mail/sieve_bin/imapsieve_copy similarity index 100% rename from modules/private/mail/sieve_bin/imapsieve_copy rename to systems/eldiron/mail/sieve_bin/imapsieve_copy diff --git a/modules/private/mail/sieve_scripts/backup.sieve b/systems/eldiron/mail/sieve_scripts/backup.sieve similarity index 100% rename from modules/private/mail/sieve_scripts/backup.sieve rename to systems/eldiron/mail/sieve_scripts/backup.sieve diff --git a/modules/private/mail/sieve_scripts/report_ham.sieve b/systems/eldiron/mail/sieve_scripts/report_ham.sieve similarity index 100% rename from modules/private/mail/sieve_scripts/report_ham.sieve rename to systems/eldiron/mail/sieve_scripts/report_ham.sieve diff --git a/modules/private/mail/sieve_scripts/report_spam.sieve b/systems/eldiron/mail/sieve_scripts/report_spam.sieve similarity index 100% rename from modules/private/mail/sieve_scripts/report_spam.sieve rename to systems/eldiron/mail/sieve_scripts/report_spam.sieve diff --git a/modules/private/mail/sympa.nix b/systems/eldiron/mail/sympa.nix similarity index 84% rename from modules/private/mail/sympa.nix rename to systems/eldiron/mail/sympa.nix index 0626ac0..8e801dd 100644 --- a/modules/private/mail/sympa.nix +++ b/systems/eldiron/mail/sympa.nix @@ -5,13 +5,43 @@ let in { config = lib.mkIf config.myServices.mail.enable { + myServices.dns.zones."immae.eu".emailPolicies."lists".receive = true; + myServices.dns.zones."immae.eu".subdomains.lists = + with config.myServices.dns.helpers; lib.mkMerge [ + (ips servers.eldiron.ips.main) + (mailCommon "immae.eu") + mailSend + ]; + + myServices.chatonsProperties.services.sympa = { + file.datetime = "2022-08-22T00:50:00"; + service = { + name = "Sympa"; + description = "Mailing lists service"; + website = "https://mail.immae.eu/sympa"; + logo = "https://mail.immae.eu/static-sympa/icons/favicon_sympa.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Sympa"; + website = "https://www.sympa.org/"; + license.url = "https://github.com/sympa-community/sympa/blob/sympa-6.2/COPYING"; + license.name = "GNU General Public License v2.0"; + version = pkgs.sympa.version; + source.url = "https://github.com/sympa-community/sympa/"; + }; + }; myServices.databases.postgresql.authorizedHosts = { backup-2 = [ { username = "sympa"; database = "sympa"; - ip4 = [config.myEnv.servers.backup-2.ips.main.ip4]; - ip6 = config.myEnv.servers.backup-2.ips.main.ip6; + ip4 = config.myEnv.servers.backup-2.ips.main.ip4; + ip6 = map (v: "${v}/128") config.myEnv.servers.backup-2.ips.main.ip6; } ]; }; @@ -105,9 +135,6 @@ in sympa_virtual = pkgs.writeText "virtual.sympa" '' sympa-request@${domain} postmaster@immae.eu sympa-owner@${domain} postmaster@immae.eu - - sympa-request@cip-ca.fr postmaster@immae.eu - sympa-owner@cip-ca.fr postmaster@immae.eu ''; sympa_transport = pkgs.writeText "transport.sympa" '' ${domain} error:User unknown in recipient table @@ -115,11 +142,6 @@ in listmaster@${domain} sympa:listmaster@${domain} bounce@${domain} sympabounce:sympa@${domain} abuse-feedback-report@${domain} sympabounce:sympa@${domain} - - sympa@cip-ca.fr sympa:sympa@cip-ca.fr - listmaster@cip-ca.fr sympa:listmaster@cip-ca.fr - bounce@cip-ca.fr sympabounce:sympa@cip-ca.fr - abuse-feedback-report@cip-ca.fr sympabounce:sympa@cip-ca.fr ''; }; config = { @@ -172,10 +194,6 @@ in webHost = "mail.immae.eu"; webLocation = "/sympa"; }; - "cip-ca.fr" = { - webHost = "mail.cip-ca.fr"; - webLocation = "/sympa"; - }; }; database = { @@ -191,6 +209,7 @@ in log_smtp = "on"; sendmail_aliases = "/var/lib/sympa/sympa_transport"; aliases_program = "${pkgs.postfix}/bin/postmap"; + create_list = "listmaster"; }; settingsFile = { "virtual.sympa".enable = false; diff --git a/systems/eldiron/monitoring.nix b/systems/eldiron/monitoring.nix new file mode 100644 index 0000000..2aa7f8f --- /dev/null +++ b/systems/eldiron/monitoring.nix @@ -0,0 +1,51 @@ +{ config, pkgs, lib, name, monitoring, ... }: +let + hostFQDN = config.hostEnv.fqdn; + emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check; +in +{ + config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "emails" "mdadm" "postfix" "postgresql" "zfs" "notify-secondary"]; + config.myServices.monitoring.pluginsArgs.postgresql.package = config.myServices.databases.postgresql.package; + config.myServices.monitoring.objects = lib.mkMerge [ + (monitoring.lib.objectsCommon { + inherit hostFQDN; + hostName = name; + master = false; + processWarn = "550"; processAlert = "650"; + loadWarn = "1.0"; loadAlert = "1.2"; + interface = builtins.head (builtins.attrNames config.networking.interfaces); + }) + + { + service = [ + { + service_description = "No mdadm array is degraded"; + use = "local-service"; + check_command = ["check_mdadm"]; + __passive_servicegroups = "webstatus-resources"; + } + { + service_description = "Postgresql replication for backup-2 is up to date"; + use = "local-service"; + check_command = ["check_postgresql_replication" "backup-2" "/run/postgresql" "5432"]; + __passive_servicegroups = "webstatus-databases"; + } + { + service_description = "No ZFS pool is degraded"; + use = "local-service"; + check_command = ["check_zfs"]; + __passive_servicegroups = "webstatus-resources"; + } + { + service_description = "mailq is empty"; + use = "local-service"; + check_command = ["check_mailq"]; + __passive_servicegroups = "webstatus-email"; + } + (emailCheck "eldiron" hostFQDN // { + __passive_servicegroups = "webstatus-email"; + }) + ]; + } + ]; +} diff --git a/modules/private/mpd.nix b/systems/eldiron/mpd.nix similarity index 100% rename from modules/private/mpd.nix rename to systems/eldiron/mpd.nix diff --git a/systems/eldiron/pub/default.nix b/systems/eldiron/pub/default.nix new file mode 100644 index 0000000..ca8122a --- /dev/null +++ b/systems/eldiron/pub/default.nix @@ -0,0 +1,100 @@ +{ lib, pkgs, config, ... }: +let + restrict = pkgs.runCommand "restrict" { + file = ./restrict; + buildInputs = [ pkgs.makeWrapper ]; + } '' + mkdir -p $out/bin + cp $file $out/bin/restrict + chmod a+x $out/bin/restrict + patchShebangs $out/bin/restrict + wrapProgram $out/bin/restrict \ + --prefix PATH : ${lib.makeBinPath [ pkgs.bubblewrap pkgs.rrsync ]} \ + --set TMUX_RESTRICT ${./tmux.restrict.conf} + ''; +in +{ + options = { + myServices.pub.enable = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + Whether to enable pub user. + ''; + }; + myServices.pub.usersProfiles = lib.mkOption { + type = lib.types.attrsOf (lib.types.listOf lib.types.package); + default = {}; + description = '' + specific user profile + ''; + }; + myServices.pub.restrictCommand = lib.mkOption { + type = lib.types.path; + readOnly = true; + default = "${restrict}/bin/restrict"; + description = '' + path to the restrict shell + ''; + }; + }; + + config = lib.mkIf config.myServices.pub.enable { + myServices.dns.zones."immae.eu".subdomains.pub = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.vm-like = { + file.datetime = "2022-08-22T01:00:00"; + service = { + name = "Comptes shell"; + description = "Compte shell cloisonné"; + logo = "https://www.openssh.com/favicon.ico"; + website = "pub.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Openssh"; + website = "https://www.openssh.com/"; + license.url = "https://github.com/openssh/openssh-portable/blob/master/LICENCE"; + license.name = "BSD Licence"; + version = pkgs.openssh.version; + source.url = "https://github.com/openssh/openssh-portable"; + }; + }; + myServices.ssh.modules.pub = { + snippet = builtins.readFile ./ldap_pub.sh; + dependencies = [ pkgs.coreutils ]; + vars.ldap_forward_group = "cn=forward,cn=pub,ou=services,dc=immae,dc=eu"; + vars.ldap_pub_group = "cn=restrict,cn=pub,ou=services,dc=immae,dc=eu"; + vars.echo_command = "${pkgs.coreutils}/bin/echo"; + vars.restrict_command = "${restrict}/bin/restrict"; + }; + + system.extraSystemBuilderCmds = let + toPath = u: paths: pkgs.buildEnv { + name = "${u}-profile"; + inherit paths; + }; + in '' + mkdir -p $out/pub + ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (u: m: "ln -s ${toPath u m} $out/pub/${u}") config.myServices.pub.usersProfiles)} + ''; + users.users.pub = let + in { + createHome = true; + description = "Restricted shell user"; + home = "/var/lib/pub"; + uid = config.myEnv.users.pub.uid; + isNormalUser = true; + group = "nogroup"; + useDefaultShell = true; + packages = [ + pkgs.tmux + ]; + }; + }; +} diff --git a/systems/eldiron/pub/ldap_pub.sh b/systems/eldiron/pub/ldap_pub.sh new file mode 100644 index 0000000..9f03ffe --- /dev/null +++ b/systems/eldiron/pub/ldap_pub.sh @@ -0,0 +1,38 @@ +### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh +LDAP_PUB_RESTRICT_MEMBER="@pub_ldap_pub_group@" +LDAP_PUB_FORWARD_MEMBER="@pub_ldap_forward_group@" +ECHO="@pub_echo_command@" + +if [[ $user == pub ]]; then + allowed_logins=$(LDAP_BASE=$USER_LDAP_BASE \ + ldap_search '(memberOf='$LDAP_PUB_RESTRICT_MEMBER')' '' \ + | grep ^dn \ + | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \ + | paste -sd,) + + allowed_forwards=$(LDAP_BASE=$USER_LDAP_BASE \ + ldap_search '(memberOf='$LDAP_PUB_FORWARD_MEMBER')' '' \ + | grep ^dn \ + | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \ + | paste -sd,) + + psql_search "SELECT login, key FROM ldap_users_ssh_keys WHERE realm = 'immae' AND 'pub' = ANY(usage) AND login IN ($allowed_logins);" | while IFS='|' read user key; do + if [ ! -z "$key" ]; then + if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then + echo -n 'command="@pub_restrict_command@ '$user'" ' + echo $key + fi + fi + done + + psql_search "SELECT login, key FROM ldap_users_ssh_keys WHERE realm = 'immae' AND 'forward' = ANY(usage) AND login IN ($allowed_logins,$allowed_forwards);" | while IFS='|' read user key; do + if [ ! -z "$key" ]; then + if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then + echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" ' + echo $key + fi + fi + done + exit 0 +fi + diff --git a/modules/private/pub/restrict b/systems/eldiron/pub/restrict similarity index 82% rename from modules/private/pub/restrict rename to systems/eldiron/pub/restrict index b2f3be3..698e394 100644 --- a/modules/private/pub/restrict +++ b/systems/eldiron/pub/restrict @@ -24,6 +24,13 @@ rsync*) | while read i; do printf '%s--ro-bind\0'$i'\0'$i'\0' '' done + if [ -e "/run/current-system/pub/$user" ]; then + nix-store -q -R "/run/current-system/pub/$user" \ + | while read i; do + printf '%s--ro-bind\0'$i'\0'$i'\0' '' + done + printf '%s--ro-bind\0/run/current-system/pub/'$user'/bin\0/bin-pub-'$user'\0' '' + fi } set -euo pipefail @@ -52,12 +59,12 @@ rsync*) --setenv LOCALE_ARCHIVE "/etc/locale-archive" \ --setenv XDG_RUNTIME_DIR "/run/user/`id -u`" \ --setenv PS1 "$user@pub $ " \ - --setenv PATH "/bin:/bin-pub" \ + --setenv PATH "/bin-pub-$user:/bin:/bin-pub" \ --setenv HOME "/var/lib/pub" \ --file 11 /etc/passwd \ --file 12 /etc/group \ -- $orig) \ - 10< <(nix_store_paths) \ + 10< <(nix_store_paths | sort | uniq) \ 11< <(getent passwd $UID 65534) \ 12< <(getent group $(id -g) 65534) ;; diff --git a/modules/private/pub/tmux.restrict.conf b/systems/eldiron/pub/tmux.restrict.conf similarity index 100% rename from modules/private/pub/tmux.restrict.conf rename to systems/eldiron/pub/tmux.restrict.conf diff --git a/modules/private/tasks/default.nix b/systems/eldiron/tasks/default.nix similarity index 88% rename from modules/private/tasks/default.nix rename to systems/eldiron/tasks/default.nix index 6480255..0772a5f 100644 --- a/modules/private/tasks/default.nix +++ b/systems/eldiron/tasks/default.nix @@ -1,4 +1,4 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, taskwarrior-web, ... }: let cfg = config.myServices.tasks; server_vardir = config.services.taskserver.dataDir; @@ -40,7 +40,6 @@ let chmod a+x $out/bin/taskserver-user-certs patchShebangs $out/bin/taskserver-user-certs ''; - taskwarrior-web = pkgs.webapps.taskwarrior-web; socketsDir = "/run/taskwarrior-web"; varDir = "/var/lib/taskwarrior-web"; taskwebPages = let @@ -86,6 +85,31 @@ in { }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.task = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.taskwarrior = { + file.datetime = "2022-08-22T00:00:00"; + service = { + name = "Taskwarrior"; + description = "Taskwarrior is Free and Open Source Software that manages your TODO list from the command line. Web interface and synchronization server"; + website = "https://task.immae.eu/"; + logo = "https://taskwarrior.org/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Taskwarrior"; + website = "https://taskwarrior.org/"; + license.url = "https://github.com/GothenburgBitFactory/taskwarrior/blob/develop/LICENSE"; + license.name = "MIT License"; + version = taskwarrior-web.version; + source.url = "https://taskwarrior.org/download/"; + }; + }; secrets.keys = { "webapps/tools-taskwarrior-web" = { user = "wwwrun"; @@ -101,19 +125,11 @@ in { SetEnv TASKD_LDAP_FILTER "${env.ldap.filter}" ''; }; - } // (lib.mapAttrs' (name: userConfig: lib.nameValuePair "webapps/tools-taskwarrior/${name}-taskrc" { - inherit user group; - permissions = "0400"; - text = let + } // (lib.mapAttrs' (name: userConfig: lib.nameValuePair "webapps/tools-taskwarrior/${name}-taskrc" ( + let credentials = "${userConfig.org}/${name}/${userConfig.key}"; dateFormat = userConfig.date; - in '' - data.location=${varDir}/${name} - taskd.certificate=${server_vardir}/userkeys/taskwarrior-web.cert.pem - taskd.key=${server_vardir}/userkeys/taskwarrior-web.key.pem - # IdenTrust DST Root CA X3 - # obtained here: https://letsencrypt.org/fr/certificates/ - taskd.ca=${pkgs.writeText "ca.cert" '' + cacert = pkgs.writeText "ca.cert" '' -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh @@ -144,17 +160,28 @@ in { 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= - -----END CERTIFICATE-----''} + -----END CERTIFICATE-----''; + in { + inherit user group; + permissions = "0400"; + text = '' + data.location=${varDir}/${name} + taskd.certificate=${server_vardir}/userkeys/taskwarrior-web.cert.pem + taskd.key=${server_vardir}/userkeys/taskwarrior-web.key.pem + # IdenTrust DST Root CA X3 + # obtained here: https://letsencrypt.org/fr/certificates/ + taskd.ca=${cacert} taskd.server=${fqdn}:${toString config.services.taskserver.listenPort} taskd.credentials=${credentials} dateformat=${dateFormat} ''; - }) env.taskwarrior-web); + keyDependencies = [ cacert ]; + })) env.taskwarrior-web); + security.acme.certs.eldiron.extraDomainNames = [ "task.immae.eu" ]; services.websites.env.tools.watchPaths = [ config.secrets.fullPaths."webapps/tools-taskwarrior-web" ]; services.websites.env.tools.modules = [ "proxy_fcgi" "sed" ]; services.websites.env.tools.vhostConfs.task = { certName = "eldiron"; - addToCerts = true; hosts = [ "task.immae.eu" ]; root = ./www; extraConfig = [ '' @@ -225,17 +252,19 @@ in { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "TaskPHPSESSID"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Task:'"; "php_admin_value[open_basedir]" = "${./www}:/tmp:${server_vardir}:/etc/profiles/per-user/${user}/bin/"; }; phpEnv = { PATH = "/etc/profiles/per-user/${user}/bin"; }; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]); }; }; - security.acme.certs."task" = config.myServices.certificates.certConfig // { - inherit user group; + security.acme.certs."task" = { + inherit group; domain = fqdn; postRun = '' systemctl restart taskserver.service diff --git a/modules/private/tasks/www/index.php b/systems/eldiron/tasks/www/index.php similarity index 100% rename from modules/private/tasks/www/index.php rename to systems/eldiron/tasks/www/index.php index 49ccd24..bde773d 100644 --- a/modules/private/tasks/www/index.php +++ b/systems/eldiron/tasks/www/index.php @@ -142,6 +142,7 @@ configuration files, and add that to your Taskwarrior configuration: taskd.certificate=/path/to/.cert.pem taskd.key=/path/to/.key.pem taskd.server= +taskd.ca=/path/to/ca.cert.pem 1) { echo "# Chose one of them\n"; foreach($entries as $entry) { @@ -151,7 +152,6 @@ taskd.server= } else { ?> taskd.credentials=// -taskd.ca=/path/to/ca.cert.pem For Mirakel, download and import the file:
    diff --git a/modules/private/vpn/default.nix b/systems/eldiron/vpn/default.nix similarity index 61% rename from modules/private/vpn/default.nix rename to systems/eldiron/vpn/default.nix index d4b197d..df56249 100644 --- a/modules/private/vpn/default.nix +++ b/systems/eldiron/vpn/default.nix @@ -8,6 +8,33 @@ in }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.vpn = with config.myServices.dns.helpers; + ips servers.eldiron.ips.main // { + subdomains.gw.AAAA = [ "${config.myEnv.vpn.eldiron.prefix}:0:ffff:1" ]; + # Fake address to designate the subnet + subdomains.sn.AAAA = [ "${config.myEnv.vpn.eldiron.prefix}::" ]; + }; + myServices.chatonsProperties.hostings.vpn = { + file.datetime = "2022-08-27T18:00:00"; + hosting = { + name = "VPN"; + description = "VPN"; + website = "https://vpn.immae.eu"; + logo = "https://tinc-vpn.org/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration.load = "FULL"; + install.type = "PACKAGE"; + }; + software = { + name = "tinc"; + website = "https://tinc-vpn.org/"; + license.url = "https://www.gnu.org/licenses/old-licenses/gpl-2.0.html"; + license.name = "GNU General Public License v2.0"; + version = pkgs.tinc.version; + source.url = "https://tinc-vpn.org/git/browse?p=tinc"; + }; + }; secrets.keys = { "tinc/key.priv" = { user = "root"; @@ -52,7 +79,7 @@ in description = "Tinc Daemon - Immae"; wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; - path = [ pkgs.tinc pkgs.bashInteractive pkgs.iproute pkgs.gnused pkgs.gawk pkgs.git pkgs.glibc ]; + path = [ pkgs.getent pkgs.tinc pkgs.bashInteractive pkgs.iproute pkgs.gnused pkgs.gawk pkgs.git pkgs.glibc ]; serviceConfig = { Slice = "tinc.slice"; Type = "simple"; diff --git a/modules/private/vpn/tinc/host-down b/systems/eldiron/vpn/tinc/host-down similarity index 100% rename from modules/private/vpn/tinc/host-down rename to systems/eldiron/vpn/tinc/host-down diff --git a/modules/private/vpn/tinc/host-up b/systems/eldiron/vpn/tinc/host-up similarity index 100% rename from modules/private/vpn/tinc/host-up rename to systems/eldiron/vpn/tinc/host-up diff --git a/modules/private/vpn/tinc/tinc-down b/systems/eldiron/vpn/tinc/tinc-down similarity index 100% rename from modules/private/vpn/tinc/tinc-down rename to systems/eldiron/vpn/tinc/tinc-down diff --git a/modules/private/vpn/tinc/tinc-up b/systems/eldiron/vpn/tinc/tinc-up similarity index 100% rename from modules/private/vpn/tinc/tinc-up rename to systems/eldiron/vpn/tinc/tinc-up diff --git a/modules/private/vpn/tinc/tinc.conf b/systems/eldiron/vpn/tinc/tinc.conf similarity index 100% rename from modules/private/vpn/tinc/tinc.conf rename to systems/eldiron/vpn/tinc/tinc.conf diff --git a/modules/private/websites/_www/googleb6d69446ff4ca3e5.html b/systems/eldiron/websites/_www/googleb6d69446ff4ca3e5.html similarity index 100% rename from modules/private/websites/_www/googleb6d69446ff4ca3e5.html rename to systems/eldiron/websites/_www/googleb6d69446ff4ca3e5.html diff --git a/modules/private/websites/_www/index.htm b/systems/eldiron/websites/_www/index.htm similarity index 100% rename from modules/private/websites/_www/index.htm rename to systems/eldiron/websites/_www/index.htm diff --git a/modules/private/websites/_www/maintenance_immae.html b/systems/eldiron/websites/_www/maintenance_immae.html similarity index 100% rename from modules/private/websites/_www/maintenance_immae.html rename to systems/eldiron/websites/_www/maintenance_immae.html diff --git a/modules/private/websites/_www/nossl.html b/systems/eldiron/websites/_www/nossl.html similarity index 100% rename from modules/private/websites/_www/nossl.html rename to systems/eldiron/websites/_www/nossl.html diff --git a/systems/eldiron/websites/assets/default.nix b/systems/eldiron/websites/assets/default.nix new file mode 100644 index 0000000..02a4952 --- /dev/null +++ b/systems/eldiron/websites/assets/default.nix @@ -0,0 +1,98 @@ +{ lib, pkgs, config, ... }: +let + cfg = config.myServices.websites.tools.assets; + fetchFont = v: pkgs.runCommand "fetch-font" { + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = v.sha256; + } '' + mkdir -p $out + ${pkgs.curl}/bin/curl -k --output $out/font.css -H "User-Agent: Firefox/100.0" "${v.url}" + cat $out/font.css | grep -o "https://[^ )]*" | while read url; do + filename=$(echo "$url" | sed -e "s@.*/@@g") + ${pkgs.curl}/bin/curl -k --output "$out/$filename" "$url" + sed -i -e "s@$url@./$filename@" "$out/font.css" + done + ''; + fetchTgz = v: pkgs.runCommand "fetch-tgz" { + outputHashAlgo = "sha256"; + outputHashMode = "recursive"; + outputHash = v.sha256; + } '' + mkdir -p $out + cd $out + ${pkgs.curl}/bin/curl -L -k "${v.url}" | tar -xz --strip-components=${builtins.toString v.tgzRemoveComponents} + ''; + fetchAsset = v: + if v.assetType == "googleFont" + then fetchFont v + else if v.assetType == "tgz" + then fetchTgz v + else pkgs.fetchurl { url = v.url; sha256 = v.sha256; }; + assets_urls = lib.mapAttrs (k: fetchAsset) config.myEnv.tools.assets; + assets = pkgs.runCommand "assets" {} ('' + mkdir -p $out + cp -a ${./static}/* $out/ + '' + builtins.concatStringsSep "\n" + (lib.mapAttrsToList (k: v: '' + if [ -d "${v}" ]; then + mkdir -p "$out/$(dirname "${k}")" + cp -a "${v}" "$out/${k}" + chmod -R u+rwX "$out/${k}" + else + install -D -m644 -T "${v}" "$out/${k}" + fi + '') assets_urls)); +in +{ + options.myServices.websites.tools.assets = { + enable = lib.mkEnableOption "Enable assets website"; + }; + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.assets = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + services.websites.env.production.bindMounts."/run/imgproxy" = {}; + security.acme.certs.eldiron.extraDomainNames = [ "assets.immae.eu" ]; + services.websites.env.tools.vhostConfs.assets = { + certName = "eldiron"; + hosts = [ "assets.immae.eu" ]; + root = assets; + extraConfig = [ + '' + Use Apaxy "${assets}" "title" + + Options Indexes FollowSymlinks + AllowOverride None + Require all granted + Header always set Last-Modified "Tue, 01 Jan 2020 00:00:00 GMT" + Header always set Cache-Control "public, max-age=31536000, immutable" + Header always set Access-Control-Allow-Origin "*" + Header always set Access-Control-Expose-Headers "*" + + + MergeSlashes OFF + + ProxyPass unix:///run/imgproxy/imgproxy.sock|http://assets.immae.eu + ProxyPassReverse unix:///run/imgproxy/imgproxy.sock|http://assets.immae.eu + + '' + ]; + }; + systemd.services.imgproxy = { + description = "IMG proxy"; + wantedBy = [ "multi-user.target" ]; + + environment = { + IMGPROXY_NETWORK = "unix"; + IMGPROXY_BIND = "%t/imgproxy/imgproxy.sock"; + }; + serviceConfig = { + User = "wwwrun"; + Group = "wwwrun"; + RuntimeDirectory = "imgproxy"; + ExecStart = "${pkgs.imgproxy}/bin/imgproxy"; + }; + }; + }; +} diff --git a/modules/private/websites/tools/assets/static/favicon.png b/systems/eldiron/websites/assets/static/favicon.png similarity index 100% rename from modules/private/websites/tools/assets/static/favicon.png rename to systems/eldiron/websites/assets/static/favicon.png diff --git a/modules/private/websites/tools/assets/static/logger.png b/systems/eldiron/websites/assets/static/logger.png similarity index 100% rename from modules/private/websites/tools/assets/static/logger.png rename to systems/eldiron/websites/assets/static/logger.png diff --git a/modules/private/websites/tools/assets/static/logger.txt b/systems/eldiron/websites/assets/static/logger.txt similarity index 100% rename from modules/private/websites/tools/assets/static/logger.txt rename to systems/eldiron/websites/assets/static/logger.txt diff --git a/modules/private/websites/tools/assets/static/logo.jpg b/systems/eldiron/websites/assets/static/logo.jpg similarity index 100% rename from modules/private/websites/tools/assets/static/logo.jpg rename to systems/eldiron/websites/assets/static/logo.jpg diff --git a/modules/private/websites/tools/assets/static/logo.txt b/systems/eldiron/websites/assets/static/logo.txt similarity index 100% rename from modules/private/websites/tools/assets/static/logo.txt rename to systems/eldiron/websites/assets/static/logo.txt diff --git a/modules/private/websites/tools/assets/static/logo_big.jpg b/systems/eldiron/websites/assets/static/logo_big.jpg similarity index 100% rename from modules/private/websites/tools/assets/static/logo_big.jpg rename to systems/eldiron/websites/assets/static/logo_big.jpg diff --git a/modules/private/websites/tools/assets/static/logo_big.txt b/systems/eldiron/websites/assets/static/logo_big.txt similarity index 100% rename from modules/private/websites/tools/assets/static/logo_big.txt rename to systems/eldiron/websites/assets/static/logo_big.txt diff --git a/modules/private/websites/tools/assets/static/logo_center.jpg b/systems/eldiron/websites/assets/static/logo_center.jpg similarity index 100% rename from modules/private/websites/tools/assets/static/logo_center.jpg rename to systems/eldiron/websites/assets/static/logo_center.jpg diff --git a/modules/private/websites/tools/assets/static/logo_center.txt b/systems/eldiron/websites/assets/static/logo_center.txt similarity index 100% rename from modules/private/websites/tools/assets/static/logo_center.txt rename to systems/eldiron/websites/assets/static/logo_center.txt diff --git a/modules/private/websites/tools/assets/static/monitoring.png b/systems/eldiron/websites/assets/static/monitoring.png similarity index 100% rename from modules/private/websites/tools/assets/static/monitoring.png rename to systems/eldiron/websites/assets/static/monitoring.png diff --git a/modules/private/websites/tools/assets/static/monitoring.txt b/systems/eldiron/websites/assets/static/monitoring.txt similarity index 100% rename from modules/private/websites/tools/assets/static/monitoring.txt rename to systems/eldiron/websites/assets/static/monitoring.txt diff --git a/modules/private/websites/tools/assets/static/photos/ct.jpg b/systems/eldiron/websites/assets/static/photos/ct.jpg similarity index 100% rename from modules/private/websites/tools/assets/static/photos/ct.jpg rename to systems/eldiron/websites/assets/static/photos/ct.jpg diff --git a/modules/private/websites/tools/assets/static/photos/fretlink.jpg b/systems/eldiron/websites/assets/static/photos/fretlink.jpg similarity index 100% rename from modules/private/websites/tools/assets/static/photos/fretlink.jpg rename to systems/eldiron/websites/assets/static/photos/fretlink.jpg diff --git a/modules/private/websites/tools/assets/static/photos/raton.jpg b/systems/eldiron/websites/assets/static/photos/raton.jpg similarity index 100% rename from modules/private/websites/tools/assets/static/photos/raton.jpg rename to systems/eldiron/websites/assets/static/photos/raton.jpg diff --git a/systems/eldiron/websites/cloud/add-htaccess.php b/systems/eldiron/websites/cloud/add-htaccess.php new file mode 100644 index 0000000..e11d943 --- /dev/null +++ b/systems/eldiron/websites/cloud/add-htaccess.php @@ -0,0 +1,70 @@ +a = $a; + } + public function getValue($val, $default) { + if(isset($this->a[$val])) { + return $this->a[$val]; + } else { + return $default; + } + } + } +} + +namespace { + class NServer { + private $argv; + public function __construct($argv) { + $this->argv = $argv; + } + public function getSystemConfig() { + return new OC\SystemConfig(Array( + 'htaccess.RewriteBase' => $this->argv[1], + )); + } + + public function get($c) { + return new $c(); + } + public function getL10N() { + return new \OCP\IL10N(); + } + public function query($c) { + return new $c(); + } + public function getSecureRandom() { + return new \OCP\Security\ISecureRandom(); + } + } + + class OC { + public static Bool $CLI = false; + public static $SERVERROOT = '.'; + public static $WEBROOT; + public static \NServer $server; + } + + \OC::$server = new NServer($argv); + \OC::$WEBROOT = $argv[1]; + + require "./lib/private/Setup.php"; + $result = \OC\Setup::updateHtaccess(); + if ($result) { + echo "done"; + }; +} diff --git a/systems/eldiron/websites/cloud/default.nix b/systems/eldiron/websites/cloud/default.nix new file mode 100644 index 0000000..e1df883 --- /dev/null +++ b/systems/eldiron/websites/cloud/default.nix @@ -0,0 +1,151 @@ +{ lib, pkgs, config, ... }: +let + ncfg = config.myServices.tools.cloud.farm.instances.immae; + env = config.myEnv.tools.nextcloud; + cfg = config.myServices.websites.tools.cloud; +in { + options.myServices.websites.tools.cloud = { + enable = lib.mkEnableOption "enable cloud website"; + }; + + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.cloud = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.hostings.nextcloud = { + file.datetime = "2022-08-21T19:50:00"; + hosting = { + name = "Nextcloud"; + description = "The self-hosted productivity platform that keeps you in control"; + website = "https://cloud.immae.eu/"; + logo = "https://cloud.immae.eu/core/img/favicon.ico"; + type = "INSTANCE"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; + myServices.chatonsProperties.services.nextcloud = { + file.datetime = "2022-08-21T19:50:00"; + service = { + name = "Nextcloud"; + description = "The self-hosted productivity platform that keeps you in control"; + website = "https://cloud.immae.eu/"; + logo = "https://cloud.immae.eu/core/img/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + guide.user = "https://www.immae.eu/docs/nextcloud.html"; + }; + software = { + name = "Nextcloud"; + website = "https://nextcloud.com/"; + license.url = "https://github.com/nextcloud/server/blob/master/COPYING"; + license.name = "GNU Affero General Public License v3.0"; + version = ncfg.rootDir.version; + source.url = "https://github.com/nextcloud/server"; + modules = map (a: a.appName) ncfg.rootDir.apps; + }; + }; + + myServices.tools.cloud.farm.instances.immae = { + nextcloud = pkgs.webapps-nextcloud_27.override ({ + # Allow /index.php redirects + postInstall = '' + cd $out + ${pkgs.php81}/bin/php ${./add-htaccess.php} / + ''; + }); + apps = a: [ + a.side_menu a.audioplayer a.bookmarks a.calendar a.carnet a.contacts + a.cookbook a.deck a.extract a.files_markdown a.files_mindmap + a.gpxpod a.keeweb a.maps a.metadata a.music + a.notes a.passman a.polls a.spreed a.tasks + ]; + varDir = "/var/lib/nextcloud"; + secretsPath = "webapps/tools-nextcloud"; + phpPackage = pkgs.php81; + # Be careful when editing that: config from here takes + # precedence over the regular one, but if a key got removed, it my + # still exist in the default config file + config = let + env = config.myEnv.tools.nextcloud; + in { + "dbtype" = "pgsql"; + "dbname" = env.postgresql.database; + "dbhost" = env.postgresql.socket; + "dbport" = ""; + "dbtableprefix" = "oc_"; + "dbuser" = env.postgresql.user; + "dbpassword" = env.postgresql.password; + + "instanceid" = env.instance_id; + "passwordsalt" = env.password_salt; + "secret" = env.secret; + + "trusted_domains" = [ "cloud.immae.eu" ]; + "overwrite.cli.url" = "https://cloud.immae.eu"; + + "lost_password_link" = "disabled"; + + "remember_login_cookie_lifetime" = 60*60*24*30; + "session_keepalive" = true; + "session_lifefime" = 60*60*24*30; + + "maxZipInputSize" = 0; + "allowZipDownload" = true; + + # set by Carnet + "has_rebuilt_cache" = true; + + "memcache.distributed" = "\\OC\\Memcache\\Redis"; + "memcache.locking" = "\\OC\\Memcache\\Redis"; + "filelocking.enabled" = true; + "redis" = { + "host" = env.redis.socket; + "port" = 0; + "dbindex" = env.redis.db; + }; + + "ldapIgnoreNamingRules" = false; + "ldapProviderFactory" = "\\OCA\\User_LDAP\\LDAPProviderFactory"; + + "mail_smtpmode" = "sendmail"; + "mail_smtphost" = "127.0.0.1"; + "mail_smtpname" = ""; + "mail_smtppassword" = ""; + "mail_from_address" = "nextcloud"; + "mail_smtpauth" = false; + "mail_domain" = "tools.immae.eu"; + }; + }; + services.websites.env.tools.modules = [ "proxy_fcgi" ]; + + security.acme.certs.eldiron.extraDomainNames = [ "cloud.immae.eu" ]; + services.websites.env.tools.vhostConfs.cloud = { + certName = "eldiron"; + hosts = ["cloud.immae.eu" ]; + root = ncfg.rootDir; + extraConfig = [ + ncfg.vhost + ]; + }; + + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "owncloud website is running on cloud.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "cloud.immae.eu" "/" "a safe home for all your data"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Nextcloud"; + _webstatus_url = "https://cloud.immae.eu"; + } + ]; + }; +} diff --git a/systems/eldiron/websites/cloud/farm.nix b/systems/eldiron/websites/cloud/farm.nix new file mode 100644 index 0000000..df24cba --- /dev/null +++ b/systems/eldiron/websites/cloud/farm.nix @@ -0,0 +1,221 @@ +{ lib, pkgs, config, ... }: +let + scfg = config.secrets.fullPaths; + cfg = config.myServices.tools.cloud.farm; + apacheUser = config.services.websites.env.production.user; + apacheGroup = config.services.websites.env.production.group; + additionalConfs = icfg: lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) icfg.rootDir.otherConfig; + overrideConfig = icfg: pkgs.writeText "override.config.php" '' + + AcceptPathInfo On + DirectoryIndex index.php + Options FollowSymlinks + Require all granted + AllowOverride all + + + Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload" + + + CGIPassAuth on + SetHandler "proxy:unix:${config.services.phpfpm.pools.${icfg.phpPoolName}.socket}|fcgi://localhost" + + + + ''; +in +{ + options.myServices.tools.cloud.farm = { + instances = lib.mkOption { + description = "Instances names for the nextcloud Farm"; + default = {}; + type = lib.types.attrsOf (lib.types.submodule ({ name, config, ... }: { + options = { + nextcloud = lib.mkOption { + description = "Nextcloud version to use"; + default = pkgs.webapps-nextcloud_27; + type = lib.types.package; + }; + apps = lib.mkOption { + description = "Applications to use"; + default = a: []; + #type = functionTo (listOf packages) + type = lib.types.unspecified; + }; + config = lib.mkOption { + description = "Config keys"; + default = {}; + type = lib.types.attrsOf lib.types.unspecified; + }; + secretsPath = lib.mkOption { + description = "Path in secrets to nextcloud config file"; + default = "websites/${name}/nextcloud"; + type = lib.types.str; + }; + configOverride = lib.mkOption { + description = "Path to config override"; + readOnly = true; + default = scfg."${config.secretsPath}"; + type = lib.types.path; + }; + phpPackage = lib.mkOption { + description = "PHP package to use"; + default = pkgs.php81; + type = lib.types.package; + apply = v: (v.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache all.imagick all.sysvsem ])).override { extraConfig = '' + apc.enable_cli = 1 + apc.enabled = 1 + ''; + }; + }; + rootDir = lib.mkOption { + description = "Instance root dirs"; + readOnly = true; + type = lib.types.package; + default = config.nextcloud.withApps config.apps; + }; + phpPoolName = lib.mkOption { + description = "Php pool name for the instance"; + readOnly = true; + type = lib.types.str; + default = "nextcloud_farm_" + name; + }; + phpBaseDir = lib.mkOption { + description = "Php basedir for the instance"; + readOnly = true; + type = lib.types.str; + default = builtins.concatStringsSep ":" ( + [ config.rootDir config.varDir ] + ++ config.rootDir.apps + ++ [ config.configOverride (overrideConfig config) ] + ++ (builtins.attrValues (additionalConfs config)) + ); + }; + varDir = lib.mkOption { + description = "Instance var dir"; + type = lib.types.path; + default = "/var/lib/nextcloud_farm/${name}"; + }; + vhost = lib.mkOption { + description = "Instance vhost config"; + readOnly = true; + type = lib.types.str; + default = toVhost config; + }; + }; + })); + }; + }; + + config = lib.mkIf (builtins.length (builtins.attrNames cfg.instances) > 0) { + systemd.services = lib.mapAttrs' (k: v: lib.nameValuePair ("phpfpm-" + v.phpPoolName) { + after = lib.mkAfter [ "postgresql.service" ]; + wants = [ "postgresql.service" ]; + serviceConfig.ExecStartPre = + "+${pkgs.writeScript "phpfpm-nextcloud-${k}-pre-start" '' + #!${pkgs.stdenv.shell} + + install -m 0755 -o wwwrun -g wwwrun -d ${v.varDir} -d ${v.varDir}/config + ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: f: + "ln -sf ${f} ${v.varDir}/config/${n}.json" + ) (additionalConfs v))} + ln -sf ${overrideConfig v} ${v.varDir}/config/override.config.php + ''}"; + }) cfg.instances; + services.phpfpm.pools = lib.mapAttrs' (k: v: lib.nameValuePair v.phpPoolName { + user = apacheUser; + group = apacheGroup; + settings = { + "listen.owner" = apacheUser; + "listen.group" = apacheGroup; + "pm" = "dynamic"; + "pm.max_children" = "60"; + "pm.start_servers" = "3"; + "pm.min_spare_servers" = "3"; + "pm.max_spare_servers" = "3"; + "pm.process_idle_timeout" = "60"; + + "php_admin_value[output_buffering]" = "0"; + "php_admin_value[max_execution_time]" = "1800"; + "php_admin_value[zend_extension]" = "opcache"; + "php_value[apc.enable_cli]" = "1"; + "php_value[apc.enabled]" = "1"; + #already enabled by default? + #"php_value[opcache.enable]" = "1"; + "php_value[opcache.enable_cli]" = "1"; + "php_value[opcache.interned_strings_buffer]" = "32"; + "php_value[opcache.max_accelerated_files]" = "10000"; + "php_value[opcache.memory_consumption]" = "128"; + "php_value[opcache.save_comments]" = "1"; + "php_value[opcache.revalidate_freq]" = "1"; + "php_admin_value[memory_limit]" = "512M"; + + "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${v.phpBaseDir}:/proc/cpuinfo:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:NextcloudFarm:${k}:'"; + }; + phpPackage = v.phpPackage; + }) cfg.instances; + environment.systemPackages = let + toOcc = name: icfg: pkgs.writeScriptBin "nextcloud-occ-${name}" '' + #! ${pkgs.stdenv.shell} + cd ${icfg.rootDir} + NEXTCLOUD_CONFIG_DIR="${icfg.varDir}/config" \ + exec \ + sudo -E -u wwwrun ${icfg.phpPackage}/bin/php \ + -d memory_limit=512M \ + -c ${icfg.phpPackage}/etc/php.ini \ + occ $* + ''; + in lib.mapAttrsToList toOcc cfg.instances; + services.cron = { + enable = true; + systemCronJobs = let + toScript = name: icfg: pkgs.writeScriptBin "nextcloud-cron" '' + #! ${pkgs.stdenv.shell} + export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive + export PATH=/run/wrappers/bin:$PATH + export NEXTCLOUD_CONFIG_DIR="${icfg.varDir}/config" + ${icfg.phpPackage}/bin/php -c ${icfg.phpPackage}/etc/php.ini -d memory_limit=512M -f ${icfg.rootDir}/cron.php + ''; + toLine = name: icfg: '' + */5 * * * * wwwrun ${toScript name icfg}/bin/nextcloud-cron + ''; + in lib.mapAttrsToList toLine cfg.instances; + }; + + secrets.keys = lib.mapAttrs' (name: v: lib.nameValuePair "${v.secretsPath}" { + user = "wwwrun"; + group = "wwwrun"; + permissions = "0600"; + # Be careful when editing that: config from this file takes + # precedence over the regular one, but if a key got removed, it my + # still exist in the default config file + text = builtins.toJSON ( { + "datadirectory" = if name == "immae" then v.varDir else "${v.varDir}/data"; + + "appstoreenabled" = false; + "integrity.check.disabled" = true; + "updater.release.channel" = "stable"; + "upgrade.disable-web" = true; + + "memcache.local" = "\\OC\\Memcache\\APCu"; + + "htaccess.RewriteBase" = "/"; + + "loglevel" = 2; + "logtimezone" = "Europe/Paris"; + + "default_phone_region" = "FR"; + "skeletondirectory" = ""; + "theme" = ""; + } // v.config); + }) cfg.instances; + }; +} diff --git a/modules/private/websites/tools/commento/default.nix b/systems/eldiron/websites/commento/default.nix similarity index 63% rename from modules/private/websites/tools/commento/default.nix rename to systems/eldiron/websites/commento/default.nix index c36255b..c5131b8 100644 --- a/modules/private/websites/tools/commento/default.nix +++ b/systems/eldiron/websites/commento/default.nix @@ -12,6 +12,31 @@ in enable = lib.mkEnableOption "Enable commento website"; }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.commento = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.commento = { + file.datetime = "2022-08-21T01:11:00"; + service = { + name = "Commento"; + description = "Commento is a fast, privacy-focused commenting platform"; + website = "https://commento.immae.eu"; + logo = "https://commento.immae.eu/images/logo.svg"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Commento"; + website = "https://www.commento.io/"; + license.url = "https://gitlab.com/commento/commento/-/blob/master/LICENSE"; + license.name = "MIT License"; + version = pkgs.commento.version; + source.url = "https://gitlab.com/commento/commento"; + }; + }; secrets.keys = { "commento/env" = { permissions = "0400"; @@ -31,9 +56,9 @@ in }; }; + security.acme.certs.eldiron.extraDomainNames = [ "commento.immae.eu" ]; services.websites.env.tools.vhostConfs.commento = { certName = "eldiron"; - addToCerts = true; hosts = [ "commento.immae.eu" ]; root = null; extraConfig = [ diff --git a/systems/eldiron/websites/cryptpad/default.nix b/systems/eldiron/websites/cryptpad/default.nix new file mode 100644 index 0000000..4635548 --- /dev/null +++ b/systems/eldiron/websites/cryptpad/default.nix @@ -0,0 +1,89 @@ +{ config, pkgs, lib, ... }: +let + cfg = config.myServices.websites.tools.cryptpad; + envCfg = config.myEnv.tools.cryptpad; + domain = "cryptpad.immae.eu"; + port = envCfg.port; + configFile = pkgs.writeText "config.js" '' + // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js + module.exports = { + httpUnsafeOrigin: 'https://${domain}', + httpPort: ${toString port}, + adminEmail: '${envCfg.email}', + filePath: './datastore/', + archivePath: './data/archive', + pinPath: './data/pins', + taskPath: './data/tasks', + blockPath: './block', + blobPath: './blob', + blobStagingPath: './data/blobstage', + decreePath: './data/decrees', + logPath: './data/logs', + logToStdout: false, + logLevel: 'info', + logFeedback: false, + verbose: false, + inactiveTime: false, + maxUploadSize: 100 * 1024 * 1024, + adminKeys: ${builtins.toJSON envCfg.admins}, + }; + ''; +in +{ + options.myServices.websites.tools.cryptpad.enable = lib.mkEnableOption "Enable Cryptpad"; + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.cryptpad = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.hostings.cryptpad = { + file.datetime = "2022-08-21T01:20:00"; + hosting = { + name = "Cryptpad"; + description = "Collaboration suite, encrypted and open-source"; + website = "https://cryptpad.immae.eu/"; + logo = "https://cryptpad.immae.eu/customize/favicon/main-favicon.png"; + type = "INSTANCE"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; + myServices.chatonsProperties.services.cryptpad = { + file.datetime = "2022-08-21T01:20:00"; + service = { + name = "Cryptpad"; + description = "Collaboration suite, encrypted and open-source"; + website = "https://cryptpad.immae.eu/"; + logo = "https://cryptpad.immae.eu/customize/favicon/main-favicon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE" "FREE" "MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Cryptpad"; + website = "https://cryptpad.org/"; + license.url = "https://github.com/xwiki-labs/cryptpad/blob/main/LICENSE"; + license.name = "GNU Affero General Public License v3.0"; + version = pkgs.cryptpad.version; + source.url = "https://github.com/xwiki-labs/cryptpad"; + }; + }; + myServices.tools.cryptpad.farm.hosts.immaeEu = { + inherit domain port; + config = configFile; + }; + services.websites.env.tools.modules = [ "proxy_wstunnel" ]; + security.acme.certs.eldiron.extraDomainNames = [ domain ]; + services.websites.env.tools.vhostConfs.cryptpad = { + certName = "eldiron"; + hosts = [domain]; + root = config.myServices.tools.cryptpad.farm.vhostRoots.immaeEu; + extraConfig = [ + config.myServices.tools.cryptpad.farm.vhosts.immaeEu + ]; + }; + }; +} diff --git a/modules/private/websites/tools/cryptpad/farm.nix b/systems/eldiron/websites/cryptpad/farm.nix similarity index 96% rename from modules/private/websites/tools/cryptpad/farm.nix rename to systems/eldiron/websites/cryptpad/farm.nix index b35f348..58393ab 100644 --- a/modules/private/websites/tools/cryptpad/farm.nix +++ b/systems/eldiron/websites/cryptpad/farm.nix @@ -161,6 +161,12 @@ in type = lib.types.attrsOf lib.types.path; default = lib.genAttrs (builtins.attrNames cfg.hosts) toVhostRoot; }; + vhostVarDirs = lib.mkOption { + description = "Instance vhosts var dirs"; + readOnly = true; + type = lib.types.attrsOf lib.types.path; + default = lib.genAttrs (builtins.attrNames cfg.hosts) (n: "/var/lib/cryptpad/${n}"); + }; }; config = { users.users = lib.optionalAttrs (cfg.hosts != {}) { diff --git a/modules/private/websites/tools/dav/davical.nix b/systems/eldiron/websites/dav/davical.nix similarity index 93% rename from modules/private/websites/tools/dav/davical.nix rename to systems/eldiron/websites/dav/davical.nix index bc5ecf6..b418cb8 100644 --- a/modules/private/websites/tools/dav/davical.nix +++ b/systems/eldiron/websites/dav/davical.nix @@ -1,11 +1,5 @@ { stdenv, fetchurl, gettext, writeText, env, awl, davical, config }: rec { - activationScript = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/davical - ''; - }; keys."webapps/dav-davical" = { user = apache.user; group = apache.group; @@ -120,9 +114,10 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "DavicalPHPSESSID"; - "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/davical"; + "php_admin_value[open_basedir]" = "${basedir}:/tmp"; "php_admin_value[include_path]" = "${awl}/inc:${webapp}/inc"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/davical"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Davical:'"; "php_flag[magic_quotes_gpc]" = "Off"; "php_flag[register_globals]" = "Off"; "php_admin_value[error_reporting]" = "E_ALL & ~E_NOTICE"; diff --git a/systems/eldiron/websites/dav/default.nix b/systems/eldiron/websites/dav/default.nix new file mode 100644 index 0000000..109715d --- /dev/null +++ b/systems/eldiron/websites/dav/default.nix @@ -0,0 +1,140 @@ +{ lib, pkgs, config, ... }: +let + infcloud = rec { + root = pkgs.webapps-infcloud; + vhostConf = '' + Alias /carddavmate ${root} + Alias /caldavzap ${root} + Alias /infcloud ${root} + + AllowOverride All + Options FollowSymlinks + Require all granted + DirectoryIndex index.html + + ''; + }; + davical = pkgs.callPackage ./davical.nix { + env = config.myEnv.tools.davical; + davical = pkgs.webapps-davical; + awl = pkgs.webapps-awl; + inherit config; + }; + + cfg = config.myServices.websites.tools.dav; +in { + options.myServices.websites.tools.dav = { + enable = lib.mkEnableOption "enable dav website"; + }; + + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.dav = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services = { + davical = { + file.datetime = "2022-08-21T01:33:00"; + service = { + name = "Davical"; + description = "DAViCal is a server for calendar sharing"; + website = "https://dav.immae.eu"; + logo = "https://www.davical.org/images/logo.gif"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Davical"; + website = "https://www.davical.org/"; + license.url = "https://gitlab.com/davical-project/davical/-/blob/master/COPYING"; + license.name = "GNU General Public License Version 2"; + version = pkgs.webapps-davical.version; + source.url = "https://gitlab.com/davical-project/davical/"; + modules = "infcloud"; + }; + }; + #calendar = { + # file.datetime = "2022-08-22T00:00:00"; + # service = { + # name = "Calendar"; + # description = "Opensource CalDAV web client"; + # website = "https://dav.immae.eu/caldavzap/"; + # logo = "https://dav.immae.eu/caldavzap/images/infcloud_logo.svg"; + # status.level = "OK"; + # status.description = "OK"; + # registration."" = ["MEMBER" "CLIENT"]; + # registration.load = "OPEN"; + # install.type = "PACKAGE"; + # }; + # software = { + # name = "InfCloud"; + # website = "https://inf-it.com/open-source/clients/infcloud/"; + # license.url = "https://www.gnu.org/licenses/agpl-3.0.en.html"; + # license.name = "GNU Affero General Public License (version 3.0)"; + # version = pkgs.webapps-infcloud.version; + # source.url = "https://inf-it.com/open-source/clients/infcloud/"; + # }; + #}; + #contacts = { + # file.datetime = "2022-08-22T00:00:00"; + # service = { + # name = "Contacts"; + # description = "Opensource Carddav web client"; + # website = "https://dav.immae.eu/carddavmate/"; + # logo = "https://dav.immae.eu/caldavzap/images/infcloud_logo.svg"; + # status.level = "OK"; + # status.description = "OK"; + # registration."" = ["MEMBER" "CLIENT"]; + # registration.load = "OPEN"; + # install.type = "PACKAGE"; + # }; + # software = { + # name = "InfCloud"; + # website = "https://inf-it.com/open-source/clients/infcloud/"; + # license.url = "https://www.gnu.org/licenses/agpl-3.0.en.html"; + # license.name = "GNU Affero General Public License (version 3.0)"; + # version = pkgs.webapps-infcloud.version; + # source.url = "https://inf-it.com/open-source/clients/infcloud/"; + # }; + #}; + }; + secrets.keys = davical.keys; + services.websites.env.tools.modules = davical.apache.modules; + + security.acme.certs.eldiron.extraDomainNames = [ "dav.immae.eu" ]; + services.websites.env.tools.vhostConfs.dav = { + certName = "eldiron"; + hosts = ["dav.immae.eu" ]; + root = ./www; + extraConfig = [ + infcloud.vhostConf + (davical.apache.vhostConf config.services.phpfpm.pools.davical.socket) + ]; + }; + + services.phpfpm.pools = { + davical = { + user = config.services.websites.env.tools.user; + group = config.services.websites.env.tools.group; + settings = davical.phpFpm.pool; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); + }; + }; + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "davical website is running on dav.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "dav.immae.eu" "/davical/" "Log On Please"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Davical"; + _webstatus_url = "https://dav.immae.eu/davical"; + } + ]; + }; +} + diff --git a/modules/private/websites/tools/dav/www/index.html b/systems/eldiron/websites/dav/www/index.html similarity index 100% rename from modules/private/websites/tools/dav/www/index.html rename to systems/eldiron/websites/dav/www/index.html diff --git a/systems/eldiron/websites/db/default.nix b/systems/eldiron/websites/db/default.nix new file mode 100644 index 0000000..339948f --- /dev/null +++ b/systems/eldiron/websites/db/default.nix @@ -0,0 +1,32 @@ +{ lib, pkgs, config, ... }: +let + cfg = config.myServices.websites.tools.db; +in { + options.myServices.websites.tools.db = { + enable = lib.mkEnableOption "enable database's website"; + }; + + config = lib.mkIf cfg.enable { + services.websites.env.tools.modules = [ "proxy_fcgi" ]; + security.acme.certs.eldiron.extraDomainNames = [ "db-1.immae.eu" ]; + services.websites.env.tools.vhostConfs.db-1 = { + certName = "eldiron"; + hosts = ["db-1.immae.eu" ]; + root = null; + extraConfig = [ '' + Alias /adminer ${pkgs.webapps-adminer} + + DirectoryIndex index.php + + SetHandler "proxy:unix:${config.services.phpfpm.pools.adminer.socket}|fcgi://localhost" + + + Use LDAPConnect + Require ldap-group cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu + Require ldap-group cn=users,cn=postgresql,cn=pam,ou=services,dc=immae,dc=eu + + '' + ]; + }; + }; +} diff --git a/modules/private/websites/default.nix b/systems/eldiron/websites/default.nix similarity index 73% rename from modules/private/websites/default.nix rename to systems/eldiron/websites/default.nix index 4864034..68205de 100644 --- a/modules/private/websites/default.nix +++ b/systems/eldiron/websites/default.nix @@ -1,8 +1,14 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, mypackages-lib, ... }: let www_root = ./_www; - theme_root = pkgs.webapps.apache-theme.theme; + theme_root = (mypackages-lib.apache-theme {}).theme; apacheConfig = { + shutdownconfig = { + # Only give 5 seconds to workers to finish their work + extraConfig = '' + GracefulShutdownTimeout 5 + ''; + }; cache = { # This setting permits to ignore time-based cache for files in the # nix store: @@ -73,7 +79,7 @@ let ''; }; apaxy = { - extraConfig = (pkgs.webapps.apache-theme.override { inherit theme_root; }).apacheConfig; + extraConfig = (mypackages-lib.apache-theme { inherit theme_root; }).apacheConfig; }; http2 = { modules = [ "http2" ]; @@ -99,9 +105,69 @@ let lib.imap0 (i: e: ''Header always set "X-Moomin-${pad 2 (builtins.toString i)}" "${e}"'') lines; in { + imports = [ + ./immae/production.nix + ./immae/release.nix + + # Tools + ./assets + ./cloud + ./cloud/farm.nix + ./cryptpad + ./cryptpad/farm.nix + ./commento + ./dav + ./vpn + ./db + ./diaspora + ./ether + ./git + ./im + ./mastodon + ./mgoblin + ./peertube + ./performance + ./tools + ./mail + ./stats + ./visio + ./kanboard/farm.nix + + # Games + ./games/codenames + ./games/terraforming-mars + ]; + options.myServices.websites.enable = lib.mkEnableOption "enable websites"; config = lib.mkIf config.myServices.websites.enable { + myServices.dns.zones."immae.eu".subdomains = with config.myServices.dns.helpers; + { + games = ips servers.eldiron.ips.main; + nossl = ips servers.eldiron.ips.main; + }; + + myServices.chatonsProperties.hostings.web = { + file.datetime = "2022-08-22T01:30:00"; + hosting = { + name = "Hébergement Web"; + description = "Service d'hébergement web avec php/mysql/postgresql"; + website = "https://www.immae.eu"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Apache Httpd"; + website = "https://httpd.apache.org/"; + license.url = "https://www.apache.org/licenses/"; + license.name = "Apache License Version 2"; + version = pkgs.apacheHttpd.version; + source.url = "https://httpd.apache.org/download.cgi"; + modules = "openssh,pure-ftpd"; + }; + }; users.users.wwwrun.extraGroups = [ "keys" ]; networking.firewall.allowedTCPPorts = [ 80 443 ]; @@ -144,17 +210,19 @@ in }; }; - services.filesWatcher.httpdProd.paths = [ config.secrets.fullPaths."apache-ldap" ]; - services.filesWatcher.httpdInte.paths = [ config.secrets.fullPaths."apache-ldap" ]; - services.filesWatcher.httpdTools.paths = [ config.secrets.fullPaths."apache-ldap" ]; - services.websites.env.production = { enable = true; + moduleType = "container"; adminAddr = "httpd@immae.eu"; - httpdName = "Prod"; + bindMounts."/var/lib/ftp" = {}; + # FIXME: Bind directly the needed files + bindMounts."/var/secrets" = {}; + bindMounts."/var/lib/goaccess" = {}; + bindMounts."/var/lib/acme" = {}; + bindMounts."/run/phpfpm" = {}; ips = let ips = config.myEnv.servers.eldiron.ips.production; - in [ips.ip4] ++ (ips.ip6 or []); + in (ips.ip4 or []) ++ (ips.ip6 or []); modules = makeModules; extraConfig = makeExtraConfig; fallbackVhost = { @@ -167,28 +235,34 @@ in services.websites.env.integration = { enable = true; + moduleType = "container"; adminAddr = "httpd@immae.eu"; - httpdName = "Inte"; + bindMounts."/var/lib/ftp" = {}; + bindMounts."/var/secrets" = {}; + bindMounts."/var/lib/goaccess" = {}; + bindMounts."/var/lib/acme" = {}; + bindMounts."/run/phpfpm" = {}; ips = let ips = config.myEnv.servers.eldiron.ips.integration; - in [ips.ip4] ++ (ips.ip6 or []); + in (ips.ip4 or []) ++ (ips.ip6 or []); modules = makeModules; extraConfig = makeExtraConfig ++ moomin; fallbackVhost = { - certName = "eldiron"; + certName = "integration"; hosts = ["eldiron.immae.eu" ]; root = www_root; extraConfig = [ "DirectoryIndex index.htm" ]; }; + watchPaths = [ config.secrets.fullPaths."apache-ldap" ]; }; services.websites.env.tools = { enable = true; + moduleType = "main"; adminAddr = "httpd@immae.eu"; - httpdName = "Tools"; ips = let ips = config.myEnv.servers.eldiron.ips.main; - in [ips.ip4] ++ (ips.ip6 or []); + in (ips.ip4 or []) ++ (ips.ip6 or []); modules = makeModules; extraConfig = makeExtraConfig ++ [ '' @@ -203,6 +277,7 @@ in nosslVhost = { enable = true; host = "nossl.immae.eu"; + root = ./nossl; }; fallbackVhost = { certName = "eldiron"; @@ -210,96 +285,15 @@ in root = www_root; extraConfig = [ "DirectoryIndex index.htm" ]; }; + watchPaths = [ config.secrets.fullPaths."apache-ldap" ]; }; myServices.websites = { - bakeer.cloud.enable = true; - capitaines.landing_pages.enable = true; - - chloe = { - integration.enable = true; - production.enable = true; - }; - - cip-ca = { - sympa.enable = true; - }; - - connexionswing = { - integration.enable = true; - production.enable = true; - }; - - denise = { - evariste.enable = true; - denisejerome.enable = true; - oms.enable = true; - bingo.enable = true; - aventuriers.enable = true; - production.enable = true; - }; - - emilia = { - moodle.enable = false; - atelierfringant.enable = true; - }; - - florian = { - app.enable = true; - integration.enable = true; - production.enable = true; - }; - immae = { production.enable = true; release.enable = true; - temp.enable = true; - }; - - isabelle = { - aten_integration.enable = true; - aten_production.enable = true; - iridologie.enable = true; - }; - - jerome.naturaloutil.enable = true; - - leila.production.enable = true; - - ludivine = { - integration.enable = true; - production.enable = true; - }; - - nassime.production.enable = true; - - nath.villon.enable = true; - - papa = { - surveillance.enable = true; - maison_bbc.enable = true; - }; - - patrick_fodella = { - ecolyeu.enable = true; - altermondia.enable = true; - }; - - piedsjaloux = { - integration.enable = true; - production.enable = true; }; - ressourcerie_banon.production.enable = true; - ressourcerie_banon.cryptpad.enable = true; - ressourcerie_banon.cloud.enable = true; - - richie.production.enable = true; - - syden.peertube.enable = true; - - telio_tortay.production.enable = true; - tools.assets.enable = true; tools.cloud.enable = true; tools.commento.enable = true; @@ -316,6 +310,7 @@ in tools.tools.enable = true; tools.email.enable = true; tools.stats.enable = false; + tools.visio.enable = true; games.codenames.enable = true; games.terraforming-mars.enable = true; diff --git a/modules/private/websites/tools/diaspora/default.nix b/systems/eldiron/websites/diaspora/default.nix similarity index 73% rename from modules/private/websites/tools/diaspora/default.nix rename to systems/eldiron/websites/diaspora/default.nix index 3a115ed..c536446 100644 --- a/modules/private/websites/tools/diaspora/default.nix +++ b/systems/eldiron/websites/diaspora/default.nix @@ -10,6 +10,31 @@ in { }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.diaspora = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.diaspora = { + file.datetime = "2022-08-21T01:39:00"; + service = { + name = "Diaspora"; + description = "The online social world where you are in control"; + website = "https://diaspora.immae.eu"; + logo = "https://diaspora.immae.eu/assets/apple-touch-icon-9f7c9cc3923b4817fbb25bfeb0dd5fd34638827fd9c82b5a03f7b68e6e90806f.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Diaspora*"; + website = "https://diasporafoundation.org/"; + license.url = "https://github.com/diaspora/diaspora/blob/develop/LICENSE"; + license.name = "GNU Affero General Public License v3.0"; + version = dcfg.package.version; + source.url = "https://github.com/diaspora/diaspora"; + }; + }; users.users.diaspora.extraGroups = [ "keys" ]; secrets.keys = { @@ -23,6 +48,7 @@ in { user = "diaspora"; group = "diaspora"; permissions = "0400"; + keyDependencies = [ pkgs.cacert ]; text = '' configuration: environment: @@ -142,7 +168,7 @@ in { services.diaspora = { enable = true; - package = pkgs.webapps.diaspora.override { ldap = true; }; + withLdap = true; dataDir = "/var/lib/diaspora_immae"; adminEmail = "diaspora@tools.immae.eu"; configDir = config.secrets.fullPaths."webapps/diaspora"; @@ -156,9 +182,9 @@ in { services.websites.env.tools.modules = [ "headers" "proxy" "proxy_http" ]; + security.acme.certs.eldiron.extraDomainNames = [ "diaspora.immae.eu" ]; services.websites.env.tools.vhostConfs.diaspora = { certName = "eldiron"; - addToCerts = true; hosts = [ "diaspora.immae.eu" ]; root = root; extraConfig = [ '' @@ -181,5 +207,18 @@ in { '' ]; }; + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "diaspora website is running on diaspora.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "diaspora.immae.eu" "/" "is the online social world where you are in control"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Diaspora"; + _webstatus_url = "https://diaspora.immae.eu/"; + } + ]; }; } diff --git a/modules/private/websites/tools/ether/default.nix b/systems/eldiron/websites/ether/default.nix similarity index 79% rename from modules/private/websites/tools/ether/default.nix rename to systems/eldiron/websites/ether/default.nix index 0539095..3993553 100644 --- a/modules/private/websites/tools/ether/default.nix +++ b/systems/eldiron/websites/ether/default.nix @@ -1,10 +1,10 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, nixpkgsRaw, etherpad-lite, ... }: let env = config.myEnv.tools.etherpad-lite; cfg = config.myServices.websites.tools.etherpad-lite; # Make sure we’re not rebuilding whole libreoffice just because of a # dependency - libreoffice = (import { overlays = []; }).libreoffice-fresh; + libreoffice = nixpkgsRaw.libreoffice-fresh; ecfg = config.services.etherpad-lite; in { options.myServices.websites.tools.etherpad-lite = { @@ -12,6 +12,32 @@ in { }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.ether = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.etherpad = { + file.datetime = "2021-01-04T00:01:00"; + service = { + name = "Etherpad"; + description = "Éditeur de texte collaboratif en temps réel. on peut y écrire simultanément."; + website = "https://ether.immae.eu"; + logo = "https://ether.immae.eu/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE" "MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Etherpad"; + website = "https://etherpad.org/"; + license.url = "https://github.com/ether/etherpad-lite/blob/develop/LICENSE"; + license.name = "Apache License Version 2.0"; + version = ecfg.package.version; + source.url = "https://github.com/ether/etherpad-lite"; + modules = ecfg.package.moduleNames; + }; + }; secrets.keys = { "webapps/tools-etherpad-apikey" = { permissions = "0400"; @@ -23,6 +49,7 @@ in { }; "webapps/tools-etherpad" = { permissions = "0400"; + keyDependencies = [ libreoffice ]; text = '' { "title": "Etherpad", @@ -61,7 +88,7 @@ in { "requireSession" : false, "editOnly" : false, "sessionNoPassword" : false, - "minify" : true, + "minify" : false, "maxAge" : 21600, "abiword" : null, "soffice" : "${libreoffice}/bin/soffice", @@ -69,7 +96,7 @@ in { "allowUnknownFileEnds" : true, "requireAuthentication" : false, "requireAuthorization" : false, - "trustProxy" : false, + "trustProxy" : true, "disableIPlogging" : false, "automaticReconnectionTimeout" : 0, "scrollWhenFocusLineIsOutOfViewport": { @@ -150,7 +177,7 @@ in { }; services.etherpad-lite = { enable = true; - package = pkgs.webapps.etherpad-lite.withModules (p: [ + package = etherpad-lite.withModules (p: [ p.ep_align p.ep_bookmark p.ep_colors p.ep_comments_page p.ep_cursortrace p.ep_delete_empty_pads p.ep_embedmedia p.ep_font_size p.ep_headings2 p.ep_immae_buttons p.ep_ldapauth @@ -166,6 +193,7 @@ in { }; systemd.services.etherpad-lite.serviceConfig.SupplementaryGroups = "keys"; + systemd.services.etherpad-lite-cleanup.serviceConfig.SupplementaryGroups = "keys"; # Needed so that they get in the closure systemd.services.etherpad-lite.path = [ libreoffice pkgs.html-tidy ]; @@ -177,9 +205,9 @@ in { services.websites.env.tools.modules = [ "headers" "proxy" "proxy_http" "proxy_wstunnel" ]; + security.acme.certs.eldiron.extraDomainNames = [ "ether.immae.eu" ]; services.websites.env.tools.vhostConfs.etherpad-lite = { certName = "eldiron"; - addToCerts = true; hosts = [ "ether.immae.eu" ]; root = null; extraConfig = [ '' @@ -188,12 +216,6 @@ in { RewriteEngine On - RewriteMap redirects "txt:${pkgs.writeText "redirects.txt" config.myEnv.tools.etherpad-lite.redirects}" - RewriteCond %{QUERY_STRING} "!noredirect" - RewriteCond %{REQUEST_URI} "^(.*)$" - RewriteCond ''${redirects:$1|Unknown} "!Unknown" - RewriteRule "^(.*)$" ''${redirects:$1} [L,NE,R=301,QSD] - RewriteCond %{REQUEST_URI} ^/socket.io [NC] RewriteCond %{QUERY_STRING} transport=websocket [NC] RewriteRule /(.*) unix://${ecfg.sockets.node}|ws://ether.immae.eu/$1 [P,NE,QSA,L] @@ -212,5 +234,18 @@ in { '' ]; }; + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "etherpad website is running on ether.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "ether.immae.eu" "/" "Etherpad"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Etherpad"; + _webstatus_url = "https://ether.immae.eu/"; + } + ]; }; } diff --git a/modules/private/websites/tools/games/codenames/codenames.patch b/systems/eldiron/websites/games/codenames/codenames.patch similarity index 100% rename from modules/private/websites/tools/games/codenames/codenames.patch rename to systems/eldiron/websites/games/codenames/codenames.patch diff --git a/modules/private/websites/tools/games/codenames/default.nix b/systems/eldiron/websites/games/codenames/default.nix similarity index 58% rename from modules/private/websites/tools/games/codenames/default.nix rename to systems/eldiron/websites/games/codenames/default.nix index 25eb62d..7f09cc3 100644 --- a/modules/private/websites/tools/games/codenames/default.nix +++ b/systems/eldiron/websites/games/codenames/default.nix @@ -11,6 +11,31 @@ in { options.myServices.websites.games.codenames.enable = lib.mkEnableOption "Enable Codenames game"; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.games.subdomains.codenames = with config.myServices.dns.helpers; + ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.codenames = { + file.datetime = "2022-08-27T14:08:00"; + service = { + name = "Codenames Green"; + description = "Co-op codenames app"; + website = "https://codenames.games.immae.eu/"; + logo = "https://codenames.games.immae.eu/images/apple-touch-icon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Codenames Green"; + website = "https://www.codenamesgreen.com/"; + license.url = "https://github.com/jbowens/codenamesgreen/blob/master/package.json"; + license.name = "MIT"; + version = greenapid.version; + source.url = "https://github.com/jbowens/codenamesgreen"; + }; + }; systemd.services.codenames_api = { description = "Api for codenames game"; wantedBy = [ "multi-user.target" ]; @@ -30,9 +55,10 @@ in }; }; + security.acme.certs.games.domain = "games.immae.eu"; + security.acme.certs.games.extraDomainNames = [ "codenames.games.immae.eu" ]; services.websites.env.tools.vhostConfs.games_codenames = { certName = "games"; - certMainHost = "games.immae.eu"; hosts = [ "codenames.games.immae.eu" ]; root = frontend; extraConfig = [ diff --git a/modules/private/websites/tools/games/codenames/deps.nix b/systems/eldiron/websites/games/codenames/deps.nix similarity index 100% rename from modules/private/websites/tools/games/codenames/deps.nix rename to systems/eldiron/websites/games/codenames/deps.nix diff --git a/modules/private/websites/tools/games/codenames/elm-srcs.nix b/systems/eldiron/websites/games/codenames/elm-srcs.nix similarity index 100% rename from modules/private/websites/tools/games/codenames/elm-srcs.nix rename to systems/eldiron/websites/games/codenames/elm-srcs.nix diff --git a/modules/private/websites/tools/games/codenames/frontend.nix b/systems/eldiron/websites/games/codenames/frontend.nix similarity index 100% rename from modules/private/websites/tools/games/codenames/frontend.nix rename to systems/eldiron/websites/games/codenames/frontend.nix diff --git a/modules/private/websites/tools/games/codenames/greenapid.nix b/systems/eldiron/websites/games/codenames/greenapid.nix similarity index 100% rename from modules/private/websites/tools/games/codenames/greenapid.nix rename to systems/eldiron/websites/games/codenames/greenapid.nix diff --git a/modules/private/websites/tools/games/codenames/greenapid.patch b/systems/eldiron/websites/games/codenames/greenapid.patch similarity index 100% rename from modules/private/websites/tools/games/codenames/greenapid.patch rename to systems/eldiron/websites/games/codenames/greenapid.patch diff --git a/systems/eldiron/websites/games/codenames/immae-assets.patch b/systems/eldiron/websites/games/codenames/immae-assets.patch new file mode 100644 index 0000000..c53ab97 --- /dev/null +++ b/systems/eldiron/websites/games/codenames/immae-assets.patch @@ -0,0 +1,15 @@ +diff --git a/src/index.html b/src/index.html +index 2559a37..84a0d64 100644 +--- a/src/index.html ++++ b/src/index.html +@@ -6,8 +6,8 @@ + <meta name="description" content="Online cooperative codenames game. Play with two or more players."> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> + <meta name="theme-color" content="#ffffff"> +- <link href="https://fonts.googleapis.com/css?family=Exo+2&display=swap" rel="stylesheet"> +- <link href="https://unpkg.com/ionicons@4.5.10-0/dist/css/ionicons.min.css" rel="stylesheet"> ++ <link href="https://assets.immae.eu/fonts/Exo2_swap/font.css" rel="stylesheet"> ++ <link href="https://assets.immae.eu/ionicons/4.5.10-0/dist/css/ionicons.min.css" rel="stylesheet"> + <link rel="manifest" href="/codenames.manifest"> + <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png"> + <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png"> diff --git a/modules/private/websites/tools/games/codenames/node-packages.nix b/systems/eldiron/websites/games/codenames/node-packages.nix similarity index 99% rename from modules/private/websites/tools/games/codenames/node-packages.nix rename to systems/eldiron/websites/games/codenames/node-packages.nix index 02595c5..1fb2db3 100644 --- a/modules/private/websites/tools/games/codenames/node-packages.nix +++ b/systems/eldiron/websites/games/codenames/node-packages.nix @@ -6448,6 +6448,7 @@ let chmod -R u+w $out cd $out patch -p1 < ${./codenames.patch} + patch -p1 < ${./immae-assets.patch} ''; dependencies = [ sources."@babel/code-frame-7.0.0" diff --git a/modules/private/websites/tools/games/codenames/registry.dat b/systems/eldiron/websites/games/codenames/registry.dat similarity index 100% rename from modules/private/websites/tools/games/codenames/registry.dat rename to systems/eldiron/websites/games/codenames/registry.dat diff --git a/modules/private/websites/tools/games/codenames/shell.nix b/systems/eldiron/websites/games/codenames/shell.nix similarity index 100% rename from modules/private/websites/tools/games/codenames/shell.nix rename to systems/eldiron/websites/games/codenames/shell.nix diff --git a/modules/private/websites/tools/games/codenames/wordlists/french.txt b/systems/eldiron/websites/games/codenames/wordlists/french.txt similarity index 100% rename from modules/private/websites/tools/games/codenames/wordlists/french.txt rename to systems/eldiron/websites/games/codenames/wordlists/french.txt diff --git a/modules/private/websites/tools/games/terraforming-mars/default.nix b/systems/eldiron/websites/games/terraforming-mars/default.nix similarity index 51% rename from modules/private/websites/tools/games/terraforming-mars/default.nix rename to systems/eldiron/websites/games/terraforming-mars/default.nix index 0df5363..e90e72f 100644 --- a/modules/private/websites/tools/games/terraforming-mars/default.nix +++ b/systems/eldiron/websites/games/terraforming-mars/default.nix @@ -6,8 +6,32 @@ in { options.myServices.websites.games.terraforming-mars.enable = lib.mkEnableOption "Enable Terraforming mars game"; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.games.subdomains.terraforming-mars = with config.myServices.dns.helpers; + ips servers.eldiron.ips.main; + myServices.chatonsProperties.services.terraforming-mars = { + file.datetime = "2022-08-27T14:20:00"; + service = { + name = "Terraforming Mars"; + description = "Terraforming Mars Boardgame"; + website = "https://terraforming-mars.games.immae.eu/"; + logo = "https://terraforming-mars.games.immae.eu/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Terraforming Mars"; + website = "https://github.com/terraforming-mars/terraforming-mars"; + license.url = "https://github.com/terraforming-mars/terraforming-mars/blob/main/LICENSE"; + license.name = "GNU General Public License v3.0"; + version = "unversionned"; + source.url = "https://github.com/terraforming-mars/terraforming-mars"; + }; + }; systemd.services.terraforming-mars = { - path = [ pkgs.nodejs pkgs.bashInteractive ]; + path = [ pkgs.nodejs_16 pkgs.bashInteractive ]; description = "Terraforming mars game"; wantedBy = [ "multi-user.target" ]; script = '' @@ -21,6 +45,8 @@ in chown :wwwrun /run/terraforming-mars/socket.sock chmod g+w /run/terraforming-mars/socket.sock ''; + environment.NPM_CONFIG_LOGS_DIR = "%S/terraforming-mars/npm_logs"; + environment.NPM_CONFIG_CACHE = "%S/terraforming-mars/npm_cache"; serviceConfig = { User = "terraformingmars"; DynamicUser = true; @@ -32,9 +58,10 @@ in }; }; + security.acme.certs.games.extraDomainNames = [ "terraforming-mars.games.immae.eu" ]; + security.acme.certs.games.domain = "games.immae.eu"; services.websites.env.tools.vhostConfs.games_terraforming-mars = { certName = "games"; - certMainHost = "games.immae.eu"; hosts = [ "terraforming-mars.games.immae.eu" ]; root = null; extraConfig = [ diff --git a/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch b/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch new file mode 100644 index 0000000..684a7df --- /dev/null +++ b/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch @@ -0,0 +1,13 @@ +diff --git a/assets/index.html b/assets/index.html +index 220192834..d77a0fc80 100644 +--- a/assets/index.html ++++ b/assets/index.html +@@ -2,7 +2,7 @@ + <html> + <head> + <link +- href="https://fonts.googleapis.com/css?family=Ubuntu&display=swap" ++ href="https://assets.immae.eu/fonts/Ubuntu_swap/font.css" + rel="stylesheet" + /> + <link rel="stylesheet" type="text/css" media="all" href="/styles.css" /> diff --git a/modules/private/websites/tools/games/terraforming-mars/node-packages.nix b/systems/eldiron/websites/games/terraforming-mars/node-packages.nix similarity index 100% rename from modules/private/websites/tools/games/terraforming-mars/node-packages.nix rename to systems/eldiron/websites/games/terraforming-mars/node-packages.nix diff --git a/modules/private/websites/tools/games/terraforming-mars/terraforming-mars.nix b/systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix similarity index 73% rename from modules/private/websites/tools/games/terraforming-mars/terraforming-mars.nix rename to systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix index 502a553..f190221 100644 --- a/modules/private/websites/tools/games/terraforming-mars/terraforming-mars.nix +++ b/systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix @@ -1,4 +1,4 @@ -{ fetchgit, runCommand, callPackage, mylibs, nodePackages, nodejs, git }: +{ fetchgit, runCommand, callPackage, mylibs, nodePackages, nodejs_16, git }: let source = fetchgit { url = "https://github.com/bafolts/terraforming-mars"; @@ -14,16 +14,19 @@ let ''; packages = callPackage ./node-packages.nix { src = patchedSource; - nodeEnv = callPackage mylibs.nodeEnv {}; - globalBuildInputs = [ nodePackages.node-pre-gyp ]; + nodeEnv = callPackage mylibs.nodeEnv { nodejs = nodejs_16; }; + globalBuildInputs = [ nodejs_16.pkgs.node-pre-gyp ]; }; terraforming-mars = runCommand "terraforming-mars" { - buildInputs = [ nodejs git ]; + buildInputs = [ nodejs_16 git ]; } '' cp -r ${source} ./source chmod -R u+w source cd source + patch -p1 < ${./immae-assets.patch} ln -s ${packages.package}/lib/node_modules/terraforming-mars/node_modules . + # See https://stackoverflow.com/questions/74548318/how-to-resolve-error-error0308010cdigital-envelope-routinesunsupported-no + export NODE_OPTIONS=--openssl-legacy-provider npm run build mkdir $out cp -a build $out/ diff --git a/systems/eldiron/websites/git/cgit_js.html b/systems/eldiron/websites/git/cgit_js.html new file mode 100644 index 0000000..4101071 --- /dev/null +++ b/systems/eldiron/websites/git/cgit_js.html @@ -0,0 +1,16 @@ +<script src="https://assets.immae.eu/jquery/3.5.1/jquery.min.js"></script> +<script type="application/javascript"> + $(document).ready(function() { + const linksObject = { + "/github/fretlink": "Fretlink Open-source Github forks", + "/github": "Github forks", + "/perso/Denise": "Denise", + "/perso/Immae": "Immae", + } + function toRow(href, name) { + return `<a href='/cgit${href}'>${name}</a>`; + } + const links = Object.keys(linksObject).map(function(k) { return toRow(k, linksObject[k]); }).join(""); + $("table.tabs a.active[href='/cgit/']").after(links); + }); +</script> diff --git a/systems/eldiron/websites/git/default.nix b/systems/eldiron/websites/git/default.nix new file mode 100644 index 0000000..46ba34d --- /dev/null +++ b/systems/eldiron/websites/git/default.nix @@ -0,0 +1,98 @@ +{ lib, pkgs, config, ... }: +let + mantisbt = pkgs.callPackage ./mantisbt.nix { + mantisbt_2 = pkgs.webapps-mantisbt_2; + mantisbt_2-plugins = pkgs.webapps-mantisbt_2-plugins; + env = config.myEnv.tools.mantisbt; + inherit config; + }; + gitweb = pkgs.callPackage ./gitweb.nix { + gitoliteDir = config.myServices.gitolite.gitoliteDir; + }; + + cfg = config.myServices.websites.tools.git; +in { + options.myServices.websites.tools.git = { + enable = lib.mkEnableOption "enable git's website"; + }; + + config = lib.mkIf cfg.enable { + myServices.chatonsProperties.services.mantisbt = { + file.datetime = "2022-08-21T10:08:00"; + service = { + name = "MantisBT"; + description = "Mantis Bug Tracker"; + website = "https://git.immae.eu/mantisbt"; + logo = "https://git.immae.eu/mantisbt/images/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + guide.user = "https://www.immae.eu/docs/forge-logicielle.html"; + }; + software = { + name = "MantisBT"; + website = "https://mantisbt.org/"; + license.url = "https://opensource.org/licenses/gpl-license"; + license.name = "GNU General Public License"; + version = mantisbt.webRoot.version; + source.url = "https://github.com/mantisbt/mantisbt"; + modules = mantisbt.webRoot.pluginNames; + }; + }; + secrets.keys = mantisbt.keys; + services.websites.env.tools.modules = + gitweb.apache.modules ++ + mantisbt.apache.modules; + + security.acme.certs.eldiron.extraDomainNames = [ "git.immae.eu" ]; + services.websites.env.tools.vhostConfs.git = { + certName = "eldiron"; + hosts = ["git.immae.eu" ]; + root = gitweb.apache.root; + extraConfig = [ + gitweb.apache.vhostConf + (mantisbt.apache.vhostConf config.services.phpfpm.pools.mantisbt.socket) + '' + RewriteEngine on + RewriteCond %{REQUEST_URI} ^/releases + RewriteRule /releases(.*) https://release.immae.eu$1 [P,L] + '' + ]; + }; + services.phpfpm.pools = { + mantisbt = { + user = config.services.websites.env.tools.user; + group = config.services.websites.env.tools.group; + settings = mantisbt.phpFpm.pool; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); + }; + }; + + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "gitweb website is running on git.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "git.immae.eu" "/cgit" "<title>Immae’s git"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Git"; + _webstatus_url = "https://git.immae.eu/"; + } + + { + service_description = "mantisbt website is running on git.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "git.immae.eu" "/mantisbt/" "<title>My View - MantisBT"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Mantisbt"; + _webstatus_url = "https://git.immae.eu/mantisbt"; + } + ]; + }; +} diff --git a/modules/private/websites/tools/git/gitweb.nix b/systems/eldiron/websites/git/gitweb.nix similarity index 95% rename from modules/private/websites/tools/git/gitweb.nix rename to systems/eldiron/websites/git/gitweb.nix index ff34da5..40f99e0 100644 --- a/modules/private/websites/tools/git/gitweb.nix +++ b/systems/eldiron/websites/git/gitweb.nix @@ -41,6 +41,7 @@ rec { css=/cgit-css/cgit.css logo=/cgit-css/cgit.png favicon=/cgit-css/favicon.ico + head-include=${./cgit_js.html} root-title=Immae’s git root-desc=To go back to the old interface: https://git.immae.eu/?old @@ -114,6 +115,10 @@ rec { RewriteEngine On RewriteCond %{QUERY_STRING} ^$ RewriteRule ^/?$ /cgit [L,R=302] + + RewriteCond %{REQUEST_URI} ^(.*)(\.git)?/?$ + RewriteCond ${varDir}/repositories/%1.git/HEAD -f + RewriteRule ^(.+)$ /cgit$1 [L,R=302] ''; }; } diff --git a/modules/private/websites/tools/git/mantisbt.nix b/systems/eldiron/websites/git/mantisbt.nix similarity index 89% rename from modules/private/websites/tools/git/mantisbt.nix rename to systems/eldiron/websites/git/mantisbt.nix index 2ef76af..3bd78e1 100644 --- a/modules/private/websites/tools/git/mantisbt.nix +++ b/systems/eldiron/websites/git/mantisbt.nix @@ -1,11 +1,5 @@ { env, mantisbt_2, mantisbt_2-plugins, config }: rec { - activationScript = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/mantisbt - ''; - }; keys."webapps/tools-mantisbt" = { user = apache.user; group = apache.group; @@ -84,8 +78,9 @@ rec { "php_admin_value[upload_max_filesize]" = "5000000"; - "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/mantisbt"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/mantisbt"; + "php_admin_value[open_basedir]" = "${basedir}:/tmp"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:MantisBT:'"; }; }; } diff --git a/systems/eldiron/websites/im/default.nix b/systems/eldiron/websites/im/default.nix new file mode 100644 index 0000000..7755a5c --- /dev/null +++ b/systems/eldiron/websites/im/default.nix @@ -0,0 +1,118 @@ +{ config, lib, pkgs, ... }: +let + cfg = config.myServices.websites.tools.im; + converseVersion = "9.1.1"; + www = pkgs.runCommand "www" {} '' + cp -a ${./www} $out + substituteInPlace $out/converse.html --replace {{converseVersion}} ${converseVersion} + ''; +in +{ + options.myServices.websites.tools.im = { + enable = lib.mkEnableOption "enable im website"; + }; + + config = lib.mkIf cfg.enable { + myServices.chatonsProperties.services.converse = { + file.datetime = "2022-08-21T19:20:00"; + service = { + name = "Converse"; + description = "A free and open-source XMPP chat client in your browser"; + website = "https://im.immae.fr/converse"; + logo = "https://conversejs.org/docs/html/_static/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE" "FREE"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Converse"; + website = "https://conversejs.org/"; + license.name = "Mozilla Public License 2.0"; + license.url = "https://github.com/conversejs/converse.js/blob/master/LICENSE"; + version = "9.1.1"; + source.url = "https://github.com/conversejs/converse.js"; + }; + }; + myServices.chatonsProperties.services.weechat-bridge = { + file.datetime = "2022-08-21T19:20:00"; + service = { + name = "Weechat bridge"; + description = "WeeChat web frontend"; + website = "https://im.immae.fr/glowing-bear"; + logo = "https://im.immae.fr/glowing-bear/assets/img/glowing_bear_128x128.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE" "FREE"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Glowing bear"; + website = "https://www.ejabberd.im/"; + license.name = "GNU General Public License v3.0"; + license.url = "https://github.com/processone/ejabberd"; + version = pkgs.glowing-bear.version; + source.url = "https://github.com/glowing-bear/glowing-bear"; + }; + }; + myServices.chatonsProperties.services.xmpp = { + file.datetime = "2022-08-21T19:20:00"; + service = { + name = "XMPP"; + description = "Universal messaging standard"; + website = "https://im.immae.fr/"; + logo = "https://xmpp.org/favicon-32x32.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "ejabberd"; + website = "https://www.ejabberd.im/"; + license.url = "https://github.com/processone/ejabberd/blob/master/COPYING"; + license.name = "GNU GENERAL PUBLIC LICENSE Version 2"; + version = pkgs.ejabberd.version; + source.url = "https://github.com/processone/ejabberd"; + modules = "converse"; + }; + }; + security.acme.certs.eldiron.extraDomainNames = [ "im.immae.fr" ]; + services.websites.env.tools.vhostConfs.im = { + certName = "eldiron"; + hosts = ["im.immae.fr"]; + root = www; + extraConfig = [ + '' + Alias /glowing-bear ${pkgs.glowing-bear} + Alias /converse ${www}/converse.html + ProxyPreserveHost On + <Location "/bosh"> + ProxyPass http://localhost:5280/bosh + ProxyPassReverse http://localhost:5280/bosh + </Location> + <Location "/ws"> + ProxyPass ws://localhost:5280/ws + </Location> + ProxyPass /upload http://localhost:5280/upload + ProxyPassReverse /upload http://localhost:5280/upload + ProxyPass /admin http://localhost:5280/admin + ProxyPassReverse /admin http://localhost:5280/admin + ProxyPass /api http://localhost:5280/api + ProxyPassReverse /api http://localhost:5280/api + <Directory ${pkgs.glowing-bear}> + AllowOverride none + Require all granted + </Directory> + <Directory ${www}> + Require all granted + AllowOverride none + </Directory> + '' + ]; + }; + }; +} diff --git a/modules/private/websites/tools/im/www/converse.html b/systems/eldiron/websites/im/www/converse.html similarity index 90% rename from modules/private/websites/tools/im/www/converse.html rename to systems/eldiron/websites/im/www/converse.html index 936dde4..4ca451d 100644 --- a/modules/private/websites/tools/im/www/converse.html +++ b/systems/eldiron/websites/im/www/converse.html @@ -8,17 +8,19 @@ <meta name="description" content="Converse: An XMPP chat client which can be integrated into any website" /> <meta name="keywords" content="xmpp chat webchat converse.js Converse" /> - <link type="text/css" rel="stylesheet" media="screen" href="https://assets.immae.eu/converse/5.0.4/converse.min.css" /> + <link type="text/css" rel="stylesheet" media="screen" href="https://assets.immae.eu/converse/{{converseVersion}}/dist/converse.min.css" /> <style type="text/css"> #conversejs div.chat-msg__text pre { background-color: #eee; padding: 10px; } </style> - <script src="https://assets.immae.eu/converse/5.0.4/libsignal-protocol.min.js"></script> - <script src="https://assets.immae.eu/converse/5.0.4/converse.min.js"></script> + <script src="https://assets.immae.eu/converse/{{converseVersion}}/3rdparty/libsignal-protocol.min.js"></script> + <script src="https://assets.immae.eu/converse/{{converseVersion}}/dist/converse.min.js"></script> <script src="https://assets.immae.eu/marked/1.2.6/marked.min.js"></script> <script src="https://assets.immae.eu/markdown-it/10.0.0/markdown-it.min.js"></script> + </head> + <body> <script> var md = window.markdownit({ html: true, @@ -50,8 +52,6 @@ whitelisted_plugins: ['markdown'], }); </script> - </head> - <body> </body> </html> diff --git a/modules/private/websites/tools/im/www/index.html b/systems/eldiron/websites/im/www/index.html similarity index 100% rename from modules/private/websites/tools/im/www/index.html rename to systems/eldiron/websites/im/www/index.html diff --git a/modules/private/websites/immae/matrix/client b/systems/eldiron/websites/immae/matrix/client similarity index 65% rename from modules/private/websites/immae/matrix/client rename to systems/eldiron/websites/immae/matrix/client index 2769de5..89136a0 100644 --- a/modules/private/websites/immae/matrix/client +++ b/systems/eldiron/websites/immae/matrix/client @@ -4,5 +4,8 @@ }, "m.identity_server": { "base_url": "https://vector.im" + }, + "org.matrix.msc3575.proxy": { + "url": "https://immae.ems.host" } } diff --git a/modules/private/websites/immae/matrix/server b/systems/eldiron/websites/immae/matrix/server similarity index 100% rename from modules/private/websites/immae/matrix/server rename to systems/eldiron/websites/immae/matrix/server diff --git a/modules/private/websites/immae/production.nix b/systems/eldiron/websites/immae/production.nix similarity index 56% rename from modules/private/websites/immae/production.nix rename to systems/eldiron/websites/immae/production.nix index 8b4998f..e4060ba 100644 --- a/modules/private/websites/immae/production.nix +++ b/systems/eldiron/websites/immae/production.nix @@ -2,22 +2,26 @@ let cfg = config.myServices.websites.immae.production; varDir = "/var/lib/buildbot/outputs/immae/blog"; - coursDir = "/var/lib/buildbot/outputs/immae/cours"; - rechercheDir = "/var/lib/buildbot/outputs/immae/recherche"; - recettesDir = "/var/lib/buildbot/outputs/immae/recettes"; historyDir = "/var/lib/buildbot/outputs/immae/history"; docsDir = "/var/lib/buildbot/outputs/immae/docs/"; - env = config.myEnv.websites.immae; in { options.myServices.websites.immae.production.enable = lib.mkEnableOption "enable Immae's website"; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains = with config.myServices.dns.helpers; + { + www = ips servers.eldiron.ips.production; + matrix.CNAME = [ "immae.element.io." ]; + }; services.webstats.sites = [ { name = "www.immae.eu"; } ]; + security.acme.certs.immae.domain = "www.immae.eu"; + security.acme.certs.immae.extraDomainNames = [ "immae.eu" ]; + services.websites.env.production.bindMounts."${varDir}" = {}; + services.websites.env.production.bindMounts."${docsDir}" = {}; + services.websites.env.production.bindMounts."${historyDir}" = {}; services.websites.env.production.vhostConfs.immae_production = { certName = "immae"; - addToCerts = true; - certMainHost = "www.immae.eu"; hosts = [ "www.immae.eu" "immae.eu" ]; root = varDir; extraConfig = [ @@ -44,13 +48,6 @@ in { Require all granted </Directory> - Alias /.well-known/chatonsinfos ${./chatons} - <Directory ${./chatons}> - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride None - Require all granted - </Directory> - Alias /.well-known/matrix ${./matrix} <Directory ${./matrix}> Options Indexes FollowSymLinks MultiViews Includes @@ -59,14 +56,6 @@ in { Header always set Access-Control-Allow-Origin "*" </Directory> - Alias /cours ${coursDir} - <Directory ${coursDir}> - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - </Directory> - Alias /docs ${docsDir} <Directory ${docsDir}> DirectoryIndex index.htm index.html @@ -75,63 +64,44 @@ in { Require all granted </Directory> - Alias /eurl ${./eurl} - <Directory ${./eurl}> + Alias /eurl ${./sarl} + Alias /eurl ${./sarl} + <Directory ${./sarl}> DirectoryIndex index.htm index.html Options Indexes FollowSymLinks MultiViews Includes AllowOverride None Require all granted </Directory> - Alias /recherche ${rechercheDir} - <Directory ${rechercheDir}> - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - </Directory> - - Alias /recettes ${recettesDir} - <Directory ${recettesDir}> - DirectoryIndex index.htm index.html - Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All - Require all granted - </Directory> - Alias /history ${historyDir} <Directory ${historyDir}> DirectoryIndex index.html AllowOverride None Require all granted </Directory> - '' - ]; - }; - services.websites.env.production.vhostConfs.immae_fr = { - certName = "immae"; - addToCerts = true; - hosts = [ "www.immae.fr" "immae.fr" ]; - root = null; - extraConfig = [ '' - RedirectMatch 301 ^/((?!\.well-known.*$).*)$ https://www.immae.eu/chapeaux/ - '' ]; - }; - - services.websites.env.production.vhostConfs.immae_bouya = { - certName = "immae"; - addToCerts = true; - hosts = [ "bouya.org" "www.bouya.org" ]; - root = rechercheDir; - extraConfig = [ '' - <Directory ${rechercheDir}> - DirectoryIndex index.htm index.html + Alias /.well-known/chatonsinfos ${config.myServices.chatonsProperties.propertiesPath} + <Directory ${config.myServices.chatonsProperties.propertiesPath}> Options Indexes FollowSymLinks MultiViews Includes - AllowOverride All + AllowOverride None Require all granted </Directory> - '' ]; + '' + ]; }; + + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "blog website is running on immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "www.immae.eu" "/blog/" "egrep -ri TODO /etc"]; + + servicegroups = "webstatus-websites"; + _webstatus_name = "Immae’s Blog"; + _webstatus_url = "https://www.immae.eu/blog"; + } + ]; }; } diff --git a/modules/private/websites/immae/release.nix b/systems/eldiron/websites/immae/release.nix similarity index 82% rename from modules/private/websites/immae/release.nix rename to systems/eldiron/websites/immae/release.nix index d06af87..4882bac 100644 --- a/modules/private/websites/immae/release.nix +++ b/systems/eldiron/websites/immae/release.nix @@ -2,16 +2,17 @@ let cfg = config.myServices.websites.immae.release; varDir = "/var/lib/ftp/release.immae.eu"; - env = config.myEnv.websites.release; in { options.myServices.websites.immae.release.enable = lib.mkEnableOption "enable Release' website"; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.release = with config.myServices.dns.helpers; + ips servers.eldiron.ips.production; services.webstats.sites = [ { name = "release.immae.eu"; } ]; + security.acme.certs.immae.extraDomainNames = [ "release.immae.eu" ]; services.websites.env.production.vhostConfs.immae_release = { certName = "immae"; - addToCerts = true; hosts = [ "release.immae.eu" ]; root = varDir; extraConfig = [ diff --git a/modules/private/websites/immae/eurl/certificates/2021-certificate.crt b/systems/eldiron/websites/immae/sarl/certificates/2021-certificate.crt similarity index 100% rename from modules/private/websites/immae/eurl/certificates/2021-certificate.crt rename to systems/eldiron/websites/immae/sarl/certificates/2021-certificate.crt diff --git a/systems/eldiron/websites/kanboard/farm.nix b/systems/eldiron/websites/kanboard/farm.nix new file mode 100644 index 0000000..a70d0d6 --- /dev/null +++ b/systems/eldiron/websites/kanboard/farm.nix @@ -0,0 +1,183 @@ +{ lib, pkgs, config, ... }: +let + cfg = config.myServices.tools.kanboard.farm; + apacheUser = config.services.websites.env.tools.user; + apacheGroup = config.services.websites.env.tools.group; + toVardir = name: "/var/lib/kanboard_farm/${name}"; + varDirs = lib.mapAttrsToList (name: v: toVardir name) cfg.instances; + toPhpBaseDir = name: [ rootDir (toVardir name) ]; + phpBaseDir = builtins.concatStringsSep ":" (lib.unique (lib.flatten (lib.mapAttrsToList (name: v: toPhpBaseDir name) cfg.instances))); + rootDir = pkgs.kanboard; + + toVhost = name: '' + Alias /${name} "${rootDir}" + <Location /${name}> + SetEnv DATA_DIR "${toVardir name}" + SetEnv MAIL_FROM "kanboard@tools.immae.eu" + </Location> + ''; + toCustomVhost = name: lib.optionalAttrs (cfg.instances."${name}".customHost != null) { + "kanboard_farm_${name}" = { + certName = "eldiron"; + hosts = [cfg.instances."${name}".customHost]; + root = null; + extraConfig = [ + '' + Alias / "${rootDir}" + <Location /> + SetEnv DATA_DIR "${toVardir name}" + SetEnv MAIL_FROM "kanboard@tools.immae.eu" + </Location> + <Directory "${rootDir}"> + DirectoryIndex index.php + AllowOverride All + Options FollowSymlinks + Require all granted + + <FilesMatch "\.php$"> + SetHandler "proxy:unix:${config.services.phpfpm.pools.kanboard_farm.socket}|fcgi://localhost" + </FilesMatch> + </Directory> + <DirectoryMatch "${rootDir}/data"> + Require all denied + </DirectoryMatch> + '' + ]; + }; + }; + customHosts = lib.filter (n: n != null) (map (n: cfg.instances."${n}".customHost) (builtins.attrNames cfg.instances)); + customVhosts = lib.foldl (o: n: o // n) {} (map toCustomVhost (builtins.attrNames cfg.instances)); + phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [all.redis]); +in +{ + options.myServices.tools.kanboard.farm = { + instances = lib.mkOption { + description = "Instances names for the kanboard Farm"; + default = {}; + type = lib.types.attrsOf (lib.types.submodule { + options = { + customHost = lib.mkOption { + description = "Custom host to use for the kanboard instance"; + default = null; + type = lib.types.nullOr lib.types.str; + }; + }; + }); + }; + vhosts = lib.mkOption { + description = "Instance vhosts configs"; + readOnly = true; + type = lib.types.attrsOf lib.types.str; + default = lib.mapAttrs (name: v: toVhost name) cfg.instances; + }; + }; + + config = lib.mkIf (builtins.length (builtins.attrNames cfg.instances) > 0) { + myServices.dns.zones."immae.eu".subdomains.kanboard = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.hostings.kanboard = { + file.datetime = "2022-08-21T19:40:00"; + hosting = { + name = "Kanboard"; + description = "Kanban project management software"; + website = "https://tools.immae.eu/kanboard"; + logo = "https://tools.immae.eu/kanboard/assets/img/favicon.png"; + type = "INSTANCE"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; + myServices.chatonsProperties.services.kanboard = { + file.datetime = "2022-08-21T19:40:00"; + service = { + name = "Kanboard"; + description = "Kanban project management software"; + website = "https://tools.immae.eu/kanboard"; + logo = "https://tools.immae.eu/kanboard/assets/img/favicon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Kanboard"; + website = "https://kanboard.org/"; + license.url = "https://github.com/kanboard/kanboard/blob/main/LICENSE"; + license.name = "MIT License"; + version = pkgs.kanboard.version; + source.url = "https://github.com/kanboard/kanboard"; + }; + }; + system.activationScripts.kanboard_farm_vardirs = { + deps = [ "httpd" ]; + text = '' + install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${builtins.concatStringsSep " " varDirs} + ''; + }; + services.phpfpm.pools.kanboard_farm = { + user = apacheUser; + group = apacheGroup; + settings = let + instanceNb = builtins.length (builtins.attrNames cfg.instances); + in { + "listen.owner" = apacheUser; + "listen.group" = apacheGroup; + "pm" = "dynamic"; + "pm.max_children" = builtins.toString (60 * instanceNb); + "pm.start_servers" = builtins.toString (2 * instanceNb); + "pm.min_spare_servers" = builtins.toString (2 * instanceNb); + "pm.max_spare_servers" = builtins.toString (3 * instanceNb); + "pm.process_idle_timeout" = "60"; + + "php_admin_value[output_buffering]" = "0"; + "php_admin_value[max_execution_time]" = "1800"; + "php_admin_value[zend_extension]" = "opcache"; + "php_value[apcu.enable_cli]" = "1"; + "php_value[apcu.enabled]" = "1"; + #already enabled by default? + #"php_value[opcache.enable]" = "1"; + "php_value[opcache.enable_cli]" = "1"; + "php_value[opcache.interned_strings_buffer]" = "8"; + "php_value[opcache.max_accelerated_files]" = "10000"; + "php_value[opcache.memory_consumption]" = "128"; + "php_value[opcache.save_comments]" = "1"; + "php_value[opcache.revalidate_freq]" = "1"; + "php_admin_value[memory_limit]" = "512M"; + + "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${phpBaseDir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:KanboardFarm:'"; + }; + inherit phpPackage; + }; + security.acme.certs.eldiron.extraDomainNames = customHosts ++ [ "kanboard.immae.eu" ]; + services.websites.env.tools.vhostConfs = { + kanboard = { + certName = "eldiron"; + hosts = ["kanboard.immae.eu"]; + root = null; + extraConfig = [ + '' + <Directory "${rootDir}"> + DirectoryIndex index.php + AllowOverride All + Options FollowSymlinks + Require all granted + + <FilesMatch "\.php$"> + SetHandler "proxy:unix:${config.services.phpfpm.pools.kanboard_farm.socket}|fcgi://localhost" + </FilesMatch> + </Directory> + <DirectoryMatch "${rootDir}/data"> + Require all denied + </DirectoryMatch> + '' + ] ++ builtins.attrValues cfg.vhosts; + }; + } // customVhosts; + }; +} diff --git a/systems/eldiron/websites/mail/default.nix b/systems/eldiron/websites/mail/default.nix new file mode 100644 index 0000000..0a0342b --- /dev/null +++ b/systems/eldiron/websites/mail/default.nix @@ -0,0 +1,141 @@ +{ lib, pkgs, config, ... }: +let + roundcubemail = pkgs.callPackage ./roundcubemail.nix { + roundcubemail = pkgs.webapps-roundcubemail; + env = config.myEnv.tools.roundcubemail; + inherit config; + }; + rainloop = pkgs.callPackage ./rainloop.nix { + rainloop = pkgs.rainloop-community; + }; + cfg = config.myServices.websites.tools.email; + pcfg = config.services.phpfpm.pools; +in +{ + options.myServices.websites.tools.email = { + enable = lib.mkEnableOption "enable email website"; + }; + + imports = [ + ./mta-sts.nix + ]; + + config = lib.mkIf cfg.enable { + #myServices.chatonsProperties.services.mail-rainloop = { + # file.datetime = "2022-08-22T00:30:00"; + # service = { + # name = "Rainloop"; + # description = "Simple, modern & fast web-based email client"; + # website = "https://mail.immae.eu/rainloop"; + # logo = "https://www.rainloop.net/static/img/logo-16x16.png"; + # status.level = "ERROR"; + # status.description = "Stopped due to CVE-2022-29360"; + # registration."" = ["MEMBER" "CLIENT"]; + # registration.load = "OPEN"; + # install.type = "PACKAGE"; + # }; + # software = { + # name = "Rainloop"; + # website = "https://www.rainloop.net/"; + # license.url = "https://www.rainloop.net/licensing/"; + # license.name = "GNU Affero General Public License v3.0"; + # version = rainloop.webRoot.version; + # source.url = "https://github.com/RainLoop/rainloop-webmail"; + # }; + #}; + #myServices.chatonsProperties.services.mail-roundcube = { + # file.datetime = "2022-08-22T00:30:00"; + # service = { + # name = "Roundcube"; + # description = "The Roundcube Webmail suite"; + # website = "https://mail.immae.eu/roundcube"; + # logo = "https://mail.immae.eu/roundcube/skins/elastic/images/favicon.ico"; + # status.level = "OK"; + # status.description = "OK"; + # registration."" = ["MEMBER" "CLIENT"]; + # registration.load = "OPEN"; + # install.type = "PACKAGE"; + # }; + # software = { + # name = "Roundcube"; + # website = "https://roundcube.net/"; + # license.url = "https://github.com/roundcube/roundcubemail/blob/master/LICENSE"; + # license.name = "GNU General Public License v3.0"; + # version = roundcubemail.webRoot.version; + # source.url = "https://github.com/roundcube/roundcubemail"; + # modules = map (a: a.pluginName) roundcubemail.webRoot.plugins ++ map (a: a.skinName) roundcubemail.webRoot.skins; + # }; + #}; + + myServices.dns.zones."immae.eu".subdomains.mail = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + secrets.keys = roundcubemail.keys; + + services.websites.env.tools.modules = + [ "proxy_fcgi" ] + ++ rainloop.apache.modules + ++ roundcubemail.apache.modules; + + security.acme.certs.mail.extraDomainNames = [ "mail.immae.eu" ]; + services.websites.env.tools.vhostConfs.mail = { + certName = "mail"; + hosts = ["mail.immae.eu"]; + root = ./www; + extraConfig = [ + (rainloop.apache.vhostConf pcfg.rainloop.socket) + (roundcubemail.apache.vhostConf pcfg.roundcubemail.socket) + '' + <Directory ${./www}> + Require all granted + Options -Indexes + </Directory> + '' + ]; + }; + systemd.services = { + phpfpm-rainloop = { + after = lib.mkAfter rainloop.phpFpm.serviceDeps; + wants = rainloop.phpFpm.serviceDeps; + }; + phpfpm-roundcubemail = { + after = lib.mkAfter roundcubemail.phpFpm.serviceDeps; + wants = roundcubemail.phpFpm.serviceDeps; + }; + }; + + services.phpfpm.pools.roundcubemail = { + user = "wwwrun"; + group = "wwwrun"; + settings = roundcubemail.phpFpm.pool; + phpOptions = config.services.phpfpm.phpOptions + '' + date.timezone = 'CET' + ''; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.imagick all.redis ]); + }; + services.phpfpm.pools.rainloop = { + user = "wwwrun"; + group = "wwwrun"; + settings = rainloop.phpFpm.pool; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]); + }; + system.activationScripts = { + roundcubemail = roundcubemail.activationScript; + rainloop = rainloop.activationScript; + }; + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "roundcube website is running on mail.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "mail.immae.eu" "/roundcube/" "<title>Roundcube"]; + + servicegroups = "webstatus-webapps,webstatus-email"; + _webstatus_name = "Roundcube"; + _webstatus_url = "https://mail.immae.eu/roundcube/"; + } + ]; + }; + +} diff --git a/modules/private/websites/tools/mail/mta-sts.nix b/systems/eldiron/websites/mail/mta-sts.nix similarity index 61% rename from modules/private/websites/tools/mail/mta-sts.nix rename to systems/eldiron/websites/mail/mta-sts.nix index 77ba2d4..2438702 100644 --- a/modules/private/websites/tools/mail/mta-sts.nix +++ b/systems/eldiron/websites/mail/mta-sts.nix @@ -1,42 +1,30 @@ { lib, pkgs, config, ... }: let - domains = (lib.remove null (lib.flatten (map - (zone: map - (e: if e.receive - then { - domain = "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}"; - mail = zone.name; - } - else null - ) - (zone.withEmail or []) - ) - config.myEnv.dns.masterZones - ))); + getDomains = p: lib.mapAttrsToList (n: v: v) (lib.filterAttrs (n: v: v.receive) p.emailPolicies); + bydomain = builtins.mapAttrs (n: getDomains) config.myServices.dns.zones; + domains = lib.flatten (builtins.attrValues bydomain); mxes = lib.mapAttrsToList (n: v: v.mx.subdomain) (lib.attrsets.filterAttrs (n: v: v.mx.enable) config.myEnv.servers); - # FIXME: increase the id number in modules/private/dns.nix when this - # file change (date -u +'%Y%m%d%H%M%S'Z) - file = domain: pkgs.writeText "mta-sts-${domain.domain}.txt" ( + file = d: pkgs.writeText "mta-sts-${d.fqdn}.txt" ( builtins.concatStringsSep "\r\n" ([ "version: STSv1" "mode: testing" ] - ++ (map (v: "mx: ${v}.${domain.mail}") mxes) + ++ (map (v: "mx: ${v}.${d.domain}") mxes) ++ [ "max_age: 604800" ] )); root = pkgs.runCommand "mta-sts_root" {} '' mkdir -p $out ${builtins.concatStringsSep "\n" (map (d: - "cp ${file d} $out/${d.domain}.txt" + "cp ${file d} $out/${d.fqdn}.txt" ) domains)} ''; cfg = config.myServices.websites.tools.email; in { config = lib.mkIf cfg.enable { + security.acme.certs.mail.extraDomainNames = ["mta-sts.mail.immae.eu"] ++ map (v: "mta-sts.${v.fqdn}") domains; services.websites.env.tools.vhostConfs.mta_sts = { certName = "mail"; - addToCerts = true; - hosts = ["mta-sts.mail.immae.eu"] ++ map (v: "mta-sts.${v.domain}") domains; + hosts = ["mta-sts.mail.immae.eu"] ++ map (v: "mta-sts.${v.fqdn}") domains; root = root; extraConfig = [ '' diff --git a/modules/private/websites/tools/mail/rainloop.nix b/systems/eldiron/websites/mail/rainloop.nix similarity index 87% rename from modules/private/websites/tools/mail/rainloop.nix rename to systems/eldiron/websites/mail/rainloop.nix index 20e43a1..f821005 100644 --- a/modules/private/websites/tools/mail/rainloop.nix +++ b/systems/eldiron/websites/mail/rainloop.nix @@ -5,7 +5,6 @@ rec { deps = [ "wrappers" ]; text = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/data ''; }; @@ -21,7 +20,7 @@ rec { DirectoryIndex index.php AllowOverride All Options -FollowSymlinks - Require all granted + Require all denied <FilesMatch "\.php$"> SetHandler "proxy:unix:${socket}|fcgi://localhost" @@ -48,7 +47,8 @@ rec { "php_admin_value[upload_max_filesize]" = "200M"; "php_admin_value[post_max_size]" = "200M"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Rainloop:'"; }; }; } diff --git a/modules/private/websites/tools/mail/roundcubemail.nix b/systems/eldiron/websites/mail/roundcubemail.nix similarity index 94% rename from modules/private/websites/tools/mail/roundcubemail.nix rename to systems/eldiron/websites/mail/roundcubemail.nix index 2661b55..21a10fe 100644 --- a/modules/private/websites/tools/mail/roundcubemail.nix +++ b/systems/eldiron/websites/mail/roundcubemail.nix @@ -6,7 +6,6 @@ rec { text = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \ ${varDir}/cache ${varDir}/logs - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions ''; }; keys."webapps/tools-roundcube" = { @@ -73,6 +72,7 @@ rec { $config['temp_dir'] = '${varDir}/cache'; $config['mime_types'] = '${apacheHttpd}/conf/mime.types'; ''; + keyDependencies = [ apacheHttpd ]; }; webRoot = (roundcubemail.override { roundcube_config = config.secrets.fullPaths."webapps/tools-roundcube"; }).withPlugins (p: [ p.automatic_addressbook p.carddav p.contextmenu p.contextmenu_folder p.html5_notifier p.ident_switch p.message_highlight p.thunderbird_labels ]); apache = rec { @@ -112,7 +112,8 @@ rec { "php_admin_value[upload_max_filesize]" = "200M"; "php_admin_value[post_max_size]" = "200M"; "php_admin_value[open_basedir]" = "${basedir}:${apacheHttpd}/conf/mime.types:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Roundcubemail:'"; }; }; } diff --git a/modules/private/websites/tools/mail/www/index.html b/systems/eldiron/websites/mail/www/index.html similarity index 100% rename from modules/private/websites/tools/mail/www/index.html rename to systems/eldiron/websites/mail/www/index.html diff --git a/modules/private/websites/tools/mastodon/default.nix b/systems/eldiron/websites/mastodon/default.nix similarity index 60% rename from modules/private/websites/tools/mastodon/default.nix rename to systems/eldiron/websites/mastodon/default.nix index 173a4b8..603fc9e 100644 --- a/modules/private/websites/tools/mastodon/default.nix +++ b/systems/eldiron/websites/mastodon/default.nix @@ -3,13 +3,38 @@ let env = config.myEnv.tools.mastodon; root = "${mcfg.workdir}/public/"; cfg = config.myServices.websites.tools.mastodon; - mcfg = config.services.mastodon; + mcfg = config.immaeServices.mastodon; in { options.myServices.websites.tools.mastodon = { enable = lib.mkEnableOption "enable mastodon's website"; }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.mastodon = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.mastodon = { + file.datetime = "2022-08-21T19:50:00"; + service = { + name = "Mastodon"; + description = "Your self-hosted, globally interconnected microblogging community"; + website = "https://mastodon.immae.eu/"; + logo = "https://mastodon.immae.eu/apple-touch-icon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Mastodon"; + website = "https://joinmastodon.org/"; + license.url = "https://github.com/tootsuite/mastodon/blob/master/LICENSE"; + license.name = "GNU General Public License v3.0"; + version = mcfg.package.version; + source.url = "https://github.com/tootsuite/mastodon"; + }; + }; secrets.keys."webapps/tools-mastodon" = { user = "mastodon"; group = "mastodon"; @@ -56,7 +81,7 @@ in { LDAP_SEARCH_FILTER="${env.ldap.filter}" ''; }; - services.mastodon = { + immaeServices.mastodon = { enable = true; configFile = config.secrets.fullPaths."webapps/tools-mastodon"; socketsPrefix = "live_immae"; @@ -79,9 +104,9 @@ in { services.websites.env.tools.modules = [ "headers" "proxy" "proxy_wstunnel" "proxy_http" ]; + security.acme.certs.eldiron.extraDomainNames = [ "mastodon.immae.eu" ]; services.websites.env.tools.vhostConfs.mastodon = { certName = "eldiron"; - addToCerts = true; hosts = ["mastodon.immae.eu" ]; root = root; extraConfig = [ '' @@ -98,19 +123,19 @@ in { RewriteEngine On - ProxyPass /500.html ! - ProxyPass /sw.js ! - ProxyPass /embed.js ! - ProxyPass /robots.txt ! - ProxyPass /manifest.json ! - ProxyPass /browserconfig.xml ! - ProxyPass /mask-icon.svg ! - ProxyPassMatch ^(/.*\.(png|ico|gif)$) ! - ProxyPassMatch ^/(assets|avatars|emoji|headers|packs|sounds|system|.well-known/acme-challenge) ! - RewriteRule ^/api/v1/streaming/(.+)$ unix://${mcfg.sockets.node}|http://mastodon.immae.eu/api/v1/streaming/$1 [P,NE,QSA,L] + RewriteRule ^/api/v1/streaming/public$ unix://${mcfg.sockets.node}|http://mastodon.immae.eu/api/v1/streaming/public [P,NE,QSA,L] RewriteRule ^/api/v1/streaming/$ unix://${mcfg.sockets.node}|ws://mastodon.immae.eu/ [P,NE,QSA,L] - ProxyPass / unix://${mcfg.sockets.rails}|http://mastodon.immae.eu/ + RewriteCond %{REQUEST_URI} !/500.html + RewriteCond %{REQUEST_URI} !/sw.js + RewriteCond %{REQUEST_URI} !/embed.js + RewriteCond %{REQUEST_URI} !/robots.txt + RewriteCond %{REQUEST_URI} !/manifest.json + RewriteCond %{REQUEST_URI} !/browserconfig.xml + RewriteCond %{REQUEST_URI} !/mask-icon.svg + RewriteCond %{REQUEST_URI} !^(/.*\.(png|ico|gif)$) + RewriteCond %{REQUEST_URI} !^/(assets|avatars|emoji|headers|packs|sounds|system|.well-known/acme-challenge) + RewriteRule ^/(.*)$ unix:///run/mastodon/live_immae_puma.sock|http://mastodon.immae.eu/$1 [P,NE,QSA,L] ProxyPassReverse / unix://${mcfg.sockets.rails}|http://mastodon.immae.eu/ Alias /system ${mcfg.dataDir} @@ -132,5 +157,18 @@ in { ErrorDocument 504 /500.html '' ]; }; + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "mastodon website is running on mastodon.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "mastodon.immae.eu" "/" "Mastodon"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Mastodon"; + _webstatus_url = "https://mastodon.immae.eu/"; + } + ]; }; } diff --git a/modules/private/websites/tools/mgoblin/default.nix b/systems/eldiron/websites/mgoblin/default.nix similarity index 70% rename from modules/private/websites/tools/mgoblin/default.nix rename to systems/eldiron/websites/mgoblin/default.nix index 1e5f5a0..f276c62 100644 --- a/modules/private/websites/tools/mgoblin/default.nix +++ b/systems/eldiron/websites/mgoblin/default.nix @@ -1,4 +1,4 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, mediagoblin, ... }: let env = config.myEnv.tools.mediagoblin; cfg = config.myServices.websites.tools.mediagoblin; @@ -9,6 +9,32 @@ in { }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.mgoblin = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.mediagoblin = { + file.datetime = "2022-08-21T20:00:00"; + service = { + name = "Mediagoblin"; + description = "MediaGoblin is a free software media publishing platform that anyone can run"; + website = "https://mgoblin.immae.eu/"; + logo = "https://mgoblin.immae.eu/mgoblin_static/images/goblin.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Mediagoblin"; + website = "https://mediagoblin.org/"; + license.url = "http://www.gnu.org/licenses/agpl.html"; + license.name = "GNU Affero General Public License"; + version = mcfg.package.version; + source.url = "https://git.savannah.gnu.org/git/mediagoblin.git"; + modules = map (a: a.pluginName) mcfg.package.plugins; + }; + }; secrets.keys."webapps/tools-mediagoblin" = { user = "mediagoblin"; group = "mediagoblin"; @@ -79,7 +105,7 @@ in { services.mediagoblin = { enable = true; - package = pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch]); + package = mediagoblin.withPlugins (p: [p.basicsearch]); configFile = config.secrets.fullPaths."webapps/tools-mediagoblin"; }; services.filesWatcher.mediagoblin-web = { @@ -95,9 +121,9 @@ in { "proxy" "proxy_http" ]; users.users.wwwrun.extraGroups = [ "mediagoblin" ]; + security.acme.certs.eldiron.extraDomainNames = [ "mgoblin.immae.eu" ]; services.websites.env.tools.vhostConfs.mgoblin = { certName = "eldiron"; - addToCerts = true; hosts = ["mgoblin.immae.eu" ]; root = null; extraConfig = [ '' @@ -130,5 +156,18 @@ in { ProxyPassReverse / unix://${mcfg.sockets.paster}|http://mgoblin.immae.eu/ '' ]; }; + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "mediagoblin website is running on mgoblin.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "mgoblin.immae.eu" "/" "GNU MediaGoblin"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Mediagoblin"; + _webstatus_url = "https://mgoblin.immae.eu/"; + } + ]; }; } diff --git a/modules/private/websites/moomin.txt b/systems/eldiron/websites/moomin.txt similarity index 100% rename from modules/private/websites/moomin.txt rename to systems/eldiron/websites/moomin.txt diff --git a/modules/websites/nosslVhost/index.html b/systems/eldiron/websites/nossl/index.html similarity index 100% rename from modules/websites/nosslVhost/index.html rename to systems/eldiron/websites/nossl/index.html diff --git a/modules/private/websites/tools/peertube/default.nix b/systems/eldiron/websites/peertube/default.nix similarity index 57% rename from modules/private/websites/tools/peertube/default.nix rename to systems/eldiron/websites/peertube/default.nix index 68c992f..0ebe4e7 100644 --- a/modules/private/websites/tools/peertube/default.nix +++ b/systems/eldiron/websites/peertube/default.nix @@ -2,14 +2,53 @@ let env = config.myEnv.tools.peertube; cfg = config.myServices.websites.tools.peertube; - pcfg = config.services.peertube; + pcfg = config.immaeServices.peertube; in { options.myServices.websites.tools.peertube = { enable = lib.mkEnableOption "enable Peertube's website"; }; config = lib.mkIf cfg.enable { - services.peertube = { + myServices.dns.zones."immae.eu".subdomains.peertube = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.hostings.peertube = { + file.datetime = "2022-08-21T20:00:00"; + hosting = { + name = "Peertube"; + description = "Free software to take back control of your videos"; + website = "https://peertube.immae.eu/"; + logo = "https://peertube.immae.eu/client/assets/images/icons/icon-192x192.png"; + type = "INSTANCE"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; + myServices.chatonsProperties.services.peertube = { + file.datetime = "2022-08-21T20:00:00"; + service = { + name = "Peertube"; + description = "Free software to take back control of your videos"; + website = "https://peertube.immae.eu/"; + logo = "https://peertube.immae.eu/client/assets/images/icons/icon-192x192.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Peertube"; + website = "https://joinpeertube.org/"; + license.url = "https://github.com/Chocobozzz/PeerTube/blob/develop/LICENSE"; + license.name = "GNU Affero General Public License"; + version = pcfg.package.version; + source.url = "https://github.com/Chocobozzz/PeerTube"; + }; + }; + immaeServices.peertube = { enable = true; configFile = config.secrets.fullPaths."webapps/tools-peertube"; }; @@ -68,9 +107,9 @@ in { paths = [ pcfg.configFile ]; }; + security.acme.certs.eldiron.extraDomainNames = [ "peertube.immae.eu" ]; services.websites.env.tools.vhostConfs.peertube = { certName = "eldiron"; - addToCerts = true; hosts = [ "peertube.immae.eu" ]; root = null; extraConfig = [ '' @@ -90,5 +129,19 @@ in { RequestHeader set X-Real-IP %{REMOTE_ADDR}s '' ]; }; + + myServices.monitoring.fromMasterActivatedPlugins = [ "http" ]; + myServices.monitoring.fromMasterObjects.service = [ + { + service_description = "peertube website is running on peertube.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "peertube.immae.eu" "/" "<title>Immae’s PeerTube"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Peertube"; + _webstatus_url = "https://peertube.immae.eu/"; + } + ]; }; } diff --git a/modules/private/websites/tools/performance/default.nix b/systems/eldiron/websites/performance/default.nix similarity index 79% rename from modules/private/websites/tools/performance/default.nix rename to systems/eldiron/websites/performance/default.nix index 5715ff0..23f754a 100644 --- a/modules/private/websites/tools/performance/default.nix +++ b/systems/eldiron/websites/performance/default.nix @@ -1,7 +1,7 @@ { pkgs, lib, config, ... }: let env = config.myEnv.tools.status_engine; - package = pkgs.status_engine.interface.override({ config_file = config.secrets.fullPaths."status_engine_ui"; }); + package = pkgs.status-engine-interface.override({ config_file = config.secrets.fullPaths."status_engine_ui"; }); apacheRoot = "${package}/public"; cfg = config.myServices.websites.tools.performance; in @@ -11,6 +11,9 @@ in }; config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.performance = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + secrets.keys = { status_engine_ui = { permissions = "0400"; @@ -36,7 +39,7 @@ in use_mysql: 1 mysql: host: 127.0.0.1 - port: ${env.mysql.port} + port: ${builtins.toString env.mysql.port} username: ${env.mysql.user} password: ${env.mysql.password} database: ${env.mysql.database} @@ -48,9 +51,9 @@ in services.websites.env.tools.modules = [ "proxy_fcgi" ]; + security.acme.certs.eldiron.extraDomainNames = [ "performance.immae.eu" ]; services.websites.env.tools.vhostConfs.performance = { certName = "eldiron"; - addToCerts = true; hosts = [ "performance.immae.eu" ]; root = apacheRoot; extraConfig = [ @@ -79,9 +82,11 @@ in "pm.min_spare_servers" = "1"; "pm.max_spare_servers" = "10"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:StatusEngine:'"; "php_admin_value[open_basedir]" = "${package}:/tmp:${config.secrets.fullPaths."status_engine_ui"}"; }; - phpPackage = pkgs.php74; + phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis ]); }; }; diff --git a/modules/private/websites/tools/stats/default.nix b/systems/eldiron/websites/stats/default.nix similarity index 95% rename from modules/private/websites/tools/stats/default.nix rename to systems/eldiron/websites/stats/default.nix index 71e31a3..665010b 100644 --- a/modules/private/websites/tools/stats/default.nix +++ b/systems/eldiron/websites/stats/default.nix @@ -18,9 +18,9 @@ in }; }; + security.acme.certs.eldiron.extraDomainNames = [ "stats.immae.eu" ]; services.websites.env.tools.vhostConfs.stats = { certName = "eldiron"; - addToCerts = true; hosts = [ "stats.immae.eu" ]; root = null; extraConfig = [ diff --git a/systems/eldiron/websites/tools/adminer.nix b/systems/eldiron/websites/tools/adminer.nix new file mode 100644 index 0000000..5e865b1 --- /dev/null +++ b/systems/eldiron/websites/tools/adminer.nix @@ -0,0 +1,83 @@ +{ config, webapps-adminer, php82, lib, forcePhpSocket ? null }: +rec { + webRoot = webapps-adminer; + phpFpm = rec { + user = apache.user; + group = apache.group; + phpPackage = let + #mysqli_pam = php81.extensions.mysqli.overrideAttrs(old: { + # configureFlags = [ "--with-mysqli=${libmysqlclient_pam.dev}/bin/mysql_config" "--with-mysql-sock=/run/mysqld/mysqld.sock" ]; + #}); + in + php82.withExtensions ({ enabled, all }: [all.mysqli all.redis all.pgsql]); + settings = { + "listen.owner" = apache.user; + "listen.group" = apache.group; + "pm" = "ondemand"; + "pm.max_children" = "5"; + "pm.process_idle_timeout" = "60"; + #"php_admin_flag[log_errors]" = "on"; + # Needed to avoid clashes in browser cookies (same domain) + "php_value[session.name]" = "AdminerPHPSESSID"; + "php_admin_value[open_basedir]" = "${webRoot}:/tmp"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Adminer:'"; + }; + }; + apache = rec { + user = "wwwrun"; + group = "wwwrun"; + modules = [ "proxy_fcgi" ]; + root = webRoot; + vhostConf = socket: '' + Alias /adminer ${webRoot} + <Directory ${webRoot}> + DirectoryIndex index.php + <FilesMatch "\.php$"> + SetHandler "proxy:unix:${if forcePhpSocket != null then forcePhpSocket else socket}|fcgi://localhost" + </FilesMatch> + + Use LDAPConnect + Require ldap-group cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu + Require ldap-group cn=users,cn=postgresql,cn=pam,ou=services,dc=immae,dc=eu + </Directory> + ''; + }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "adminer website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https_auth" "tools.immae.eu" "/adminer/" "www.adminerevo.org"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Adminer"; + _webstatus_url = "https://tools.immae.eu/adminer/"; + } + ]; + + chatonsProperties = { + published = false; + file.datetime = "2023-08-21T15:20:00"; + service = { + name = "Adminer"; + description = "Database management in a single PHP file"; + website = "https://tools.immae.eu/adminer/"; + logo = "https://tools.immae.eu/adminer/?file=favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Adminer"; + website = "https://docs.adminerevo.org/"; + license.url = "https://github.com/adminerevo/adminerevo/blob/main/readme.md"; + license.name = "Apache License 2.0 or GPL 2"; + version = webRoot.version; + source.url = "https://github.com/adminerevo/adminerevo/"; + }; + }; +} diff --git a/modules/private/websites/tools/tools/default.nix b/systems/eldiron/websites/tools/default.nix similarity index 62% rename from modules/private/websites/tools/tools/default.nix rename to systems/eldiron/websites/tools/default.nix index 90fcbe1..4d9e3c1 100644 --- a/modules/private/websites/tools/tools/default.nix +++ b/systems/eldiron/websites/tools/default.nix @@ -1,13 +1,14 @@ -{ lib, pkgs, config, ... }: +{ lib, pkgs, config, mypackages-lib, grocy, ... }: let - flakeCompat = import ../../../../../lib/flake-compat.nix; - - adminer = pkgs.callPackage ./adminer.nix {}; + composerEnv = mypackages-lib.composerEnv; + adminer = pkgs.callPackage ./adminer.nix { inherit config; }; ympd = pkgs.callPackage ./ympd.nix { env = config.myEnv.tools.ympd; + inherit config; }; ttrss = pkgs.callPackage ./ttrss.nix { - inherit (pkgs.webapps) ttrss ttrss-plugins; + ttrss = pkgs.webapps-ttrss; + ttrss-plugins = pkgs.webapps-ttrss-plugins; env = config.myEnv.tools.ttrss; php = pkgs.php72; inherit config; @@ -17,8 +18,8 @@ let env = config.myEnv.tools.kanboard; }; wallabag = pkgs.callPackage ./wallabag.nix { - wallabag = pkgs.webapps.wallabag.override { - composerEnv = pkgs.composerEnv.override { + wallabag = pkgs.webapps-wallabag.override { + composerEnv = composerEnv.override { php = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy]); }; }; @@ -26,59 +27,110 @@ let inherit config; }; yourls = pkgs.callPackage ./yourls.nix { - inherit (pkgs.webapps) yourls yourls-plugins; + yourls = pkgs.webapps-yourls; + yourls-plugins = pkgs.webapps-yourls-plugins; env = config.myEnv.tools.yourls; inherit config; }; rompr = pkgs.callPackage ./rompr.nix { - inherit (pkgs.webapps) rompr; + rompr = pkgs.webapps-rompr; env = config.myEnv.tools.rompr; + inherit config; }; shaarli = pkgs.callPackage ./shaarli.nix { env = config.myEnv.tools.shaarli; inherit config; }; dokuwiki = pkgs.callPackage ./dokuwiki.nix { - inherit (pkgs.webapps) dokuwiki dokuwiki-plugins; + dokuwiki = pkgs.webapps-dokuwiki; + dokuwiki-plugins = pkgs.webapps-dokuwiki-plugins; + inherit config; }; ldap = pkgs.callPackage ./ldap.nix { - inherit (pkgs.webapps) phpldapadmin; + phpldapadmin = pkgs.webapps-phpldapadmin; env = config.myEnv.tools.phpldapadmin; inherit config; }; - grocy = pkgs.callPackage ./grocy.nix { - grocy = pkgs.webapps.grocy.override { composerEnv = pkgs.composerEnv.override { php = pkgs.php72; }; }; + grocy' = pkgs.callPackage ./grocy.nix { + grocy = grocy.override { composerEnv = composerEnv.override { php = pkgs.php72; }; }; }; phpbb = pkgs.callPackage ./phpbb.nix { - phpbb = (pkgs.webapps.phpbb.withLangs (l: [ l.fr ])).withExts (e: [ + phpbb = (pkgs.webapps-phpbb.withLangs (l: [ l.fr ])).withExts (e: [ e.alfredoramos.markdown e.davidiq.mailinglist e.dmzx.mchat e.empteintesduweb.monitoranswers e.lr94.autosubscribe e.phpbbmodders.adduser ]); }; + webhooks-bin-env = pkgs.buildEnv { + name = "webhook-env"; + paths = [ pkgs.apprise ]; + pathsToLink = [ "/bin" ]; + }; webhooks = pkgs.callPackage ./webhooks.nix { env = config.myEnv.tools.webhooks; + binEnv = webhooks-bin-env; }; dmarc-reports = pkgs.callPackage ./dmarc_reports.nix { env = config.myEnv.tools.dmarc_reports; inherit config; }; - csp-reports = pkgs.callPackage ./csp_reports.nix { - env = config.myEnv.tools.csp_reports; - }; - landing = pkgs.callPackage ./landing.nix {}; + landing = pkgs.callPackage ./landing.nix { }; cfg = config.myServices.websites.tools.tools; pcfg = config.services.phpfpm.pools; in { - imports = - builtins.attrValues (flakeCompat ../../../../../flakes/private/paste).nixosModules; - options.myServices.websites.tools.tools = { enable = lib.mkEnableOption "enable tools website"; }; config = lib.mkIf cfg.enable { + # Services needing to send e-mails + myServices.dns.zones."immae.eu".emailPolicies."tools".receive = true; + myServices.dns.zones."immae.eu".subdomains = + with config.myServices.dns.helpers; + { + outils = ips servers.eldiron.ips.main; + tools = lib.mkMerge [ + (mailCommon "immae.eu") + mailSend + (ips servers.eldiron.ips.main) + ]; + }; + + myServices.chatonsProperties.services = { + adminer = adminer.chatonsProperties; + dokuwiki = dokuwiki.chatonsProperties; + shaarli = shaarli.chatonsProperties; + ttrss = ttrss.chatonsProperties; + wallabag = wallabag.chatonsProperties; + paste = { + file.datetime = "2022-08-22T00:15:00"; + service = { + name = "Paste"; + description = "A simple paster script with syntax highlight"; + website = "https://tools.immae.eu/paste/"; + logo = "https://assets.immae.eu/logo.jpg"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + guide.user = "https://tools.immae.eu/paste/"; + }; + software = { + name = "Paste"; + website = "https://tools.immae.eu/paste/"; + license.url = "https://tools.immae.eu/paste/license"; + license.name = "MIT License"; + version = "Unversioned"; + source.url = "https://tools.immae.eu/paste/abcd123/py"; + }; + }; + }; + myServices.chatonsProperties.hostings = { + dokuwiki = dokuwiki.chatonsHostingProperties; + phpbb = phpbb.chatonsHostingProperties; + }; secrets.keys = kanboard.keys // ldap.keys @@ -87,9 +139,20 @@ in { // wallabag.keys // yourls.keys // dmarc-reports.keys - // csp-reports.keys - // webhooks.keys; - + // webhooks.keys + // ({ "webapps/tools-landing-sql-rw" = { + user = "wwwrun"; + group = "wwwrun"; + permissions = "0400"; + text = let + env = config.myEnv.tools.landing; + in '' + SetEnv PGUSER "${env.postgresql.user}" + SetEnv PGPASSWORD "${env.postgresql.password}" + SetEnv PGDATABASE "${env.postgresql.database}" + SetEnv PGHOST "${env.postgresql.socket}" + ''; + }; }); services.websites.env.tools.modules = [ "proxy_fcgi" ] ++ adminer.apache.modules @@ -105,10 +168,12 @@ in { ++ ldap.apache.modules ++ kanboard.apache.modules; + myServices.dns.zones."immae.dev" = with config.myServices.dns.helpers; { + subdomains.tools = ips servers.eldiron.ips.integration; + }; + security.acme.certs.integration.domain = "tools.immae.dev"; services.websites.env.integration.vhostConfs.devtools = { certName = "integration"; - certMainHost = "tools.immae.dev"; - addToCerts = true; hosts = [ "tools.immae.dev" ]; root = "/var/lib/ftp/immae/devtools"; extraConfig = [ @@ -129,9 +194,10 @@ in { ]; }; + + security.acme.certs.eldiron.extraDomainNames = [ "outils.immae.eu" "tools.immae.eu" ]; services.websites.env.tools.vhostConfs.tools = { certName = "eldiron"; - addToCerts = true; hosts = ["tools.immae.eu" ]; root = landing; extraConfig = [ @@ -141,6 +207,7 @@ in { RedirectMatch 301 ^/jappix(.*)$ https://im.immae.fr/converse <Directory "${landing}"> + Include ${config.secrets.fullPaths."webapps/tools-landing-sql-rw"} DirectoryIndex index.html AllowOverride None Require all granted @@ -160,7 +227,7 @@ in { (dokuwiki.apache.vhostConf pcfg.dokuwiki.socket) (ldap.apache.vhostConf pcfg.ldap.socket) (kanboard.apache.vhostConf pcfg.kanboard.socket) - (grocy.apache.vhostConf pcfg.grocy.socket) + (grocy'.apache.vhostConf pcfg.grocy.socket) (phpbb.apache.vhostConf pcfg.phpbb.socket) (dmarc-reports.apache.vhostConf pcfg.dmarc-reports.socket) '' @@ -175,6 +242,20 @@ in { ProxyPreserveHost on </Location> + <Location "/ntfy/"> + SetEnv proxy-nokeepalive 1 + SetEnv proxy-sendchunked 1 + LimitRequestBody 102400 + + RewriteEngine On + + # FIXME: why is landing prefixed in the url? + RewriteCond %{HTTP:Upgrade} websocket [NC] + RewriteCond %{HTTP:Connection} upgrade [NC] + RewriteRule ^(${landing}/ntfy)?/?(.*) unix:///run/ntfy/ntfy.sock|ws://tools.immae.eu/$2 [P,NE,QSA,L] + + RewriteRule ^(${landing}/ntfy)?/?(.*) unix:///run/ntfy/ntfy.sock|http://tools.immae.eu/$2 [P,NE,QSA,L] + </Location> Alias /BIP39 /var/lib/buildbot/outputs/immae/bip39 <Directory "/var/lib/buildbot/outputs/immae/bip39"> DirectoryIndex index.html @@ -185,6 +266,7 @@ in { Alias /webhooks ${config.secrets.fullPaths."webapps/webhooks"} <Directory "${config.secrets.fullPaths."webapps/webhooks"}"> Options -Indexes + DirectoryIndex index.php Require all granted AllowOverride None <FilesMatch "\.php$"> @@ -197,7 +279,6 @@ in { services.websites.env.tools.vhostConfs.outils = { certName = "eldiron"; - addToCerts = true; hosts = [ "outils.immae.eu" ]; root = null; extraConfig = [ @@ -261,6 +342,18 @@ in { after = lib.mkAfter yourls.phpFpm.serviceDeps; wants = yourls.phpFpm.serviceDeps; }; + ntfy = { + description = "send push notifications to your phone or desktop via scripts from any computer"; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + ExecStart = "${pkgs.ntfy-sh}/bin/ntfy serve --listen-http '' --listen-unix %t/ntfy/ntfy.sock --cache-file %S/ntfy/cache.db --cache-duration 120h --behind-proxy --attachment-cache-dir %S/ntfy/attachments --base-url https://tools.immae.eu/ntfy"; + Type = "simple"; + WorkingDirectory = "%S/ntfy"; + RuntimeDirectory = "ntfy"; + StateDirectory = "ntfy"; + User = "wwwrun"; + }; + }; ympd = { description = "Standalone MPD Web GUI written in C"; wantedBy = [ "multi-user.target" ]; @@ -303,18 +396,21 @@ in { "pm.min_spare_servers" = "1"; "pm.max_spare_servers" = "10"; + "php_admin_value[sendmail_path]" = "/run/wrappers/bin/sendmail -t -i"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Tools:'"; # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "ToolsPHPSESSID"; "php_admin_value[open_basedir]" = builtins.concatStringsSep ":" [ "/run/wrappers/bin/sendmail" landing "/tmp" config.secrets.fullPaths."webapps/webhooks" + "${webhooks-bin-env}/bin" ]; - "include" = config.secrets.fullPaths."webapps/tools-csp-reports.conf"; }; phpEnv = { CONTACT_EMAIL = config.myEnv.tools.contact; }; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]); }; devtools = { user = "wwwrun"; @@ -328,92 +424,92 @@ in { "pm.min_spare_servers" = "1"; "pm.max_spare_servers" = "10"; + "php_admin_value[sendmail_path]" = "/run/wrappers/bin/sendmail -t -i"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Devtools:'"; "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:/var/lib/ftp/immae/devtools:/tmp"; }; - phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.mysqli all.redis all.apcu all.opcache ]); + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.mysqli all.sqlite3 all.redis all.apcu all.opcache ]); }; adminer = adminer.phpFpm; ttrss = { user = "wwwrun"; group = "wwwrun"; settings = ttrss.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; wallabag = { user = "wwwrun"; group = "wwwrun"; settings = wallabag.phpFpm.pool; - phpPackage = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy]); + phpPackage = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy all.redis]); }; yourls = { user = "wwwrun"; group = "wwwrun"; settings = yourls.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; rompr = { user = "wwwrun"; group = "wwwrun"; settings = rompr.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; shaarli = { user = "wwwrun"; group = "wwwrun"; settings = shaarli.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; dmarc-reports = { user = "wwwrun"; group = "wwwrun"; settings = dmarc-reports.phpFpm.pool; phpEnv = dmarc-reports.phpFpm.phpEnv; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; dokuwiki = { user = "wwwrun"; group = "wwwrun"; settings = dokuwiki.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; phpbb = { user = "wwwrun"; group = "wwwrun"; settings = phpbb.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; ldap = { user = "wwwrun"; group = "wwwrun"; settings = ldap.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; kanboard = { user = "wwwrun"; group = "wwwrun"; settings = kanboard.phpFpm.pool; - phpPackage = pkgs.php72; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; grocy = { user = "wwwrun"; group = "wwwrun"; - settings = grocy.phpFpm.pool; - phpPackage = pkgs.php72; + settings = grocy'.phpFpm.pool; + phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]); }; }; system.activationScripts = { - adminer = adminer.activationScript; - grocy = grocy.activationScript; + grocy = grocy'.activationScript; ttrss = ttrss.activationScript; wallabag = wallabag.activationScript; - yourls = yourls.activationScript; rompr = rompr.activationScript; shaarli = shaarli.activationScript; dokuwiki = dokuwiki.activationScript; phpbb = phpbb.activationScript; kanboard = kanboard.activationScript; - ldap = ldap.activationScript; }; services.websites.env.tools.watchPaths = [ @@ -424,6 +520,28 @@ in { paths = [ config.secrets.fullPaths."webapps/tools-wallabag" ]; }; + myServices.monitoring.fromMasterActivatedPlugins = lib.mkMerge [ + ttrss.monitoringPlugins + rompr.monitoringPlugins + wallabag.monitoringPlugins + yourls.monitoringPlugins + ympd.monitoringPlugins + dokuwiki.monitoringPlugins + shaarli.monitoringPlugins + ldap.monitoringPlugins + adminer.monitoringPlugins + ]; + myServices.monitoring.fromMasterObjects = lib.mkMerge [ + ttrss.monitoringObjects + rompr.monitoringObjects + wallabag.monitoringObjects + yourls.monitoringObjects + ympd.monitoringObjects + dokuwiki.monitoringObjects + shaarli.monitoringObjects + ldap.monitoringObjects + adminer.monitoringObjects + ]; }; } diff --git a/modules/private/websites/tools/tools/dmarc_reports.nix b/systems/eldiron/websites/tools/dmarc_reports.nix similarity index 86% rename from modules/private/websites/tools/tools/dmarc_reports.nix rename to systems/eldiron/websites/tools/dmarc_reports.nix index 8a77b13..8b3aa99 100644 --- a/modules/private/websites/tools/tools/dmarc_reports.nix +++ b/systems/eldiron/websites/tools/dmarc_reports.nix @@ -10,7 +10,7 @@ rec { $dbname = "${env.mysql.database}"; $dbuser = "${env.mysql.user}"; $dbpass = "${env.mysql.password}"; - $dbport = "${env.mysql.port}"; + $dbport = "${builtins.toString env.mysql.port}"; $anonymous_key = "${env.anonymous_key}"; ?> ''; @@ -49,6 +49,8 @@ rec { "pm.max_children" = "60"; "pm.process_idle_timeout" = "60"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:DmarcReports:'"; # Needed to avoid clashes in browser cookies (same domain) "php_admin_value[open_basedir]" = "${basedir}:/tmp"; }; diff --git a/modules/private/websites/tools/tools/dmarc_reports/api.php b/systems/eldiron/websites/tools/dmarc_reports/api.php similarity index 100% rename from modules/private/websites/tools/tools/dmarc_reports/api.php rename to systems/eldiron/websites/tools/dmarc_reports/api.php diff --git a/modules/private/websites/tools/tools/dmarc_reports/app.js b/systems/eldiron/websites/tools/dmarc_reports/app.js similarity index 100% rename from modules/private/websites/tools/tools/dmarc_reports/app.js rename to systems/eldiron/websites/tools/dmarc_reports/app.js diff --git a/modules/private/websites/tools/tools/dmarc_reports/default.css b/systems/eldiron/websites/tools/dmarc_reports/default.css similarity index 100% rename from modules/private/websites/tools/tools/dmarc_reports/default.css rename to systems/eldiron/websites/tools/dmarc_reports/default.css diff --git a/modules/private/websites/tools/tools/dmarc_reports/index.html b/systems/eldiron/websites/tools/dmarc_reports/index.html similarity index 100% rename from modules/private/websites/tools/tools/dmarc_reports/index.html rename to systems/eldiron/websites/tools/dmarc_reports/index.html diff --git a/systems/eldiron/websites/tools/dokuwiki.nix b/systems/eldiron/websites/tools/dokuwiki.nix new file mode 100644 index 0000000..813c426 --- /dev/null +++ b/systems/eldiron/websites/tools/dokuwiki.nix @@ -0,0 +1,106 @@ +{ lib, stdenv, dokuwiki, dokuwiki-plugins, config }: +rec { + varDir = "/var/lib/dokuwiki"; + activationScript = { + deps = [ "wrappers" ]; + text = '' + if [ ! -d ${varDir} ]; then + install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \ + ${varDir}/animals + cp -a ${webRoot}/conf.dist ${varDir}/conf + cp -a ${webRoot}/data.dist ${varDir}/data + cp -a ${webRoot}/ + chown -R ${apache.user}:${apache.user} ${varDir}/config ${varDir}/data + chmod -R 755 ${varDir}/config ${varDir}/data + fi + ''; + }; + chatonsHostingProperties = { + file.datetime = "2022-08-21T22:50:00"; + hosting = { + name = "Dokuwiki"; + description = "DokuWiki is a simple to use and highly versatile Open Source wiki software"; + website = "https://tools.immae.eu/dokuwiki/"; + logo = "https://tools.immae.eu/dokuwiki/lib/tpl/dokuwiki/images/apple-touch-icon.png"; + type = "INSTANCE"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; + chatonsProperties = { + file.datetime = "2022-08-21T22:50:00"; + service = { + name = "Dokuwiki"; + description = "DokuWiki is a simple to use and highly versatile Open Source wiki software"; + website = "https://tools.immae.eu/dokuwiki/"; + logo = "https://tools.immae.eu/dokuwiki/lib/tpl/dokuwiki/images/apple-touch-icon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Dokuwiki"; + website = "https://www.dokuwiki.org/dokuwiki"; + license.url = "http://www.gnu.org/licenses/gpl-2.0.html"; + license.name = "GNU General Public License Version 2"; + version = webRoot.version; + source.url = "https://download.dokuwiki.org/"; + modules = map (a: a.pluginName) webRoot.plugins; + }; + }; + webRoot = dokuwiki.withPlugins (p: [ p.farmer p.todo ]); + apache = rec { + user = "wwwrun"; + group = "wwwrun"; + modules = [ "proxy_fcgi" ]; + root = webRoot; + vhostConf = socket: '' + Alias /dokuwiki "${root}" + <Directory "${root}"> + DirectoryIndex index.php + <FilesMatch "\.php$"> + SetHandler "proxy:unix:${socket}|fcgi://localhost" + </FilesMatch> + + AllowOverride All + Options +FollowSymlinks + Require all granted + </Directory> + ''; + }; + phpFpm = rec { + serviceDeps = [ "openldap.service" ]; + basedir = builtins.concatStringsSep ":" ( + [ webRoot varDir ] ++ webRoot.plugins); + pool = { + "listen.owner" = apache.user; + "listen.group" = apache.group; + "pm" = "ondemand"; + "pm.max_children" = "60"; + "pm.process_idle_timeout" = "60"; + + # Needed to avoid clashes in browser cookies (same domain) + "php_value[session.name]" = "DokuwikiPHPSESSID"; + "php_admin_value[open_basedir]" = "${basedir}:/tmp"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Dokuwiki:'"; + }; + }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "dokuwiki website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "tools.immae.eu" "/dokuwiki/" "<title>start"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Dokuwiki"; + _webstatus_url = "https://tools.immae.eu/dokuwiki/"; + } + ]; +} diff --git a/modules/private/websites/tools/tools/grocy.nix b/systems/eldiron/websites/tools/grocy.nix similarity index 86% rename from modules/private/websites/tools/tools/grocy.nix rename to systems/eldiron/websites/tools/grocy.nix index 3c45261..96e18a3 100644 --- a/modules/private/websites/tools/tools/grocy.nix +++ b/systems/eldiron/websites/tools/grocy.nix @@ -5,7 +5,6 @@ rec { deps = [ "wrappers" ]; text = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions ''; }; webRoot = grocy.webRoot; @@ -41,7 +40,8 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "grocyPHPSESSID"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Grocy:'"; }; }; } diff --git a/modules/private/websites/tools/tools/kanboard.nix b/systems/eldiron/websites/tools/kanboard.nix similarity index 56% rename from modules/private/websites/tools/tools/kanboard.nix rename to systems/eldiron/websites/tools/kanboard.nix index 4809a42..db39ecd 100644 --- a/modules/private/websites/tools/tools/kanboard.nix +++ b/systems/eldiron/websites/tools/kanboard.nix @@ -5,7 +5,6 @@ rec { deps = [ "wrappers" ]; text = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions install -TDm644 ${webRoot}/dataold/.htaccess ${varDir}/data/.htaccess install -TDm644 ${webRoot}/dataold/web.config ${varDir}/data/web.config ''; @@ -15,30 +14,28 @@ rec { group = apache.group; permissions = "0400"; text = '' - <?php - define('MAIL_FROM', 'kanboard@tools.immae.eu'); + SetEnv MAIL_FROM "kanboard@tools.immae.eu" - define('DB_DRIVER', 'postgres'); - define('DB_USERNAME', '${env.postgresql.user}'); - define('DB_PASSWORD', '${env.postgresql.password}'); - define('DB_HOSTNAME', '${env.postgresql.socket}'); - define('DB_NAME', '${env.postgresql.database}'); + SetEnv DB_DRIVER "postgres" + SetEnv DB_USERNAME "${env.postgresql.user}" + SetEnv DB_PASSWORD "${env.postgresql.password}" + SetEnv DB_HOSTNAME "${env.postgresql.socket}" + SetEnv DB_NAME "${env.postgresql.database}" - define('DATA_DIR', '${varDir}'); - define('LDAP_AUTH', true); - define('LDAP_SERVER', '${env.ldap.host}'); - define('LDAP_START_TLS', true); + SetEnv DATA_DIR "${varDir}" + SetEnv LDAP_AUTH "true" + SetEnv LDAP_SERVER "${env.ldap.host}" + SetEnv LDAP_START_TLS "true" - define('LDAP_BIND_TYPE', 'proxy'); - define('LDAP_USERNAME', '${env.ldap.dn}'); - define('LDAP_PASSWORD', '${env.ldap.password}'); - define('LDAP_USER_BASE_DN', '${env.ldap.base}'); - define('LDAP_USER_FILTER', '${env.ldap.filter}'); - define('LDAP_GROUP_ADMIN_DN', '${env.ldap.admin_dn}'); - ?> + SetEnv LDAP_BIND_TYPE "proxy" + SetEnv LDAP_USERNAME "${env.ldap.dn}" + SetEnv LDAP_PASSWORD "${env.ldap.password}" + SetEnv LDAP_USER_BASE_DN "${env.ldap.base}" + SetEnv LDAP_USER_FILTER "${env.ldap.filter}" + SetEnv LDAP_GROUP_ADMIN_DN "${env.ldap.admin_dn}" ''; }; - webRoot = kanboard { kanboard_config = config.secrets.fullPaths."webapps/tools-kanboard"; }; + webRoot = kanboard; apache = rec { user = "wwwrun"; group = "wwwrun"; @@ -46,6 +43,9 @@ rec { root = webRoot; vhostConf = socket: '' Alias /kanboard "${root}" + <Location /kanboard> + Include ${config.secrets.fullPaths."webapps/tools-kanboard"} + </Location> <Directory "${root}"> DirectoryIndex index.php AllowOverride All @@ -63,7 +63,7 @@ rec { }; phpFpm = rec { serviceDeps = [ "postgresql.service" "openldap.service" ]; - basedir = builtins.concatStringsSep ":" [ webRoot varDir config.secrets.fullPaths."webapps/tools-kanboard" ]; + basedir = builtins.concatStringsSep ":" [ webRoot varDir ]; pool = { "listen.owner" = apache.user; "listen.group" = apache.group; @@ -74,7 +74,8 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "KanboardPHPSESSID"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Kanboard:'"; }; }; } diff --git a/systems/eldiron/websites/tools/landing.nix b/systems/eldiron/websites/tools/landing.nix new file mode 100644 index 0000000..f5d851e --- /dev/null +++ b/systems/eldiron/websites/tools/landing.nix @@ -0,0 +1,38 @@ +{ stdenv, yarn2nix-moretea, nodejs_16 }: +let + source = builtins.fetchGit { + url = "https://git.immae.eu/github/bastienwirtz/homer.git"; + ref = "gitolite_local/local_changes"; + rev = "bb60c5b869931f305f15c5bfa9cdb3f68702f01f"; + narHash = "sha256-xBIBUJhQ7KPY0d92pW9ErA9OvGafWcxyuGkbHShF4Bs="; + }; + yarnModules = yarn2nix-moretea.mkYarnModules rec { + nodejs = nodejs_16; + name = "landing"; + pname = name; + version = "v1.0.0"; + packageJSON = "${source}/package.json"; + yarnLock = "${source}/yarn.lock"; + yarnNix = ./landing/yarn-packages.nix; + }; +in + stdenv.mkDerivation rec { + pname = "landing"; + version = "v1.0.0"; + src = source; + + buildInputs = [ yarnModules yarn2nix-moretea.yarn ]; + configurePhase = '' + ln -s ${yarnModules}/node_modules . + ''; + buildPhase = '' + # See https://stackoverflow.com/questions/74548318/how-to-resolve-error-error0308010cdigital-envelope-routinesunsupported-no + export NODE_OPTIONS=--openssl-legacy-provider + yarn build + ''; + installPhase = '' + cp -a dist $out + cp ${./landing}/*.php $out/ + ln -s service-worker.js $out/worker.js + ''; + } diff --git a/modules/private/websites/tools/tools/landing/ldap_password.php b/systems/eldiron/websites/tools/landing/ldap_password.php similarity index 80% rename from modules/private/websites/tools/tools/landing/ldap_password.php rename to systems/eldiron/websites/tools/landing/ldap_password.php index b6079e5..efb4f57 100644 --- a/modules/private/websites/tools/tools/landing/ldap_password.php +++ b/systems/eldiron/websites/tools/landing/ldap_password.php @@ -18,6 +18,42 @@ $message = array(); $message_css = ""; +function changePasswordLDAP($con, $user_dn, $newPassword){ + global $message; + $salt = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',4)),0,4); + $encoded_newPassword = "{SSHA}" . base64_encode(pack("H*", sha1($newPassword.$salt)).$salt); + + $entry = array(); + $entry["userPassword"] = "$encoded_newPassword"; + + if (ldap_modify($con,$user_dn,$entry) === false){ + $error = ldap_error($con); + $errno = ldap_errno($con); + $message[] = "$errno - $error"; + return false; + } else { + return true; + } +} + +function changePasswordSQL($user_realm, $newPassword) { + global $message; + + foreach(["PGUSER", "PGPASSWORD", "PGDATABASE", "PGHOST"] as $k) { + if (isset($_SERVER[$k]) && !isset($_ENV[$k])) { + putenv("${k}=" . $_SERVER[$k]); + } + } + $con = pg_connect(""); + $result = pg_query_params($con, "WITH newsalt as (SELECT gen_random_bytes(4)) UPDATE ldap_users SET password = encode(digest( $1 || (SELECT * FROM newsalt), 'sha1'), 'hex'), mechanism = 'SSHA', salt = (SELECT * FROM newsalt) where login || '@' || realm = $2", array($newPassword, $user_realm)); + if (!$result) { + $message[] = "Error when accessing database"; + return false; + } else { + return true; + } +} + function changePassword($user,$oldPassword,$newPassword,$newPasswordCnf){ global $message; global $message_css; @@ -46,26 +82,20 @@ function changePassword($user,$oldPassword,$newPassword,$newPasswordCnf){ return false; } - $salt = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',4)),0,4); - $encoded_newPassword = "{SSHA}" . base64_encode(pack("H*", sha1($newPassword.$salt)).$salt); - $user_search = ldap_search($con,"dc=immae,dc=eu","(uid=$user)"); $auth_entry = ldap_first_entry($con, $user_search); - $mail_addresses = ldap_get_values($con, $auth_entry, "mail"); - $given_names = ldap_get_values($con, $auth_entry, "givenName"); - $mail_address = $mail_addresses[0]; - $first_name = $given_names[0]; - - /* And Finally, Change the password */ - $entry = array(); - $entry["userPassword"] = "$encoded_newPassword"; + $mail_address = ldap_get_values($con, $auth_entry, "mail")[0]; + $first_name = ldap_get_values($con, $auth_entry, "givenName")[0]; + $existing_password = ldap_get_values($con, $auth_entry, "userPassword")[0]; + if (substr($existing_password, 0, 6) == "{SASL}") { + $result = changePasswordSQL(substr($existing_password, 6), $newPassword); + } else { + $result = changePasswordLDAP($con, $user_dn, $newPassword); + } - if (ldap_modify($con,$user_dn,$entry) === false){ - $error = ldap_error($con); - $errno = ldap_errno($con); + if (!$result) { $message[] = "E201 - Your password cannot be changed, please contact the administrator."; - $message[] = "$errno - $error"; } else { $message_css = "yes"; mail($mail_address,"Password change notice","Dear $first_name, diff --git a/modules/private/websites/tools/tools/landing/ldap_ssh_keys.php b/systems/eldiron/websites/tools/landing/ldap_ssh_keys.php similarity index 75% rename from modules/private/websites/tools/tools/landing/ldap_ssh_keys.php rename to systems/eldiron/websites/tools/landing/ldap_ssh_keys.php index 259e28d..85ed973 100644 --- a/modules/private/websites/tools/tools/landing/ldap_ssh_keys.php +++ b/systems/eldiron/websites/tools/landing/ldap_ssh_keys.php @@ -78,33 +78,14 @@ function checkSshKey($sshKey) function isUserLogged() { - return (isset($_SESSION["login"]) && doConnect() !== NULL); -} - -function doConnect() -{ - global $connection; - $server = "ldaps://ldap.immae.eu"; - - if ($connection === NULL) { - $connection = ldap_connect($server); - ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, 3); - if (isset($_SESSION["user_dn"]) && isset($_SESSION["password"])) { - if (ldap_bind($connection, $_SESSION["user_dn"], $_SESSION["password"]) === false) { - $connection = NULL; - unset($_SESSION["user_dn"]); - unset($_SESSION["password"]); - unset($_SESSION["login"]); - } - } - } - - return $connection; + return (isset($_SESSION["login"])); } function checkLogin($user, $password) { - $con = doConnect(); + $server = "ldaps://ldap.immae.eu"; + $con = ldap_connect($server); + ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3); $user_dn = "uid=$user,ou=users,dc=immae,dc=eu"; @@ -112,7 +93,6 @@ function checkLogin($user, $password) return false; } $_SESSION["user_dn"] = $user_dn; - $_SESSION["password"] = $password; $user_search = ldap_search($con,"dc=immae,dc=eu","(uid=$user)"); $auth_entry = ldap_first_entry($con, $user_search); @@ -120,48 +100,61 @@ function checkLogin($user, $password) return true; } -function getLdapInfo() -{ - $con = doConnect(); - if (!isset($_SESSION["user_dn"])) { - $sortieLdap = []; - } else { - $user_read = ldap_read($con, $_SESSION["user_dn"], "(objectclass=*)", array("uid","immaeSshKey")); - $user_entry = ldap_first_entry($con, $user_read); - $sortieLdap = ldap_get_values($con, $user_entry, "immaeSshKey"); - unset($sortieLdap["count"]); - } - - $keys = []; - foreach ($sortieLdap as $line) { - $exploded = explode(' ', $line); - - $apps = explode('|', $exploded[0]); - $publicKey = $exploded[1] . ' ' . $exploded[2]; - - unset($exploded[0]); - unset($exploded[1]); - unset($exploded[2]); - - $comment = implode(' ', $exploded); - - $keys[] = [ - 'apps' => $apps, - 'public_key' => $publicKey, - 'comment' => $comment, - ]; +function connectPg() { + foreach(["PGUSER", "PGPASSWORD", "PGDATABASE", "PGHOST"] as $k) { + if (isset($_SERVER[$k]) && !isset($_ENV[$k])) { + putenv("${k}=" . $_SERVER[$k]); } + } + $con = pg_connect(""); + if (!$con) { + die("database access error"); + } + return $con; +} +function getKeys() +{ + $keys = []; + if (!isset($_SESSION["login"])) return $keys; + $pg = connectPg(); + $result = pg_query_params($pg, "SELECT id,key,array_to_json(usage) as usage,comment FROM ldap_users_ssh_keys WHERE realm = 'immae' AND login = $1 ORDER BY id", array($_SESSION["login"])); + if (!$result) { + die("database access error"); + } + $keys = []; + while ($row = pg_fetch_assoc($result)) { + $keys[] = array( + 'id' => $row["id"], + 'apps' => json_decode($row["usage"]), + 'public_key' => $row["key"], + 'comment' => $row["comment"], + ); + } + + pg_close($pg); + return $keys; } -function pushLdapInfos($keys) +function saveKeys($keys) { - $con = doConnect(); - if (!isset($_SESSION["user_dn"])) - return false; - - return ldap_mod_replace($con, $_SESSION["user_dn"], array("immaeSshKey" => $keys)); + if (!isset($_SESSION["login"])) { + return false; + } + $pg = connectPg(); + $existingIds = pg_fetch_all_columns(pg_query_params($pg, "SELECT id FROM ldap_users_ssh_keys WHERE realm = 'immae' AND login = $1", array($_SESSION["login"]))); + foreach ($keys as $key) { + if (isset($key["id"])) { + unset($existingIds[array_search($key["id"],$existingIds)]); + pg_query_params($pg, "UPDATE ldap_users_ssh_keys SET key = $2, usage = ARRAY(SELECT * FROM json_array_elements_text($3))::ldap_users_ssh_key_usage[], comment = $4 WHERE id = $5 AND login = $1 AND realm = 'immae'", array($_SESSION["login"], $key["public_key"], json_encode($key["apps"]), $key["comment"], $key["id"])); + } else { + pg_query_params($pg, "INSERT INTO ldap_users_ssh_keys (login,realm,key,usage,comment) values ($1,'immae',$2,ARRAY(SELECT * FROM json_array_elements_text($3))::ldap_users_ssh_key_usage[],$4)", array($_SESSION["login"], $key["public_key"], json_encode($key["apps"]), $key["comment"])); + } + } + foreach ($existingIds as $removedKeyId) { + pg_query_params($pg, "DELETE FROM ldap_users_ssh_keys WHERE login = $1 AND realm = 'immae' AND id = $2", array($_SESSION["login"], $removedKeyId)); + } } @@ -192,12 +185,12 @@ if (isset($_POST['sauvegarder'])) { } if (!isset($editedKeys[$id]['error']) || $editedKeys[$id]['error'] !== true) { - $keysToSave[] = implode('|', $key['apps']) . ' ' . $key['public_key'] . ' ' . $key['comment']; + $keysToSave[] = $key; } } if (!$errors) { - $successSave = pushLdapInfos($keysToSave); + $successSave = saveKeys($keysToSave); } } @@ -213,7 +206,7 @@ if (isset($_POST['login'])) { } if (isUserLogged()) : - $keys = isset($editedKeys) ? $editedKeys : getLdapInfo(); + $keys = isset($editedKeys) ? $editedKeys : getKeys(); ?> <p>Connecté en tant que <b><?= $_SESSION['login']; ?></b></p> @@ -246,7 +239,7 @@ if (isUserLogged()) : ?> <td><input type="checkbox" name="keys[<?= $id ?>][apps][]" value="<?= $app ?>"<?= $checked ? ' checked' : '' ?>></td> <?php endforeach; ?> - <td class="delete-button" rowspan="2"><button class="delete">Suppr.</button></td> + <td class="delete-button" rowspan="2"><input type="hidden" name="keys[<?= $id ?>][id]" value="<?= $sshKey["id"] ?>"><button class="delete">Suppr.</button></td> </tr> <tr class="sshkeyrow"> <td colspan="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name="keys[<?= $id ?>][public_key]" <?php if (isset($sshKey['error']) && $sshKey['error'] === true) :?>style="color: red"<?php endif; ?>><?= $sshKey['public_key'] ?></textarea></td> @@ -267,6 +260,8 @@ if (isUserLogged()) : function deleteLine(element) { element.addEventListener('click', function(e) { e.preventDefault(); + e.target.closest('tr').nextElementSibling.remove(); + e.target.closest('tr').previousElementSibling.remove(); e.target.closest('tr').remove(); }, false); } @@ -306,7 +301,7 @@ if (isUserLogged()) : </tr>`; newLine += `<tr class="sshkeyrow"> - <td colspan="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name="keys[$[i}][public_key]"></textarea></td> + <td colspan="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name="keys[${i}][public_key]"></textarea></td> </tr>`; diff --git a/modules/private/websites/tools/tools/landing/myip.php b/systems/eldiron/websites/tools/landing/myip.php similarity index 100% rename from modules/private/websites/tools/tools/landing/myip.php rename to systems/eldiron/websites/tools/landing/myip.php diff --git a/modules/private/websites/tools/tools/landing/node-packages.nix b/systems/eldiron/websites/tools/landing/node-packages.nix similarity index 100% rename from modules/private/websites/tools/tools/landing/node-packages.nix rename to systems/eldiron/websites/tools/landing/node-packages.nix diff --git a/modules/private/websites/tools/tools/landing/yarn-packages.nix b/systems/eldiron/websites/tools/landing/yarn-packages.nix similarity index 100% rename from modules/private/websites/tools/tools/landing/yarn-packages.nix rename to systems/eldiron/websites/tools/landing/yarn-packages.nix diff --git a/modules/private/websites/tools/tools/ldap.nix b/systems/eldiron/websites/tools/ldap.nix similarity index 74% rename from modules/private/websites/tools/tools/ldap.nix rename to systems/eldiron/websites/tools/ldap.nix index 2ca59f7..9509169 100644 --- a/modules/private/websites/tools/tools/ldap.nix +++ b/systems/eldiron/websites/tools/ldap.nix @@ -1,11 +1,5 @@ { lib, php, env, writeText, phpldapadmin, config }: rec { - activationScript = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/phpldapadmin - ''; - }; keys."webapps/tools-ldap" = { user = apache.user; group = apache.group; @@ -62,8 +56,22 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "LdapPHPSESSID"; - "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/phpldapadmin"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/phpldapadmin"; + "php_admin_value[open_basedir]" = "${basedir}:/tmp"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:PhpLDAPAdmin:'"; }; }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "ldap website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "tools.immae.eu" "/ldap/" "<title>phpLDAPadmin"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "LDAP"; + _webstatus_url = "https://tools.immae.eu/ldap/"; + } + ]; } diff --git a/modules/private/websites/tools/tools/phpbb.nix b/systems/eldiron/websites/tools/phpbb.nix similarity index 71% rename from modules/private/websites/tools/tools/phpbb.nix rename to systems/eldiron/websites/tools/phpbb.nix index 77845c3..c1cbd6f 100644 --- a/modules/private/websites/tools/tools/phpbb.nix +++ b/systems/eldiron/websites/tools/phpbb.nix @@ -9,9 +9,22 @@ rec { cp -a ${phpbb}/vars/* ${varDir} chown -R ${apache.user}:${apache.user} ${varDir} fi - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions ''; }; + chatonsHostingProperties = { + file.datetime = "2022-08-21T22:50:00"; + hosting = { + name = "phpBB"; + description = "Forum software"; + website = "https://tools.immae.eu/forum"; + logo = "https://www.phpbb.com/favicon.ico"; + type = "INSTANCE"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + }; webRoot = phpbb; apache = rec { user = "wwwrun"; @@ -49,7 +62,8 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "PhpBBPHPSESSID"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:PhpBB:'"; }; }; } diff --git a/modules/private/websites/tools/tools/rompr.nix b/systems/eldiron/websites/tools/rompr.nix similarity index 75% rename from modules/private/websites/tools/tools/rompr.nix rename to systems/eldiron/websites/tools/rompr.nix index e80d6b2..a7308ce 100644 --- a/modules/private/websites/tools/tools/rompr.nix +++ b/systems/eldiron/websites/tools/rompr.nix @@ -1,9 +1,9 @@ -{ lib, env, rompr }: +{ lib, env, rompr, config }: rec { varDir = "/var/lib/rompr"; activationScript = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \ - ${varDir}/prefs ${varDir}/albumart ${varDir}/phpSessions + ${varDir}/prefs ${varDir}/albumart ''; webRoot = rompr; apache = rec { @@ -57,7 +57,8 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "RomprPHPSESSID"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Rompr:'"; "php_flag[magic_quotes_gpc]" = "Off"; "php_flag[track_vars]" = "On"; "php_flag[register_globals]" = "Off"; @@ -69,4 +70,17 @@ rec { "php_admin_value[memory_limit]" = "256M"; }; }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "rompr mpd website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https_auth" "tools.immae.eu" "/rompr/" "<title>RompЯ"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "MPD (ROMPR)"; + _webstatus_url = "https://tools.immae.eu/rompr/"; + } + ]; } diff --git a/modules/private/websites/tools/tools/shaarli.nix b/systems/eldiron/websites/tools/shaarli.nix similarity index 57% rename from modules/private/websites/tools/tools/shaarli.nix rename to systems/eldiron/websites/tools/shaarli.nix index d128465..35f1edb 100644 --- a/modules/private/websites/tools/tools/shaarli.nix +++ b/systems/eldiron/websites/tools/shaarli.nix @@ -4,10 +4,9 @@ let in rec { activationScript = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \ - ${varDir}/cache ${varDir}/pagecache ${varDir}/tmp ${varDir}/data \ - ${varDir}/phpSessions + ${varDir}/cache ${varDir}/pagecache ${varDir}/tmp ${varDir}/data ''; - webRoot = shaarli varDir; + webRoot = shaarli.override { inherit varDir; }; apache = rec { user = "wwwrun"; group = "wwwrun"; @@ -33,6 +32,29 @@ in rec { </Directory> ''; }; + chatonsProperties = { + file.datetime = "2022-08-21T22:50:00"; + service = { + name = "Shaarli"; + description = "The personal, minimalist, super-fast, database free, bookmarking service - community repo"; + website = "https://tools.immae.eu/Shaarli/"; + logo = "https://tools.immae.eu/Shaarli/tpl/default/img/apple-touch-icon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Shaarli"; + website = "https://shaarli.readthedocs.io/"; + license.url = "https://github.com/shaarli/Shaarli/blob/master/COPYING"; + license.name = "GNU General Public License Version 3"; + version = webRoot.version; + source.url = "https://github.com/shaarli/Shaarli"; + modules = "ldap-connection-patch"; + }; + }; keys."webapps/tools-shaarli" = { user = apache.user; group = apache.group; @@ -58,9 +80,23 @@ in rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "ShaarliPHPSESSID"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Shaarli:'"; "php_admin_value[upload_max_filesize]" = "200M"; "php_admin_value[post_max_size]" = "200M"; }; }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "shaarli website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "tools.immae.eu" "/Shaarli/immae" "<title>Immae"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Shaarli"; + _webstatus_url = "https://tools.immae.eu/Shaarli/"; + } + ]; } diff --git a/modules/private/websites/tools/tools/ttrss.nix b/systems/eldiron/websites/tools/ttrss.nix similarity index 72% rename from modules/private/websites/tools/tools/ttrss.nix rename to systems/eldiron/websites/tools/ttrss.nix index 1dc99ed..6393256 100644 --- a/modules/private/websites/tools/tools/ttrss.nix +++ b/systems/eldiron/websites/tools/ttrss.nix @@ -13,13 +13,36 @@ rec { ${varDir}/cache/simplepie/ \ ${varDir}/cache/upload/ touch ${varDir}/feed-icons/index.html - install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions ''; }; + chatonsProperties = { + file.datetime = "2022-08-21T22:50:00"; + service = { + name = "RSS"; + description = "Tiny Tiny RSS is a free and open source web-based news feed (RSS/Atom) reader and aggregator"; + website = "https://tools.immae.eu/ttrss/"; + logo = "https://tools.immae.eu/ttrss/images/favicon.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Tiny Tiny RSS"; + website = "https://tt-rss.org/"; + license.url = "https://www.gnu.org/copyleft/gpl.html"; + license.name = "GNU General Public License Version 3"; + version = webRoot.version; + source.url = "https://git.tt-rss.org/fox/tt-rss.git/"; + modules = map (p: p.pluginName) webRoot.plugins; + }; + }; keys."webapps/tools-ttrss" = { user = apache.user; group = apache.group; permissions = "0400"; + keyDependencies = [ php ]; text = '' <?php @@ -57,6 +80,7 @@ rec { define('LOG_DESTINATION', '''); define('CONFIG_VERSION', 26); + define('DAEMON_UPDATE_LOGIN_LIMIT', 0); define('SPHINX_SERVER', 'localhost:9312'); define('SPHINX_INDEX', 'ttrss, delta'); @@ -123,7 +147,21 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "TtrssPHPSESSID"; "php_admin_value[open_basedir]" = "${basedir}:/tmp"; - "php_admin_value[session.save_path]" = "${varDir}/phpSessions"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:TTRSS:'"; }; }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "ttrss website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "tools.immae.eu" "/ttrss/" "<title>Tiny Tiny RSS"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "TT-RSS"; + _webstatus_url = "https://tools.immae.eu/ttrss/"; + } + ]; } diff --git a/modules/private/websites/tools/tools/wallabag.nix b/systems/eldiron/websites/tools/wallabag.nix similarity index 76% rename from modules/private/websites/tools/tools/wallabag.nix rename to systems/eldiron/websites/tools/wallabag.nix index 0ebdb0b..0a5750d 100644 --- a/modules/private/websites/tools/tools/wallabag.nix +++ b/systems/eldiron/websites/tools/wallabag.nix @@ -64,6 +64,29 @@ rec { arguments: ['/run/wrappers/bin/sendmail -bs'] ''; }; + chatonsProperties = { + file.datetime = "2022-08-21T22:50:00"; + service = { + name = "Wallabag"; + description = "wallabag is a self hostable application for saving web pages: Save and classify articles. Read them later. Freely."; + website = "https://tools.immae.eu/wallabag/"; + logo = "https://tools.immae.eu/wallabag/wallassets/themes/_global/img/appicon/apple-touch-icon-120.png"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Wallabag"; + website = "https://wallabag.org/en"; + license.url = "https://github.com/wallabag/wallabag/blob/master/COPYING.md"; + license.name = "MIT License"; + version = webappDir.version; + source.url = "https://github.com/wallabag/wallabag"; + modules = "ldap-patch"; + }; + }; webappDir = wallabag.override { ldap = true; wallabag_config = config.secrets.fullPaths."webapps/tools-wallabag"; }; activationScript = '' install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \ @@ -135,8 +158,23 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "WallabagPHPSESSID"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Wallabag:'"; "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/tmp"; "php_value[max_execution_time]" = "300"; }; }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "wallabag website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "tools.immae.eu" "/wallabag/" "<title>Bienvenue sur wallabag"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "Wallabag"; + _webstatus_url = "https://tools.immae.eu/wallabag/"; + } + ]; } diff --git a/systems/eldiron/websites/tools/webhooks.nix b/systems/eldiron/websites/tools/webhooks.nix new file mode 100644 index 0000000..337c8f8 --- /dev/null +++ b/systems/eldiron/websites/tools/webhooks.nix @@ -0,0 +1,25 @@ +{ lib, env, binEnv }: +{ + keys = lib.attrsets.mapAttrs' (k: v: + lib.nameValuePair "webapps/webhooks/${k}.php" { + user = "wwwrun"; + group = "wwwrun"; + permissions = "0400"; + text = builtins.replaceStrings ["{{webhooks-bin-env}}"] [ "${binEnv}" ] v; + keyDependencies = [ binEnv ]; + }) env // lib.attrsets.mapAttrs' (k: v: + lib.nameValuePair "webapps/webhooks/${k}/index.php" { + user = "wwwrun"; + group = "wwwrun"; + permissions = "0400"; + text = builtins.replaceStrings ["{{webhooks-bin-env}}"] [ "${binEnv}" ] v; + keyDependencies = [ binEnv ]; + }) env // { + "webapps/webhooks" = { + isDir = true; + user = "wwwrun"; + group = "wwwrun"; + permissions = "0500"; + }; + }; +} diff --git a/modules/private/websites/tools/tools/ympd.nix b/systems/eldiron/websites/tools/ympd.nix similarity index 70% rename from modules/private/websites/tools/tools/ympd.nix rename to systems/eldiron/websites/tools/ympd.nix index 531b1a9..0d8d41d 100644 --- a/modules/private/websites/tools/tools/ympd.nix +++ b/systems/eldiron/websites/tools/ympd.nix @@ -1,4 +1,4 @@ -{ env }: +{ env, config }: let ympd = rec { config = { @@ -37,4 +37,18 @@ let }; }; in - ympd + ympd // { + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "mpd website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https_auth" "tools.immae.eu" "/mpd/" "<title>ympd"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "MPD (YMPD)"; + _webstatus_url = "https://tools.immae.eu/mpd/"; + } + ]; + } diff --git a/modules/private/websites/tools/tools/yourls.nix b/systems/eldiron/websites/tools/yourls.nix similarity index 64% rename from modules/private/websites/tools/tools/yourls.nix rename to systems/eldiron/websites/tools/yourls.nix index 3717520..9e54b0d 100644 --- a/modules/private/websites/tools/tools/yourls.nix +++ b/systems/eldiron/websites/tools/yourls.nix @@ -1,11 +1,5 @@ { env, yourls, yourls-plugins, config }: rec { - activationScript = { - deps = [ "httpd" ]; - text = '' - install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/yourls - ''; - }; keys."webapps/tools-yourls" = { user = apache.user; group = apache.group; @@ -39,6 +33,29 @@ rec { define( 'LDAPAUTH_USERCACHE_TYPE', 0); ''; }; + chatonsProperties = { + file.datetime = "2022-08-27T18:00:00"; + service = { + name = "Yourls"; + description = "Your own URL shortener"; + website = "https://tools.immae.eu/url/admin/"; + logo = "https://tools.immae.eu/url/images/favicon.gif"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["MEMBER" "CLIENT"]; + registration.load = "FULL"; + install.type = "PACKAGE"; + }; + software = { + name = "YOURLS"; + website = "http://yourls.org/"; + license.url = "https://github.com/YOURLS/YOURLS/blob/master/LICENSE"; + license.name = "MIT License"; + version = webRoot.version; + source.url = "https://github.com/YOURLS/YOURLS"; + modules = map (a: a.pluginName) webRoot.plugins; + }; + }; webRoot = (yourls.override { yourls_config = config.secrets.fullPaths."webapps/tools-yourls"; }).withPlugins (p: [p.ldap]); apache = rec { user = "wwwrun"; @@ -79,8 +96,23 @@ rec { # Needed to avoid clashes in browser cookies (same domain) "php_value[session.name]" = "YourlsPHPSESSID"; - "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/yourls"; - "php_admin_value[session.save_path]" = "/var/lib/php/sessions/yourls"; + "php_admin_value[session.save_handler]" = "redis"; + "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Yourls:'"; + "php_admin_value[open_basedir]" = "${basedir}:/tmp"; }; }; + monitoringPlugins = [ "http" ]; + monitoringObjects.service = [ + { + service_description = "yourl website is running on tools.immae.eu"; + host_name = config.hostEnv.fqdn; + use = "external-web-service"; + check_command = ["check_https" "tools.immae.eu" "/url/admin/" "<title>YOURLS"]; + + servicegroups = "webstatus-webapps"; + _webstatus_name = "YOURLS"; + _webstatus_url = "https://tools.immae.eu/url/admin/"; + } + + ]; } diff --git a/systems/eldiron/websites/visio/default.nix b/systems/eldiron/websites/visio/default.nix new file mode 100644 index 0000000..76d1960 --- /dev/null +++ b/systems/eldiron/websites/visio/default.nix @@ -0,0 +1,63 @@ +{ lib, pkgs, config, ... }: +let + port = config.myEnv.ports.galene_port; + cfg = config.myServices.websites.tools.visio; +in { + options.myServices.websites.tools.visio = { + enable = lib.mkEnableOption "enable visio website"; + }; + + config = lib.mkIf cfg.enable { + myServices.dns.zones."immae.eu".subdomains.visio = + with config.myServices.dns.helpers; ips servers.eldiron.ips.main; + + myServices.chatonsProperties.services.galene = { + file.datetime = "2022-08-21T22:45:00"; + service = { + name = "Galene"; + description = "The Galène videoconference server"; + website = "https://visio.immae.eu/"; + status.level = "OK"; + status.description = "OK"; + registration."" = ["NONE"]; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "Galene"; + website = "https://galene.org/"; + license.url = "https://github.com/jech/galene/blob/master/LICENCE"; + license.name = "MIT License"; + version = pkgs.galene.version; + source.url = "https://github.com/jech/galene"; + }; + }; + services.galene = { + enable = true; + httpPort = port; + insecure = true; + # hack to bypass module's limitations + dataDir = "/var/lib/galene/data -http localhost:${builtins.toString port}"; + }; + systemd.services.galene.serviceConfig.RestrictAddressFamilies = lib.mkForce [ "AF_INET" "AF_INET6" "AF_NETLINK" ]; + security.acme.certs.eldiron.extraDomainNames = [ "visio.immae.eu" ]; + services.websites.env.tools.vhostConfs.visio = { + certName = "eldiron"; + hosts = ["visio.immae.eu" ]; + root = null; + extraConfig = [ + '' + ProxyPass /ws ws://localhost:${builtins.toString port}/ws + ProxyPassReverse /ws ws://localhost:${builtins.toString port}/ws + + ProxyPass / http://localhost:${builtins.toString port}/ + ProxyPassReverse / http://localhost:${builtins.toString port}/ + + ProxyPreserveHost On + '' + ]; + }; + + }; +} + diff --git a/modules/private/websites/tools/vpn/default.nix b/systems/eldiron/websites/vpn/default.nix similarity index 78% rename from modules/private/websites/tools/vpn/default.nix rename to systems/eldiron/websites/vpn/default.nix index 9cd499b..ea54691 100644 --- a/modules/private/websites/tools/vpn/default.nix +++ b/systems/eldiron/websites/vpn/default.nix @@ -3,9 +3,9 @@ let cfg = config.myServices.vpn; in { config = lib.mkIf cfg.enable { + security.acme.certs.eldiron.extraDomainNames = [ "vpn.immae.eu" ]; services.websites.env.tools.vhostConfs.vpn = { certName = "eldiron"; - addToCerts = true; hosts = [ "vpn.immae.eu" ]; root = ./www; }; diff --git a/modules/private/websites/tools/vpn/www/index.html b/systems/eldiron/websites/vpn/www/index.html similarity index 100% rename from modules/private/websites/tools/vpn/www/index.html rename to systems/eldiron/websites/vpn/www/index.html diff --git a/modules/private/websites/tools/vpn/www/style.css b/systems/eldiron/websites/vpn/www/style.css similarity index 100% rename from modules/private/websites/tools/vpn/www/style.css rename to systems/eldiron/websites/vpn/www/style.css diff --git a/modules/webapps/webstats/default.nix b/systems/eldiron/webstats/default.nix similarity index 90% rename from modules/webapps/webstats/default.nix rename to systems/eldiron/webstats/default.nix index e873af2..0057f64 100644 --- a/modules/webapps/webstats/default.nix +++ b/systems/eldiron/webstats/default.nix @@ -37,7 +37,7 @@ in { }; config = lib.mkIf (builtins.length cfg.sites > 0) { - users.users.root.packages = [ + environment.systemPackages = [ pkgs.goaccess ]; @@ -58,10 +58,10 @@ in { trap "rm -f $TMPFILE" EXIT mkdir -p ${cfg.dataDir}/${domain} - for i in /var/log/httpd/access-${domain}*.gz; do + for i in /var/log/httpd/access-${domain}*.gz /var/log/httpd/*/access-${domain}*.gz; do zcat "$i" >> $TMPFILE done - cat /var/log/httpd/access-${domain}.log > $TMPFILE + cat /var/log/httpd/*access-${domain}.log /var/log/httpd/*/access-${domain}.log > $TMPFILE ${pkgs.goaccess}/bin/goaccess $TMPFILE --no-progress -o ${cfg.dataDir}/${domain}/index.html -p ${config} ''; in "${d}/bin/stats-${domain}"; diff --git a/modules/webapps/webstats/goaccess.conf b/systems/eldiron/webstats/goaccess.conf similarity index 100% rename from modules/webapps/webstats/goaccess.conf rename to systems/eldiron/webstats/goaccess.conf diff --git a/modules/private/system/monitoring-1.nix b/systems/monitoring-1/base.nix similarity index 75% rename from modules/private/system/monitoring-1.nix rename to systems/monitoring-1/base.nix index dea5f45..8bfacc1 100644 --- a/modules/private/system/monitoring-1.nix +++ b/systems/monitoring-1/base.nix @@ -1,25 +1,31 @@ -{ config, pkgs, resources, ... }: +{ config, pkgs, lib, nixpkgs, php, secrets, ... }: { - deployment = { - targetUser = "root"; - targetHost = config.hostEnv.ips.main.ip4; - substituteOnDestination = true; - }; # ssh-keyscan monitoring-1 | nix-shell -p ssh-to-age --run ssh-to-age secrets.ageKeys = [ "age1dn4lzhgxusqrpjjnzm7w8ml39ptf326htuzmpqdqs2gg3wq7cqzqxuvx8k" ]; boot.kernelPackages = pkgs.linuxPackages_latest; - myEnv = import ../../../nixops/secrets/environment.nix; - imports = [ <nixpkgs/nixos/modules/profiles/qemu-guest.nix> ] ++ builtins.attrValues (import ../..); + imports = [ + secrets.nixosModules.users-config-monitoring-1 + (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix") + ./monitoring-master.nix + ./monitoring.nix + ./status.nix + ./status_engine.nix + ]; + + nixpkgs.overlays = builtins.attrValues php.overlays; + nixpkgs.config.permittedInsecurePackages = [ + "python-2.7.18.6" # for nagios-cli + ]; myServices.monitoring.enable = true; myServices.monitoring.master = true; myServices.status.enable = true; networking = { firewall.enable = true; - interfaces."ens3".ipv4.addresses = pkgs.lib.attrsets.mapAttrsToList - (n: ips: { address = ips.ip4; prefixLength = 32; }) - (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips); + interfaces."ens3".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList + (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or [])) + (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips)); interfaces."ens3".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or [])) config.hostEnv.ips); @@ -37,13 +43,13 @@ ]; services.netdata.enable = true; + services.netdata.configDir."stream.conf" = config.secrets.fullPaths."netdata-stream.conf"; services.netdata.config.web."allow dashboard from" = "localhost"; services.netdata.config.web."allow badges from" = "*"; services.netdata.config.web."allow streaming from" = "*"; services.netdata.config.web."allow netdata.conf from" = "fd*"; services.netdata.config.web."allow management from" = "fd*"; networking.firewall.allowedTCPPorts = [ 19999 ]; - environment.etc."netdata/stream.conf".source = config.secrets.fullPaths."netdata-stream.conf"; secrets.keys = { "netdata-stream.conf" = { @@ -65,5 +71,5 @@ # database servers. You should change this only after NixOS release # notes say you should. # https://nixos.org/nixos/manual/release-notes.html - system.stateVersion = "20.03"; # Did you read the comment? + system.stateVersion = "23.05"; # Did you read the comment? } diff --git a/systems/monitoring-1/flake.lock b/systems/monitoring-1/flake.lock new file mode 100644 index 0000000..d4a2c8d --- /dev/null +++ b/systems/monitoring-1/flake.lock @@ -0,0 +1,790 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "chatons": { + "inputs": { + "environment": "environment" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=", + "path": "../../flakes/private/chatons", + "type": "path" + }, + "original": { + "path": "../../flakes/private/chatons", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_4": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_5": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "loginctl-linger": { + "locked": { + "lastModified": 1, + "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=", + "path": "../../flakes/loginctl-linger", + "type": "path" + }, + "original": { + "path": "../../flakes/loginctl-linger", + "type": "path" + } + }, + "mail-relay": { + "inputs": { + "environment": "environment_3", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=", + "path": "../../flakes/private/mail-relay", + "type": "path" + }, + "original": { + "path": "../../flakes/private/mail-relay", + "type": "path" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_4", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets_2" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_8", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "my-lib", + "disko" + ], + "flake-parts": [ + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "php": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_6", + "nixpkgs-4": "nixpkgs-4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "root": { + "inputs": { + "chatons": "chatons", + "environment": "environment_2", + "files-watcher": "files-watcher", + "loginctl-linger": "loginctl-linger", + "mail-relay": "mail-relay", + "monitoring": "monitoring", + "my-lib": "my-lib", + "myuids": "myuids", + "nixpkgs": "nixpkgs_5", + "php": "php", + "secrets": "secrets_3", + "system": "system" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_5", + "mypackages": "mypackages", + "myuids": "myuids_2", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/systems/monitoring-1/flake.nix b/systems/monitoring-1/flake.nix new file mode 100644 index 0000000..e97cb05 --- /dev/null +++ b/systems/monitoring-1/flake.nix @@ -0,0 +1,45 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + my-lib.url = "path:../../flakes/lib"; + + monitoring.url = "path:../../flakes/private/monitoring"; + mail-relay.url = "path:../../flakes/private/mail-relay"; + chatons.url = "path:../../flakes/private/chatons"; + environment.url = "path:../../flakes/private/environment"; + system.url = "path:../../flakes/private/system"; + php.url = "path:../../flakes/private/php"; + + myuids.url = "path:../../flakes/myuids"; + secrets.url = "path:../../flakes/secrets"; + files-watcher.url = "path:../../flakes/files-watcher"; + loginctl-linger.url = "path:../../flakes/loginctl-linger"; + }; + outputs = inputs@{ self, my-lib, nixpkgs, ...}: + my-lib.lib.mkColmenaFlake { + name = "monitoring-1"; + inherit self nixpkgs; + system = "x86_64-linux"; + targetHost = "95.216.164.150"; + targetUser = "root"; + nixosModules = { + base = ./base.nix; + system = inputs.system.nixosModule; + mail-relay = inputs.mail-relay.nixosModule; + chatons = inputs.chatons.nixosModule; + monitoring = inputs.monitoring.nixosModule; + environment = inputs.environment.nixosModule; + + myuids = inputs.myuids.nixosModule; + secrets = inputs.secrets.nixosModule; + files-watcher = inputs.files-watcher.nixosModule; + loginctl-linger = inputs.loginctl-linger.nixosModule; + }; + moduleArgs = { + nixpkgs = inputs.nixpkgs; + monitoring = inputs.monitoring; + php = inputs.php; + }; + }; +} diff --git a/systems/monitoring-1/monitoring-master.nix b/systems/monitoring-1/monitoring-master.nix new file mode 100644 index 0000000..09319b8 --- /dev/null +++ b/systems/monitoring-1/monitoring-master.nix @@ -0,0 +1,87 @@ +{ config, pkgs, lib, nodes, name, monitoring, ... }: +let + mlib = monitoring.lib; + nodesWithMonitoring = lib.filterAttrs (n: v: (v.config.myServices or {}) ? "monitoring") nodes; +in +{ + imports = [ + ./monitoring/master.nix + ./monitoring/phare.nix + ./monitoring/ulminfo-fr.nix + ]; + myServices.monitoring.activatedPlugins = lib.flatten (lib.mapAttrsToList (_: n: n.config.myServices.monitoring.fromMasterActivatedPlugins) nodesWithMonitoring); + myServices.monitoring.objects = lib.mkMerge ( + lib.mapAttrsToList (_: n: + mlib.toMasterPassiveObject "external-passive-service" 1.5 n.config.myServices.monitoring.objects + ) (lib.filterAttrs (n: v: n != name) nodesWithMonitoring) + ++ + lib.mapAttrsToList (_: n: n.config.myServices.monitoring.fromMasterObjects) nodesWithMonitoring + ); + myServices.chatonsProperties.hostings.monitoring = { + file.datetime = "2022-08-27T16:00:00"; + hosting = { + name = "Monitoring"; + description = "Website and server health monitoring"; + website = "https://status.immae.eu"; + logo = "https://www.naemon.io/favicon.ico"; + status.level = "OK"; + status.description = "OK"; + registration.load = "OPEN"; + install.type = "PACKAGE"; + }; + software = { + name = "naemon"; + website = "https://www.naemon.io/"; + license.url = "https://github.com/naemon/naemon-core/blob/master/COPYING"; + license.name = "GNU General Public License v2.0"; + version = config.services.naemon.package.version; + source.url = "https://github.com/naemon/naemon-core"; + modules = "livestatus,status-engine"; + }; + }; + + services.nginx = { + virtualHosts."status.immae.eu".locations = { + "=/common/immae.cfg" = { + alias = pkgs.writeText "immae.cfg" '' + # put me for instance in /etc/naemon/module-conf.d/immae.cfg + # Make sure that you have include_dir=module-conf.d in + # naemon.cfg + log_initial_states=1 + date_format=iso8601 + admin_email=${config.myEnv.monitoring.email} + obsess_over_services=1 + ocsp_command=notify-master + ''; + }; + "=/common/resource.cfg" = { + alias = pkgs.writeText "resource.cfg" '' + # Resource.cfg file + # Replace this with path to monitoring plugins + $USER1$=@@COMMON_PLUGINS@@ + # Replace this with a path to scripts from + # https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/tree/modules/private/monitoring/plugins + $USER2$=@@IMMAE_PLUGINS@@ + $USER200$=https://status.immae.eu/ + $USER201$=@@TOKEN@@ + ''; + }; + }; + }; + + secrets.keys = lib.mapAttrs' (k: v: lib.nameValuePair "${k}_access_key" { + user = "naemon"; + group = "naemon"; + permissions = "0400"; + text = '' + export AWS_ACCESS_KEY_ID="${v.accessKeyId}" + export AWS_SECRET_ACCESS_KEY="${v.secretAccessKey}" + export BASE_URL="${v.remote "immae-eldiron"}" + ''; + }) config.myEnv.backup.remotes; + + services.naemon.extraConfig = '' + broker_module=${pkgs.naemon-livestatus}/lib/naemon-livestatus/livestatus.so ${config.services.naemon.runDir}/live + broker_module=${pkgs.status-engine-module}/lib/status-engine/naemon/statusengine-${pkgs.naemon.status_engine_version}.o use_service_perfdata=1 use_process_data=0 use_system_command_data=0 use_external_command_data=0 use_flapping_data=0 use_program_status_data=0 use_notification_data=0 use_contact_status_data=0 use_contact_notification_data=0 use_event_handler_data=0 use_object_data=0 + ''; +} diff --git a/systems/monitoring-1/monitoring.nix b/systems/monitoring-1/monitoring.nix new file mode 100644 index 0000000..421c71f --- /dev/null +++ b/systems/monitoring-1/monitoring.nix @@ -0,0 +1,61 @@ +{ config, pkgs, lib, name, monitoring, ... }: +let + hostFQDN = config.hostEnv.fqdn; + emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check; +in +{ + config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "emails" "ovh" "notify-primary" ]; + config.myServices.monitoring.objects = lib.mkMerge [ + (monitoring.lib.objectsCommon { + inherit hostFQDN; + hostName = name; + master = true; + processWarn = "70"; processAlert = "80"; + loadWarn = "4.0"; loadAlert = "5.0"; + load15Warn = "1.0"; load15Alert = "2.0"; + interface = builtins.head (builtins.attrNames config.networking.interfaces); + }) + + { + service = [ + (emailCheck "monitoring-1" hostFQDN) + + { + service_description = "OVH account has enough sms"; + host_name = hostFQDN; + use = "external-service"; + check_command = "check_ovh_sms"; + + check_interval = 120; + notification_interval = "1440"; + } + + # Dummy service for testing + # { + # service_description = "Dummy failing test"; + # host_name = "dummy-host"; + # use = "local-service"; + # check_interval = 0.3; + # max_check_attempts = "1"; + # flap_detection_enabled = "0"; + # notification_interval = "0.1"; + # check_command = "check_critical"; + # } + ]; + + host = { + # Dummy host for testing + # "dummy-host" = { + # alias = "dummy.host"; + # check_interval = 0.3; + # max_check_attempts = "1"; + # flap_detection_enabled = "0"; + # notification_interval = "0.1"; + # address = "dummy.host"; + # use = "linux-server"; + # check_command = "check_ok"; + # }; + }; + } + ]; +} diff --git a/systems/monitoring-1/monitoring/master.nix b/systems/monitoring-1/monitoring/master.nix new file mode 100644 index 0000000..c8f52ea --- /dev/null +++ b/systems/monitoring-1/monitoring/master.nix @@ -0,0 +1,43 @@ +{ config, ... }: +{ + myServices.monitoring.objects = { + contact = { + immae = { + alias = "Immae"; + email = config.myEnv.monitoring.immae_contact; + use = "generic-contact"; + contactgroups = "admins"; + host_notification_commands = "notify-host-by-email,notify-host-by-apprise!$USER210$"; + service_notification_commands = "notify-service-by-email,notify-service-by-apprise!$USER210$"; + }; + }; + command = { + check_passive = "$USER1$/check_dummy 3 \"Service result are stale\""; + }; + templates = { + service = { + external-passive-service = { + active_checks_enabled = "0"; + check_freshness = "1"; + check_period = "24x7"; + contact_groups = "admins"; + event_handler_enabled = "1"; + flap_detection_enabled = "1"; + is_volatile = "0"; + max_check_attempts = "3"; + notification_interval = "60"; + notification_options = "w,u,c,r,f,s"; + notification_period = "24x7"; + notifications_enabled = "1"; + passive_checks_enabled = "1"; + process_perf_data = "1"; + retain_nonstatus_information = "1"; + retain_status_information = "1"; + retry_interval = "2"; + check_command = "check_passive"; + _webstatus_namespace = "immae"; + }; + }; + }; + }; +} diff --git a/modules/private/monitoring/objects_phare.nix b/systems/monitoring-1/monitoring/phare.nix similarity index 53% rename from modules/private/monitoring/objects_phare.nix rename to systems/monitoring-1/monitoring/phare.nix index 082e7e3..0ce9ffe 100644 --- a/modules/private/monitoring/objects_phare.nix +++ b/systems/monitoring-1/monitoring/phare.nix @@ -1,7 +1,10 @@ -{ emailCheck, ... }: +{ monitoring, config, ... }: +let + emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check; +in { - activatedPlugins = [ "emails" ]; - host = { + config.myServices.monitoring.activatedPlugins = [ "emails" ]; + config.myServices.monitoring.objects.host = { "phare.normalesup.org" = { alias = "phare.normalesup.org"; address = "phare.normalesup.org"; @@ -11,7 +14,7 @@ _webstatus_vhost = "status.immae.eu"; }; }; - service = [ + config.myServices.monitoring.objects.service = [ (emailCheck "phare" "phare.normalesup.org") ]; } diff --git a/modules/private/monitoring/objects_ulminfo-fr.nix b/systems/monitoring-1/monitoring/ulminfo-fr.nix similarity index 50% rename from modules/private/monitoring/objects_ulminfo-fr.nix rename to systems/monitoring-1/monitoring/ulminfo-fr.nix index bd2804b..b0c6657 100644 --- a/modules/private/monitoring/objects_ulminfo-fr.nix +++ b/systems/monitoring-1/monitoring/ulminfo-fr.nix @@ -1,7 +1,10 @@ -{ emailCheck, ... }: +{ monitoring, config, ... }: +let + emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check; +in { - activatedPlugins = [ "emails" ]; - host = { + config.myServices.monitoring.activatedPlugins = [ "emails" ]; + config.myServices.monitoring.objects.host = { "ulminfo.fr" = { alias = "ulminfo.fr"; address = "ulminfo.fr"; @@ -11,7 +14,7 @@ _webstatus_vhost = "status.immae.eu"; }; }; - service = [ + config.myServices.monitoring.objects.service = [ (emailCheck "ulminfo" "ulminfo.fr") ]; } diff --git a/modules/private/monitoring/status.nix b/systems/monitoring-1/status.nix similarity index 84% rename from modules/private/monitoring/status.nix rename to systems/monitoring-1/status.nix index ab0290c..8b6615f 100644 --- a/modules/private/monitoring/status.nix +++ b/systems/monitoring-1/status.nix @@ -29,14 +29,8 @@ upstreams."netdata".extraConfig = '' keepalive 64; ''; - virtualHosts."status.eban.bzh" = { - acmeRoot = config.myServices.certificates.webroot; - useACMEHost = name; - forceSSL = true; - locations."/".proxyPass = "http://unix:/run/naemon-status/socket.sock:/"; - }; virtualHosts."status.immae.eu" = { - acmeRoot = config.myServices.certificates.webroot; + acmeRoot = config.security.acme.defaults.webroot; useACMEHost = name; forceSSL = true; locations."/".proxyPass = "http://unix:/run/naemon-status/socket.sock:/"; @@ -62,13 +56,10 @@ }; }; security.acme.certs."${name}" = { - extraDomains."status.immae.eu" = null; - extraDomains."status.eban.bzh" = null; - user = config.services.nginx.user; + extraDomainNames = [ "status.immae.eu" ]; group = config.services.nginx.group; }; - myServices.certificates.enable = true; networking.firewall.allowedTCPPorts = [ 80 443 ]; systemd.services.naemon-status = { description = "Naemon status"; diff --git a/modules/private/monitoring/status/app.py b/systems/monitoring-1/status/app.py similarity index 100% rename from modules/private/monitoring/status/app.py rename to systems/monitoring-1/status/app.py diff --git a/modules/private/monitoring/status_engine.nix b/systems/monitoring-1/status_engine.nix similarity index 89% rename from modules/private/monitoring/status_engine.nix rename to systems/monitoring-1/status_engine.nix index 39a753a..fc6afc0 100644 --- a/modules/private/monitoring/status_engine.nix +++ b/systems/monitoring-1/status_engine.nix @@ -1,6 +1,6 @@ { config, pkgs, lib, name, ... }: let - package = pkgs.status_engine.worker.override { config_file = config.secrets.fullPaths."status_engine"; }; + package = pkgs.status-engine-worker.override { config_file = config.secrets.fullPaths."status_engine"; }; env = config.myEnv.tools.status_engine; in { @@ -40,7 +40,7 @@ in use_mysql: 1 mysql: host: ${env.mysql.remoteHost} - port: ${env.mysql.port} + port: ${builtins.toString env.mysql.port} username: ${env.mysql.user} password: ${env.mysql.password} database: ${env.mysql.database} @@ -88,7 +88,7 @@ in ''; }; - services.redis = rec { + services.redis.servers."" = rec { enable = true; bind = "127.0.0.1"; }; @@ -100,6 +100,14 @@ in ]; }; + environment.systemPackages = [ + pkgs.gearmand + (pkgs.writeScriptBin "status-engine-worker" '' + #! ${pkgs.stdenv.shell} + cd ${package} + exec sudo -E -u naemon ./bin/Console.php "$@" + '') + ]; systemd.services.status_engine_worker = { description = "Status engine worker"; after = [ "network.target" ]; diff --git a/systems/quatresaisons/flake.lock b/systems/quatresaisons/flake.lock new file mode 100644 index 0000000..6f2ccca --- /dev/null +++ b/systems/quatresaisons/flake.lock @@ -0,0 +1,767 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_3", + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "environment_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "environment_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "files-watcher": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../../flakes/files-watcher", + "type": "path" + }, + "original": { + "path": "../../flakes/files-watcher", + "type": "path" + } + }, + "files-watcher_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=", + "path": "../files-watcher", + "type": "path" + }, + "original": { + "path": "../files-watcher", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1648297722, + "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "landing-page": { + "flake": false, + "locked": { + "lastModified": 1691524124, + "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=", + "ref": "main", + "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf", + "revCount": 573, + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + }, + "original": { + "ref": "main", + "type": "git", + "url": "https://github.com/bastienwirtz/homer.git" + } + }, + "monitoring": { + "inputs": { + "environment": "environment_2", + "naemon": "naemon", + "nixpkgs-lib": "nixpkgs-lib", + "secrets": "secrets" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=", + "path": "../../flakes/private/monitoring", + "type": "path" + }, + "original": { + "path": "../../flakes/private/monitoring", + "type": "path" + } + }, + "multi-apache-container": { + "inputs": { + "files-watcher": "files-watcher_2", + "myuids": "myuids" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=", + "path": "../../flakes/multi-apache-container", + "type": "path" + }, + "original": { + "path": "../../flakes/multi-apache-container", + "type": "path" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_8", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../myuids", + "type": "path" + }, + "original": { + "path": "../myuids", + "type": "path" + } + }, + "myuids_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../flakes/myuids", + "type": "path" + }, + "original": { + "path": "../../flakes/myuids", + "type": "path" + } + }, + "myuids_3": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "naemon": { + "locked": { + "lastModified": 1, + "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=", + "path": "../../naemon", + "type": "path" + }, + "original": { + "path": "../../naemon", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "my-lib", + "disko" + ], + "flake-parts": [ + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-4": { + "flake": false, + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1691269286, + "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_3": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "flake": false, + "locked": { + "lastModified": 1596265691, + "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "php": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_6", + "nixpkgs-4": "nixpkgs-4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=", + "path": "../../flakes/private/php", + "type": "path" + }, + "original": { + "path": "../../flakes/private/php", + "type": "path" + } + }, + "root": { + "inputs": { + "environment": "environment", + "files-watcher": "files-watcher", + "landing-page": "landing-page", + "monitoring": "monitoring", + "multi-apache-container": "multi-apache-container", + "my-lib": "my-lib", + "myuids": "myuids_2", + "nixpkgs": "nixpkgs_5", + "php": "php", + "secrets": "secrets_2", + "system": "system" + } + }, + "secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "secrets_2": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "system": { + "inputs": { + "backports": "backports", + "environment": "environment_3", + "mypackages": "mypackages", + "myuids": "myuids_3", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/systems/quatresaisons/flake.nix b/systems/quatresaisons/flake.nix new file mode 100644 index 0000000..8b269f6 --- /dev/null +++ b/systems/quatresaisons/flake.nix @@ -0,0 +1,49 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + my-lib.url = "path:../../flakes/lib"; + + monitoring.url = "path:../../flakes/private/monitoring"; + environment.url = "path:../../flakes/private/environment"; + php.url = "path:../../flakes/private/php"; + system.url = "path:../../flakes/private/system"; + + myuids.url = "path:../../flakes/myuids"; + secrets.url = "path:../../flakes/secrets"; + files-watcher.url = "path:../../flakes/files-watcher"; + multi-apache-container.url = "path:../../flakes/multi-apache-container"; + + landing-page = { + url = "https://github.com/bastienwirtz/homer.git"; + ref = "main"; + type = "git"; + flake = false; + }; + }; + outputs = inputs@{ self, my-lib, nixpkgs, ...}: + my-lib.lib.mkColmenaFlake { + name = "quatresaisons"; + inherit self nixpkgs; + system = "x86_64-linux"; + targetHost = "144.76.76.162"; + targetUser = "root"; + nixosModules = { + base = { secrets, ... }: { imports = [ secrets.nixosModules.users-config-quatresaisons ]; }; + system = inputs.system.nixosModule; + monitoring = inputs.monitoring.nixosModule; + environment = inputs.environment.nixosModule; + + myuids = inputs.myuids.nixosModule; + secrets = inputs.secrets.nixosModule; + files-watcher = inputs.files-watcher.nixosModule; + multi-apache-container = inputs.multi-apache-container.nixosModule; + }; + moduleArgs = { + monitoring = inputs.monitoring; + php = inputs.php; + landing-page = inputs.landing-page; + pkgs-no-overlay = inputs.nixpkgs.legacyPackages.x86_64-linux; + }; + }; +} diff --git a/systems/zoldene/Immae.pub b/systems/zoldene/Immae.pub new file mode 100644 index 0000000..dd42b04 --- /dev/null +++ b/systems/zoldene/Immae.pub @@ -0,0 +1,322 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBFvwA+gBEADlchQGPyI2M9RNRUsk8wsL9XLc8qAFWTYlVp5p7177ucxTQf6S +rny9yRCF69UqtE0ugwt+432sAAsDPi7BRA/JE95bIRBiewOiY1jYiivccP5dR6Jr +58HJ3QOHYPekqZIQhxzCWjdD2nRhhCbbxeWFJsJyaG8idGBiLkgNKxEEmqE5LIat +tzMpQFwOpL2FoYZ7+e4ZTMc+x+yqpOnGcQD1qwouqx68okSCjrVBWo5S2tK5AzzU +X8esBLNpgkhpUEZVltiNc4bmj7GZPdy4+mvS33/HQTed8YpatCFVWzcK+/uK0SYE +P8Hj1mguT9idBhAf+kv7qbTycrFkTBliP3oDNUoARWDmfQdV4nlxqW03QxUY18mL +KPByduK3hEXAZnD+/8QfVzbNVVP+70/jdSB+ckF88Li2g4bv/9uqjaObKVJB9ocG +EWslm1h7tvdCLBRgIl8b2+Zl0fComRAMuwUr+LYlWLnfygAi8Uy9hl7UcRWAAj99 +PG4ba0+y8eD8k1J2IE8HpeIzMzRwYTLtvLyJBvrKiQHJb1PGM5cS8iry81wjUPZm +dO5p5rbC8z99w7UNMaiz6iqAFAaDyLLsBZ5gWD+1ps9XxCA0zf28Z/Tc/Gj4QKAf +kpMd7lQ+gprsFyRtzcRD4WhsOL2ogKYFHYi4LE0GYduspGdQPlK/YfrKQwARAQAB +tB9Jc21hZWwgQm91eWEgPGlzbWFlbEBib3V5YS5vcmc+iQJRBBMBCAA7AhsDBQsJ +CAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvw +BU4CGQEACgkQyfztbKa3lFR/kA//cHVrb/RRTLQZy514vMkOBKgAk+dj+j0lrgvJ +yR0JK1KjodduSoccPq7qRFAU+KVa3FsXMn8yY/lWaCXYJoF0DT5iEHsEuzJRc7Cn +N4aq2h42DD7z8dJCXZvtvJs+vZ7G/rlLl322TjLb2OyIybBEoPOmJl0dVG0wKBFC +r7EJmOKl3ytUWUpEbuxs1U/pP4GKrPT2CK3QcLF8JHKIPkEO347RorseeHcHhMxs +Bz5JXojts1NyLJh7lErT42atgEdTGzSmkkGm8OifZVIH2rgmnRsPHnCqrXYsa7dE +yPsC01Ns3DPYk4C5FtbpfiNvATbnkOicEwb2U55OpYUZLsFCKo7Bl+duJVY0nPRN +WiLCALPcdJL+a6hbh1hSuqHt5eNGxyrDtRPowXRTS1D4nTCgAh6+wpH47xXWEwXZ +mEnkXqHLIjsW4CSIz2gc+Bza40+wkWz6NQDEb3ncytDZu9vKK1CYwl7RGW4RFkAO +j3FWZvZp8ETPLNRVy64BhZzHY3uOxbYreE+T6JfiIZux8X+Bh4cPJHizfhSMLLS5 +kwABzalaTD33XnjKn5wQ/DfGJ+fGbF54fMlGFjne5VTNwY1ju2ieXTgVrUyzfKPF +96zcvnxo/MWwqcQ8+dXFCZjldP76puo1eVATEBeOCQs8Vj7eL9eN/eo+BfzhS3S8 +CfFFYWeIXQQQEQIAHRYhBNw4R0hwnSYZ/yhnIW0Mr/3bHP6QBQJb8AgDAAoJEG0M +r/3bHP6Q/TsAnA6vTjmrX4nY3QnevNrKefWaQvf3AJ0TALTqXhTcVYVLxfzRt/Qd +u5W2/rQvSXNtYWVsIEJvdXlhIChXb3JrKSA8aXNtYWVsLmJvdXlhQGZyZXRsaW5r +LmNvbT6JAk4EEwEIADgWIQT4KAb9ob9bmhswFOfJ/O1spreUVAUCW/AFCwIbAwUL +CQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ/O1spreUVKlBD/sE/eDbJtL8UKc6 +CN7zmA038RSjxlcJrMRoBoThCFKOFtBsYLPebnIkzCDiUwQJaIMYe2RNBHKKz0p+ +2Kvzf7q+xq8W1e72aK1DRhsBTL8/LA1kQkvh3GwMS8z3SOcbXLWqKQuQ7ztYReQG +wsT2/S8reVM96eV67K9vMHKMDF3NyYZewahX0I44YIbQJfLVG5elCkBrfHjGSeIt +tSAv56BhN8J8ky+9nGx5jwWmxc/4Oquyfe9Lf0NMTCjw1xess7UoHlzSMp57yF3T +AaqDcqD2Jdgr2meN9Yo4/Yb9dEvHFy34ppXYanX1nrHGev7YaaQWLoKLVZc3f6gR ++D7sEJUJm3IxO041CR7DBwQ1CQkx3sa66mcHxe+wchOoXBZdsqyl5Ds+zqh6eMyO +UiixDcXDxZuimEY0/+7XjlFjtzhGVNKsjV/Azh+Hx3GZnGHMVpTw73qQFHkWeDrX +FPUbinjtEVTxw0fS9PkDZB5ysgAWlXs2cqoNDMcbdyJn2xszbV5+vjlmcofsQZTr +PiX+hB6P5RQP5ogtnotvbkPDSfPfqdUk5HjGFrGX08FoP4rCromHvSL6Un2lP4I2 +mJbbQzBU/bQUGzfz6U6VEbUHtOL+7woGuXuzTYsRZ/O7/fKohyi/+qsmOozQpLFN +k5xocbF1PgpFphrKYpHaSkf6DS2/F4hdBBARAgAdFiEE3DhHSHCdJhn/KGchbQyv +/dsc/pAFAlvwCAQACgkQbQyv/dsc/pDXWACeKMbL/Dtifpd466TqQP8isfWedtIA +n2xbEmlpxG8yk0w4HQ4djwgY4RbutCpJc21hZWwgQm91eWEgPGlzbWFlbC5ib3V5 +YUBub3JtYWxlc3VwLm9yZz6JAk4EEwEIADgWIQT4KAb9ob9bmhswFOfJ/O1spreU +VAUCW/AEawIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ/O1spreUVMGJ +EAC5hKt5NCanRxEl13nQUu4+n05tdRl9C3sTczR8EUZ30zhpBV4chKgeJSD0r1VA +zBSQHMNzroGawaQn38qxFtbcSmkGRDd+0y798x1HFHp+UFiYOdQDQJVsyDuwjq4k +RF7zV+FBj0ffjn5JBy6R3wLmWCFxz1mPmkImdyyS8GEeifwTftC+SSotqfg1lh0K +C+DSQGYtPk0jLvxVPRllnjltDOSPUt9xRE785I6E9oyYrCa5Om51e0eEMzwpkl4e +QschAYILb6SNrVyEMRD5E3lJHD2r6dPvIPFNcLxIQuK/Kdco2jNq7dCL6ukdGI40 +j/oZi7XRrlFCQW321BuipJZ/7t9JWOXOrrEndQv+hOb6PeWkwF1rigjbQq+IipdJ +DUXGBfiIzlpJM5tLhs7BGfLxYNn09rOpkotXrdBzRO62lYyRdQepKpD33v96bQV2 +0w64U44+CxuicjGDw/6no54LY4J7bM1lLGwqvHSeqgYoc+Zs9WH95TNNSmaAHGSf +An4LpzW5nOXbq2rsWVbZpvsVHz3VmC9qmpsYl5tT/ninkLta3tN6TrYUFHXcDWz9 +K+HW+/oARzEmN8eg3iMmWtOnV59YEr/x2vvOHndguUL0tUpRjwuTunH9KOGZE0Kb +uI3ovgLLO2kCSGk4SdXlntu/eLq9FPYqlOpjM9CtLf9JdIhdBBARAgAdFiEE3DhH +SHCdJhn/KGchbQyv/dsc/pAFAlvwCAQACgkQbQyv/dsc/pCHCQCfdPdGx0FmknAs +rPvjuUmuCj9Q8xUAn32dsgQYTlgfTdwLSxWGj4mTD2h6tClJc21hZWwgQm91eWEg +PGJvdXlhQHBoYXJlLm5vcm1hbGVzdXAub3JnPokCTgQTAQgAOBYhBPgoBv2hv1ua +GzAU58n87Wymt5RUBQJb8ASdAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJ +EMn87Wymt5RU58QQALMGlOJzcQj/arHezum5H/PiYIpZ1yY+QMCzpSgPdwupwawW +VN88aQRfU6k9xwmsU+Ghjreja09AuqYi/D2+61TM/Tmqi/9HdU6NRYw0hvaZnwFc +vudFBII2XrxmU5k9PnSR6Sq4uLUGkXmvhJddV0q+cjtif+vDi5pl9mqbWBQY8d9S +5Q6ZFZPeEeASUK7Xt/tSq9iXpb1tQsmEJ94Czl5G+gNFJcqj7nlHQ1/c9XeNsvJT +GZVLGM/cAZNzB6AC8Kz+iWUypFuXifC2PYGpJDJ8klqTmDQikGQtM1HMHda6rnwU +L7JIfbuwGbMk65CtG2YE8QqB+/GIfkzWySenmIrldn9Vp5EKB0DD529TyOwQWgzz ++HuVP/4QfkNRxNquWxlAPXmcNfV1SV+/Xn1KwSspb7QlAjiXXOL13J2dwYFpV+21 +vsSW5XqJXfWUU8d4YVOdq1kUTwLjWnWyxwtt8j68KSuTOT4JTA8oNXg87r0B4Fzr +6AoxCM8ePywm5IW55gNAwViTKWBAcNrcwRTP647oNOM5+8D7NZIBpnKffNc/S2S5 +iI1tmaM0yXavmCm0Hb7lkFIsxM2Y2lxwHexPck2ftPXIrjhPYLcFVBdLVx2V2yXe +cFW2vMGZiasVobFqqp1g8htmAlTkN0cTDY7l96wDuirC6OeCbVomEgxQEd0MiF0E +EBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/92xz+kHsv +AJ4+zdfjTdO1FUWb42bWdPQfiFe9nACeMIRp1Iu3tNVJkfS9CGGqhrChpfu0LUlz +bWFlbCBCb3V5YSA8aXNtYWVsLmJvdXlhLjA2QG5vcm1hbGVzdXAub3JnPokCTgQT +AQgAOBYhBPgoBv2hv1uaGzAU58n87Wymt5RUBQJb8ASsAhsDBQsJCAcCBhUKCQgL +AgQWAgMBAh4BAheAAAoJEMn87Wymt5RUxa8P/i7zdQ9i5BfWITbdyCgXNoQYIcE3 +J6lIa15eLUcfDcL707zOrUSbhSkthLjeqZoNRCalqjeDOdgCQC1PNoISdkMGd9PO +VOwS3G7Pjt4FSjPVHyw9+Su57pwTcLXBhEyBAkv+tx/QrB/UBCFzPUnsl71QH51y +T8+bNdOiBxssdgn/9IrObn7tu8xDf+d/yGsA493x+mxalai+fhd/t0yzQcdcTrvD +EKRxAaU8wXe8oSwcW5cRmXIi+N4aEnLRO/so9YDGf4z2FQVSL0ktoZYMqZ1ZvIb0 +MNCNl2NgNXThhrAPk9Rhs+S5nRzazJ+tS+D2S728EPpRHpUE43+vewtCdu5c5NWd +Lz88o/jxLwcNwQa2iJoFMyqr15lHt+vM7OyD9X650IJwQw24n4tF6TijzH5GhWcN +SnB7RpLSkftQldpK/zK+tmFH4vVpv+bI3JKAfzRga+5Fu42kB5uHVzXF3qMwYgEO +sRNL5d4xV4SATce1mb8vFpsQmGOWnZAcCaQYhLKfMl7zR5ukytTjf3hRMRH0GAjh +06QAoBMJZhWosYehPi1odjTngIf6hFOqA5prz8Cu/AFe/8aftp9UorJOekAj2io0 +CENRv21qrN8R4bNo04aTMD6WrY+mBL8MteR0ooD3ENQEAZ6UUyZwTzUJk2UUl+5M +ch/HgJ+rQozmRGYeiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AI +BAAKCRBtDK/92xz+kPsmAJ4wGQ0Hly2eTVzsU8Ht4609Q5kf2wCdHGuu863a0GHv +uUdEokzQEsumYPG0OElzbWFlbCBCb3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVy +ZSkgPGlfYm91eWFAeWFob28uZnI+iQJOBBMBCAA4FiEE+CgG/aG/W5obMBTnyfzt +bKa3lFQFAlvwBMkCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQyfztbKa3 +lFQTlxAAjbuDy3prdEBNMYfi/870MO5eeDOCMtiDJDae4fQjj2NANjeuDGNP659B +/k9uS7o5nrWB7E6rdG4a1J+Qzj5I775xTP/zVbrNSchcLwSoHMMXBm2IdbIanCX0 +JX+dRg2YX6yX+6ZmL8UaWRVICQ84ZxGtYHZ8o8hMCFOuxFklNjYFEPciO9M9m+rv +fUEihQgcBF7+x9KVntlxad61Aa9AzUJLULgY3snaZK687tHUq3yYwXpF9s1CuJ81 +SfZxH32dKqy+2cpJqwQ38BZrTUwjBxxIMR5TRC7h/O9aRIBKQZKlpLcmxWPv18i7 +DwWlrJVb2Sd2WUh+TwPNa7VQc3NjlGtu74SfZqmirE0FyuB86fnsQaF8zhJnRsqE +lagnLoW24PCvc8A9TK95tj+0JO8DIeM49Gg+Br/NBtRB8q5q/ICJOREber6Ke+/I +p90q5VkZafIgeuO+EkyQ6Dq+58NRqC2qEs209xnKOd6exxT+2tEzx6Hy0PKwaay3 +h8WzUamJOTqRv1WG4GmlCeRUQGx8BtdIAEMdww26cN8rmxh5Foh5CH+V75bcybkv +yH+FBDoKFYSpEPg0axHM/e13/nujgLNnSTHuMf7ILvpwoNkkIcQwSpH17B5hZdgl +y0xD7aIS5XU9OoP9mKs1unzUKerWQWY6CxgYOqpssyDTUG+fohuIXQQQEQIAHRYh +BNw4R0hwnSYZ/yhnIW0Mr/3bHP6QBQJb8AgEAAoJEG0Mr/3bHP6QFPAAn3DbFqHo +hjznqQvg15QjlGFaPJaaAJ4ps0+VWG9BN7UBQPG+fcCRwqLaVLQ0SXNtYWVsIEJv +dXlhIChEb24ndCBjb250YWN0IG1lIHRoZXJlKSA8Ym91eWFAa3RoLnNlPokCTgQT +AQgAOBYhBPgoBv2hv1uaGzAU58n87Wymt5RUBQJb8ATfAhsDBQsJCAcCBhUKCQgL +AgQWAgMBAh4BAheAAAoJEMn87Wymt5RU2vAP/12b6S0yJdZ1rgNLj+ZohY36PhCm +30/amkGPQp7HCBylYIRv+y5m4IdiqynzJoap547cFMWNsCyfyU2VKbcy1Uy44FCI +PCUcBME95jD1JWviINDKqLhglciKlJnWUhupiolqFcr2ro+rJVc/fBMWJoBjM5fJ +9eq1ge2LxuYKbu9cpSEtopk7ZBeo69khhrFACdZEqfJtW4qp0hEC0pAKLjN8LhpQ +EEVcq4zejksB+1e1qkuJ6be3/Q2Sj+1ijaJBElJIVJ8qyYs9XSlTlUA1USfy3Yqu +jOkFrIaycxYgKooFgwYfYXCniuqXWZ2geCm2IE90lanQC2w7ZDN/JGwwVuAFVi4H +Mrx6x/yEreqy2AUMesB1eGxqQQG9cgssMLoMAN2IDDJ6FS+e0imWTTMZ6r3ou9W8 ++pFzSIT8LMnBNwp+RxrW3QzBs8sXDw5mS6WroiZMRlfJdA1sUPsrW0GV4/AFuEaK +PhCUvIvoh6zxYR0lA/gYqtszCHGzHeNLoczOhytUZM+KQpOtO3TSING/+o59HHuM +niD6k3mWcyk6MkSgIXquJRGUVGVFeLGlXXf7aWEkIOrXeqjBZpBchZUIxZfkg100 +xxmEgNVGG4vxB/UIGeVqV2S4JscJmCyDGs130nRp7Qp5YGfkaTLKyOdutssrqatP +m5Zcjl2VGr4Xt4uXiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AI +BAAKCRBtDK/92xz+kEViAJ9zBTPNNTYIxPxt8BEvb3pUDeZkiQCffsDGKi7kdlTj +oZ26K7yxdjexaYS0OUlzbWFlbCBCb3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVy +ZSkgPGJvdXlhQG1lY2gua3RoLnNlPokCTgQTAQgAOBYhBPgoBv2hv1uaGzAU58n8 +7Wymt5RUBQJb8ATwAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEMn87Wym +t5RUIzgP/0/7+y7UOgj4Yja6Lwa+Lm7ESRZnbVmR1ERSAa9RKKr8BbPT4KhgwN2R +x8c3CedFupS02sG1G57u+4qQbEeZylaMu6rusf/XyQ+esh06cRXfR7Vb2d14yFQg +xun9PgPR7jL0RiU2fsgvF6O+u9KwnGRmABZXILDBxzGZBXKBIkmqBM8+rBkXFVWc +gezZqD106KcuGewciuWM7bfyLj+2yV9GhvX8iRyptgkx9/CNEdOqQzKYEbXVTSkh +tUW4QUmNnIiTnD/pZ4kr3UsQV6y0GC1kf9G5EeQHbD+kVROFM0/sX6qGn99IeC+j +96MflMnKuXJeXjlxNFZIYPoolBAC7CvpRfdky5q0KB2xWh+x2jQbn3fPpa6lVZdQ +De14guXdcEsj1QVUMRL3wFCDwHIsi3gqOpCHdy5GmunFRNqUWmoGU+uHt3Kk031w +DJdQY4YP+8tFWLPG3vKoPSf5EcG2Mf0hZiWiiIAX8sVw13W+oDlAQ0HKah/uxV77 +gM2ScBiiiOr92JIf3ftq2AjMuzrGhpKME/wG2DdcOqmq7U+tcVbambSc7SVa5nTM +JXm8ZPOSH0Fax1PULPd3pyLLhfF0rnPiDLcVa6UzG1MaSJiGBurIf3D3OCHRjQQ6 +kVpF9VtXhWeziV8wkyt66HNcuqUs6HDBNkpxPTNacKcZmW8J/FlaiF0EEBECAB0W +IQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/92xz+kKOiAJ4shO9b +nZ2Nx9XzBBg4C0nUl05LyQCbBpk7t2NIPMKaNtjsPb+RV5HbiQa0O0lzbWFlbCBC +b3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVyZSkgPGlzbWFlbC5ib3V5YUBlbnMu +ZnI+iQJOBBMBCAA4FiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvwBZYCGwMFCwkI +BwIGFQoJCAsCBBYCAwECHgECF4AACgkQyfztbKa3lFRK1w//cqsweiuXGPepyn0t +AL/S/scM6r9IwcjD3HrZqmUNSDAqU6PJ0FFialOPuSQIyEvrpY1GL+TiVtnYyAit +sbotxNxNQFwiBvqchg6xd1ftpjJihuo7RysNdSNAnlOxFlEz9X+EGkRqq8rCTpoS +GA9+4uFyFKzfv9CDg7YUVX5GVsE3bsPWymfCW1boW0TQyL7xNrDPfzKpVRHFu7hi +5OghiTbHbifmIolj5Mo0hGuXxz26gFzrufCjgxK9ycW7LnHEnnK0zX8Qfueir8RV +EisuAXtKILgS5mmOj0ywsrva4Qtf5JW5SKymhgsKCWskfz0lq6S6ceIKaYBr4Syk +0MLI82M0zDfGlLuRP6yQ3DTiTC4lWfXHdjyd0w4SwcuAQPCWz34gtUEGfMTyrd6O +le6pYreL1NPzd/NakYsR1H1fsXVJkgpESktoDIkzooLmBV6Pjr+PEt4DvPZYqgKl +AyD+aZeZ5HlTZCLbN9O38nDttWdAvsGjq82qvNI8A/d2Vvz4L1ND6NT71+wtC2QT +a95epSBD64l/JtK99SW/HjLjyvV9O+Nu2p8ESTOEaQhyIudnWYU+er+Vwy7YtLvY +y8L9/Xu9KvlBMjHBXAAV047KwkIQNrNyoTla5yQFSpv57hFYbx5CKTprpsl9Ic4v +uPjC/GMgkAJ3yTwIgxa47hgUAtKIXQQQEQIAHRYhBNw4R0hwnSYZ/yhnIW0Mr/3b +HP6QBQJb8AgEAAoJEG0Mr/3bHP6QyCcAnRuTQIMOpwxbyzjj+t0C9GdNJYmGAJ9v +5c5kvNCFiJAFCbUD4OxJBNA28rQ9SXNtYWVsIEJvdXlhIChEb24ndCBjb250YWN0 +IG1lIHRoZXJlKSA8Ym91eWFAbWF0aC5qdXNzaWV1LmZyPokCTgQTAQgAOBYhBPgo +Bv2hv1uaGzAU58n87Wymt5RUBQJb8AW0AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4B +AheAAAoJEMn87Wymt5RUaT8P/2OvKAfgqu0zQX0JhKu/wd9AATVmLa8C48JPQMUn +5Z9dQyDcFyKKfKbGCz9B5jTOrzHNX0VJfpDujOTiPIk6ci0KqAJ3Fz0gdpxIcEoW +B2zg0nwDtGHsGMX8togpcbVgKqblp0XSsMAFV2FN5PsAnxkqdXPDmZ5iZSgs9roi +9nxHPavbcr1cSAjsiRoFxFudzo7Q0Z/KLRlTuTSAX6B+vRAeyRB4NcXThKYZlAi6 +cr+xXTvPFddiQZgVBT+ICZRQY0gwgHpQcj70fNx1w6tTHfThlxInojKGlreOZov9 +A4TVeex/QagVTsjRAQuZ9yLMkx7JxakAxBPZ/OHuv7/K1Qdx90AJ8zQZ6uOXpUNl +c2MDEBoTI/nbsgMeHI/Mj4ndxCBUMperZ1oCITl+AhaqEZ+LxTKyne41YJedlqjc +5xnUVigz4ajmZPYmbO6eRDxisx4fMG7hI2HnNWak2xBDVOp1z2aqZY0xsG7o697d +I9BeR9JxbIusx0Szq6GabwI5beEI1xLlT333Fe3XDtT0NIQQvW9byuYuyfp7H6Xm +hFj2ut7jVI9xG932sJ8ioRJGCK1UcGYEL0ei4YZRv+mVysEJFjki2nlxspnG4C/V +Q20jXnLAXOpKLiStkNJ15WsnzeoL4eq0AUOYMMmYKAquXXgpVs+xUDv6XathWA2v +oZkAiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/9 +2xz+kEBpAJ4x7hASmdnDcyFGTyuRHj6NwsDtNwCfRVfqoiRcGmvDRA8U25cPk5XT +ZYTRzlXOUwEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQEASABIAAD/2wBD +AAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcp +LDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy +MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACMAG4D +AREAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAABgcEBQACAwEI/8QAQhAAAQIE +BAIGBgYIBwEAAAAAAQIDAAQFEQYSITFBURMUImFxsQcjMoGRwUJDUmJjchUlNTaC +odHwFiYzc4OS4bL/xAAZAQADAQEBAAAAAAAAAAAAAAAAAQIDBAX/xAAgEQEBAAID +AQEBAQEBAAAAAAAAAQIRAyExQRJREyIy/9oADAMBAAIRAxEAPwB2JHaECEjiPGA4 +6GA3kMMgDy8AZAGQAp8XD/Nc5+VP/wAiJT9GeBv3e/5VQ4cEu8M3sAZAGQBFT7Qh +JSOUBt4DZYww8O0AeQB5cc4AgzNXk5dfRh1Dj1r9Ghab/wAzpE3KQFdiSotTGIph +4trQFpAFyDwtwjO8mqqYbHeByDQNCD61R0jTGyzcTrQmigyAMsYAyxgCtTNt5hqI +SUnrKOYgN06yjnCVtnWUc4BtyenmWGVuurSlttJUpR2AGpMGyKbEHpZm3ulapLSW +GTcIdWm6yOZ1sIj92q0Cf8UVp2Y6b9IOIVtZkkD366xOzkjujFc83mROKZcCjc9M +kE/1hbV+Yq1VhC3TkUEKvcWNxE6UY3o4xKpueVIuKGRaSoWO5GsXhdXSM59Nhucb +cbStJFlAEeEa7Q26yj7UPdJ71pv7Qhboedab+0Iexsu2p2ZuD0sJltZom5gkEuaQ +jldxMPkZuk0gW2E05cetgIvfSJihZY/RcvODKpXr0NntKA4HkCeHdEWrkLBc67fK +EoF+Khc/CEuMYZn5tYyMFwX0KQRbwtCtkXMbUk4eqBKgpC9eYN4n9xf+Vczh+fYv +maUoDUHlD/cF47EmlTz0hPtFalsrQsdoGxtx1hs7DpolaTO5JZl7sdHmZPNKbAjx +Fx7jFY34ys+rcl4/XGL0jbVQmODpgsG2JD/F1UVIVqmRKgcT8YbNcy8qOrqO/ZiL +6uRLTKAU8WGloF/A3WpgUqjTc8gjOy0Si+2bYQr1C9pAzM469NOuKdUpxxRN766x +LUXYWw6mYbEw+m9zpeMc8/kdPHh/THp9LaYQAlCR4CMvXRNLASSCbqSOUGha0ekW +ym2QW8INBRVbCkjUJJ1BbCHCLpcA1SeBiscrEZ4ygLD1XmaFXUNzCypcutSSgnTX +Q2jbf2OTLH5TvkHGpuVbfTey0hWpvvHRjdxzWdrJiXSraHRi1cZQlVjDhUFGqNgX +zDaCxAtpjgepRcHFMQvHxaNIzUoG30YF/Cl9JM0sYVW2nNZb6EqI5an5ROXgw9LX +DEiieniVpBCNLGMuTLUdPHNmzTpdEu2lKUgJHARzW9uqToQy1iBDhpRtaKJ4bFO0 +A+oTygLxKiXxS2WMSqWNFGyzaN8L/wAuXlnY9whWn2qX0SyS2k3bJ5co14/45uXX +pjYYnOvpcUdcpt/KNazxaVWotys8W1HWwMBX0s0yM8sWyDbTtCK2z0ZNBys0INPO +thwIsRmEQ0x8XLEzLimhBfazBNvaEJfwtMeU0PYXnCVIOSzicqrm4MK+Fj6XeBmg +3LuuH2s9o5+V2cRgsz7DashKlHiEi8YadMqwYr9NS4lourSs8FIMVoerxDzTiLg7 +xW4WkWZqkhK9mYm2m1HYKO8IIipyXmFXYeQsDkYiztW+iwxmwheJAyDYrQlV78yY +34/HNy+jOkUZCqQyEzLbRCbZSNY6OOfXHyW0Y4TXK0lp1ExNt3Uq4+EXU49K3Eja +ahVS/LTSMmQJhwspuhRc20nUz7dvGIDZmYbWq6ZtKtDteAK1AeW0XElwoG6glRA9 +8JfTkp7MhSOnGoI3MTlLpWNm44YdkhKiYlr3UHLE8zaObO7jswx1dLadROyqkplz +kSsi6xwiJZb231Z4i081l0zJnnAgIUOg49IL8deWusVlMNdFj/pvsZ0guO0txbg9 +Yi4FuNoz1dKvoPrM1WOtN9Tlm3hm7YNiUjgf75ReEx13U5/rf/MWtPdmzNOMvNhS +Uq7DgTa45wrZL0NWzsP4ukutYokg3bpFNpzC17gE8PCNuPxy8vq1ammGWg31lQt9 +wxvjLI5rd1IYdMySJdb7pG/RsqV8orsumrs0GHC286+2sbpUyoHygLcQQhpSkHKk +gnlFMqaOHZdkUI2Zb9k/RETV4+L2ntNijpSEJtk2AhxfwAzbTIdc9UjQn6IgjOg8 +ASlaW1fTQ352J1jhynseljd2X+ixltuYbGZIULcYjTqk6Y9KtMsKUEITpuBBelad +6SvNT1FI02EOeM/XPqMu+c/RpUR3awo0+OqZZtkWQkCFpNnSfhuiSk3PzFYdZSp6 +XXkaWe5JGngSfjHXwzp53PQfOPFM1Mg7dKoD4x0uQZejxZWzM34OfKFVYIGMr/pw +AH6seZhxOXoClnCpSQf71gSbmHf2D/CYmrx8XdO/Y6b75YIv4AZ0WcdP3j5xTOl7 +UOtMYkPS3U0U5m1HdQO49x090cvLjJt18Wdup/BfSpglsDhHNvT0ML0ytTWVlCm5 +hKXG1ZshTmze6FO7s8spEalVqeZQ+2uUzIOqFIQRvwsdovxHqdKz6lqz5wHL9pGX +KbRF3LtpLPE1+ZyIzngLxU7RnlqC7CssZfDDeY3W6OkV4nWO3jx1HmZ5fqlhU05a +g+k8XFecbRz0aejtIS3M2+2PKFkrBExgi9bB/DHmYIWfpdygs4k+ECThw5rQP4TC +q8fF1TtaQm/2YS/gAqH+o9+Y+cUyoWxNklaVIzJSi/WVoJ2Psgxjyzrpvw3vtrSZ +4XzZzkWNDyMcWUehhk7Lpk7Jzhf6wtTLlipIAKx/FBLNaaY49rlpMsWdVzpNtgtO +/wAItprP+xBNPmUTInFzDnQJUAlpdlFPffv5RGV+M8vfXs9N5gWxYlZypHO8XxY7 +sjDlz1jaaVDFsPsDk2PKO5wTwqKwgmpPH8Q+cWxo09HySG5m/wBseULJeCNjAE1Z +On0PmYIMi8ZFn0i0NmbeGz+oB+U+cTWmPi6p6gqlAjbLCXPC2xDPJpsnOTa05g1m +OUfSN9BDt0zk3dF+1XprF9BmGX5Zlhlp3MwpBJUVW1uT7o5+XPVjq4uP1UyFWXIu +dXfAQ6g+0rYjmIzuP67jWZfnqmXR6tIz8olsrvbTX+sYXCyujDOWLhFNkmLv5la8 +OkNoeulb0HazX2ULLSVZGxcbjwiphazyzkQKMtycfdnHgRlA6FJ5Hj746+HCTtwc +/JbdHNQ1ZqAyfwx5RpU4+FnUtZ5/T6xXnF7ZaGGBT6t8Wt2h5Qsl4oWK1XrOX8MH ++ZggsLmUN3UlXdDZG5hz9hC3IxFaY+Leln9Tp/LAv4RnpEqahUxIJPqkErcAO5US +Nfd5wqWE+oWFZNtmTYlEG6bE35m+scXLv9Xbv4pNPK9hhbt1JbVobpUOELDPR54b +DDTlTo7pBbK0g7jjGu8cmWssVpMY3qEzLpl0srFhYgA3I+EKYRV5MrHeh0KerlVQ +/UG1NSvtKSrQqHL3w8spjOk443K9iOj1aVqU3PBgpSQuyUfdT2QR3aCOnj6mnLyz +vZyUD93mf9sRVGPhbz6gZ18X+tV5xWmWxfgdeZDwtqFfKFkvFVYxWUV5JHFr5wQZ +eoLHo+m21AmbR/1/9hbT+aNqVTHKdTjLqWFGxFwIVVjNRS1fGdOwpTTJqUJufCbB +hs6A/ePDw3hKkIGqzj9QemZ15RW46orUfE/KBUTqDVxITjZevkvfSMuTj/U6bcef +5vZryjrM3LocQpK0LFwRqDHJZ/XXL9jSYpjDuvRI8csJSKaWhBu20gHnYQi1GPI6 +tJulBAWoGyu+KhXwmqa9N0esKbKih9lw5rbf2fIx3Y3fccOWPyvqHB861UsKyr7S +hZaMqkj6KhoR/fdFbZya6QH8DtPPrdM04CtRVaw4xX6R+FrQ6EmilwJeU4Fm/agt +2cx0gV3DT1WqImEzCUAIy2y34wbFxBLWO6iUlSsgA3JhaR+rVZW/SJVJ1gyss6WE +EWWtGi1DlfgPCE0k/oEecU4sklVz3wKQ7WcUyq2VYJT8x84DaS4DjRaX7aNP/YAJ +sK4lVRpoSk8SZN09le/Rq5+HMRjycf67nrbj5Pz1fDWllNzDCXEKStChdKkm4UOY +jm18rp3/AB4tnXQQtK2qag2S6G+65gKlJWQhzFs84kdkry+8C0dfF/5cvJ6JMO4w +qeHWnGpZ31CiFKbUnMkm1r24HbaNWFgrlPSS/NKQkvNt3PaJJ0hzSLL8HWHKoupv +qzPBxNgRlMOyQsbbe0bEdZnqbUQ1LrbyFN+2qx3hyDLLVJWamweyDoNkxC5jpXrW +V7QG4lRO1r84DR5hpbqUqSrK4ghST3/0gPTmhwOuIeQLH2VjlASUUh1JSRfXUQGn +UrGUzhR9ptbinZZau00o3FufcfD+cRlhMl48lxNuk12RrcqJiTdC08Qd0+Mc2WNl +1XVjlMpuK/EU+mlyz02QCVdlNzbW0TMbbpWVkm6S70+/1t0hpokqvmNySd47ccZJ +pw223bnKTU4mdbadc6Rp0ELSRsddRDSnq6RhwkXAuFAwGJsLYvn8NzqX2CHWFH1j +K9ljuPA98BWbG9dqTGJ52Vnqcq7a2LqSrQoObVJ74ueMMuqVSlG+u8Q6HNSiIA8J +SdYA8NucAQVlUrNlxKFKbXbOEi5B52hBKXMC3qknMRuRDCKqX6W/SDPffNxgDrTl +zNImumkHXGuYQsix7v6QrJfTls8XFYxBO10s9YASptOWw0BPFXjE44TGqz5LlNVT +mXGc+MWh6ZZKilRSCU8YA7FG45jSAMaJSgDkbQBd0SsPUxbuUZkKHsnnzh70jLHa +qHHxiVtV6JvDDjt8YA3ygI4wBrlGf3QBsEjLtAbLDlAG6QIQcrdpR5GGTpYWvAGx +FlECAPLa35QBooBPSW4C8ASZXVRvyhlX/9mJAk4EEwEIADgWIQT4KAb9ob9bmhsw +FOfJ/O1spreUVAUCW/AHrgIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ +/O1spreUVJ4nD/9tGS8cg2eUSwd0ExCl0dWsJRdM0mUYh17mXyVNLcvbglIkSdma +v/Ty3ke533izRN/SkkU8vNthjKAohZmmXlaXrruEyHq2vfXcDg4+C7FJQ+O3PT2B +S5ft3Ht2GmRpD2lWpeUlJ9BXF2EF5pSnHPOrlTHRUfjBCDU4uuSeKgioSyoc2iWb +BBaSXyeQAUR+ppM1AYKUlCDxpLbe3nVCOUc+JgJzv+47EqwMyVODwzk7oFO4GMRm +KTKlctb1ym75oV1tiZi2fL/KA2uAab/RMO0rfxa9HVWnJGvUEDMPlTfs7222zuLB +55Fzllfx5rQlou+MLBQIV978HRZrDxZesQOOJ4/BwTPgQ42GREf+uf5/SG4Fn3Qh +NZsvoaePMLN/QQEjM7eqOUzRJRVcdJfRH+LinIFrAqcmbbcp1bvq8LV5lbmlFJLF +gimvW/shf/6Zu1YsfBhvLWInUCyoOPFa1tASF6qqi1hEOd8tQgNE/H/FSIehmTHT +74kYPNRm+DzlvrW2JPVl24Nf/SWbOG/IzGBY/pDActTwYqnpXKR7eUt/YcPpmrPi +kyIKX32U2vTBCE3yvCm0KRzrcSbTJGfVgmlxxqIuOtbeaBtf96m+o5z/xw9ro7Ek +VZbsx6fPuWuLY/MqeLXl1EuiU6X1sr+skDY8lJeeiRt+Uq5mCZuEgWdM1IhdBBAR +AgAdFiEE3DhHSHCdJhn/KGchbQyv/dsc/pAFAlvwCAQACgkQbQyv/dsc/pABQACf +YaUOqzlafrzeGdwHwDleootu0UcAn2adbaKJ79QBtDVPkR77zV801JlXuQINBFvw +A+gBEACt8AiUTMcyNXwN6kiOLPd+85IPlLwEVyofz8p2QBAxJsqKozlXXpnK7ahC +RSiHt02EK39WiyZpeY1/2dGmdvyI1vc7ld3814Dveh4nf1GRSpDZ427cxayaclh+ +wRQ8nDWFOQUsMB3He/Z+aO6l/ZNvdVdzRUHda1XvN41nwXUL9FQUn/TLYgHbxa7P +Yy18ZnNzH/xGSwDgRrqPEAZ8KOpbHEbNyYuYuv6IM8Xmbp8Q6bl2RyBNnrlphksJ +kLvO6RLHUvvw5uX5bt+u3umoZ+yHUkP13NtQHTyZ8VTCQimkB6OisisOTnV8OjLG +xtLEF/TjeGFAAoEnc8bQAPvrtONQL19rPkMB0gXYXPBbGw7eWYr3QpuOujUXcz9U +0JSSEov7cUepdTY8LEYFw8U5WimKY6f/uJUVx/ukNPtuAljJji0cjIGEOX2XGlBV +Ix/U3vywLBfUFW5hT+75z7UB3yG3Zexo0WSaQxxZ5PHxyPYBK1PvVkH0LvkbxJcr +rouJJQ66chjRglUbv4lf85/cG1ZLu3Ds0UbuD0gE9sAEwXtfdgDmp/HB7mxwJr1O +BRbTRv0Okx/lovWXkxt+hX+DXZ1u1qdZUW3zjmge8W7xag3epD21jIjFDODgUfDT +fgJi2FQq+szpagfPN5j5aIQKHCZf0DLbBD+ZWYQdld5JZs2V5QARAQABiQI2BBgB +CAAgFiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvwA+gCGwwACgkQyfztbKa3lFTa +yxAAxQo/9dvOO74J+9XznCYb5iO1B1ksnVegSGVuId45JKXkCkuWvDOkcU8+ma38 +wo3MBoPLpSMCXc/mKQ0p0ntO1tD/Wf4nBBCvseWcsR6RR5Su5jYorm0qZ89IOEPN +K2W2Z41X6DHyteB1dAyIyexOYoLKD7iWcQzga4/EoUPEwcr8BWWgGLBfRhXsYySz +F3fQPS7KaemDLGbJfTDZCSqmsZPnlksSvGxEBwUwfCjfY+QHxzWPRFPkuQJJR6YW +tiZ3z7jBRdRk/R5v2CJZJuGHcPPYQy6j2TYGONojm+ifaq1hz+A0aoy4P9qRW5Nl +mm6yiqEoJe07DrMLxn3H3ucuOo7DiNWmkkjW8DfhFSd+3pFMSvKGujOJWN27UDEp +ERWFX50gE15Sq4aPbMPNRejFQ1n75B4jfFQXg6WuwF3kwgHK3Y5T5vTEkbPgce9c +SyyFWU7EA4DJGnt7/FoaPDTKOWI9WSkmjOSABTBNSaUiMSFA3Wg/T0aS5pETpkv2 +S/GVVX022orAGK8zEY1vr2a24itOAKpQwFRuMjqDCBVgKAsMtlPu8jv3Zm/AMcYM +sRRnDWJh2TO8bqXXUG/o783fcTE3d1Ff7s4BfmBqpGHigZeehNvu+FshRDYaDrDN +IS0fTqbsX/JjaCXwU/o2E6G4aE79Ut/IMsCYzItTDh2UmcS5Ag0EW/G8wgEQALBi +2/A7Ev/92mYi4Gm//IJEKjm2Vc3NcX5LdSyPwdSLlHSRwvzZz7M0VeflcTYqssto +VPVf4maDtLGbQJn43CLqjvIW/C6jzjfvoZf0gbHpNfKY1ENs5xgE0wd3ZdsqpQC6 +W9Pu+kN31QS9+RUKwiG2bNBIREChL/omqiLhNu3hDbZnB+uSByOk901XVrNmKa8G +NzXSfJSCt0gP7XU6VpMqjxppA8Y2Vo7jnylbrgVJriTt6jtjDylBBQqmHSOXMT+q +9kIWDSocKhSFHBMO6LYnAwbMef2kqio5zaKzZAuwis0zjOqKHwW54xL2T7djFav9 +VlgcAYN105iMLUiIl39HLeZnS5pUESOXRUv/qLwiQRvBlWBPIep3+ycM2eK8r5a1 +5EwCgN2nSl3KYjzTOisCmK1nQs+gQ1RMraeBGYEG0uIUvDxfoONTuYkM3dhWq2Xx +V/OO6yUkfyOlBGUREe1PXAOsP0LtAFJha7kbh7Eg6GGU7gRYh2dG2Ln6Vmx1ldbS +F3woFYPGNMsQmgEKxwyjKaq0Qhd/sKHrTpPz8PXfGP4dHegExKegS7Yof1VrKBB+ +L8Q8o1Oi8JPCjRp47iga5OYS1Vn3h5a07ajzSAxPsmF0lmF4tYk2MFxSs403ShiE +BTjN4t6rjmnoQV/b+CuhpmvzxaYr736/jkY7s0I5ABEBAAGJBGwEGAEIACAWIQT4 +KAb9ob9bmhswFOfJ/O1spreUVAUCW/G8wgIbAgJACRDJ/O1spreUVMF0IAQZAQgA +HRYhBB2wOl45wX3kd77c+/0dTvV/qVkCBQJb8bzCAAoJEP0dTvV/qVkC3tUP/2rR +VDaSPj9+UYJtHGDfQmYCEqxROm5wGCJbNrUQspLeL8+XrsaUDh1ldNAQtoDqGjRp +kwjJAS0OZfvCv7pI052NK/KVGaK5Tj2+0lxTAcGbAKoH8E2HWPlERpU9CRLvzvDE +4GGxw2nw7aobNGbf9d98c9RpZuAul92BOClnpGEU4VzjKUk9IsSjZQVJnggQujxL +qWWiwfGwVsj2PdgPao/P48cYNl5CACBgY19AAh7WzgJVz/6je/5NLdAAV+E31qSE +EaZsvTBqrMOtH6iTn1GpJ73FsJ0BYVt9X99bRT0Vi0iWulBuhYfZG4PdCY6fv6uC +d+6pAC+Y/M9npaLbBHscSlJheTyvfuB7bzYBY+Q87VHSOMuNni7U08FuiILFoF+e +/ESU/v0Hde44ghiXKSaFO8djxc874KM9UlGWvw9UbmI8Z2uM0kDcrPZ/8tcjXOhp +PEBib54ab4tKCUCtOmsF9ZiT0hOqYdP9bXW+6OGfCignJ7ABhPpANfx2Sn/28L9l +PbF1nA5CkHdyo/ku1Z/lNq44yvrB8r0Ljq6s3KS69dUZqqrADeogOdi0/TrghtKU +DERWGmQagYSzMIvsXoAI56MxXFLriSObmpFLTWq7cr/+Ju3AcaSkrpDSYi3U6vLL +8NuXPhul1S/+yPwvX6Mk1Zkip9/Wg4SQeiT2R7xj8zMP/RJ8uKbnKpOftY89Kv0Y +FZ4hE3FeBR3UJvkuPdQYNLQRluzh63Bzc4ClSxB9Ma7fmAEiuFtgEi4HLTMBDOHO +uVMuWYcgubu9VBlAGLJ++gnKxCAJXEntuB49il8MjMsy+uv/cFCjPG9z/1pmWYrE +XBNA+vcaOrNTS2IykAbqybcPYbBcN47bm+A4i5yqiahk0q++j4LOW/nf88xXO7xI +V/4vQgemh7RHgHJOkKfzOPw/Kx3UjV1jA9gEUrusHE4R3Upxh0ZeQW19hUnVlao1 +TxxKEUryrRzckuRfc5ziMWNyJaZsPMkeBEhyY/CizDFPrsSXIAijfu8KFnxCsnaM +ylFBWOu5FwsKMDXxu0QdwqpL2CM8p+q12z1VruNjpIc8bAc0/YMndjYnxzsqQEMV +GQIDKWqh/m6v7sqbn65ZQcVAzSAriGcQxCOIoT/TA/J+/4BSk5c8TKlqT8NBT77B +Z70vMr41mZus1A/ciI8AxgbYwlhuvTehdm74k/c7NSzTxeG3OumTlBR1I18C4AIi +y4iM3O4H4jvEssWBUzpm3VJG0NvcN/M4YVZHX5yxWQuIFcghzb7sLYddmRvR9B0M +Xowot//r/sgn43xv54sIvwe9MkCCU6j7ePYUlOUnn+vQ5i7rFN/UPub3V3toI2gg +DRuKdymWEii1jA9KlmheLTFr +=r9L+ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/systems/zoldene/base.nix b/systems/zoldene/base.nix new file mode 100644 index 0000000..8ca5d52 --- /dev/null +++ b/systems/zoldene/base.nix @@ -0,0 +1,122 @@ +{ name, config, lib, pkgs, secrets, ... }: +let + # udev rules to be able to boot from qemu in a rescue + udev-qemu-rules = + let disks = config.disko.devices.disk; + in builtins.concatStringsSep "\n" (lib.imap1 (i: d: '' + SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_MODEL}=="QEMU_HARDDISK", ENV{ID_SERIAL_SHORT}=="QM0000${builtins.toString i}", SYMLINK+="${lib.removePrefix "/dev/" disks."${d}".device}" + SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="partition", ENV{ID_MODEL}=="QEMU_HARDDISK", ENV{ID_SERIAL_SHORT}=="QM0000${builtins.toString i}", SYMLINK+="${lib.removePrefix "/dev/" disks."${d}".device}-part%E{PARTN}" + '') (builtins.attrNames disks)); +in +{ + services.openssh = { + settings.KbdInteractiveAuthentication = false; + hostKeys = [ + { + path = "/persist/zpool/etc/ssh/ssh_host_ed25519_key"; + type = "ed25519"; + } + { + path = "/persist/zpool/etc/ssh/ssh_host_rsa_key"; + type = "rsa"; + bits = 4096; + } + ]; + }; + + system.stateVersion = "23.05"; + + # Useful when booting from qemu in rescue + console = { + earlySetup = true; + keyMap = "fr"; + }; + + services.udev.extraRules = udev-qemu-rules; + fileSystems."/persist/zfast".neededForBoot = true; + boot = { + zfs.forceImportAll = true; # needed for the first boot after + # install, because nixos-anywhere + # doesn't export filesystems properly + # after install (only affects fs not + # needed for boot, see fsNeededForBoot + # in nixos/lib/utils.nix + kernelParams = [ "boot.shell_on_fail" ]; + loader.grub.devices = [ + config.disko.devices.disk.sda.device + config.disko.devices.disk.sdb.device + ]; + extraModulePackages = [ ]; + kernelModules = [ "kvm-intel" ]; + supportedFilesystems = [ "zfs" ]; + kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages; + initrd = { + postDeviceCommands = lib.mkAfter '' + zfs rollback -r zfast/root@blank + ''; + services.udev.rules = udev-qemu-rules; + availableKernelModules = [ "e1000e" "ahci" "sd_mod" ]; + network = { + enable = true; + postCommands = "echo 'cryptsetup-askpass' >> /root/.profile"; + flushBeforeStage2 = true; + ssh = { + enable = true; + port = 2222; + authorizedKeys = config.users.extraUsers.root.openssh.authorizedKeys.keys; + hostKeys = [ + "/boot/initrdSecrets/ssh_host_rsa_key" + "/boot/initrdSecrets/ssh_host_ed25519_key" + ]; + }; + }; + }; + }; + networking = { + hostId = "6251d3d5"; + firewall.enable = false; + firewall.allowedUDPPorts = [ 43484 ]; + # needed for initrd proper network setup too + useDHCP = lib.mkDefault true; + + wireguard.interfaces.wg0 = { + generatePrivateKeyFile = true; + privateKeyFile = "/persist/zpool/etc/wireguard/wg0"; + #presharedKeyFile = config.secrets.fullPaths."wireguard/preshared_key"; + listenPort = 43484; + + ips = [ + "192.168.1.25/24" + ]; + peers = [ + ]; + }; + }; + + powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + hardware.enableRedistributableFirmware = lib.mkDefault true; + system.activationScripts.createDatasets = { + deps = [ ]; + text = '' + PATH=${pkgs.zfs}/bin:$PATH + '' + builtins.concatStringsSep "\n" (lib.mapAttrsToList (name: c: '' + if ! zfs list "${c._parent.name}/${name}" 2>/dev/null >/dev/null; then + ${c._create { zpool = c._parent.name; }} + fi + '') (config.disko.devices.zpool.zfast.datasets // config.disko.devices.zpool.zpool.datasets)); + }; + + secrets.keys."wireguard/preshared_key/eldiron" = { + permissions = "0400"; + user = "root"; + group = "root"; + text = let + key = builtins.concatStringsSep "_" (builtins.sort builtins.lessThan [ name "eldiron" ]); + in + "{{ .wireguard.preshared_keys.${key} }}"; + }; + secrets.decryptKey = "/persist/zpool/etc/ssh/ssh_host_ed25519_key"; + # ssh-keyscan zoldene | nix-shell -p ssh-to-age --run ssh-to-age + secrets.ageKeys = [ "age1rqr7qdpjm8fy9nf3x07fa824v87n40g0ljrgdysuayuklnvhcynq4c8en8" ]; +} diff --git a/systems/zoldene/disko.nix b/systems/zoldene/disko.nix new file mode 100644 index 0000000..7df5697 --- /dev/null +++ b/systems/zoldene/disko.nix @@ -0,0 +1,87 @@ +{ cryptKeyFile, ... }: { + disko.devices = let + zpoolDatasets = { + "root" = { type = "zfs_fs"; options.mountpoint = "none"; }; + "root/persist" = { type = "zfs_fs"; mountpoint = "/persist/zpool"; options.mountpoint = "legacy"; }; + }; + zfastDatasets = { + "root" = { type = "zfs_fs"; mountpoint = "/"; options.mountpoint = "legacy"; postCreateHook = "zfs snapshot zfast/root@blank"; }; + "root/nix" = { type = "zfs_fs"; mountpoint = "/nix"; options.mountpoint = "legacy"; }; + "root/persist" = { type = "zfs_fs"; mountpoint = "/persist/zfast"; options.mountpoint = "legacy"; }; + "root/persist/var" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var"; options.mountpoint = "legacy"; }; + "root/persist/var/lib" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib"; options.mountpoint = "legacy"; }; + }; + in { + disk = { + sda = { + type = "disk"; + device = "/dev/disk/by-id/ata-SAMSUNG_MZ7LM480HCHP-00003_S1YJNYAG700613"; + content = { + type = "table"; + format = "gpt"; + partitions = [ + { start = "2GiB"; end = "-8GiB"; name = "ssdLuksA"; content = { type = "luks"; name = "ssdA"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zfast"; }; }; } + { start = "-8GiB"; end = "-2MiB"; name = "swapA"; flags = [ "swap" ]; content = { type = "swap"; }; } + { start = "2048s"; end = "4095s"; name = "ssdGrubA"; flags = [ "bios_grub" ]; } + { start = "4096s"; end = "2GiB"; name = "ssdBootA"; content = { type = "filesystem"; format = "ext4"; mountpoint = "/boot"; }; } + ]; + }; + }; + sdb = { + type = "disk"; + device = "/dev/disk/by-id/ata-SAMSUNG_MZ7LM480HCHP-00003_S1YJNYAG700682"; + content = { + type = "table"; + format = "gpt"; + partitions = [ + { start = "2GiB"; end = "-8GiB"; name = "ssdLuksB"; content = { type = "luks"; name = "ssdB"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zfast"; }; }; } + { start = "-8GiB"; end = "-2MiB"; name = "swapB"; flags = [ "swap" ]; content = { type = "swap"; }; } + { start = "2048s"; end = "4095s"; name = "ssdGrubB"; flags = [ "bios_grub" ]; } + #{ start = "4096s"; end = "2GiB"; name = "ssdBootB"; content = { type = "filesystem"; format = "ext4"; }; } # non monté + ]; + }; + }; + sdc = { + type = "disk"; + device = "/dev/disk/by-id/ata-ST4000NM0245-1Z2107_ZC110SY1"; + content = { + type = "table"; + format = "gpt"; + partitions = [ + { start = "2048s"; end = "-34s"; name = "hddLuksA"; content = { type = "luks"; name = "bigA"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zpool"; }; }; } + ]; + }; + }; + sdd = { + type = "disk"; + device = "/dev/disk/by-id/ata-ST4000NM0245-1Z2107_ZC110YXX"; + content = { + type = "table"; + format = "gpt"; + partitions = [ + { start = "2048s"; end = "-34s"; name = "hddLuksB"; content = { type = "luks"; name = "bigB"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zpool"; }; }; } + ]; + }; + }; + }; + + zpool = { + zpool = { + type = "zpool"; + mode = "mirror"; + mountRoot = "/"; + rootFsOptions = { mountpoint = "none"; atime = "off"; xattr = "sa"; acltype = "posix"; }; + options = { ashift = "12"; }; + datasets = zpoolDatasets; + }; + zfast = { + type = "zpool"; + mode = "mirror"; + mountRoot = "/"; + rootFsOptions = { mountpoint = "none"; atime = "off"; xattr = "sa"; acltype = "posix"; }; + options = { ashift = "12"; }; + datasets = zfastDatasets; + }; + }; + }; +} diff --git a/systems/zoldene/flake.lock b/systems/zoldene/flake.lock new file mode 100644 index 0000000..0a9ba64 --- /dev/null +++ b/systems/zoldene/flake.lock @@ -0,0 +1,560 @@ +{ + "nodes": { + "backports": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=", + "path": "../../backports", + "type": "path" + }, + "original": { + "path": "../../backports", + "type": "path" + } + }, + "colmena": { + "inputs": { + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "stable": "stable" + }, + "locked": { + "lastModified": 1687954574, + "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=", + "owner": "immae", + "repo": "colmena", + "rev": "e427171150a35e23204c4c15a2483358d22a0eff", + "type": "github" + }, + "original": { + "owner": "immae", + "ref": "add-lib-get-flake", + "repo": "colmena", + "type": "github" + } + }, + "disko": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1687968164, + "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=", + "owner": "nix-community", + "repo": "disko", + "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "disko", + "type": "github" + } + }, + "environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../environment", + "type": "path" + }, + "original": { + "path": "../environment", + "type": "path" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1687762428, + "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1675295133, + "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "impermanence": { + "locked": { + "lastModified": 1684264534, + "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=", + "owner": "nix-community", + "repo": "impermanence", + "rev": "89253fb1518063556edd5e54509c30ac3089d5e6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "impermanence", + "type": "github" + } + }, + "my-lib": { + "inputs": { + "colmena": "colmena", + "disko": "disko", + "flake-parts": "flake-parts", + "nixos-anywhere": "nixos-anywhere", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=", + "path": "../../flakes/lib", + "type": "path" + }, + "original": { + "path": "../../flakes/lib", + "type": "path" + } + }, + "mypackages": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_7", + "webapps-ttrss": "webapps-ttrss" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=", + "path": "../../mypackages", + "type": "path" + }, + "original": { + "path": "../../mypackages", + "type": "path" + } + }, + "myuids": { + "locked": { + "lastModified": 1, + "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=", + "path": "../../myuids", + "type": "path" + }, + "original": { + "path": "../../myuids", + "type": "path" + } + }, + "nixos-2305": { + "locked": { + "lastModified": 1687938137, + "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixos-anywhere": { + "inputs": { + "disko": [ + "my-lib", + "disko" + ], + "flake-parts": [ + "my-lib", + "flake-parts" + ], + "nixos-2305": "nixos-2305", + "nixos-images": "nixos-images", + "nixpkgs": "nixpkgs_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1689945193, + "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=", + "owner": "numtide", + "repo": "nixos-anywhere", + "rev": "27161266077a177ac116e2cb72cc70af5f145189", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nixos-anywhere", + "type": "github" + } + }, + "nixos-images": { + "inputs": { + "nixos-2305": [ + "my-lib", + "nixos-anywhere", + "nixos-2305" + ], + "nixos-unstable": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1686819168, + "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=", + "owner": "nix-community", + "repo": "nixos-images", + "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-images", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1683408522, + "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1685564631, + "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib_2": { + "locked": { + "dir": "lib", + "lastModified": 1675183161, + "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1687701825, + "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687893427, + "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4b14ab2a916508442e685089672681dff46805be", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1648725829, + "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1646497237, + "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "type": "github" + } + }, + "private-environment": { + "locked": { + "lastModified": 1, + "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=", + "path": "../../flakes/private/environment", + "type": "path" + }, + "original": { + "path": "../../flakes/private/environment", + "type": "path" + } + }, + "private-system": { + "inputs": { + "backports": "backports", + "environment": "environment", + "mypackages": "mypackages", + "myuids": "myuids", + "secrets-public": "secrets-public" + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=", + "path": "../../flakes/private/system", + "type": "path" + }, + "original": { + "path": "../../flakes/private/system", + "type": "path" + } + }, + "public-secrets": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../flakes/secrets", + "type": "path" + }, + "original": { + "path": "../../flakes/secrets", + "type": "path" + } + }, + "root": { + "inputs": { + "impermanence": "impermanence", + "my-lib": "my-lib", + "nixpkgs": "nixpkgs_5", + "private-environment": "private-environment", + "private-system": "private-system", + "public-secrets": "public-secrets" + } + }, + "secrets-public": { + "locked": { + "lastModified": 1, + "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=", + "path": "../../secrets", + "type": "path" + }, + "original": { + "path": "../../secrets", + "type": "path" + } + }, + "stable": { + "locked": { + "lastModified": 1669735802, + "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "731cc710aeebecbf45a258e977e8b68350549522", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "my-lib", + "nixos-anywhere", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687940979, + "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "0a4f06c27610a99080b69433873885df82003aae", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "webapps-ttrss": { + "flake": false, + "locked": { + "lastModified": 1546759381, + "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=", + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "revCount": 9256, + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + }, + "original": { + "ref": "master", + "rev": "986ca251f995f7754a0470d3e0c44538a545081f", + "type": "git", + "url": "https://git.tt-rss.org/fox/tt-rss.git" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/systems/zoldene/flake.nix b/systems/zoldene/flake.nix new file mode 100644 index 0000000..42466e8 --- /dev/null +++ b/systems/zoldene/flake.nix @@ -0,0 +1,29 @@ +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + impermanence.url = "github:nix-community/impermanence/master"; + my-lib.url = "path:../../flakes/lib"; + public-secrets.url = "path:../../flakes/secrets"; + private-environment.url = "path:../../flakes/private/environment"; + private-system.url = "path:../../flakes/private/system"; + }; + outputs = inputs@{ self, nixpkgs, my-lib, ... }: + my-lib.lib.mkColmenaFlake { + name = "zoldene"; + inherit self nixpkgs; + system = "x86_64-linux"; + targetHost = "88.198.39.152"; + targetUser = "root"; + nixosModules = with inputs; { + impermanence = impermanence.nixosModule; + base = ./base.nix; + disko = ./disko.nix; + logging = ./logging.nix; + + secrets = public-secrets.nixosModule; + + environment = private-environment.nixosModule; + system = private-system.nixosModule; + }; + }; +} diff --git a/systems/zoldene/logging.nix b/systems/zoldene/logging.nix new file mode 100644 index 0000000..09ee104 --- /dev/null +++ b/systems/zoldene/logging.nix @@ -0,0 +1,138 @@ +{ config, pkgs, name, ... }: +# Initialization +# CREATE INDEX ON LOGS (tag); +# CREATE INDEX ON LOGS (time); +# CREATE INDEX ON LOGS (((data->>'PRIORITY')::int)); +# CREATE INDEX ON LOGS ((data->>'_SYSTEMD_UNIT')); +# CREATE INDEX ON LOGS ((data->>'SYSLOG_IDENTIFIER')); +let + fluent-bit-config = { + pipeline = { + inputs = [ + { + name = "systemd"; + tag = "${name}.systemd"; + DB = "/var/lib/fluentbit/fluent-bit.db"; + } + ]; + outputs = [ + { + name = "loki"; + match = "${name}.systemd"; + line_format = "json"; + labels = "job=fluentbit, server=${name}, priority=$PRIORITY, syslog_identifier=$SYSLOG_IDENTIFIER, systemd_unit=$_SYSTEMD_UNIT"; + } + { + name = "pgsql"; + match = "*"; + host = "/run/postgresql"; + user = "fluentbit"; + table = "logs"; + database = "fluentbit"; + timestamp_key = "event_timestamp"; + } + ]; + }; + }; + yamlFormat = pkgs.formats.yaml {}; + psqlVersion = pkgs.postgresql_13.psqlSchema; +in +{ + disko.devices.zpool.zfast.datasets."root/persist/var/lib/loki" = + { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/loki"; options.mountpoint = "legacy"; }; + disko.devices.zpool.zfast.datasets."root/persist/var/lib/fluentbit" = + { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/fluentbit"; options.mountpoint = "legacy"; }; + disko.devices.zpool.zfast.datasets."root/persist/var/lib/postgresql" = + { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/postgresql"; options.mountpoint = "legacy"; }; + disko.devices.zpool.zfast.datasets."root/persist/var/lib/postgresql/${psqlVersion}" = + { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/postgresql/${psqlVersion}"; options.mountpoint = "legacy"; }; + environment.persistence."/persist/zfast".directories = [ + { + directory = "/var/lib/postgresql"; + user = config.users.users.postgres.name; + group = config.users.users.postgres.group; + mode = "0755"; + } + { + directory = "/var/lib/fluentbit"; + user = config.users.users.fluentbit.name; + group = config.users.users.fluentbit.group; + mode = "0755"; + } + { + directory = "/var/lib/loki"; + user = config.users.users.loki.name; + group = config.users.users.loki.group; + mode = "0755"; + } + ]; + + ids.uids.fluentbit = 500; + ids.gids.fluentbit = 500; + users.users.fluentbit = { + name = "fluentbit"; + home = "/var/lib/fluentbit"; + uid = config.ids.uids.fluentbit; + group = "fluentbit"; + isSystemUser = true; + extraGroups = [ "systemd-journal" ]; + }; + users.groups.fluentbit.gid = config.ids.gids.fluentbit; + + services.loki = { + enable = true; + configuration = { + auth_enabled = false; + common = { + ring.kvstore.store = "inmemory"; + ring.instance_addr = "127.0.0.1"; + replication_factor = 1; + path_prefix = "/var/lib/loki"; + }; + server.log_level = "warn"; + limits_config = { + reject_old_samples = false; + ingestion_rate_mb = 100; + ingestion_burst_size_mb = 200; + per_stream_rate_limit = "100MB"; + per_stream_rate_limit_burst = "200MB"; + }; + + schema_config.configs = [ + { + from = "2020-10-24"; + store = "boltdb-shipper"; + object_store = "filesystem"; + schema = "v11"; + index.prefix = "index_"; + index.period = "24h"; + } + ]; + }; + }; + services.postgresql = { + enable = true; + package = pkgs.postgresql_13; + ensureDatabases = [ "fluentbit" ]; + ensureUsers = [ + { + name = "fluentbit"; + ensurePermissions."DATABASE \"fluentbit\"" = "ALL PRIVILEGES"; + } + ]; + }; + + environment.systemPackages = [ + pkgs.fluent-bit + ]; + systemd.services.fluent-bit = { + description = "Fluent-bit daemon"; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + ExecStart = "${pkgs.fluent-bit}/bin/fluent-bit -c ${yamlFormat.generate "fluent.yaml" fluent-bit-config}"; + User = "fluentbit"; + Group = "fluentbit"; + SupplementaryGroups = [ "systemd-journal" ]; + }; + }; +}