# 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
+++ /dev/null
-; 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"
/result*
/versions_log
.direnv/
-/nixops/.gcroots
+/deploy/.gcroots
+/deploy/history
+++ /dev/null
-[submodule "nixops/secrets"]
- path = nixops/secrets
- url = gitolite@git.immae.eu:perso/Immae/Config/Nix/Nixops/Secrets
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.
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
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
---------
- 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 <nixpkgs> {};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 :
- 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
------
-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
-{ 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}"
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+ };
+}
+++ /dev/null
-{ callPackage }:
-{
- immae-eu = callPackage ./immae-eu.nix {};
-}
+++ /dev/null
-{ 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; };
-}
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ });
+}
"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": {
},
"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"
}
{
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 {
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");
};
};
}
--- /dev/null
+{ 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
--- /dev/null
+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))
+
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ }
--- /dev/null
+[[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"},
+]
--- /dev/null
+[tool.poetry]
+name = "copanier"
+version = "0.0.4"
+description = ""
+authors = ["Your Name <you@example.com>"]
+
+[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"
--- /dev/null
+{ 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
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+ };
+ };
+}
+
{ 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"
];
# 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:
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
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
--- /dev/null
+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:%';
+
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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}"
+ ];
+ };
+ };
+
+ };
+ };
+ };
+}
+
+
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 = {};
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+}
-{ 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 = ''
cat package.json | jq -r '.version = "${version}"' > $out/package.json
cp yarn.lock $out/
'';
- });
+ };
yarnModules = yarn2nix-moretea.mkYarnModules rec {
name = "grocy-yarn";
pname = name;
};
app = composerEnv.buildPackage (
import ./php-packages.nix { inherit composerEnv fetchurl; } //
- packagesource //
{
+ name = "grocy";
+ inherit src;
noDev = true;
buildInputs = [ yarnModules ];
postInstall = ''
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+}
{
"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": {
},
"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"
}
}
},
{
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;
+ };
+ };
};
};
}
--- /dev/null
+{
+ 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}";
+ };
+ };
+ };
+ };
+}
-{ 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: {
};
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 = {
};
};
};
- 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
ln -sf ${varDir}/tmp/cache tmp
'';
buildInputs = [ gems gems.ruby nodejs yarn ];
- passthru = { inherit gems varDir; };
+ passthru = { inherit gems varDir nodejs; };
}
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+
+ };
+ };
+ };
+}
+
+
-{ 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: {
};
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 ];
});
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:
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
'';
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
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+ };
+ };
+}
+
+
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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 = ''
+ <Directory ${cfg.root}>
+ DirectoryIndex ${cfg.indexFile}
+ AllowOverride None
+ Require all granted
+
+ RewriteEngine on
+ RewriteRule ^/(.+) / [L]
+ </Directory>
+ '';
+ };
+ 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)
+ );
+
+ }
+ ];
+ };
+ };
+}
+
+
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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; };
+ };
+ };
+}
--- /dev/null
+{
+ 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 <<EOF | /run/wrappers/bin/sendmail -i scripts_error+${name}@mail.immae.eu
+ $repeat
+ To: scripts_error+${name}@mail.immae.eu
+ Subject: Log from script error
+ Content-Type: text/plain; charset="UTF-8"
+ Content-Transfer-Encoding: 8bit
+ References:$messageId
+ MIME-Version: 1.0
+ X-Return-Code: $ret
+
+ Error code: $ret
+ Output of message:
+ --------------
+ $output
+ --------------
+ EOF
+ fi
+ '';
+
+}
--- /dev/null
+i@{ name, type }:
+{ lib, flake-parts-lib, ... }:
+flake-parts-lib.mkTransposedPerSystemModule {
+ inherit name;
+ option = lib.mkOption {
+ type = lib.types.lazyAttrsOf lib.types."${type}";
+ default = { };
+ };
+ file = import ./flake-parts-lib.nix i;
+}
# This file originates from node2nix
-{stdenv, nodejs, python2, utillinux, libtool, runCommand, writeTextFile}:
+{lib, stdenv, nodejs, python2, utillinux, libtool, runCommand, writeTextFile}:
let
python = if nodejs ? python then nodejs.python else python2;
};
includeDependencies = {dependencies}:
- stdenv.lib.optionalString (dependencies != [])
- (stdenv.lib.concatMapStrings (dependency:
+ lib.optionalString (dependencies != [])
+ (lib.concatMapStrings (dependency:
''
# Bundle the dependencies of the package
mkdir -p node_modules
cd "$DIR/${packageName}"
${includeDependencies { inherit dependencies; }}
cd ..
- ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
+ ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
'';
pinpointDependencies = {dependencies, production}:
''
node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"}
- ${stdenv.lib.optionalString (dependencies != [])
+ ${lib.optionalString (dependencies != [])
''
if [ -d node_modules ]
then
cd node_modules
- ${stdenv.lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies}
+ ${lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies}
cd ..
fi
''}
cd "${packageName}"
${pinpointDependencies { inherit dependencies production; }}
cd ..
- ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
+ ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
fi
'';
stdenv.mkDerivation ({
name = "node-${name}-${version}";
buildInputs = [ tarWrapper python nodejs ]
- ++ stdenv.lib.optional (stdenv.isLinux) utillinux
- ++ stdenv.lib.optional (stdenv.isDarwin) libtool
+ ++ lib.optional (stdenv.isLinux) utillinux
+ ++ lib.optional (stdenv.isDarwin) libtool
++ buildInputs;
inherit dontStrip; # Stripping may fail a build for some package deployments
cd "${packageName}"
runHook preRebuild
- ${stdenv.lib.optionalString bypassCache ''
+ ${lib.optionalString bypassCache ''
if [ ! -f package-lock.json ]
then
echo "No package-lock.json file found, reconstructing..."
node ${addIntegrityFieldsScript}
''}
- npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
+ npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} rebuild
if [ "$dontNpmInstall" != "1" ]
then
# NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
rm -f npm-shrinkwrap.json
- npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
+ npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} install
fi
# Create symlink to the deployed executable folder, if applicable
name = "node-dependencies-${name}-${version}";
buildInputs = [ tarWrapper python nodejs ]
- ++ stdenv.lib.optional (stdenv.isLinux) utillinux
- ++ stdenv.lib.optional (stdenv.isDarwin) libtool
+ ++ lib.optional (stdenv.isLinux) utillinux
+ ++ lib.optional (stdenv.isDarwin) libtool
++ buildInputs;
inherit dontStrip; # Stripping may fail a build for some package deployments
# Create fake package.json to make the npm commands work properly
cp ${src}/package.json .
chmod 644 package.json
- ${stdenv.lib.optionalString bypassCache ''
+ ${lib.optionalString bypassCache ''
if [ -f ${src}/package-lock.json ]
then
cp ${src}/package-lock.json .
# Pinpoint the versions of all dependencies to the ones that are actually being used
echo "pinpointing versions of dependencies..."
cd ..
- ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
+ ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
source $pinpointDependenciesScriptPath
cd ${packageName}
export HOME=$PWD
- ${stdenv.lib.optionalString bypassCache ''
+ ${lib.optionalString bypassCache ''
if [ ! -f package-lock.json ]
then
echo "No package-lock.json file found, reconstructing..."
node ${addIntegrityFieldsScript}
''}
- npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
+ npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} rebuild
- ${stdenv.lib.optionalString (!dontNpmInstall) ''
+ ${lib.optionalString (!dontNpmInstall) ''
# NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
rm -f npm-shrinkwrap.json
- npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
+ npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} install
''}
cd ..
- ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
+ ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
mv ${packageName} lib
ln -s $out/lib/node_modules/.bin $out/bin
stdenv.mkDerivation {
name = "node-shell-${name}-${version}";
- buildInputs = [ python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ buildInputs;
+ buildInputs = [ python nodejs ] ++ lib.optional (stdenv.isLinux) utillinux ++ buildInputs;
buildCommand = ''
mkdir -p $out/bin
cat > $out/bin/shell <<EOF
# Provide the dependencies in a development shell through the NODE_PATH environment variable
inherit nodeDependencies;
- shellHook = stdenv.lib.optionalString (dependencies != []) ''
+ shellHook = lib.optionalString (dependencies != []) ''
export NODE_PATH=$nodeDependencies/lib/node_modules
'';
};
in
{
- buildNodeSourceDist = stdenv.lib.makeOverridable buildNodeSourceDist;
- buildNodePackage = stdenv.lib.makeOverridable buildNodePackage;
- buildNodeShell = stdenv.lib.makeOverridable buildNodeShell;
+ buildNodeSourceDist = lib.makeOverridable buildNodeSourceDist;
+ buildNodePackage = lib.makeOverridable buildNodePackage;
+ buildNodeShell = lib.makeOverridable buildNodeShell;
}
-{}:
+{ pkgs }:
{
# This adds header colors to the builds, but it rebuilds the whole
# world from scratch, so only use it to debug!
self: super: {
bitlbee-discord = super.bitlbee-discord.overrideAttrs(old: rec {
- version = "master-3061edd";
+ version = "master";
name = "bitlbee-discord-${version}";
src = self.fetchFromGitHub {
- rev = "master";
+ rev = "607f9887ca85f246e970778e3d40aa5c346365a7";
owner = "sm00th";
repo = "bitlbee-discord";
- sha256 = "07gjd4b0g09888gpaqwcjafr8m292y2qz0gzharxjh1k2jbs88g3";
+ sha256 = "0jkwhx2walx2ay0vc9x13q0j1qq4r5x30ss03a3j7ks28xvsnxc7";
};
});
}
--- /dev/null
+self: super: rec {
+ #mariadb = super.mariadb_106.overrideAttrs(old: {
+ # passthru = old.passthru // { mysqlVersion = "5.7"; };
+ #});
+ #mariadb_pam = super.mariadb_106.overrideAttrs(old: {
+ # cmakeFlags = old.cmakeFlags ++ [ "-DWITH_AUTHENTICATION_PAM=ON" ];
+ # buildInputs = old.buildInputs ++ [ self.pam ];
+ # outputs = old.outputs ++ [ "dev" ];
+ # passthru = old.passthru // { mysqlVersion = "5.7"; };
+ # 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
+ # '';
+ #});
+}
--- /dev/null
+{ sources, mylibs }:
+{
+ mylibs = self: super: { inherit mylibs; };
+ mypkgs = final: prev: import ../pkgs/default.nix { pkgs = final; inherit mylibs sources; };
+
+ bitlbee = import ./bitlbee;
+ bitlbee-discord = import ./bitlbee-discord;
+ gitweb = import ./gitweb;
+ gitolite = import ./gitolite;
+ goaccess = import ./goaccess;
+ kanboard = import ./kanboard;
+ mysql = import ./databases/mysql;
+ postfix = import ./postfix;
+ postgresql = import ./databases/postgresql;
+ ympd = import ./ympd;
+ morph = import ./morph;
+ cron = self: super: {
+ cron = super.cron.overrideAttrs(old: {
+ # Allow "+" char in MAILTO
+ patchPhase = ''
+ sed -i -e "/static const char safe_delim/s/@/@+/" do_command.c
+ '';
+ });
+ };
+}
--- /dev/null
+self: super: {
+ kanboard = self.stdenv.mkDerivation rec {
+ name = "kanboard-${version}";
+ version = "1.2.21";
+ src = self.fetchFromGitHub {
+ owner = "kanboard";
+ repo = "kanboard";
+ rev = "ee18479b7e019e6415d7b095da629932ee1b3fd5";
+ sha256 = "00pnpq5qgxpb2f9la58ycvx5kx3pmcvpssh6lwgpcdk04yciw8nh";
+ };
+
+ dontBuild = true;
+
+ installPhase = ''
+ cp -a . $out
+ mv $out/data $out/dataold
+ '';
+ };
+}
--- /dev/null
+self: super: {
+ morph = super.morph.overrideAttrs(old: rec {
+ version = "1.6.0-30-g5b85237";
+ src = self.fetchFromGitHub {
+ owner = "dbcdk";
+ repo = "morph";
+ rev = "5b852370d8054a895b5ba79b5ef017c3afbb3a3c";
+ sha256 = "166dwibbpb90bdy8dvhlinh6gc509f8pq8wn345h01pilf7fc8fh";
+ };
+
+ ldflags = [
+ "-X main.version=${version}"
+ ];
+ preBuild = ''
+ ldflags+=" -X main.assetRoot=$lib"
+ '';
+ postInstall = ''
+ mkdir -p $lib
+ cp -v ./data/*.nix $lib
+ '';
+
+ outputs = [ "out" "lib" ];
+ vendorSha256 = "08zzp0h4c4i5hk4whz06a3da7qjms6lr36596vxz0d8q0n7rspr9";
+
+ patches = (old.patches or []) ++ [ ./dry-run.patch ];
+ });
+}
--- /dev/null
+self: super: {
+ ympd = super.ympd.overrideAttrs(old: {
+ pname = "ympd";
+ version = "612f8fc-master";
+ src = self.fetchFromGitHub {
+ owner = "notandy";
+ repo = "ympd";
+ rev = "612f8fc0b2c47fc89d403e4a044541c6b2b238c8";
+ sha256 = "01hnj10zl103mrn82vyd42fvq7w5az3jf1qz18889zv67kn73ll9";
+ fetchSubmodules = true;
+ };
+ patches = (old.patches or []) ++ [ ./ympd-password-env.patch ];
+ });
+}
--- /dev/null
+{ lib, stdenv, fetchFromGitHub, makeWrapper, shellcheck, bashInteractive, coreutils, gnugrep, gawk, file, aspell, util-linux, gnused }:
+stdenv.mkDerivation {
+ pname = "bash-libs";
+ version = "master";
+ src = fetchFromGitHub {
+ owner = "foopgp";
+ repo = "bash-libs";
+ rev = "4bf7fe3a488f55beecc74b76e0daf24244bd824f";
+ sha256 = "sha256-8AHUXPd1dQpo1Ce9MT4++eFhJT3X8SYtgaIKbPFUYjM=";
+ };
+
+ buildInputs = [ shellcheck makeWrapper bashInteractive ];
+ phases = [ "checkPhase" "installPhase" ];
+ checkPhase = ''
+ shellcheck bin/*
+ '';
+ installPhase =
+ let binPath = lib.makeBinPath [
+ coreutils file aspell util-linux gnused gnugrep gawk
+ ];
+ in ''
+ mkdir -p $out/bin $out/nix-support $out/share/doc/bash-libs $out/share/bash-libs/include
+
+ for i in $src/bin/*; do
+ name=$(basename $i)
+ cp "$i" $out/share/bash-libs/include
+ patchShebangs $out/share/bash-libs/include/$name
+ makeWrapper $out/share/bash-libs/include/$name $out/bin/$name --set PATH ${binPath}
+ done
+ echo "${binPath}" > $out/nix-support/propagated-build-inputs
+ cp $src/man/* $out/share/doc/bash-libs
+ '';
+}
-{ 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" ];
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 ];
}
-{ 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"
# 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 <<EOF
- #! ${stdenv.shell} -e
- exec ${php}/bin/php $out/share/php/composer.phar "\$@"
- EOF
- chmod +x $out/bin/composer
- '';
- meta = {
- description = "Dependency Manager for PHP";
- #license = stdenv.licenses.mit;
- maintainers = [ stdenv.lib.maintainers.sander ];
- platforms = stdenv.lib.platforms.unix;
- };
- };
-
buildZipPackage = { name, src }:
stdenv.mkDerivation {
inherit name src;
else
$allPackages = array();
- ${stdenv.lib.optionalString (!noDev) ''
+ ${lib.optionalString (!noDev) ''
if(array_key_exists("packages-dev", $config))
$allPackages = array_merge($allPackages, $config["packages-dev"]);
''}
};
bundleDependencies = dependencies:
- stdenv.lib.concatMapStrings (dependencyName:
+ lib.concatMapStrings (dependencyName:
let
dependency = dependencies.${dependencyName};
in
# Copy or symlink the provided dependencies
cd vendor
${bundleDependencies packages}
- ${stdenv.lib.optionalString (!noDev) (bundleDependencies devPackages)}
+ ${lib.optionalString (!noDev) (bundleDependencies devPackages)}
cd ..
# Reconstruct autoload scripts
# We use the optimize feature because Nix packages cannot change after they have been built
# Using the dynamic loader for a Nix package is useless since there is nothing to dynamically reload.
- composer dump-autoload --optimize ${stdenv.lib.optionalString noDev "--no-dev"}
+ composer dump-autoload --optimize ${lib.optionalString noDev "--no-dev"}
# Run the install step as a validation to confirm that everything works out as expected
- composer install --optimize-autoloader ${stdenv.lib.optionalString noDev "--no-dev"}
+ composer install --optimize-autoloader ${lib.optionalString noDev "--no-dev"}
- ${stdenv.lib.optionalString executable ''
+ ${lib.optionalString executable ''
# Reconstruct the bin/ folder if we deploy an executable project
${constructBin} composer.json
ln -s $(pwd)/vendor/bin $out/bin
''}
- ${stdenv.lib.optionalString (!symlinkDependencies) ''
+ ${lib.optionalString (!symlinkDependencies) ''
# Patch the shebangs if possible
if [ -d $(pwd)/vendor/bin ]
then
'';
} // extraArgs);
in
-{
- composer = stdenv.lib.makeOverridable composer;
- buildZipPackage = stdenv.lib.makeOverridable buildZipPackage;
- buildPackage = stdenv.lib.makeOverridable buildPackage;
-}
+{ inherit composer buildZipPackage buildPackage; }
-{ stdenv, mylibs }:
+{ stdenv, fetchFromGitHub }:
let
- daedalusSrc = (mylibs.fetchedGithub ./daedalus.json).src;
- daedalusOrig = (import daedalusSrc {}).daedalus;
+ src = fetchFromGitHub {
+ owner = "input-output-hk";
+ repo = "daedalus";
+ rev = "998fd3189c9a54fac496dfef7a6224714c67bc80";
+ sha256 = "1r3gwfv6hn7lzp4h2s6849m7x12nxadsql358ss615krvdlnb6rr";
+ fetchSubmodules = true;
+ };
+ daedalusOrig = (import src {}).daedalus;
cfg = stdenv.mkDerivation rec {
name = "launcher-config-custom";
- buildInputs = [ daedalusSrc daedalusOrig.cfg ];
+ buildInputs = [ src daedalusOrig.cfg ];
src = daedalusOrig.cfg;
installPhase = ''
cp -a $src $out
-{ stdenv, mylibs, fetchurl, fetchgit, callPackage, nodePackages, nodejs-10_x }:
+{ stdenv, mylibs, fetchFromGitHub, fetchurl, fetchgit, callPackage, nodePackages, nodejs-10_x }:
let
nodeEnv = callPackage mylibs.nodeEnv { nodejs = nodejs-10_x; };
# built using node2nix -8 -l package-lock.json
# and changing "./." to "src"
packageEnv = import ./node-packages.nix {
- src = stdenv.mkDerivation (mylibs.fetchedGithub ./iota-cli-app.json // {
+ src = stdenv.mkDerivation ({
+ pname = "iota-cli-app";
+ version = "d7e2e08-master";
+ src = fetchFromGitHub {
+ owner = "iotaledger";
+ repo = "cli-app";
+ rev = "d7e2e0856ae6bd34890fefb4245c07cd467a5032";
+ sha256 = "1n9kczsxdgjv8282nj2grlijvxipiskx0ndn169vz6v1l1hrwc8b";
+ fetchSubmodules = true;
+ };
phases = "installPhase";
installPhase = ''
cp -a $src $out
--- /dev/null
+{ pkgs, mylibs, sources }:
+let
+ inherit (pkgs) callPackage python2Packages python38Packages python38;
+ composerEnv = callPackage ./composer-env {};
+ webapps = import ./webapps { inherit callPackage mylibs composerEnv sources; };
+in
+rec {
+ bash-libs = callPackage ./bash-libs {};
+ boinctui = callPackage ./boinctui {};
+ cnagios = callPackage ./cnagios {};
+ commento = callPackage ./commento {};
+ flrn = callPackage ./flrn { slang = callPackage ./slang_1 {}; };
+ fluentd = callPackage ./fluentd {};
+ fluent-bit = callPackage ./fluent-bit {};
+ genius = callPackage ./genius {};
+ ical2html = callPackage ./ical2html {};
+ mtop = callPackage ./mtop {};
+ muttprint = callPackage ./muttprint {};
+ mutt-ics = callPackage ./mutt-ics {};
+ nagios-cli = callPackage ./nagios-cli {};
+ nagnu = callPackage ./nagnu {};
+ nb = callPackage ./nb {};
+ note = callPackage ./note {};
+ notmuch-python2 = callPackage ./notmuch/notmuch-python { pythonPackages = python2Packages; };
+ notmuch-python3 = callPackage ./notmuch/notmuch-python { pythonPackages = python38Packages; };
+ notmuch-vim = callPackage ./notmuch/notmuch-vim {};
+ perl-ical-parser-html = callPackage ./perl-ical-parser-html {};
+ pgpid = callPackage ./pgpid { inherit bash-libs; };
+ predixy = callPackage ./predixy {};
+ riotkit-do = callPackage ./riotkit-do {};
+ rrsync_sudo = callPackage ./rrsync_sudo {};
+ signaldctl = callPackage ./signaldctl {};
+ telegram-history-dump = callPackage ./telegram-history-dump {};
+ telegramircd = callPackage ./telegramircd { telethon = callPackage ./telethon_sync {}; };
+ terminal-velocity = callPackage ./terminal-velocity {};
+ tiv = callPackage ./tiv {};
+ twins = callPackage ./twins {};
+ upcmd = callPackage ./upcmd {};
+ umami = callPackage ./umami {};
+ unicodeDoc = callPackage ./unicode {};
+ shaarli = callPackage ./shaarli {};
+
+ cardano = callPackage ./crypto/cardano {};
+ 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 {};
+
+ inherit composerEnv;
+
+ monitoring-plugins = callPackage ./monitoring-plugins {};
+ naemon = callPackage ./naemon { inherit monitoring-plugins; };
+ naemon-livestatus = callPackage ./naemon-livestatus { inherit naemon; };
+ gearmand = callPackage ./gearmand {};
+ status-engine-module = callPackage ./status_engine/module.nix { inherit gearmand; };
+ status-engine-worker = callPackage ./status_engine/worker.nix { inherit composerEnv gearmand; };
+ status-engine-interface = callPackage ./status_engine/interface.nix { inherit composerEnv; };
+
+ dovecot_deleted-to-trash = callPackage ./dovecot/plugins/deleted_to_trash {};
+}
+# lib.mapAttrs' produces infinite recursion
+// (builtins.listToAttrs (builtins.map (n: { name = "webapps-${n}"; value = webapps."${n}"; }) (builtins.attrNames webapps)))
-{ stdenv, fetchurl, dovecot, mylibs, fetchpatch }:
+{ stdenv, fetchurl, dovecot, fetchFromGitHub, fetchpatch }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./dovecot-deleted_to_trash.json // rec {
+stdenv.mkDerivation ({
+ pname = "dovecot-deleted_to_trash";
+ version = "81b0754-master";
+ src = fetchFromGitHub {
+ owner = "lexbrugman";
+ repo = "dovecot_deleted_to_trash";
+ rev = "81b07549accfc36467bf8527a53c295c7a02dbb9";
+ sha256 = "1b3k31g898s4fa0a9l4kvjsdyds772waaay84sjdxv09jw6mqs0f";
+ fetchSubmodules = true;
+ };
buildInputs = [ dovecot ];
patches = [
(fetchpatch {
-{ stdenv, mylibs, libetpan, openssl, autoconf, groff, slang, yacc }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./flrn.json // {
+{ stdenv, fetchFromGitHub, libetpan, openssl, autoconf, groff, slang, yacc }:
+stdenv.mkDerivation (rec {
+ version = "860d642-master";
+ pname = "flrn";
+ src = fetchFromGitHub {
+ owner = "Cigaes";
+ repo = "flrn";
+ rev = "860d642bd6389a209c8b697bd044f78d23406509";
+ sha256 = "0sqlxxpy1xg7cb2hbxcr0al46nyr6jjnns4b5i8w04z5sypa9r5c";
+ fetchSubmodules = true;
+ };
buildInputs = [ libetpan openssl autoconf groff slang yacc ];
preConfigure = ''
sed -i -e "s/test -e configure/false/" configure.in
--- /dev/null
+{ lib, stdenv, fetchFromGitHub, cmake, flex, bison, pkg-config
+, systemd, openssl, postgresql }:
+
+stdenv.mkDerivation rec {
+ pname = "fluent-bit";
+ version = "1.8.3";
+
+ src = fetchFromGitHub {
+ owner = "fluent";
+ repo = "fluent-bit";
+ rev = "v${version}";
+ sha256 = "004x135imja67babmmpkk1jpp5xwhfa8cwg1svaas2asq6cnv77d";
+ };
+
+ nativeBuildInputs = [ cmake flex bison pkg-config postgresql ];
+
+ buildInputs = [ openssl ]
+ ++ lib.optionals stdenv.isLinux [ systemd ];
+
+ cmakeFlags = [ "-DFLB_METRICS=ON" "-DFLB_HTTP_SERVER=ON" "-DFLB_SQLDB=ON" "-DFLB_OUT_PGSQL=ON" "-DFLB_IN_SYSTEMD=ON" ];
+
+ patches = lib.optionals stdenv.isDarwin [ ./fix-luajit-darwin.patch ];
+
+ NIX_CFLAGS_COMPILE = lib.optionals stdenv.cc.isGNU [
+ # _FORTIFY_SOURCE requires compiling with optimization (-O)
+ "-O"
+ # Needed due to bundled mbedtls
+ "-Wno-error=format"
+ "-Wno-error=format-truncation"
+ ];
+
+
+ outputs = [ "out" "dev" ];
+
+ postPatch = ''
+ substituteInPlace src/CMakeLists.txt \
+ --replace /lib/systemd $out/lib/systemd
+ '';
+
+ meta = with lib; {
+ description = "Log forwarder and processor, part of Fluentd ecosystem";
+ homepage = "https://fluentbit.io";
+ maintainers = with maintainers; [ samrose fpletz ];
+ license = licenses.asl20;
+ platforms = platforms.unix;
+ };
+}
--- /dev/null
+source "https://rubygems.org"
+
+gem 'fluentd'
--- /dev/null
+GEM
+ remote: https://rubygems.org/
+ specs:
+ concurrent-ruby (1.1.9)
+ cool.io (1.7.1)
+ fluentd (1.13.3)
+ bundler
+ cool.io (>= 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
--- /dev/null
+{ 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;
+ };
+}
--- /dev/null
+{
+ 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
-{ 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 = [
-{ 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";
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 = ''
--- /dev/null
+{ 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 ];
+
+}
{ stdenv, iputils, fetchpatch, fetchurl, file, hostname, perl, openssl,
- bind, openldap, procps-ng, postfix,
+ bind, openldap, procps, postfix,
wrapperDir ? "/run/wrappers/bin"
}:
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 ];
}
-{ buildPerlPackage, fetchurl, perlPackages, lib }:
-buildPerlPackage rec {
+{ fetchurl, perlPackages, lib }:
+perlPackages.buildPerlPackage rec {
pname = "mtop";
version = "0.6.6";
src = fetchurl {
--- /dev/null
+{ 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 ];
+})
-{ 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
'';
-{ 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",
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
--- /dev/null
+{ python2Packages, fetchFromGitHub }:
+python2Packages.buildPythonApplication rec {
+ version = "edc51ea-master";
+ pname = "nagios-cli";
+ src = fetchFromGitHub {
+ owner = "tehmaze";
+ repo = "nagios-cli";
+ rev = "edc51eaccf1086bb4469ce45c5e5155f2d71a2f9";
+ sha256 = "1qw5fv4niz079zqwmfr3kzjv8cc31rbhi9whdbv9c32qdi3h7vsp";
+ fetchSubmodules = true;
+ };
+}
--- /dev/null
+{ 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
+ '';
+})
-{ pkgs ? import <nixpkgs> {} }: with pkgs;
+{ fetchFromGitHub, stdenv, makeWrapper, lib, file }:
stdenv.mkDerivation {
pname = "nb";
version = "e0d4e24-master";
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
'';
-{ lib, buildPerlPackage, fetchurl, perlPackages }:
-buildPerlPackage rec {
+{ lib, fetchurl, perlPackages }:
+perlPackages.buildPerlPackage rec {
pname = "note";
version = "1.3.26";
src = fetchurl {
--- /dev/null
+{ 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
+ ];
+}
--- /dev/null
+{ 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
+ '';
+}
--- /dev/null
+{ 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
+ '';
+})
-{ pkgs ? import <nixpkgs> {} }:
-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
'';
{ ldapFtpId ? null
-, stdenv, fetchurl, openssl, postgresql, openldap }:
+, stdenv, lib, fetchurl, openssl, postgresql, openldap }:
stdenv.mkDerivation rec {
name = "pure-ftpd-1.0.47";
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(?)
--- /dev/null
+{ 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
+ ];
+}
--- /dev/null
+{ 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/
+ '';
+}
-{ 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}";
--- /dev/null
+{ 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
+ '';
+})
--- /dev/null
+{ 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
+ '';
+})
--- /dev/null
+{
+ "_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"
+}
--- /dev/null
+{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";
+ };
+ };
+ };
+ };
+}
--- /dev/null
+{ 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 ];
+})
-{ 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
-{ python36Packages }:
-with python36Packages;
+{ python37Packages }:
+with python37Packages;
buildPythonApplication rec {
pname = "terminal-velocity-git";
version = "0.2.0";
-{ buildPerlPackage, fetchurl, perlPackages }:
-buildPerlPackage rec {
+{ fetchurl, perlPackages }:
+perlPackages.buildPerlPackage rec {
pname = "tiv";
version = "2015";
src = fetchurl {
--- /dev/null
+{ 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=";
+}
--- /dev/null
+{ 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
+ '';
+}
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;
--- /dev/null
+{ 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 {};
+}
-{ 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;
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
(name: callPackage (./plugins + "/${name}") {});
toPassthru = pkg: plugins: {
inherit plugins allPlugins;
+ pluginNames = map (n: n.pluginName) plugins;
withPlugins = withPlugins pkg;
};
withPlugins = pkg: toPlugins:
cp -a Source* $out/
'';
passthru = {
+ pluginName = "source-integration";
selector = "Source*";
};
}
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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")
--- /dev/null
+{ 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
--- /dev/null
+{ 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
+ '';
+})
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} .
--- /dev/null
+{ 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";
+})
--- /dev/null
+{ 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";
+})
--- /dev/null
+{ 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";
+})
--- /dev/null
+{ 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";
+})
--- /dev/null
+{ 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";
+})
-{ 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;
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/
--- /dev/null
+{ 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";
+})
# 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;
};
gids = {
nagios = 11; # commented in the ids file
+ openldap = 99; # commented in the ids file
cryptpad = 386;
acme = 388;
backup = 389;
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";
+ }
+ ];
};
};
};
--- /dev/null
+{
+ 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 <link
+ xlink:href='http://www.naemon.org/'>Naemon</link> 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;
+ };
+ };
+ };
+ };
+ };
+}
},
"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": {
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";
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 {
},
"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": {
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";
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;
--- /dev/null
+{ 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
+ }
--- /dev/null
+{
+ 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
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 {
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
}
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)
-> GET {paste}/download
force download of file
</pre>
-<a href="{paste}/py">Get the source</a>
+<a href="{paste}/py">Get the source</a><br />
+Software licensed under the terms of the <a href="{host}/license">MIT license</a>
'''.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")
},
"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": {
{
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";
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;
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 ];
-{ 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";
yarnNix = ./yarn-packages.nix;
pkgConfig = {
node-sass = {
- buildInputs = [ libsass python ];
+ buildInputs = with yarn2nix-moretea'.pkgs; [ libsass python2 ];
postInstall =
''
node scripts/build.js --tarball=${nodeHeaders}
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"
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", {})
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=""),
]
)
-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"]:
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"
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"]],
)
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
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,
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": {},
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+}
--- /dev/null
+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
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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)}
+ '';
+ };
+ };
+ };
+}
--- /dev/null
+{
+ 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 = { ... }: {};
+ };
+}
+
--- /dev/null
+# 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
--- /dev/null
+{
+ 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.<name>
+ 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";
+ };
+ };
+ };
+}
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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 <creds> \
+ mail-from ${name}@immae.eu
+ action "relay" relay \
+ helo ${config.hostEnv.fqdn} \
+ host smtp+tls://eldiron@eldiron.immae.eu:587 \
+ auth <creds>
+ 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 ];
+ };
+ };
+ };
+}
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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";
+ };
+ };
+ };
+ };
+ };
+}
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+ };
+ };
+}
};
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
]}
'';
};
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";
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
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$\"";
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
]}
'';
};
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
]}
'';
, 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}" = {
};
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 = [
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 = [
"20480" # kb/s
"51200" # kb/s
];
+ __passive_servicegroups = "webstatus-resources";
}
{
- passiveInfo = defaultPassiveInfo;
service_description = "Average load";
use = "local-service";
check_command = [
"${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";
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";
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";
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;"
-#!/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.
--- /dev/null
+#!/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
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);
${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)}
}
'';
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
"nodes": {
"files-watcher": {
"locked": {
- "narHash": "sha256-6urOJuzXsu4HJHyVmrZHd40SMzzTeHiOiDOM40q53Y0=",
+ "lastModified": 1,
+ "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
"path": "../../files-watcher",
"type": "path"
},
"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=",
"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"
},
"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"
},
{
- 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; };
+ };
+ };
}
{
"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"
},
"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=",
"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"
},
},
"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"
},
{
- 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; };
+ };
+ };
}
-
--- /dev/null
+{
+ outputs = { self }: {
+ immae-schema = ./immae.schema;
+ immae-ldif = ./immae.ldif;
+ };
+}
--- /dev/null
+# 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 )
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
"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,
"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"
},
},
"root": {
"inputs": {
- "my-lib": "my-lib",
- "nix-lib": "nix-lib",
"paste": "paste"
}
}
{
- 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; };
+ };
+ };
}
},
"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": {
"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",
"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",
"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",
"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"
}
}
},
{
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;
};
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+}
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+ };
+ };
+}
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"
}
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() {
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+ };
+ };
+}
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} #####
'';
];
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;
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 {
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;
# 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";
};
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:
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 = ''
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}' \;
-{ 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
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+}
-{ ruby_2_6, bundlerEnv, mylibs, stdenv }:
+{ ruby_2_6, bundlerEnv, src, stdenv }:
let
gems = bundlerEnv {
name = "taskwarrior-web-env";
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 = ''
passthru = {
inherit gems;
};
- });
+ };
in package
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
: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
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+}
+++ /dev/null
-{ 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 {})
+++ /dev/null
-# 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 {});
- }
+++ /dev/null
-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
+++ /dev/null
-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 {})
+++ /dev/null
-{ 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 <link
- xlink:href='http://www.naemon.org/'>Naemon</link> 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;
- };
- };
- };
-}
+++ /dev/null
-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)
+++ /dev/null
-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)
+++ /dev/null
-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)
+++ /dev/null
-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)
+++ /dev/null
-#!/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
+++ /dev/null
-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)
+++ /dev/null
-{ 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" ]; };
- };
- };
-}
+++ /dev/null
-{ 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";
- };
- };
-}
+++ /dev/null
-{ 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)
+++ /dev/null
-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))
+++ /dev/null
-{ 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);
- };
- };
-}
+++ /dev/null
-{ 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.<name>
- 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_<name>@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_<attrskey>
- '';
- };
- 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";
- };
-}
+++ /dev/null
-{ 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";
- };
- };
-}
+++ /dev/null
-{ 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;
- };
- };
-}
+++ /dev/null
-### 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
+++ /dev/null
-{ 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";
- };
- };
- };
- };
-}
+++ /dev/null
-{ 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;
- };
-}
+++ /dev/null
-{ 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";
- };
- };
-}
+++ /dev/null
-{ 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";
- };
- };
- };
-}
+++ /dev/null
-{ 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 <creds> \
- mail-from ${name}@immae.eu
- action "relay" relay \
- helo ${config.hostEnv.fqdn} \
- host smtp+tls://eldiron@eldiron.immae.eu:587 \
- auth <creds>
- 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;
- };
- };
-}
+++ /dev/null
-{ 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));
- };
- };
-}
+++ /dev/null
-{ 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"];
- }
- ];
-}
+++ /dev/null
-{ 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")
- ];
-}
+++ /dev/null
-{ ... }:
-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" "/" "<title>"];
- _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/";
- })
- ];
-}
+++ /dev/null
-{ 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"; };
- })
- ];
-}
+++ /dev/null
-{ 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";
- };
- };
- };
-}
+++ /dev/null
-{ 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</title>"];
-
- 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" "/" "<title>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"; };
- };
-}
+++ /dev/null
-{ 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" ];
- }
- ];
-}
+++ /dev/null
-{ 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";
- };
- };
- };
-}
+++ /dev/null
-#!/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
+++ /dev/null
-{ 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
- ]; })
- ];
- };
- };
-}
+++ /dev/null
-### 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
-
+++ /dev/null
-{ 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;
- };
- });
-}
+++ /dev/null
-{ 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";
- };
- };
-}
+++ /dev/null
-# 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);
-}
+++ /dev/null
-{ 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?
-}
+++ /dev/null
-{ 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";
- };
- };
-
-}
+++ /dev/null
-{ 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" ];
- };
- };
-}
+++ /dev/null
----
-# 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"
+++ /dev/null
----
-# 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"
+++ /dev/null
-{ 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
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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
- ];
- };
- };
-}
-
+++ /dev/null
-<!DOCTYPE html>
-<html lang='en'>
- <head>
- <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
- <title>This instance is now closed - Discourse</title>
- <style>
- body {
- text-align: center;
- background: #f9f9f9;
- font-family: sans-serif;
- }
- img {
- max-width: 235px;
- width: 100%;
- }
- h1 {
- font-size: 20px;
- font-weight: 400;
- }
- </style>
- </head>
- <body>
- <div>
- <img alt='Discourse capitaines' src='/discourse.png'>
- <h1>Sorry, this instance is closed now.</h1>
- </div>
- </body>
-</html>
+++ /dev/null
-{ 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
- <Directory ${./mastodon_static}>
- DirectoryIndex index.html
- Options Indexes FollowSymLinks MultiViews Includes
- Require all granted
- </Directory>
- ''
- ];
- };
-
- services.websites.env.production.vhostConfs.capitaines_discourse = {
- inherit certName;
- addToCerts = true;
- hosts = [ "discourse.${domain}" ];
- root = ./discourse_static;
- extraConfig = [
- ''
- ErrorDocument 404 /index.html
- <Directory ${./discourse_static}>
- DirectoryIndex index.html
- Options Indexes FollowSymLinks MultiViews Includes
- Require all granted
- </Directory>
- ''
- ];
- };
-
- services.websites.env.production.vhostConfs.capitaines = {
- inherit certName;
- addToCerts = true;
- hosts = [ domain ];
- root = ../_www;
- extraConfig = [ ''
- <Directory ${../_www}>
- DirectoryIndex index.htm
- Require all granted
- </Directory>
- '' ];
- };
- };
-}
+++ /dev/null
-<!DOCTYPE html>
-<html lang='en'>
- <head>
- <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
- <title>This instance is now closed - Mastodon</title>
- <style>
- body {
- text-align: center;
- background: #282c37;
- font-family: sans-serif;
- }
- img {
- max-width: 470px;
- width: 100%;
- }
- h1 {
- font-size: 20px;
- font-weight: 400;
- color: #9baec8;
- }
- </style>
- </head>
- <body>
- <div>
- <img alt='Mastodon' src='/oops.png'>
- <h1>Sorry, this instance is closed now.</h1>
- </div>
- </body>
-</html>
+++ /dev/null
-{ 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;
-}
+++ /dev/null
-<?php
-if (!defined("_ECRIRE_INC_VERSION")) return;
-if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', 0777);
-?>
\ No newline at end of file
+++ /dev/null
-<?php
-if (!defined("_ECRIRE_INC_VERSION")) return;
-define('_MYSQL_SET_SQL_MODE',true);
-$GLOBALS['spip_connect_version'] = 0.7;
-spip_connect_db(
- getenv("SPIP_MYSQL_HOST"),
- getenv("SPIP_MYSQL_PORT"),
- getenv("SPIP_MYSQL_USER"),
- getenv("SPIP_MYSQL_PASSWORD"),
- getenv("SPIP_MYSQL_DB"),
- 'mysql',
- 'spip',
- 'ldap.php'
-);
-?>
+++ /dev/null
-<?php
-if (!defined("_ECRIRE_INC_VERSION")) return;
-$GLOBALS['ldap_base'] = getenv("SPIP_LDAP_BASE");
-$GLOBALS['ldap_link'] = @ldap_connect(getenv("SPIP_LDAP_HOST"));
-@ldap_set_option($GLOBALS['ldap_link'],LDAP_OPT_PROTOCOL_VERSION,'3');
-@ldap_bind($GLOBALS['ldap_link'],getenv("SPIP_LDAP_SEARCH_DN"), getenv("SPIP_LDAP_SEARCH_PW"));
-$GLOBALS['ldap_champs'] = array('login' => array('sAMAccountName','uid','login','userid','cn','sn'),'nom' => 'cn','email' => 'mail','bio' => 'description',);
-$GLOBALS['ldap_search'] = getenv("SPIP_LDAP_SEARCH");
-?>
+++ /dev/null
-{ 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
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.chloe_integration.socket}|fcgi://localhost"
- </FilesMatch>
-
- <Directory ${webRoot}>
- DirectoryIndex index.php index.htm index.html
- Options -Indexes +FollowSymLinks +MultiViews +Includes
- Include ${webRoot}/htaccess.txt
-
- AllowOverride AuthConfig FileInfo Limit
- Require all granted
- </Directory>
-
- <DirectoryMatch "${webRoot}/squelettes">
- Require all denied
- </DirectoryMatch>
-
- <FilesMatch "(.htaccess|rewrite-rules|.gitignore)$">
- Require all denied
- </FilesMatch>
-
- <Location />
- Use LDAPConnect
- Require ldap-group cn=chc.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu
- ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://osteopathe-cc.fr\"></html>"
- </Location>
- ''
- ];
- };
- services.websites.env.integration.watchPaths = [
- config.secrets.fullPaths."websites/chloe/integration"
- ];
- };
-}
+++ /dev/null
-{ 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
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.chloe_production.socket}|fcgi://localhost"
- </FilesMatch>
-
- <Directory ${app.webRoot}>
- DirectoryIndex index.php index.htm index.html
- Options -Indexes +FollowSymLinks +MultiViews +Includes
- Include ${app.webRoot}/htaccess.txt
-
- AllowOverride AuthConfig FileInfo Limit
- Require all granted
- </Directory>
-
- <DirectoryMatch "${app.webRoot}/squelettes">
- Require all denied
- </DirectoryMatch>
-
- <FilesMatch "(.htaccess|rewrite-rules|.gitignore)$">
- Require all denied
- </FilesMatch>
- ''
- ];
- };
- services.websites.env.production.watchPaths = [
- config.secrets.fullPaths."websites/chloe/production"
- ];
- };
-}
+++ /dev/null
-{ 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/
- <Directory /var/lib/sympa/static_content/>
- Require all granted
- AllowOverride none
- </Directory>
- <Location /sympa>
- SetHandler "proxy:unix:/run/sympa/wwsympa.socket|fcgi://"
- Require all granted
- </Location>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ config, callPackage }:
-callPackage ../tools/tools/adminer.nix {
- forcePhpSocket = config.services.phpfpm.pools.adminer.socket;
-}
+++ /dev/null
-{ 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
+++ /dev/null
-# 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";
- };
- };
- };
- };
-}
+++ /dev/null
-{ 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 = [
- ''
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${pcfg.phpListenPaths.connexionswing_integration}|fcgi://localhost"
- </FilesMatch>
-
- <Directory ${varDir}/medias>
- Options FollowSymLinks
- AllowOverride None
- Require all granted
- </Directory>
-
- <Directory ${varDir}/uploads>
- Options FollowSymLinks
- AllowOverride None
- Require all granted
- </Directory>
-
- <Location />
- Use LDAPConnect
- Require ldap-group cn=cs.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu
- ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://connexionswing.com\"></html>"
- </Location>
-
- <Directory ${webRoot}>
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
-
- DirectoryIndex app_dev.php
-
- <IfModule mod_negotiation.c>
- Options -MultiViews
- </IfModule>
-
- <IfModule mod_rewrite.c>
- 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]
- </IfModule>
-
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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 = [
- ''
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${pcfg.phpListenPaths.connexionswing_production}|fcgi://localhost"
- </FilesMatch>
-
- <Directory ${app.varDir}/medias>
- Options FollowSymLinks
- AllowOverride None
- Require all granted
- </Directory>
-
- <Directory ${app.varDir}/uploads>
- Options FollowSymLinks
- AllowOverride None
- Require all granted
- </Directory>
-
- Use Stats connexionswing.com
-
- <Directory ${app.webRoot}>
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride All
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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 = [
- ''
- <Directory ${varDir}>
- DirectoryIndex aventuriers.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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";
- };
- };
- };
-}
+++ /dev/null
-{ 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
-
- <Directory ${varDir}>
- DirectoryIndex index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride AuthConfig
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.denise_nsievariste.socket}|fcgi://localhost"
- </FilesMatch>
-
- <Directory ${nsiVarDir}>
- DirectoryIndex index.php index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
- </Directory>
- ''
- ];
- };
-
- 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
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.denise_stmgevariste.socket}|fcgi://localhost"
- </FilesMatch>
-
- <Directory ${stmgVarDir}>
- DirectoryIndex index.php index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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";
- };
- };
- };
-}
+++ /dev/null
-{ 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 = [
- ''
- <Directory ${../_www}>
- DirectoryIndex index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride AuthConfig
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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 = [
- ''
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.emilia_atelierfringant.socket}|fcgi://localhost"
- </FilesMatch>
-
- <Location /xmlrpc.php>
- AllowOverride None
- Require all denied
- </Location>
- <Directory ${varDir}>
- DirectoryIndex index.php index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride all
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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 = ''
- <?php // Moodle configuration file
-
- unset($CFG);
- global $CFG;
- $CFG = new stdClass();
-
- $CFG->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 = [
- ''
- <Directory ${siteDir}>
- DirectoryIndex pause.html
- Options Indexes FollowSymLinks MultiViews Includes
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-<!doctype html>
-<html>
- <head>
- <title>Pause</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <style>
- body {
- padding-left: 5px;
- padding-right: 5px;
- text-align: center;
- margin: auto;
- font: 20px Helvetica, sans-serif;
- color: #333;
- }
- h1 {
- margin: 0px;
- font-size: 40px;
- }
- article {
- display: block;
- max-width: 650px;
- margin: 0 auto;
- padding-top: 30px;
- }
- article + article {
- border-top: 1px solid lightgrey;
- }
- article div {
- text-align: justify;
- }
- a {
- color: #dc8100;
- text-decoration: none;
- }
- a:hover {
- color: #333;
- }
- </style>
- </head>
- <body>
- <article>
- <h1>Site web en pause !</h1>
- <div>
- <p>Le site et les cours de photographie sont actuellement en pause.</p>
- </div>
- </article>
- </body>
-</html>
+++ /dev/null
-{ 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 = [
- ''
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${pcfg.phpListenPaths.florian_app}|fcgi://localhost"
- </FilesMatch>
-
- <Location />
- 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 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://tellesflorian.com\"></html>"
- </Location>
-
- <Directory ${webRoot}>
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
-
- DirectoryIndex app_dev.php
-
- <IfModule mod_negotiation.c>
- Options -MultiViews
- </IfModule>
-
- <IfModule mod_rewrite.c>
- 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]
- </IfModule>
-
- </Directory>
- ''
- (adminer.apache.vhostConf null)
- ];
- };
- };
-}
+++ /dev/null
-{ 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
+++ /dev/null
-# 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";
- };
- };
- };
- };
-}
+++ /dev/null
-{ 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}
-
- <Directory ${varDir}>
- DirectoryIndex index.php index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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}
-
- <Directory ${varDir}>
- DirectoryIndex index.php index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-# 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 =
-
+++ /dev/null
-# 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]
+++ /dev/null
-{ 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/
- <Proxy *>
- Options FollowSymLinks MultiViews
- AllowOverride None
- Require all granted
- </Proxy>
- '' ];
- };
-
- 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";
- };
- };
- };
-}
-
+++ /dev/null
-{ 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
+++ /dev/null
-# 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";
- };
- };
- };
- };
-}
+++ /dev/null
-{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";
- };
- }
- ];
-}
+++ /dev/null
-{ 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 = [
- ''
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${pcfg.phpListenPaths.isabelle_aten_integration}|fcgi://localhost"
- </FilesMatch>
-
- Include ${config.secrets.fullPaths."websites/isabelle/aten_integration"}
-
- <Location />
- Use LDAPConnect
- Require ldap-group cn=ic.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu
- ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://aten.pro\"></html>"
- </Location>
-
- <Location /backend>
- Use LDAPConnect
- Require ldap-group cn=ic.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu
- ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://aten.pro\"></html>"
- </Location>
-
- <Directory ${webRoot}>
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride All
- Require all granted
- DirectoryIndex index.php
- FallbackResource /index.php
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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 = [
- ''
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${pcfg.phpListenPaths.isabelle_aten_production}|fcgi://localhost"
- </FilesMatch>
-
- Include ${config.secrets.fullPaths."websites/isabelle/aten_production"}
-
- Use Stats aten.pro
-
- <Location /backend>
- Use LDAPConnect
- Require ldap-group cn=aten.pro,cn=httpd,ou=services,dc=immae,dc=eu
- ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://aten.pro\"></html>"
- </Location>
-
- <Directory ${app.webRoot}>
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride All
- Require all granted
- DirectoryIndex index.php
- FallbackResource /index.php
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-<?php
-if (!defined("_ECRIRE_INC_VERSION")) return;
-if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', 0777);
-?>
\ No newline at end of file
+++ /dev/null
-<?php
-if (!defined("_ECRIRE_INC_VERSION")) return;
-define('_MYSQL_SET_SQL_MODE',true);
-$GLOBALS['spip_connect_version'] = 0.7;
-spip_connect_db(
- getenv("SPIP_MYSQL_HOST"),
- getenv("SPIP_MYSQL_PORT"),
- getenv("SPIP_MYSQL_USER"),
- getenv("SPIP_MYSQL_PASSWORD"),
- getenv("SPIP_MYSQL_DB"),
- 'mysql',
- 'spip',
- 'ldap.php'
-);
-?>
+++ /dev/null
-<?php
-if (!defined("_ECRIRE_INC_VERSION")) return;
-$GLOBALS['ldap_base'] = getenv("SPIP_LDAP_BASE");
-$GLOBALS['ldap_link'] = @ldap_connect(getenv("SPIP_LDAP_HOST"));
-@ldap_set_option($GLOBALS['ldap_link'],LDAP_OPT_PROTOCOL_VERSION,'3');
-@ldap_bind($GLOBALS['ldap_link'],getenv("SPIP_LDAP_SEARCH_DN"), getenv("SPIP_LDAP_SEARCH_PW"));
-$GLOBALS['ldap_champs'] = array('login' => array('sAMAccountName','uid','login','userid','cn','sn'),'nom' => 'cn','email' => 'mail','bio' => 'description',);
-$GLOBALS['ldap_search'] = getenv("SPIP_LDAP_SEARCH");
-?>
+++ /dev/null
-{ 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
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.isabelle_iridologie.socket}|fcgi://localhost"
- </FilesMatch>
-
- <Directory ${app.webRoot}>
- DirectoryIndex index.php index.htm index.html
- Options -Indexes +FollowSymLinks +MultiViews +Includes
- Include ${app.webRoot}/htaccess.txt
-
- AllowOverride AuthConfig FileInfo Limit
- Require all granted
- </Directory>
-
- <DirectoryMatch "${app.webRoot}/squelettes">
- Require all denied
- </DirectoryMatch>
-
- <FilesMatch "(.htaccess|rewrite-rules|.gitignore)$">
- Require all denied
- </FilesMatch>
-
- Use Stats iridologie.icommandeur.org
- ''
- ];
- };
- services.websites.env.production.watchPaths = [
- secretsPath
- ];
- };
-}
+++ /dev/null
-{ 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;
-}
+++ /dev/null
-{ 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 = ''
- <?php
- $mysql_user = '${env.mysql.user}' ;
- $mysql_server = '${env.mysql.host}' ;
- $mysql_base = '${env.mysql.database}' ;
- $mysql_password = '${env.mysql.password}' ;
- //connect to db
- $db = mysqli_init();
- ${if env.mysql.host != "localhost" then ''
- mysqli_options ($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
- $db->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
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.jerome_naturaloutil.socket}|fcgi://localhost"
- </FilesMatch>
-
- <Directory ${varDir}/logs>
- AllowOverride None
- Require all denied
- </Directory>
- <Directory ${varDir}>
- DirectoryIndex index.php index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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
- <Directory ${varDir}/Chorale>
- 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
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.leila.socket}|fcgi://localhost"
- </FilesMatch>
- </Directory>
- ''
- ];
- };
- services.websites.env.production.vhostConfs.leila_syrwenne = {
- certName = "leila";
- addToCerts = true;
- hosts = [ "syrwennecreation.bouya.org" ];
- root = "${varDir}/Syrwennecreation";
- extraConfig = [
- ''
- Use Stats syrwennecreation.bouya.org
- <Directory ${varDir}/Syrwennecreation>
- DirectoryIndex index.php index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.leila.socket}|fcgi://localhost"
- </FilesMatch>
- </Directory>
- ''
- ];
- };
- services.websites.env.production.vhostConfs.leila = {
- certName = "leila";
- certMainHost = "leila.bouya.org";
- hosts = [ "leila.bouya.org" ];
- root = varDir;
- extraConfig = [
- ''
- Use Stats leila.bouya.org
- <Directory ${varDir}/Chorale>
- 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
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.leila.socket}|fcgi://localhost"
- </FilesMatch>
- </Directory>
- <Directory ${varDir}>
- DirectoryIndex index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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 <<EOF
- leapt_im:
- binary_path: ${imagemagick}/bin
- assetic:
- sass: ${sass}/bin/sass
- ruby: ${ruby}/bin/ruby
- EOF
- sed -i -e "/Incenteev..ParameterHandler..ScriptHandler::buildParameters/d" composer.json
- '';
- # /!\ miniatures and data need to be in the same physical dir due to a
- # bug in leapt.im (searches for data/../miniatures)
- postInstall = ''
- rm -rf var/{logs,cache,data,miniatures,tmp}
- ln -sf ${varDir}/{logs,cache,data,miniatures,tmp} var/
- ln -sf ${secretsPath} app/config/parameters.yml
- '';
- buildInputs = [ sass ];
- passthru = {
- inherit varDir environment;
- webRoot = "${app}/web";
- };
- });
-in app
+++ /dev/null
-# 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";
- };
- };
- };
- "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";
- };
- };
- };
- "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";
- };
- };
- };
- "immae/ludivine-ckeditor-component" = {
- targetDir = "";
- src = fetchgit {
- name = "immae-ludivine-ckeditor-component-1794320dcfdfcd19572fb1676294f9853a6bbc20";
- url = "https://git.immae.eu/perso/Immae/Projets/packagist/ludivine-ckeditor-component.git";
- rev = "1794320dcfdfcd19572fb1676294f9853a6bbc20";
- sha256 = "080f3znvp0aj5jdpc3ywis0kfzvkwz5mw2jcj12gwq3r5g5i8zdq";
- };
- };
- "immae/ludivine-slick-component" = {
- targetDir = "";
- src = fetchgit {
- name = "immae-ludivine-slick-component-604734c4a960aac3d99f1008337181ed2b0f04db";
- url = "https://git.immae.eu/perso/Immae/Projets/packagist/ludivine-slick-component.git";
- rev = "604734c4a960aac3d99f1008337181ed2b0f04db";
- sha256 = "041wqv9pa9nvqcgqykx6cnbj539qnr9h1iym7l54igw12yj57w06";
- };
- };
- "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";
- };
- };
- };
- "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-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-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";
- };
- };
- };
- };
-}
+++ /dev/null
-{ lib, pkgs, config, ... }:
-let
- secrets = config.myEnv.websites.ludivine.integration;
- cfg = config.myServices.websites.ludivine.integration;
- pcfg = config.services.phpApplication;
- webRoot = "/var/lib/ftp/immae/ludivine/web";
-in {
- options.myServices.websites.ludivine.integration.enable = lib.mkEnableOption "enable Ludivine's website in integration";
-
- config = lib.mkIf cfg.enable {
- services.phpApplication.apps.ludivine_integration = {
- websiteEnv = "integration";
- httpdUser = config.services.httpd.Inte.user;
- httpdGroup = config.services.httpd.Inte.group;
- inherit webRoot;
- varDir = "/var/lib/ftp/immae/ludivine_var";
- app = "/var/lib/ftp/immae/ludivine";
- varDirPaths = {
- "tmp" = "0700";
- };
- 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 [
- # below ones don't need to be in the PATH but they’re used in
- # secrets
- pkgs.imagemagick pkgs.sass pkgs.ruby
- ];
- SYMFONY_DEBUG_MODE = "\"yes\"";
- };
- phpWatchFiles = [
- config.secrets.fullPaths."websites/ludivine/integration"
- ];
- phpPackage = pkgs.php72;
- };
-
- secrets.keys."websites/ludivine/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}
- 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.integration.vhostConfs.ludivine_integration = {
- certName = "integration";
- addToCerts = true;
- hosts = [ "test.lc.immae.dev" ];
- root = webRoot;
- extraConfig = [
- ''
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${pcfg.phpListenPaths.ludivine_integration}|fcgi://localhost"
- </FilesMatch>
-
- <Location />
- Use LDAPConnect
- Require ldap-group cn=lc.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu
- ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://ludivinecassal.com\"></html>"
- </Location>
-
- <Directory ${webRoot}>
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
-
- DirectoryIndex app_dev.php
-
- <IfModule mod_negotiation.c>
- Options -MultiViews
- </IfModule>
-
- <IfModule mod_rewrite.c>
- 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]
- </IfModule>
-
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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]
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${pcfg.phpListenPaths.ludivine_production}|fcgi://localhost"
- </FilesMatch>
-
- Use Stats ludivinecassal.com
-
- <Directory ${app.webRoot}>
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride All
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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}
-
- <Directory ${varDir}>
- DirectoryIndex index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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}
-
- <Directory ${varDir}>
- DirectoryIndex index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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
- <Directory ${./maison_bbc_static}>
- DirectoryIndex index.htm index.html
- AllowOverride None
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
-
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-<!doctype html>
-<html>
- <head>
- <title>Pause</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <script src="https://assets.immae.eu/jquery/3.5.1/jquery.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
- <script src="https://assets.immae.eu/chart.js/2.9.3/Chart.bundle.min.js" integrity="sha256-TQq84xX6vkwR0Qs1qH5ADkP+MvH0W+9E7TdHJsoIQiM=" crossorigin="anonymous"></script>
- <script src="https://assets.immae.eu/hammerjs/2.0.8/hammer.min.js" integrity="sha256-eVNjHw5UeU0jUqPPpZHAkU1z4U+QFBBY488WvueTm88=" crossorigin="anonymous"></script>
- <script src="https://assets.immae.eu/chartjs-plugin-zoom/0.7.7/chartjs-plugin-zoom.min.js" integrity="sha256-6S7w9Wue7EBvlJh/Li/cPecjTNN+yBm/AoCePQA9Xi8=" crossorigin="anonymous"></script>
- <style>
- body {
- padding-left: 5px;
- padding-right: 5px;
- text-align: center;
- margin: auto;
- font: 20px Helvetica, sans-serif;
- color: #333;
- }
- h1 {
- margin: 0px;
- font-size: 40px;
- }
- article {
- display: block;
- max-width: 850px;
- margin: 0 auto;
- padding-top: 30px;
- }
- article + article {
- border-top: 1px solid lightgrey;
- }
- article div {
- text-align: center;
- }
- a {
- color: #dc8100;
- text-decoration: none;
- }
- a:hover {
- color: #333;
- }
- button.selected {
- background-color: lightgreen;
- background-opacity: 40%;
- }
- img.banner {
- max-width: 100%;
- }
- .button-row {
- padding: 10px;
- }
- </style>
- </head>
- <body>
- <article>
- <h1>Site web en pause !</h1>
- <div>
- <img class="banner" src="/lamaison.png" />
- <p>Le site est actuellement en pause.</p>
- </div>
- <h1>Données historiques</h1>
- <div class="button-row">
- <button class="chart-choice" data-type="kW" id="mean_consumption">Consommation moyenne</button>
- <button class="chart-choice" data-type="kWh" id="total_consumption">Consommation totale</button>
- <button class="chart-choice" data-type="%" id="hygrometrie">Hygrométrie</button>
- <button class="chart-choice" data-type="°C" id="temperature">Température</button>
- </div>
- <canvas id="chart" width="400" height="400"></canvas>
- </article>
- <script>
- $(".chart-choice").click(function() {
- drawData($(this).data("type"));
- $(".chart-choice").removeClass("selected");
- $(this).addClass("selected");
- });
- var allData = {};
- var myChart;
- var colors = [
- "#DDDF0D", "#7798BF", "#55BF3B", "#DF5353", "#aaeeee",
- "#ff0066", "#eeaaee", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"
- ];
-
- $.ajax({
- type: "GET",
- url: "/data.json",
- dataType: "json",
- success: function(data) {
- allData = data;
- $(".chart-choice")[3].click();
- },
- });
-
- var getData = function(key, colorIndex) {
- var d = allData[key];
- return {
- borderColor: colors[colorIndex],
- hidden: d.hide,
- fill: false,
- label: d.name + " (" + d.unit + ")",
- data: d.data.map(function(value) {
- return {
- "x": new Date(value.x),
- "y": Math.max(0,value.y),
- };
- }),
- };
- };
-
- var getDataByType = function(type) {
- var colorIndex = 0;
- return Object.keys(allData)
- .filter(function (key) { return allData[key].unit === type; })
- .map(function (key) { return getData(key, colorIndex++); });
- };
-
- var drawData = function (type) {
- $('#chart').replaceWith('<canvas id="chart" width="400" height="400"></canvas>');
- var ctx = document.getElementById('chart').getContext('2d');
- myChart = new Chart(ctx, {
- type: 'line',
- options: {
- scales: {
- xAxes: [
- {
- type: "time",
- time: {
- displayFormats: {
- 'millisecond': 'YYYY-MM',
- 'second': 'YYYY-MM',
- 'minute': 'YYYY-MM',
- 'hour': 'YYYY-MM',
- 'day': 'YYYY-MM',
- 'week': 'YYYY-MM',
- 'month': 'YYYY-MM',
- 'quarter': 'YYYY-MM',
- 'year': 'YYYY-MM',
- }
- }
- }
- ],
- yAxes: [
- {
- ticks: {
- callback: function(value, index, values) { return value + " " + type; }
- }
- }
- ],
- },
- plugins: {
- zoom: {
- pan: { enabled: true, mode: "x" },
- zoom: { enabled: true, mode: "x" },
- }
- },
- },
- data: {
- datasets: getDataByType(type),
- }
- });
- }
- </script>
- </body>
-</html>
-
+++ /dev/null
-{ 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"
- <Directory ${varDir}>
- Use LDAPConnect
- Options Indexes
- AllowOverride None
- Require ldap-group cn=surveillance.maison.bbc.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu
- </Directory>
- ''
- ];
- };
- };
-}
-
+++ /dev/null
-{ 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]
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.patrick_fodella_altermondia.socket}|fcgi://localhost"
- </FilesMatch>
-
- <Location /xmlrpc.php>
- AllowOverride None
- Require all denied
- </Location>
- <Directory ${varDir}>
- DirectoryIndex index.php index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride all
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
-
+++ /dev/null
-{ 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]
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.patrick_fodella_ecolyeu.socket}|fcgi://localhost"
- </FilesMatch>
-
- <Location /xmlrpc.php>
- AllowOverride None
- Require all denied
- </Location>
- <Directory ${varDir}>
- DirectoryIndex index.php index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride all
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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
+++ /dev/null
-# 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";
- };
- };
- };
- };
-}
+++ /dev/null
-{ 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 = [
- ''
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${pcfg.phpListenPaths.piedsjaloux_integration}|fcgi://localhost"
- </FilesMatch>
-
- <Location />
- Use LDAPConnect
- Require ldap-group cn=pj.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu
- ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://piedsjaloux.fr\"></html>"
- </Location>
-
- <Directory ${webRoot}>
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
-
- DirectoryIndex app_dev.php
-
- <IfModule mod_negotiation.c>
- Options -MultiViews
- </IfModule>
-
- <IfModule mod_rewrite.c>
- 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]
- </IfModule>
-
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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]
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${pcfg.phpListenPaths.piedsjaloux_production}|fcgi://localhost"
- </FilesMatch>
-
- Use Stats piedsjaloux.fr
-
- <Directory ${app.webRoot}>
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride All
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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 ];
- };
- };
-}
-
+++ /dev/null
-{ 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
- ];
- };
- };
-}
+++ /dev/null
-{ 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]
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.ressourcerie_banon.socket}|fcgi://localhost"
- </FilesMatch>
-
- <Directory ${varDir}>
- DirectoryIndex index.php index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride all
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
-
+++ /dev/null
-{ 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; ''
- <?php
-
- $hote_sql = '${mysql.host}';
- $login_sql = '${mysql.user}';
- $bdd_sql = '${mysql.database}';
- $mdp_sql = '${mysql.password}';
-
- $db = mysqli_connect($hote_sql,$login_sql,$mdp_sql);
- unset($mdp_sql);
-
- $smtp_mailer->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
- <LocationMatch "^/files/.*/admin/">
- Require all denied
- </LocationMatch>
- <Directory ${richieSrc}>
- DirectoryIndex index.php index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride None
- Require all granted
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.richie_production.socket}|fcgi://localhost"
- </FilesMatch>
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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
- '' ];
- };
- };
-}
+++ /dev/null
-{ 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
-
- <FilesMatch "\.php$">
- SetHandler "proxy:unix:${config.services.phpfpm.pools.telio_tortay.socket}|fcgi://localhost"
- </FilesMatch>
-
- <Location /xmlrpc.php>
- AllowOverride None
- Require all denied
- </Location>
- <Directory ${varDir}/logs>
- AllowOverride None
- Require all denied
- </Directory>
- <Directory ${varDir}>
- DirectoryIndex index.php index.htm index.html
- Options Indexes FollowSymLinks MultiViews Includes
- AllowOverride all
- Require all granted
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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"
- <Directory "${assets}">
- 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 "*"
- </Directory>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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
- <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>
- ''
- ];
- };
-
- secrets.keys."webapps/tools-nextcloud" = {
- user = "wwwrun";
- group = "wwwrun";
- permissions = "0600";
- # This file is not actually included, see activationScript below
- text = ''
- <?php
- include('${nextcloud}/version.php');
- $CONFIG = array (
- // FIXME: change this value when nextcloud starts getting slow
- 'instanceid' => '${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
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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}"
- <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_farm.socket}|fcgi://localhost"
- </FilesMatch>
-
- </Directory>
- '';
-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;
- };
- };
-}
+++ /dev/null
-{ 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
- ];
- };
- };
-}
+++ /dev/null
-{ lib, pkgs, config, ... }:
-let
- infcloud = rec {
- root = pkgs.webapps.infcloud;
- vhostConf = ''
- Alias /carddavmate ${root}
- Alias /caldavzap ${root}
- Alias /infcloud ${root}
- <Directory ${root}>
- AllowOverride All
- Options FollowSymlinks
- Require all granted
- DirectoryIndex index.html
- </Directory>
- '';
- };
- 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;
- };
- };
- };
-}
-
+++ /dev/null
-{ 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) ];
- };
- };
-}
+++ /dev/null
-{ 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;
- };
- };
- };
-}
+++ /dev/null
-{ 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
- <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>
- ''
- ];
- };
- };
-}
+++ /dev/null
-{ 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)
- ''
- <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 ]);
- };
- services.phpfpm.pools.rainloop = {
- user = "wwwrun";
- group = "wwwrun";
- settings = rainloop.phpFpm.pool;
- phpPackage = pkgs.php72;
- };
- system.activationScripts = {
- roundcubemail = roundcubemail.activationScript;
- rainloop = rainloop.activationScript;
- };
- };
-
-}
+++ /dev/null
-{ 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}
- <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>
- '';
- };
-}
+++ /dev/null
-{ 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}"
- '';
- };
-}
+++ /dev/null
-{ 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}"
- <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_path]" = "${varDir}/phpSessions";
- };
- };
-}
+++ /dev/null
-{ 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
- '';
- }
+++ /dev/null
-<?php
-http_response_code(204);
-
-$dbconn = pg_connect(getenv("CSP_REPORT_URI")) or die();
-
-function _get(&$var, $default=null) {
- return isset($var) ? $var : $default;
-}
-
-$json_data = file_get_contents('php://input');
-if ($json_data = json_decode($json_data, true)) {
- $report = _get($json_data["csp-report"], Array());
- $blocked_uri = _get($report["blocked-uri"], "");
- $document_uri = _get($report["document-uri"], "");
- $original_policy = _get($report["original-policy"], "");
- $referrer = _get($report["referrer"], "");
- $violated_directive = _get($report["violated-directive"], "");
-
- $query = pg_prepare($dbconn, "insert_query", 'INSERT INTO csp_reports (blocked_uri, document_uri, original_policy, referrer, violated_directive, total_count, last) VALUES ($1, $2, $3, $4, $5, 1, NOW()) ON CONFLICT ON CONSTRAINT csp_report_unique DO UPDATE SET total_count = csp_reports.total_count + 1, last = NOW(), referrer = EXCLUDED.referrer, original_policy = EXCLUDED.original_policy');
-
- pg_execute($dbconn, "insert_query", Array($blocked_uri, $document_uri, $original_policy, $referrer, $violated_directive));
-}
+++ /dev/null
-{ lib, env }:
-{
- keys = lib.attrsets.mapAttrs' (k: v:
- lib.nameValuePair "webapps/webhooks/${k}.php" {
- user = "wwwrun";
- group = "wwwrun";
- permissions = "0400";
- text = v;
- }) env // {
- "webapps/webhooks" = {
- isDir = true;
- user = "wwwrun";
- group = "wwwrun";
- permissions = "0500";
- };
- };
-}
+++ /dev/null
-{ 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.webapps.diaspora;
- description = ''
- Diaspora package to use.
- '';
- };
- # 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;
- };
- 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 {
- users.users = lib.optionalAttrs (cfg.user == name) {
- "${name}" = {
- inherit uid;
- 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}" = {
- inherit gid;
- };
- };
-
- 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;
- };
- };
-}
+++ /dev/null
-{ 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}"
- ];
- };
- };
-
- };
-}
+++ /dev/null
-{ 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;
- };
-
- };
-}
+++ /dev/null
-{ 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;
- };
- };
-}
+++ /dev/null
-{ 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 = ''
- <Directory ${cfg.root}>
- DirectoryIndex ${cfg.indexFile}
- AllowOverride None
- Require all granted
-
- RewriteEngine on
- RewriteRule ^/(.+) / [L]
- </Directory>
- '';
- };
- 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;
-}
+++ /dev/null
-# 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 = ''
- <IfModule mod_setenvif.c>
- 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
- </IfModule>
- '';
-
-
- sslConf = ''
- <IfModule mod_ssl.c>
- SSLSessionCache shmcb:${runtimeDir}/ssl_scache(512000)
-
- Mutex posixsem
-
- SSLRandomSeed startup builtin
- SSLRandomSeed connect builtin
-
- SSLProtocol ${cfg.sslProtocols}
- SSLCipherSuite ${cfg.sslCiphers}
- SSLHonorCipherOrder on
- </IfModule>
- '';
-
-
- 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
-
- <IfModule mod_mime_magic.c>
- MIMEMagicFile ${pkg}/conf/magic
- </IfModule>
- '';
-
- 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/"
- <Directory "${hostOpts.acmeRoot}">
- AllowOverride None
- Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
- Require method GET POST OPTIONS
- Require all granted
- </Directory>
- '';
- in
- optionalString (listen != []) ''
- <VirtualHost ${concatMapStringsSep " " (listen: "${listen.ip}:${toString listen.port}") listen}>
- ServerName ${hostOpts.hostName}
- ${concatMapStrings (alias: "ServerAlias ${alias}\n") hostOpts.serverAliases}
- ServerAdmin ${adminAddr}
- <IfModule mod_ssl.c>
- SSLEngine off
- </IfModule>
- ${acmeChallenge}
- ${if hostOpts.forceSSL then ''
- <IfModule mod_rewrite.c>
- RewriteEngine on
- RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge [NC]
- RewriteCond %{HTTPS} off
- RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
- </IfModule>
- '' else mkVHostCommonConf hostOpts}
- </VirtualHost>
- '' +
- optionalString (listenSSL != []) ''
- <VirtualHost ${concatMapStringsSep " " (listen: "${listen.ip}:${toString listen.port}") 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}
- </VirtualHost>
- ''
- ;
-
- 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: ''
- <Location ${config.location}>
- ${optionalString (config.proxyPass != null) ''
- <IfModule mod_proxy.c>
- ProxyPass ${config.proxyPass}
- ProxyPassReverse ${config.proxyPass}
- </IfModule>
- ''}
- ${optionalString (config.index != null) ''
- <IfModule mod_dir.c>
- DirectoryIndex ${config.index}
- </IfModule>
- ''}
- ${optionalString (config.alias != null) ''
- <IfModule mod_alias.c>
- Alias "${config.alias}"
- </IfModule>
- ''}
- ${config.extraConfig}
- </Location>
- '') (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}"
-
- <Directory "${documentRoot}">
- Options Indexes FollowSymLinks
- AllowOverride None
- Require all granted
- </Directory>
-
- ${optionalString hostOpts.enableUserDir ''
- UserDir public_html
- UserDir disabled root
- <Directory "/home/*/public_html">
- AllowOverride FileInfo AuthConfig Limit Indexes
- Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
- <Limit GET POST OPTIONS>
- Require all granted
- </Limit>
- <LimitExcept GET POST OPTIONS>
- Require all denied
- </LimitExcept>
- </Directory>
- ''}
-
- ${optionalString (hostOpts.globalRedirect != null && hostOpts.globalRedirect != "") ''
- RedirectPermanent / ${hostOpts.globalRedirect}
- ''}
-
- ${
- let makeDirConf = elem: ''
- Alias ${elem.urlPath} ${elem.dir}/
- <Directory ${elem.dir}>
- Options +Indexes
- Require all granted
- AllowOverride All
- </Directory>
- '';
- 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
- ''}
-
- <IfModule prefork.c>
- MaxClients ${toString cfg.maxClients}
- MaxRequestsPerChild ${toString cfg.maxRequestsPerChild}
- </IfModule>
-
- ${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
-
- <Files ~ "^\.ht">
- Require all denied
- </Files>
-
- ${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.
- <Directory />
- Options FollowSymLinks
- AllowOverride None
- Require all denied
- </Directory>
-
- ${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 <option>configFile</option> 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
- <varname>name</varname> and <varname>path</varname> 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 <link xlink:href="https://httpd.apache.org/docs/2.4/logs.html"/> for more details.
- '';
- };
-
- logPerVirtualHost = mkOption {
- type = types.bool;
- default = true;
- description = ''
- If enabled, each virtual host gets its own
- <filename>access.log</filename> and
- <filename>error.log</filename>, namely suffixed by the
- <option>hostName</option> 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 <nixpkgs/nixos/modules/services/web-servers/apache-httpd/vhost-options.nix>));
- 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 <filename>php.ini</filename>.
- '';
- };
-
- multiProcessingModule = mkOption {
- type = types.enum [ "event" "prefork" "worker" ];
- default = "prefork";
- example = "worker";
- description =
- ''
- Multi-processing module to be used by Apache. Available
- modules are <literal>prefork</literal> (the default;
- handles each request in a separate child process),
- <literal>worker</literal> (hybrid approach that starts a
- number of child processes each running a number of
- threads) and <literal>event</literal> (a recent variant of
- <literal>worker</literal> 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.<name>.enableSSL` no longer has any effect; please remove it.
- Select one of `services.httpd.virtualHosts.<name>.addSSL`, `services.httpd.virtualHosts.<name>.forceSSL`,
- or `services.httpd.virtualHosts.<name>.onlySSL`.
- '';
- }
- {
- assertion = all (hostOpts: with hostOpts; !(addSSL && onlySSL) && !(forceSSL && onlySSL) && !(addSSL && forceSSL)) vhosts;
- message = ''
- Options `services.httpd.virtualHosts.<name>.addSSL`,
- `services.httpd.virtualHosts.<name>.onlySSL` and `services.httpd.virtualHosts.<name>.forceSSL`
- are mutually exclusive.
- '';
- }
- {
- assertion = all (hostOpts: !(hostOpts.enableACME && hostOpts.useACMEHost != null)) vhosts;
- message = ''
- Options `services.httpd.virtualHosts.<name>.enableACME` and
- `services.httpd.virtualHosts.<name>.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";
- };
- };
-
- };
-}
+++ /dev/null
---- /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
- </Directory>
-
-- # But do allow access to files in the store so that we don't have
-- # to generate <Directory> clauses for every generated file that we
-- # want to serve.
-- <Directory /nix/store>
-- Require all granted
-- </Directory>
--
- ${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";
- };
- };
+++ /dev/null
-{ 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;
- };
-}
+++ /dev/null
-{ 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";
- };
- };
- };
-}
+++ /dev/null
-This directory is handled by niv, but it prefers to have a directory
-named "nix"
+++ /dev/null
-{
- "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/<owner>/<repo>/archive/<rev>.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/<owner>/<repo>/archive/<rev>.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/<version>/nixos-<version>.<revision>/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/<owner>/<repo>/archive/<rev>.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/<owner>/<repo>/archive/<rev>.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/<owner>/<repo>/archive/<rev>.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/<owner>/<repo>/archive/<rev>.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/<owner>/<repo>/archive/<rev>.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/<owner>/<repo>/archive/<rev>.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"
- }
-}
+++ /dev/null
-# This file has been generated by Niv.
-
-let
-
- #
- # The fetchers. fetch_<type> fetches specs of type <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 = <nixpkgs> == ./.;
- in
- if builtins.hasAttr "nixpkgs" sources
- then sourcesNixpkgs
- else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then
- import <nixpkgs> {}
- else
- abort
- ''
- Please specify either <nixpkgs> (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); }
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-{
- 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;
-}
+++ /dev/null
-#!/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"
-
-"$@"
+++ /dev/null
-Subproject commit 8c6277e3c2762e13d5f1f2ac06d2e815e02fab82
+++ /dev/null
-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;
- });
-}
+++ /dev/null
-self: super: {
- bugwarrior = super.python3Packages.bugwarrior.overridePythonAttrs(old: rec {
- patches = old.patches or [] ++ [ ./mantisbt.patch ];
- });
-}
+++ /dev/null
-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
+++ /dev/null
-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
- '';
- });
-}
+++ /dev/null
-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
- '';
- });
-}
+++ /dev/null
-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
+++ /dev/null
-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}"
- '';
- };
- };
-}
+++ /dev/null
-self: super: {
- dwm = super.dwm.overrideAttrs(old: rec {
- postPatch = ''
- cp ${./dwm_config.h} ./config.h
- '';
- });
-}
+++ /dev/null
-/* 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} },
-};
-
+++ /dev/null
-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 = [];
- }
- );
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-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
- '';
- });
-}
+++ /dev/null
-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
- '';
- });
-}
+++ /dev/null
-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" ];
- })
- ];
- });
-}
+++ /dev/null
-self: super: {
- lesspipe = super.lesspipe.overrideAttrs(old: {
- configureFlags = (old.configureFlags or []) ++ [ "--yes" ];
- });
-}
+++ /dev/null
-self: super: {
- morph = super.morph.overrideAttrs(old: {
- patches = (old.patches or []) ++ [ ./verbose_nix.patch ./dry-run.patch ];
- });
-}
+++ /dev/null
-self: super: {
- neomutt = super.neomutt.overrideAttrs(old: {
- patches = old.patches or [] ++ [
- ./tx.patch
- ];
- });
-}
+++ /dev/null
-commit 61ae454e1579d02736c48e3468a3237429214cdf
-Author: Ismaël Bouya <ismael.bouya@normalesup.org>
-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;
+++ /dev/null
-self: super: {
- nix-direnv = super.nix-direnv.overrideAttrs (old: {
- postPatch = old.postPatch + ''
- sed -i -e 's/TEMPDIR "$old_tmp"/TEMPDIR "$old_tmpdir"/' direnvrc
- '';
- });
-}
+++ /dev/null
-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
- '';
- });
-}
+++ /dev/null
-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 <nixpkgs> { system = "x86_64-linux"; };
- let
- pkgsNative = import <nixpkgs> {};
-
-- nixpart = python2Packages.nixpart0.override {
-- useNixUdev = false;
-- };
-+ nixpart = python2Packages.nixpart0;
-
- generateConfig = (import <nixpkgs/nixos> {
- configuration = {};
+++ /dev/null
-From 272e50d0b0262e49cdcaad42cdab57aad183d1c2 Mon Sep 17 00:00:00 2001
-From: goodraven
- <employee-pseudonym-7f597def-7eeb-47f8-b10a-0724f2ba59a9@google.com>
-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
-+ <envar>HETZNER_CLOUD_AUTH_TOKEN</envar> 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('<nixpkgs/nixos/modules/profiles/qemu-guest.nix>') ],
-+ ('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 </dev/stdin 2>&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 = [ <nixpkgs/nixos/modules/profiles/qemu-guest.nix> ];
-- 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
+++ /dev/null
-self: super: {
- pass = super.pass.overrideAttrs (old: rec {
- patches = old.patches ++ [ ./pass-fix-pass-init.patch ];
- });
-}
+++ /dev/null
-From 33e8f1cd0065639a948d7b5ba3f93d43bdf7f3be Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= <ismael.bouya@normalesup.org>
-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
-
+++ /dev/null
-self: super: {
- pelican = with self.python3Packages;
- pelican.overrideAttrs(old: {
- propagatedBuildInputs = old.propagatedBuildInputs ++ [ pyyaml markdown ];
- doInstallCheck = false;
- });
-}
+++ /dev/null
-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 ];
-});
-}
+++ /dev/null
-self: super: {
- procps-ng = super.procps-ng.overrideAttrs(old: {
- configureFlags = old.configureFlags ++ [ "--enable-watch8bit" ];
- });
-}
+++ /dev/null
-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;
-}
+++ /dev/null
-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";
-}
+++ /dev/null
-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;
- });
-}
+++ /dev/null
-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/
- '';
- });
-}
+++ /dev/null
-self: super: {
- slrn = super.slrn.overrideAttrs (old: rec {
- configureFlags = old.configureFlags ++ [ "--with-slrnpull" ];
- });
-}
+++ /dev/null
-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
- '';
- });
-}
+++ /dev/null
-self: super: {
- weechat = super.weechat.override {
- configure = { availablePlugins, ... }: {
- plugins = with self; with availablePlugins; [
- (python.withPackages (ps: with ps; [websocket_client emoji]))
- perl
- ruby
- ];
- };
- };
-
-}
+++ /dev/null
-self: super: {
- ympd = super.ympd.overrideAttrs(old: self.mylibs.fetchedGithub ./ympd.json // {
- patches = (old.patches or []) ++ [ ./ympd-password-env.patch ];
- });
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ 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;
- };
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ python3Packages, mylibs }:
-with python3Packages;
-buildPythonApplication (mylibs.fetchedGithub ./mutt-ics.json // {
- propagatedBuildInputs = [ icalendar ];
-})
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ python2Packages, mylibs }:
-python2Packages.buildPythonApplication (mylibs.fetchedGithub ./nagios-cli.json)
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ 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
- '';
-})
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-# 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;
- };
-}
+++ /dev/null
-{ 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
- '';
-})
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ 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 <nixpkgs> {}; pkgs.mkShell { buildInputs = [ python3 python3Packages.blivet3 ]; }"
-# nix-shell -E "with import <nixpkgs> {}; 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;
-}
+++ /dev/null
-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 <amulhern@redhat.com>
-
-+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
+++ /dev/null
-[[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"},
-]
+++ /dev/null
-[tool.poetry]
-name = "blivet"
-version = "3.3.0"
-description = "A python module for system storage configuration"
-authors = ["David Lehman <dlehman@redhat.com>"]
-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"
+++ /dev/null
-{ callPackage, python }:
-{
- buildslist = callPackage ./buildslist {
- pythonPackages = python.pkgs;
- };
-}
+++ /dev/null
-{ 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; };
-}
+++ /dev/null
-{ pythonPackages, libmilter }: with pythonPackages;
-buildPythonPackage rec {
- pname = "pymilter";
- version = "1.0.4";
- src = fetchPypi {
- inherit pname version;
- sha256 = "1bpcvq7d72q0zi7c8h5knhasywwz9gxc23n9fxmw874n5k8hsn7k";
- };
- doCheck = false;
- buildInputs = [ libmilter ];
-}
+++ /dev/null
-{ 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;
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ 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
- '';
-})
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ 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
- '';
-})
+++ /dev/null
-{
- "_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"
-}
+++ /dev/null
-# 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";
- };
- };
- };
- };
-}
+++ /dev/null
-{ 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 ];
-})
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ 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
- '';
-}
+++ /dev/null
-{ 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; };
-}
+++ /dev/null
-{ 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; };
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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/
- '';
-}
-
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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"];
- };
- };
-}
+++ /dev/null
-{ 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"];
- };
- };
-}
+++ /dev/null
-{ 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";
-}
-
+++ /dev/null
-{ 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"];
- };
- };
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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/
- '';
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
-
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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";
-}
+++ /dev/null
-{ 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
+++ /dev/null
-{ 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
- '';
-})
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ 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";
-})
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ stdenv, mylibs }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./auth-ldap.json // {
- installPhase = ''
- mkdir $out
- cp plugins/auth_ldap/init.php $out
- '';
- passthru.pluginName = "auth_ldap";
-})
+++ /dev/null
-{ 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";
-})
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ stdenv, mylibs }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./ff_instagram.json // {
- installPhase = ''
- mkdir $out
- cp -a . $out
- '';
- passthru.pluginName = "ff_instagram";
-})
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ stdenv, mylibs }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./tumblr_gdpr_ua.json // {
- installPhase = ''
- mkdir $out
- cp -a . $out
- '';
- passthru.pluginName = "tumblr_gdpr_ua";
-})
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{ stdenv, mylibs }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./ldap.json // rec {
- installPhase = ''
- mkdir -p $out
- cp plugin.php $out
- '';
- passthru.pluginName = "ldap";
-})
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-{
- "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
- }
-}
+++ /dev/null
-#!/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
# 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
--- /dev/null
+#!/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
--- /dev/null
+#!/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
--- /dev/null
+#!/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 <<EOF
+Host *
+IdentityFile $TEMP/id_ed25519
+EOF
+export SSH_CONFIG_FILE="$TEMP/ssh_config"
+export SSH_IDENTITY_FILE="$TEMP/id_ed25519"
+
+"$@"
+++ /dev/null
-{ pkgs ? import <nixpkgs> { overlays = builtins.attrValues (import ./overlays); },
- pkgs-nix ? import <nixpkgs-nix> { 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 ];
-}
-{ 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 = {
};
};
boot.kernelPackages = pkgs.linuxPackages_latest;
- myEnv = import ../../../nixops/secrets/environment.nix;
- imports = [ <nixpkgs/nixos/modules/profiles/qemu-guest.nix> ] ++ 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" = {
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);
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 = {
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;
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";
# 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?
}
'';
};
port = lib.mkOption {
- type = lib.types.str;
+ type = lib.types.int;
description = ''
Port to connect to
'';
};
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";
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;
'';
})
${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 \
-{ 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}"
};
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;
unix_socket_directories = '${dataDir}'
data_directory = '${dataDir}'
wal_level = logical
+ max_connections = 300
'';
})
]) cfg.hosts));
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";
};
};
rev = "061f0564757289d3bea553b16f8fd5c4a0319c5e";
};
log2rotate = pkgs.writeScript "log2rotate" ''
- #!${pkgs.python3}/bin/python
+ #!${pkgs.python38}/bin/python
${builtins.readFile "${log2rotateSrc}/log2rotate.py"}
'';
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+}
-{ 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" = {
};
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";
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"}"
"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";
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 = [
--- /dev/null
+{ 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";
+ }
+ ];
+ }
+ ];
+}
-{ 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 = {
# 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"; };
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
];
};
- 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 = ''
+ <source>
+ <name>zpool/libvirt</name>
+ </source>
+ '';
+ };
+ };
system.nssModules = [ pkgs.libvirt ];
system.nssDatabases.hosts = lib.mkForce [ "files" "libvirt_guest" "mymachines" "dns" "myhostname" ];
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}"];
};
}
];
- 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
})
];
- # 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?
}
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+}
--- /dev/null
+{ 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")
+ ];
+ }
+ ];
+}
--- /dev/null
+# 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<nbr>"; };
+ 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" ''
+ <network>
+ <name>${name}</name>
+ <uuid>UUID</uuid>
+ <forward mode='nat' />
+ <bridge name='virbr${builtins.toString 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}'
+ '';
+ }) 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" ''
+ <pool type="${pool.type}">
+ <name>${name}</name>
+ <uuid>UUID</uuid>
+ ${pool.xml}
+ ${if pool.target != null then ''
+ <target>
+ <path>${pool.target}</path>
+ </target>
+ '' else ""}
+ </pool>
+ '';
+ 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"
+ ''
+ <domain type="kvm">
+ <name>${name}</name>
+ <uuid>UUID</uuid>
+ <memory unit="GiB">${builtins.toString guest.memory}</memory>
+ <vcpu>${builtins.toString 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}
+ <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 + ''
+ 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;
+ }
+ ];
+}
-{ 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;
-configuration_file: { pkgs ? import <nixpkgs> {}, system ? builtins.currentSystem, myEnv, ... }:
+configuration_file: { pkgs, myEnv, nixpkgs, environment, pkgs-no-overlay, ... }:
let
- config = (import <nixpkgs/nixos/lib/eval-config.nix> {
- 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.
};
} ];
}).config;
-in pkgs.vmTools.runInLinuxVM (
+in pkgs-no-overlay.vmTools.runInLinuxVM (
pkgs.runCommand "nixos-base-image"
{
memSize = 768;
''
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 =
{ pkgs, config, lib, ... }:
{
imports = [
- <nixpkgs/nixos/modules/profiles/qemu-guest.nix>
./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" ''
--- /dev/null
+{ 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 = <HOST> \S+ FATAL: password authentication failed for user .+$
+ <HOST> \S+ FATAL: PAM authentication failed for user.+$
+ <HOST> \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
+ '';
+}
-{ 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 = {
};
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;
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
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";
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}" {
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
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
${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 = {
--- /dev/null
+{ 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;
+ };
+ };
+}
-{ 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 = {
};
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;
};
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;
};
};
};
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.
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";
# 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 = ''
--- /dev/null
+{ 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";
+ }
+ ];
+ };
+}
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 = ''
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}'" \
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
));
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;
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";
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"}";
+ # };
- };
+ #};
};
}
--- /dev/null
+{ 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);
+ };
+}
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";
+ }
+ ];
};
}
-{ lib, pkgs, config, ... }:
+{ lib, pkgs, config, mypackages-lib, ... }:
let
cfg = config.myServices.ejabberd;
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 ];
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")}"
+ '';
};
}
--- /dev/null
+#!@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)
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+}
};
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 = {
SFTPAuthMethods password publickey
SFTPOptions IgnoreSFTPSetOwners
+ AllowChrootSymlinks off
</VirtualHost>
'';
in lib.mkIf proftpd-enabled {
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";
+ }
+
+ ];
+
};
}
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)"
$(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"
--- /dev/null
+{ 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";
+ };
+ };
+}
--- /dev/null
+{ 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";
+ }
+ ];
+ };
+}
#!/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)
--- /dev/null
+### 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 <<EOF
+@gitolite_services@
+EOF
+ exit 0
+fi
--- /dev/null
+{ lib, pkgs, config, ... }:
+let
+ cfg = config.myServices.irc;
+in
+{
+ options.myServices = {
+ irc.enable = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Whether to enable irc stuff.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ myServices.dns.zones."immae.eu".subdomains.irc =
+ with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
+
+ myServices.chatonsProperties.services.bitlbee = {
+ file.datetime = "2022-08-27T19:00:00";
+ service = {
+ name = "Bitlbee";
+ description = "An IRC to other chat networks gateway";
+ logo = "https://www.bitlbee.org/style/logo.png";
+ website = "irc.immae.eu";
+ status.level = "OK";
+ status.description = "OK";
+ registration."" = ["MEMBER" "CLIENT"];
+ registration.load = "FULL";
+ install.type = "PACKAGE";
+ };
+ software = {
+ name = "BitlBee";
+ website = "https://www.bitlbee.org/";
+ license.url = "https://github.com/bitlbee/bitlbee/blob/master/COPYING";
+ license.name = "GNU General Public License v2.0";
+ version = pkgs.bitlbee.version;
+ source.url = "https://github.com/bitlbee/bitlbee";
+ modules = map (a: a.pname) config.services.bitlbee.plugins
+ ++ map (a: a.pname) config.services.bitlbee.libpurple_plugins;
+ };
+ };
+ security.acme.certs."irc" = {
+ 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
+ purple-facebook
+ purple-googlechat
+ ];
+ 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";
+ };
+ };
+ };
+ };
+}
--- /dev/null
+{ lib, pkgs, config, ... }:
+{
+ imports = [
+ ./postfix.nix
+ ./dovecot.nix
+ ./rspamd.nix
+ ./sympa.nix
+ ];
+
+ options.myServices.mail.enable = lib.mkEnableOption "enable Mail services";
+ config = lib.mkIf config.myServices.mail.enable {
+ myServices.mail.milters.enable = true;
+ security.acme.certs."mail" = {
+ postRun = lib.mkBefore ''
+ cp -f fullchain.pem /etc/dovecot/fullchain.pem
+ chown :dovecot2 /etc/dovecot/fullchain.pem
+ chmod a+r /etc/dovecot/fullchain.pem
+ '';
+ domain = config.hostEnv.fqdn;
+ extraDomainNames = let
+ zonesWithMx = builtins.attrNames (lib.filterAttrs (n: v: v.hasEmail) config.myServices.dns.zones);
+ mxs = map (n: "${config.hostEnv.mx.subdomain}.${n}") zonesWithMx;
+ in mxs;
+ };
+ # This is for clients that don’t support elliptic curves (e.g.
+ # printer)
+ security.acme.certs."mail-rsa" = {
+ postRun = lib.mkBefore ''
+ cp -f fullchain.pem /etc/dovecot/fullchain-rsa.pem
+ chown :dovecot2 /etc/dovecot/fullchain-rsa.pem
+ chmod a+r /etc/dovecot/fullchain-rsa.pem
+ '';
+ domain = config.hostEnv.fqdn;
+ keyType = "rsa4096";
+ extraDomainNames = let
+ zonesWithMx = builtins.attrNames (lib.filterAttrs (n: v: v.hasEmail) config.myServices.dns.zones);
+ mxs = map (n: "${config.hostEnv.mx.subdomain}.${n}") zonesWithMx;
+ in mxs;
+ };
+ systemd.slices.mail = {
+ description = "Mail slice";
+ };
+ };
+}
in
{
config = lib.mkIf config.myServices.mail.enable {
+ myServices.dns.zones."immae.eu".subdomains =
+ with config.myServices.dns.helpers;
+ {
+ imap = ips servers.eldiron.ips.main;
+ pop3 = ips servers.eldiron.ips.main;
+ };
+
+ myServices.chatonsProperties.services.email = {
+ file.datetime = "2022-08-22T01:00:00";
+ service = {
+ name = "E-mail account";
+ description = "Compte e-mail avec configuration imap et smtp/pop3";
+ logo = "https://www.dovecot.org/wp-content/uploads/2021/09/favicon.ico";
+ website = "https://mail.immae.eu/";
+ status.level = "OK";
+ status.description = "OK";
+ registration."" = ["MEMBER" "CLIENT"];
+ registration.load = "OPEN";
+ install.type = "PACKAGE";
+ };
+ software = {
+ name = "Dovecot";
+ website = "https://www.dovecot.org/";
+ license.url = "https://github.com/dovecot/core/blob/main/COPYING";
+ license.name = "MIT and LGPLv2.1 Licenses";
+ version = pkgs.dovecot.version;
+ source.url = "https://github.com/dovecot/core";
+ modules = ["roundcube" "rainloop"] ++ map (a: a.pname) config.services.dovecot2.modules;
+ };
+ };
systemd.services.dovecot2.serviceConfig.Slice = "mail.slice";
secrets.keys."dovecot/ldap" = {
user = config.services.dovecot2.user;
uid = config.ids.uids.vhost;
};
users.groups.vhost.gid = config.ids.gids.vhost;
+ users.users."${config.services.dovecot2.user}".extraGroups = [ "acme" ];
+
+ nixpkgs.overlays = [
+ (self: super: {
+ dovecot = super.dovecot.override { openldap = self.openldap_libressl_cyrus; };
+ })
+ ];
# https://blog.zeninc.net/index.php?post/2018/04/01/Un-annuaire-pour-les-gouverner-tous.......
services.dovecot2 = {
protocols = [ "sieve" ];
modules = [
pkgs.dovecot_pigeonhole
- pkgs.dovecot_fts-xapian
+ pkgs.dovecot_fts_xapian
];
mailUser = "vhost";
mailGroup = "vhost";
Drafts = { auto = "subscribe"; specialUse = "Drafts"; };
};
mailLocation = "mbox:~/Mail:INBOX=~/Mail/Inbox:INDEX=~/.imap";
- sslServerCert = "/var/lib/acme/mail/fullchain.pem";
+ sslServerCert = "/etc/dovecot/fullchain.pem";
sslServerKey = "/var/lib/acme/mail/key.pem";
- sslCACert = "/var/lib/acme/mail/fullchain.pem";
+ sslCACert = "/etc/dovecot/fullchain.pem";
extraConfig = builtins.concatStringsSep "\n" [
# For printer which doesn’t support elliptic curve
''
- ssl_alt_cert = </var/lib/acme/mail-rsa/fullchain.pem
+ ssl_alt_cert = </etc/dovecot/fullchain-rsa.pem
ssl_alt_key = </var/lib/acme/mail-rsa/key.pem
''
postRun = ''
systemctl restart dovecot2.service
'';
- extraDomains = {
- "imap.immae.eu" = null;
- "pop3.immae.eu" = null;
- };
+ extraDomainNames = [ "imap.immae.eu" "pop3.immae.eu" ];
};
security.acme.certs."mail" = {
postRun = ''
systemctl restart dovecot2.service
'';
- extraDomains = {
- "imap.immae.eu" = null;
- "pop3.immae.eu" = null;
- };
+ extraDomainNames = [ "imap.immae.eu" "pop3.immae.eu" ];
};
+ myServices.monitoring.fromMasterActivatedPlugins = [ "imap" "tcp" ];
+ myServices.monitoring.fromMasterObjects.service = [
+ {
+ service_description = "imap connection works";
+ host_name = config.hostEnv.fqdn;
+ use = "external-service";
+ check_command = "check_imap_connection";
+
+ servicegroups = "webstatus-remote-services,webstatus-email";
+ _webstatus_name = "IMAP";
+ _webstatus_url = "imap.immae.eu";
+ }
+
+ {
+ service_description = "imap SSL is up to date";
+ host_name = config.hostEnv.fqdn;
+ use = "external-service";
+ check_command = ["check_tcp_ssl" "993"];
+
+ servicegroups = "webstatus-ssl";
+ _webstatus_name = "IMAP";
+ _webstatus_url = "imap.immae.eu";
+ }
+
+ ];
};
}
-{ lib, pkgs, config, nodes, ... }:
+{ lib, pkgs, config, options, ... }:
+let
+ getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) (lib.filterAttrs (n: v: v.receive) p.emailPolicies);
+ bydomain = builtins.mapAttrs (n: getDomains) config.myServices.dns.zones;
+ receiving_domains = lib.flatten (builtins.attrValues bydomain);
+in
{
+ options.services.postfix.submissionOptions' = options.services.postfix.submissionOptions // {
+ type = with lib.types; attrsOf (either str (listOf str));
+ apply = builtins.mapAttrs (n: v: if builtins.isList v then builtins.concatStringsSep "," v else v);
+ };
config = lib.mkIf config.myServices.mail.enable {
+ myServices.dns.zones."immae.eu" = with config.myServices.dns.helpers; lib.mkMerge [
+ mailMX
+ (mailCommon "immae.eu")
+ mailSend
+ {
+ # Virtual forwards and mailboxes for real users
+ emailPolicies."mail".receive = true;
+ # multi-domain generic mails:
+ # hostmaster, cron, httpd, naemon, postmaster
+ # system virtual mailboxes:
+ # devnull, printer, testconnect
+ emailPolicies."".receive = true;
+ subdomains.mail = lib.mkMerge [ (mailCommon "immae.eu") mailSend ];
+ subdomains.smtp = ips servers.eldiron.ips.main;
+
+ # DMARC reports
+ subdomains._dmarc.subdomains._report.subdomains = let
+ getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) p.emailPolicies;
+ bydomain = builtins.mapAttrs (n: getDomains) config.myServices.dns.zones;
+ hostsWithMail = lib.flatten (builtins.attrValues bydomain);
+ nvpairs = builtins.map (e: { name = e; value = { TXT = [ "v=DMARC1;" ]; }; }) hostsWithMail;
+ in
+ builtins.listToAttrs nvpairs;
+ }
+ ];
+
+ myServices.chatonsProperties.hostings.mx-backup = {
+ file.datetime = "2022-08-22T01:00:00";
+ hosting = {
+ name = "MX Backup";
+ description = "Serveur e-mail secondaire";
+ logo = "https://www.postfix.org/favicon.ico";
+ website = "https://mail.immae.eu/";
+ status.level = "OK";
+ status.description = "OK";
+ registration.load = "OPEN";
+ install.type = "PACKAGE";
+ };
+ software = {
+ name = "Postfix";
+ website = "http://www.postfix.org/";
+ license.url = "http://postfix.mirrors.ovh.net/postfix-release/LICENSE";
+ license.name = "Eclipse Public license (EPL 2.0) and IBM Public License (IPL 1.0)";
+ version = pkgs.postfix.version;
+ source.url = "http://www.postfix.org/download.html";
+ };
+ };
secrets.keys = {
"postfix/mysql_alias_maps" = {
user = config.services.postfix.user;
version = 3
'';
};
- } // lib.mapAttrs' (name: v: lib.nameValuePair "postfix/scripts/${name}-env" {
- user = "postfixscripts";
- group = "root";
- permissions = "0400";
- text = builtins.toJSON v.env;
- }) config.myEnv.mail.scripts;
+ };
networking.firewall.allowedTCPPorts = [ 25 465 587 ];
};
services.postfix = {
extraAliases = let
- toScript = name: script: pkgs.writeScript name ''
+ testmail = pkgs.writeScript "testmail" ''
#! ${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 <<EOF | /run/wrappers/bin/sendmail -i scripts_error+${name}@mail.immae.eu
- $repeat
- To: scripts_error+${name}@mail.immae.eu
- Subject: Log from script error
- Content-Type: text/plain; charset="UTF-8"
- Content-Transfer-Encoding: 8bit
- References:$messageId
- MIME-Version: 1.0
- X-Return-Code: $ret
-
- Error code: $ret
- Output of message:
- --------------
- $output
- --------------
- EOF
- fi
+ ${pkgs.coreutils}/bin/touch \
+ "/var/lib/naemon/checks/email/$(${pkgs.procmail}/bin/formail -x To: | ${pkgs.coreutils}/bin/tr -d ' <>')"
'';
- 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";
"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"}"
];
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";
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 = [
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";
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)
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"
# 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"
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" ];
'';
};
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";
+ }
+ ];
};
}
[ "*/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;
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;
}
];
};
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
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 = {
webHost = "mail.immae.eu";
webLocation = "/sympa";
};
- "cip-ca.fr" = {
- webHost = "mail.cip-ca.fr";
- webLocation = "/sympa";
- };
};
database = {
log_smtp = "on";
sendmail_aliases = "/var/lib/sympa/sympa_transport";
aliases_program = "${pkgs.postfix}/bin/postmap";
+ create_list = "listmaster";
};
settingsFile = {
"virtual.sympa".enable = false;
--- /dev/null
+{ 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";
+ })
+ ];
+ }
+ ];
+}
--- /dev/null
+{ 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
+ ];
+ };
+ };
+}
--- /dev/null
+### 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
+
| 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
--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)
;;
-{ lib, pkgs, config, ... }:
+{ lib, pkgs, config, taskwarrior-web, ... }:
let
cfg = config.myServices.tasks;
server_vardir = config.services.taskserver.dataDir;
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
};
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";
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
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 = [ ''
# 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
taskd.certificate=/path/to/<?php echo $ldap_user; ?>.cert.pem
taskd.key=/path/to/<?php echo $ldap_user; ?>.key.pem
taskd.server=<?php echo $host ."\n"; ?>
+taskd.ca=/path/to/ca.cert.pem
<?php if (count($entries) > 1) {
echo "# Chose one of them\n";
foreach($entries as $entry) {
} else { ?>
taskd.credentials=<?php echo $entries[0][0]; ?>/<?php echo $entries[0][1]; ?>/<?php echo $entries[0][2]; ?>
<?php } ?>
-taskd.ca=/path/to/ca.cert.pem
</pre>
For Mirakel, download and import the file:
<ul>
};
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";
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";
--- /dev/null
+{ 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"
+ <Directory "${assets}">
+ 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 "*"
+ </Directory>
+
+ MergeSlashes OFF
+ <Location /p>
+ ProxyPass unix:///run/imgproxy/imgproxy.sock|http://assets.immae.eu
+ ProxyPassReverse unix:///run/imgproxy/imgproxy.sock|http://assets.immae.eu
+ </Location>
+ ''
+ ];
+ };
+ 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";
+ };
+ };
+ };
+}
--- /dev/null
+<?php
+
+namespace bantu\IniGetWrapper { class IniGetWrapper { } }
+namespace Psr\Log { class LoggerInterface { } }
+namespace OCP {
+ class IL10N { }
+ class Defaults { }
+}
+namespace OCP\Security {
+ class ISecureRandom { }
+}
+namespace OC {
+ class Installer { }
+ class SystemConfig {
+ private $a;
+ public function __construct($a) {
+ $this->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";
+ };
+}
--- /dev/null
+{ 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";
+ }
+ ];
+ };
+}
--- /dev/null
+{ 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" ''
+ <?php
+ $CONFIG = json_decode(file_get_contents("${icfg.configOverride}"), TRUE);
+ '';
+ toVhost = icfg: ''
+ SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
+ SetEnv NEXTCLOUD_CONFIG_DIR "${icfg.varDir}/config"
+ <Directory ${icfg.rootDir}>
+ 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.${icfg.phpPoolName}.socket}|fcgi://localhost"
+ </FilesMatch>
+
+ </Directory>
+ '';
+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;
+ };
+}
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";
};
};
+ 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 = [
--- /dev/null
+{ 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
+ ];
+ };
+ };
+}
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 != {}) {
{ 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;
# 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";
--- /dev/null
+{ lib, pkgs, config, ... }:
+let
+ infcloud = rec {
+ root = pkgs.webapps-infcloud;
+ vhostConf = ''
+ Alias /carddavmate ${root}
+ Alias /caldavzap ${root}
+ Alias /infcloud ${root}
+ <Directory ${root}>
+ AllowOverride All
+ Options FollowSymlinks
+ Require all granted
+ DirectoryIndex index.html
+ </Directory>
+ '';
+ };
+ 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";
+ }
+ ];
+ };
+}
+
--- /dev/null
+{ 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}
+ <Directory ${pkgs.webapps-adminer}>
+ DirectoryIndex index.php
+ <FilesMatch "\.php$">
+ SetHandler "proxy:unix:${config.services.phpfpm.pools.adminer.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>
+ ''
+ ];
+ };
+ };
+}
-{ 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:
'';
};
apaxy = {
- extraConfig = (pkgs.webapps.apache-theme.override { inherit theme_root; }).apacheConfig;
+ extraConfig = (mypackages-lib.apache-theme { inherit theme_root; }).apacheConfig;
};
http2 = {
modules = [ "http2" ];
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 ];
};
};
- 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 = {
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 ++
[ ''
nosslVhost = {
enable = true;
host = "nossl.immae.eu";
+ root = ./nossl;
};
fallbackVhost = {
certName = "eldiron";
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;
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;
};
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 = {
user = "diaspora";
group = "diaspora";
permissions = "0400";
+ keyDependencies = [ pkgs.cacert ];
text = ''
configuration:
environment:
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";
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 = [ ''
</Directory>
'' ];
};
+ 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/";
+ }
+ ];
};
}
-{ 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 <nixpkgs> { overlays = []; }).libreoffice-fresh;
+ libreoffice = nixpkgsRaw.libreoffice-fresh;
ecfg = config.services.etherpad-lite;
in {
options.myServices.websites.tools.etherpad-lite = {
};
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";
};
"webapps/tools-etherpad" = {
permissions = "0400";
+ keyDependencies = [ libreoffice ];
text = ''
{
"title": "Etherpad",
"requireSession" : false,
"editOnly" : false,
"sessionNoPassword" : false,
- "minify" : true,
+ "minify" : false,
"maxAge" : 21600,
"abiword" : null,
"soffice" : "${libreoffice}/bin/soffice",
"allowUnknownFileEnds" : true,
"requireAuthentication" : false,
"requireAuthorization" : false,
- "trustProxy" : false,
+ "trustProxy" : true,
"disableIPlogging" : false,
"automaticReconnectionTimeout" : 0,
"scrollWhenFocusLineIsOutOfViewport": {
};
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
};
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 ];
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 = [ ''
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]
</IfModule>
'' ];
};
+ 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" "/" "<title>Etherpad"];
+
+ servicegroups = "webstatus-webapps";
+ _webstatus_name = "Etherpad";
+ _webstatus_url = "https://ether.immae.eu/";
+ }
+ ];
};
}
{
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" ];
};
};
+ 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 = [
--- /dev/null
+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">
chmod -R u+w $out
cd $out
patch -p1 < ${./codenames.patch}
+ patch -p1 < ${./immae-assets.patch}
'';
dependencies = [
sources."@babel/code-frame-7.0.0"
{
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 = ''
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;
};
};
+ 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 = [
--- /dev/null
+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" />
-{ 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";
'';
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/
--- /dev/null
+<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>
--- /dev/null
+{ 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";
+ }
+ ];
+ };
+}
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
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]
'';
};
}
{ 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;
"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:'";
};
};
}
--- /dev/null
+{ 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>
+ ''
+ ];
+ };
+ };
+}
<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,
whitelisted_plugins: ['markdown'],
});
</script>
- </head>
- <body>
</body>
</html>
},
"m.identity_server": {
"base_url": "https://vector.im"
+ },
+ "org.matrix.msc3575.proxy": {
+ "url": "https://immae.ems.host"
}
}
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 = [
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
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
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";
+ }
+ ];
};
}
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 = [
--- /dev/null
+{ 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;
+ };
+}
--- /dev/null
+{ 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/";
+ }
+ ];
+ };
+
+}
{ 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 = [
''
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
'';
};
DirectoryIndex index.php
AllowOverride All
Options -FollowSymlinks
- Require all granted
+ Require all denied
<FilesMatch "\.php$">
SetHandler "proxy:unix:${socket}|fcgi://localhost"
"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:'";
};
};
}
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" = {
$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 {
"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:'";
};
};
}
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";
LDAP_SEARCH_FILTER="${env.ldap.filter}"
'';
};
- services.mastodon = {
+ immaeServices.mastodon = {
enable = true;
configFile = config.secrets.fullPaths."webapps/tools-mastodon";
socketsPrefix = "live_immae";
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 = [ ''
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}
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</title>"];
+
+ servicegroups = "webstatus-webapps";
+ _webstatus_name = "Mastodon";
+ _webstatus_url = "https://mastodon.immae.eu/";
+ }
+ ];
};
}
-{ lib, pkgs, config, ... }:
+{ lib, pkgs, config, mediagoblin, ... }:
let
env = config.myEnv.tools.mediagoblin;
cfg = config.myServices.websites.tools.mediagoblin;
};
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";
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 = {
"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 = [ ''
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" "/" "<title>GNU MediaGoblin"];
+
+ servicegroups = "webstatus-webapps";
+ _webstatus_name = "Mediagoblin";
+ _webstatus_url = "https://mgoblin.immae.eu/";
+ }
+ ];
};
}
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";
};
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 = [ ''
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/";
+ }
+ ];
};
}
{ 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
};
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";
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}
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 = [
"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 ]);
};
};
};
};
+ 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 = [
--- /dev/null
+{ 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/";
+ };
+ };
+}
-{ 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;
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]);
};
};
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
// 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
++ 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 = [
];
};
+
+ 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 = [
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
(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)
''
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
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$">
services.websites.env.tools.vhostConfs.outils = {
certName = "eldiron";
- addToCerts = true;
hosts = [ "outils.immae.eu" ];
root = null;
extraConfig = [
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" ];
"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";
"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 = [
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
+ ];
};
}
$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}";
?>
'';
"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";
};
--- /dev/null
+{ 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/";
+ }
+ ];
+}
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;
# 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:'";
};
};
}
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
'';
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";
root = webRoot;
vhostConf = socket: ''
Alias /kanboard "${root}"
+ <Location /kanboard>
+ Include ${config.secrets.fullPaths."webapps/tools-kanboard"}
+ </Location>
<Directory "${root}">
DirectoryIndex index.php
AllowOverride All
};
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;
# 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:'";
};
};
}
--- /dev/null
+{ 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
+ '';
+ }
$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;
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,
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";
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);
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));
+ }
}
}
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);
}
}
}
if (isUserLogged()) :
- $keys = isset($editedKeys) ? $editedKeys : getLdapInfo();
+ $keys = isset($editedKeys) ? $editedKeys : getKeys();
?>
<p>Connecté en tant que <b><?= $_SESSION['login']; ?></b></p>
?>
<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>
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);
}
</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>`;
{ 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;
# 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/";
+ }
+ ];
}
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";
# 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:'";
};
};
}
-{ 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 {
# 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";
"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/";
+ }
+ ];
}
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";
</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;
# 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/";
+ }
+ ];
}
${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
define('LOG_DESTINATION', ''');
define('CONFIG_VERSION', 26);
+ define('DAEMON_UPDATE_LOGIN_LIMIT', 0);
define('SPHINX_SERVER', 'localhost:9312');
define('SPHINX_INDEX', 'ttrss, delta');
# 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/";
+ }
+ ];
}
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} \
# 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/";
+ }
+ ];
}
--- /dev/null
+{ 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";
+ };
+ };
+}
-{ env }:
+{ env, config }:
let
ympd = rec {
config = {
};
};
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/";
+ }
+ ];
+ }
{ 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;
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";
# 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/";
+ }
+
+ ];
}
--- /dev/null
+{ 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
+ ''
+ ];
+ };
+
+ };
+}
+
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;
};
};
config = lib.mkIf (builtins.length cfg.sites > 0) {
- users.users.root.packages = [
+ environment.systemPackages = [
pkgs.goaccess
];
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}";
-{ 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);
];
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" = {
# 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?
}
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+}
--- /dev/null
+{ 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
+ '';
+}
--- /dev/null
+{ 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";
+ # };
+ };
+ }
+ ];
+}
--- /dev/null
+{ 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";
+ };
+ };
+ };
+ };
+}
-{ 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";
_webstatus_vhost = "status.immae.eu";
};
};
- service = [
+ config.myServices.monitoring.objects.service = [
(emailCheck "phare" "phare.normalesup.org")
];
}
-{ 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";
_webstatus_vhost = "status.immae.eu";
};
};
- service = [
+ config.myServices.monitoring.objects.service = [
(emailCheck "ulminfo" "ulminfo.fr")
];
}
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:/";
};
};
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";
{ 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
{
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}
'';
};
- services.redis = rec {
+ services.redis.servers."" = rec {
enable = true;
bind = "127.0.0.1";
};
];
};
+ 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" ];
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+}
--- /dev/null
+-----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-----
--- /dev/null
+{ 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" ];
+}
--- /dev/null
+{ 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;
+ };
+ };
+ };
+}
--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ 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;
+ };
+ };
+}
--- /dev/null
+{ 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" ];
+ };
+ };
+}